├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── app.js ├── bin └── juejinxiaoce ├── constant.js ├── dist ├── html │ └── readme.txt └── md │ └── readme.txt ├── package-lock.json ├── package.json ├── readme.md └── utils.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = false 8 | insert_final_newline = true 9 | end_of_line = crlf 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "parserOptions": { 8 | "ecmaVersion": 2018 9 | }, 10 | "rules": { 11 | "indent": [ 12 | "error", 13 | 2 14 | ], 15 | "linebreak-style": [ 16 | "error", 17 | "windows" 18 | ], 19 | "quotes": [ 20 | "error", 21 | "single" 22 | ], 23 | "semi": [ 24 | "error", 25 | "never" 26 | ] 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /.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 (https://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 (https://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 | .env.test 60 | 61 | # parcel-bundler cache (https://parceljs.org/) 62 | .cache 63 | 64 | # next.js build output 65 | .next 66 | 67 | # nuxt.js build output 68 | .nuxt 69 | 70 | # vuepress build output 71 | .vuepress/dist 72 | 73 | # Serverless directories 74 | .serverless/ 75 | 76 | # FuseBox cache 77 | .fusebox/ 78 | 79 | # DynamoDB Local files 80 | .dynamodb/ 81 | 82 | 83 | 84 | 85 | # dist 86 | dist/html/*.html 87 | dist/md/*.md 88 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at billyangg@qq.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | 78 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2019 OliverYoung 3 | 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, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 19 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 21 | OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const fs = require('fs') 3 | const path = require('path') 4 | const os = require('os') 5 | const readline = require('readline') 6 | const Turndown = require('turndown') 7 | 8 | const { getCookieArr, getCookieObj, sendPost, sendGet, sleep, rmfile, mkdir } = require('./utils') 9 | const { USER_AGENT, URL_HOSTNAME, URL_LOGIN_EMAIL, URL_LOGIN_PHONENUMBER, URL_BOOK_HOSTNAME, URL_BOOK_LIST_SECTION, URL_BOOK_SECTION } = require('./constant') 10 | 11 | class Juejin { 12 | constructor() { 13 | this.loginType = '0' // 0为邮箱 1为手机 14 | this.account = '' 15 | this.password = '' 16 | this.bookID = '' 17 | this.cookie = '' 18 | this.src = 'web' 19 | this.userInfo = {} 20 | this.bookSectionList = [] 21 | this.count = 0 22 | this.pwd = process.env.PWD 23 | } 24 | 25 | copyToPWDDir(dirname) { 26 | mkdir(dirname) 27 | 28 | const output = path.resolve(__dirname, 'dist', 'md') 29 | 30 | const fileList = fs.readdirSync(output).filter(item => path.extname(item) === '.md') 31 | fileList.forEach(file => { 32 | fs.copyFileSync(path.join(output, file), path.resolve(process.env.PWD, dirname, file)) 33 | }) 34 | } 35 | 36 | async getMetaData() { 37 | const rl = readline.createInterface({ 38 | input: process.stdin, 39 | output: process.stdout 40 | }) 41 | 42 | const question = query => { 43 | return new Promise(resolve => { 44 | rl.question(query, resolve) 45 | }) 46 | } 47 | console.warn('loginType 0:邮箱 1:手机号码') 48 | const loginType = await question('loginType: ') 49 | const account = await question('account: ') 50 | const password = await question('password: ') 51 | const bookID = await question('bookId: ') 52 | 53 | rl.close() 54 | this.loginType = loginType 55 | this.account = account 56 | this.password = password 57 | this.bookID = bookID 58 | 59 | Promise.resolve() 60 | } 61 | 62 | async mainPage() { 63 | console.warn('===navagating to main page') 64 | const headers = { 65 | 'User-Agent': USER_AGENT, 66 | 'Connection': 'keep-alive' 67 | } 68 | const response = await sendGet(URL_HOSTNAME, '/', headers) 69 | this.cookie = JSON.stringify(getCookieObj(response.headers['set-cookie'])) 70 | } 71 | 72 | async login() { 73 | console.warn('===login...') 74 | const authObj = { 75 | password: this.password 76 | } 77 | let loginUrl; 78 | 79 | if(this.loginType === '0'){ 80 | Object.assign(authObj,{ 81 | email: this.account 82 | }) 83 | loginUrl = URL_LOGIN_EMAIL; 84 | }else{ 85 | Object.assign(authObj,{ 86 | phoneNumber: this.account 87 | }) 88 | loginUrl = URL_LOGIN_PHONENUMBER; 89 | } 90 | const auth = JSON.stringify(authObj) 91 | const headers = { 92 | 'User-Agent': USER_AGENT, 93 | 'Content-Type': 'application/json', 94 | 'Content-Length': Buffer.byteLength(auth), 95 | 'Cookie': getCookieArr(JSON.parse(this.cookie)) 96 | } 97 | const response = await sendPost(URL_HOSTNAME, loginUrl, auth, headers) 98 | this.cookie = JSON.stringify(Object.assign(JSON.parse(this.cookie), getCookieObj(response.res.headers['set-cookie']))) 99 | this.userInfo = JSON.parse(response.data) 100 | return response 101 | } 102 | 103 | async getTargetBookSectionList() { 104 | console.warn('===getting book section list') 105 | const headers = { 106 | 'User-Agent': USER_AGENT, 107 | 'Connection': 'keep-alive' 108 | } 109 | const response = await sendGet(URL_BOOK_HOSTNAME, `${URL_BOOK_LIST_SECTION}?uid=${this.userInfo.userId}&client_id=${this.userInfo.user.clientId}&token=${this.userInfo.user.token}&src=${this.src}&id=${this.bookID}`, headers) 110 | const data = response.data 111 | this.bookSectionList = JSON.parse(data).d 112 | return response 113 | } 114 | 115 | async getContentHTML(callback) { 116 | console.warn('===getting book HTML content') 117 | const headers = { 118 | 'User-Agent': USER_AGENT, 119 | 'Connection': 'keep-alive' 120 | } 121 | await sleep(3000) 122 | 123 | const url = `${URL_BOOK_SECTION}?uid=${this.userInfo.userId}&client_id=${this.userInfo.clientId}&token=${this.userInfo.token}&src=${this.src}§ionId=${this.bookSectionList[this.count].sectionId}` 124 | const response = await sendGet(URL_BOOK_HOSTNAME, url, headers) 125 | let data = JSON.parse(response.data) 126 | 127 | console.log(`${this.count + 1}.${data.d.title}`) 128 | data.d.isFinished || console.log('写作中...') 129 | callback(data.d) 130 | 131 | this.count ++ 132 | let maxCount = this.bookSectionList.length 133 | this.count < maxCount && await this.getContentHTML(callback) 134 | } 135 | 136 | saveHTML(d) { 137 | return new Promise((resolve, reject) => { 138 | console.log('===writing html...') 139 | const title = d.title.replace(/[/?*:|\\<>]/g, ' ') 140 | const output = path.resolve(__dirname, 'dist', 'html', title + '.html') 141 | fs.writeFile(output, d.html, { encoding: 'utf-8' }, err => { 142 | err && reject(err) 143 | console.log('===write html file success') 144 | resolve({title, output}) 145 | }) 146 | }) 147 | } 148 | 149 | toMarkdown(title, path) { 150 | return new Promise((resolve, reject) => { 151 | const turndownService = new Turndown({ 152 | headingStyle: 'atx', 153 | codeBlockStyle: 'fenced' 154 | }) 155 | try { 156 | const markdown = turndownService.turndown(fs.readFileSync(path, { encoding: 'utf-8' })) 157 | resolve({ title, markdown }) 158 | } catch (error) { 159 | reject(error) 160 | } 161 | }) 162 | } 163 | 164 | saveMD(title, data) { 165 | return new Promise((resolve, reject) => { 166 | console.log('===writing markdown...') 167 | const output = path.resolve(__dirname, 'dist', 'md', `${this.count}.${title}.md`) 168 | fs.writeFile(output, data, { encoding: 'utf-8' }, err => { 169 | err && reject(err) 170 | console.log('===write markdown file success') 171 | resolve() 172 | }) 173 | }) 174 | } 175 | 176 | } 177 | 178 | {(async () => { 179 | rmfile('html') 180 | rmfile('md') 181 | const juejin = new Juejin() 182 | try { 183 | await juejin.getMetaData() 184 | await juejin.mainPage() 185 | await sleep() 186 | await juejin.login() 187 | await sleep() 188 | await juejin.getTargetBookSectionList() 189 | 190 | const dirname = 'md ' + + new Date() 191 | 192 | await juejin.getContentHTML(async d => { 193 | const { title, output } = await juejin.saveHTML(d) 194 | const { title: mdTitle, markdown: markdownData } = await juejin.toMarkdown(title, output) 195 | await juejin.saveMD(mdTitle, markdownData) 196 | juejin.copyToPWDDir(dirname) 197 | }) 198 | 199 | setTimeout(() => { 200 | console.log(`${os.EOL}======${os.EOL}All Done...Enjoy.${os.EOL}======${os.EOL}`) 201 | }, 200) 202 | 203 | } catch (error) { 204 | console.log(error) 205 | } 206 | })()} 207 | -------------------------------------------------------------------------------- /bin/juejinxiaoce: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | require('../app.js') 4 | -------------------------------------------------------------------------------- /constant.js: -------------------------------------------------------------------------------- 1 | const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' 2 | const URL_HOSTNAME = 'juejin.im' 3 | const URL_LOGIN_EMAIL = '/auth/type/email' 4 | const URL_LOGIN_PHONENUMBER = '/auth/type/phoneNumber' 5 | 6 | const URL_BOOK_HOSTNAME = 'xiaoce-cache-api-ms.juejin.im' 7 | const URL_BOOK_LIST_SECTION = '/v1/getListSection' 8 | const URL_BOOK_SECTION = '/v1/getSection' 9 | 10 | module.exports = { 11 | USER_AGENT, 12 | URL_HOSTNAME, 13 | URL_LOGIN_EMAIL, 14 | URL_LOGIN_PHONENUMBER, 15 | URL_BOOK_HOSTNAME, 16 | URL_BOOK_LIST_SECTION, 17 | URL_BOOK_SECTION 18 | } 19 | -------------------------------------------------------------------------------- /dist/html/readme.txt: -------------------------------------------------------------------------------- 1 | 爬取的 html 文件目录 2 | -------------------------------------------------------------------------------- /dist/md/readme.txt: -------------------------------------------------------------------------------- 1 | markdown 文件的输出目录 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@oliyg/juejinxiaoce", 3 | "version": "2.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz", 10 | "integrity": "sha1-BuKrGb21NThVWaq7W6WXKUgoAPg=", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz", 19 | "integrity": "sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ=", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "abab": { 28 | "version": "2.0.0", 29 | "resolved": "http://registry.npm.taobao.org/abab/download/abab-2.0.0.tgz", 30 | "integrity": "sha1-q6CrTF7uLUx500h9hUUPsjduuw8=" 31 | }, 32 | "acorn": { 33 | "version": "6.0.5", 34 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.0.5.tgz", 35 | "integrity": "sha1-gXMMCBXz87NNjvqVy3Qwll9NiHo=" 36 | }, 37 | "acorn-globals": { 38 | "version": "4.3.0", 39 | "resolved": "http://registry.npm.taobao.org/acorn-globals/download/acorn-globals-4.3.0.tgz", 40 | "integrity": "sha1-47b42jwVUqla5idXH33Wkju1QQM=", 41 | "requires": { 42 | "acorn": "^6.0.1", 43 | "acorn-walk": "^6.0.1" 44 | } 45 | }, 46 | "acorn-jsx": { 47 | "version": "5.0.1", 48 | "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz", 49 | "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=", 50 | "dev": true 51 | }, 52 | "acorn-walk": { 53 | "version": "6.1.1", 54 | "resolved": "http://registry.npm.taobao.org/acorn-walk/download/acorn-walk-6.1.1.tgz", 55 | "integrity": "sha1-02O2b1+sXwGP+cOh57b44xDMORM=" 56 | }, 57 | "ajv": { 58 | "version": "6.7.0", 59 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.7.0.tgz", 60 | "integrity": "sha1-4857s3LWV3uxg58d/fy/WtKUjZY=", 61 | "requires": { 62 | "fast-deep-equal": "^2.0.1", 63 | "fast-json-stable-stringify": "^2.0.0", 64 | "json-schema-traverse": "^0.4.1", 65 | "uri-js": "^4.2.2" 66 | } 67 | }, 68 | "ansi-escapes": { 69 | "version": "3.1.0", 70 | "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.1.0.tgz", 71 | "integrity": "sha1-9zIHu4EgfXX9bIPxJa8m7qN4yjA=", 72 | "dev": true 73 | }, 74 | "ansi-regex": { 75 | "version": "3.0.0", 76 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 77 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 78 | "dev": true 79 | }, 80 | "ansi-styles": { 81 | "version": "3.2.1", 82 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", 83 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 84 | "dev": true, 85 | "requires": { 86 | "color-convert": "^1.9.0" 87 | } 88 | }, 89 | "argparse": { 90 | "version": "1.0.10", 91 | "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", 92 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 93 | "dev": true, 94 | "requires": { 95 | "sprintf-js": "~1.0.2" 96 | } 97 | }, 98 | "array-equal": { 99 | "version": "1.0.0", 100 | "resolved": "http://registry.npm.taobao.org/array-equal/download/array-equal-1.0.0.tgz", 101 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 102 | }, 103 | "asn1": { 104 | "version": "0.2.4", 105 | "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", 106 | "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", 107 | "requires": { 108 | "safer-buffer": "~2.1.0" 109 | } 110 | }, 111 | "assert-plus": { 112 | "version": "1.0.0", 113 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 114 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 115 | }, 116 | "astral-regex": { 117 | "version": "1.0.0", 118 | "resolved": "http://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", 119 | "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", 120 | "dev": true 121 | }, 122 | "async-limiter": { 123 | "version": "1.0.0", 124 | "resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz", 125 | "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" 126 | }, 127 | "asynckit": { 128 | "version": "0.4.0", 129 | "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", 130 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 131 | }, 132 | "aws-sign2": { 133 | "version": "0.7.0", 134 | "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", 135 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 136 | }, 137 | "aws4": { 138 | "version": "1.8.0", 139 | "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", 140 | "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=" 141 | }, 142 | "balanced-match": { 143 | "version": "1.0.0", 144 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 145 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 146 | "dev": true 147 | }, 148 | "bcrypt-pbkdf": { 149 | "version": "1.0.2", 150 | "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", 151 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 152 | "requires": { 153 | "tweetnacl": "^0.14.3" 154 | } 155 | }, 156 | "brace-expansion": { 157 | "version": "1.1.11", 158 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 159 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 160 | "dev": true, 161 | "requires": { 162 | "balanced-match": "^1.0.0", 163 | "concat-map": "0.0.1" 164 | } 165 | }, 166 | "browser-process-hrtime": { 167 | "version": "0.1.3", 168 | "resolved": "http://registry.npm.taobao.org/browser-process-hrtime/download/browser-process-hrtime-0.1.3.tgz", 169 | "integrity": "sha1-YW8A+u8d9+wbW/nP4r3DFw8mx7Q=" 170 | }, 171 | "callsites": { 172 | "version": "3.0.0", 173 | "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-3.0.0.tgz", 174 | "integrity": "sha1-+361abcq16RYEvk/2UMKPkELPdM=", 175 | "dev": true 176 | }, 177 | "caseless": { 178 | "version": "0.12.0", 179 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", 180 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 181 | }, 182 | "chalk": { 183 | "version": "2.4.2", 184 | "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", 185 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 186 | "dev": true, 187 | "requires": { 188 | "ansi-styles": "^3.2.1", 189 | "escape-string-regexp": "^1.0.5", 190 | "supports-color": "^5.3.0" 191 | } 192 | }, 193 | "chardet": { 194 | "version": "0.7.0", 195 | "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz", 196 | "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", 197 | "dev": true 198 | }, 199 | "circular-json": { 200 | "version": "0.3.3", 201 | "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz", 202 | "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", 203 | "dev": true 204 | }, 205 | "cli-cursor": { 206 | "version": "2.1.0", 207 | "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", 208 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 209 | "dev": true, 210 | "requires": { 211 | "restore-cursor": "^2.0.0" 212 | } 213 | }, 214 | "cli-width": { 215 | "version": "2.2.0", 216 | "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", 217 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 218 | "dev": true 219 | }, 220 | "color-convert": { 221 | "version": "1.9.3", 222 | "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", 223 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 224 | "dev": true, 225 | "requires": { 226 | "color-name": "1.1.3" 227 | } 228 | }, 229 | "color-name": { 230 | "version": "1.1.3", 231 | "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 232 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 233 | "dev": true 234 | }, 235 | "combined-stream": { 236 | "version": "1.0.7", 237 | "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz", 238 | "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", 239 | "requires": { 240 | "delayed-stream": "~1.0.0" 241 | } 242 | }, 243 | "concat-map": { 244 | "version": "0.0.1", 245 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 246 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 247 | "dev": true 248 | }, 249 | "core-util-is": { 250 | "version": "1.0.2", 251 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 252 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 253 | }, 254 | "cross-spawn": { 255 | "version": "6.0.5", 256 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", 257 | "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", 258 | "dev": true, 259 | "requires": { 260 | "nice-try": "^1.0.4", 261 | "path-key": "^2.0.1", 262 | "semver": "^5.5.0", 263 | "shebang-command": "^1.2.0", 264 | "which": "^1.2.9" 265 | } 266 | }, 267 | "cssom": { 268 | "version": "0.3.4", 269 | "resolved": "http://registry.npm.taobao.org/cssom/download/cssom-0.3.4.tgz", 270 | "integrity": "sha1-jNUuijrP1o067TjuCmQBd9L515c=" 271 | }, 272 | "cssstyle": { 273 | "version": "1.1.1", 274 | "resolved": "http://registry.npm.taobao.org/cssstyle/download/cssstyle-1.1.1.tgz", 275 | "integrity": "sha1-GLA4qcRNZfeo5CimU7n2/kL69fs=", 276 | "requires": { 277 | "cssom": "0.3.x" 278 | } 279 | }, 280 | "dashdash": { 281 | "version": "1.14.1", 282 | "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", 283 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 284 | "requires": { 285 | "assert-plus": "^1.0.0" 286 | } 287 | }, 288 | "data-urls": { 289 | "version": "1.1.0", 290 | "resolved": "http://registry.npm.taobao.org/data-urls/download/data-urls-1.1.0.tgz", 291 | "integrity": "sha1-Fe4Fgrql4iu1nHcUDaj5x2lju/4=", 292 | "requires": { 293 | "abab": "^2.0.0", 294 | "whatwg-mimetype": "^2.2.0", 295 | "whatwg-url": "^7.0.0" 296 | }, 297 | "dependencies": { 298 | "whatwg-url": { 299 | "version": "7.0.0", 300 | "resolved": "http://registry.npm.taobao.org/whatwg-url/download/whatwg-url-7.0.0.tgz", 301 | "integrity": "sha1-/ekm+lSlmfOt+C3/Jan3vgLcbt0=", 302 | "requires": { 303 | "lodash.sortby": "^4.7.0", 304 | "tr46": "^1.0.1", 305 | "webidl-conversions": "^4.0.2" 306 | } 307 | } 308 | } 309 | }, 310 | "debug": { 311 | "version": "4.1.1", 312 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", 313 | "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", 314 | "dev": true, 315 | "requires": { 316 | "ms": "^2.1.1" 317 | } 318 | }, 319 | "deep-is": { 320 | "version": "0.1.3", 321 | "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", 322 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 323 | }, 324 | "delayed-stream": { 325 | "version": "1.0.0", 326 | "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", 327 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 328 | }, 329 | "doctrine": { 330 | "version": "2.1.0", 331 | "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz", 332 | "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", 333 | "dev": true, 334 | "requires": { 335 | "esutils": "^2.0.2" 336 | } 337 | }, 338 | "domexception": { 339 | "version": "1.0.1", 340 | "resolved": "http://registry.npm.taobao.org/domexception/download/domexception-1.0.1.tgz", 341 | "integrity": "sha1-k3RCZEymoxJh7zbj7Gd/6AVYLJA=", 342 | "requires": { 343 | "webidl-conversions": "^4.0.2" 344 | } 345 | }, 346 | "ecc-jsbn": { 347 | "version": "0.1.2", 348 | "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", 349 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 350 | "requires": { 351 | "jsbn": "~0.1.0", 352 | "safer-buffer": "^2.1.0" 353 | } 354 | }, 355 | "escape-string-regexp": { 356 | "version": "1.0.5", 357 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 358 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 359 | "dev": true 360 | }, 361 | "escodegen": { 362 | "version": "1.11.0", 363 | "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.11.0.tgz", 364 | "integrity": "sha1-snqTiUgdW/1b7Hb3ux6z+PRVZYk=", 365 | "requires": { 366 | "esprima": "^3.1.3", 367 | "estraverse": "^4.2.0", 368 | "esutils": "^2.0.2", 369 | "optionator": "^0.8.1", 370 | "source-map": "~0.6.1" 371 | }, 372 | "dependencies": { 373 | "esprima": { 374 | "version": "3.1.3", 375 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", 376 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 377 | } 378 | } 379 | }, 380 | "eslint": { 381 | "version": "5.12.1", 382 | "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-5.12.1.tgz", 383 | "integrity": "sha1-XKmTH7kCnQTnvpKwPOO1jt+sfjs=", 384 | "dev": true, 385 | "requires": { 386 | "@babel/code-frame": "^7.0.0", 387 | "ajv": "^6.5.3", 388 | "chalk": "^2.1.0", 389 | "cross-spawn": "^6.0.5", 390 | "debug": "^4.0.1", 391 | "doctrine": "^2.1.0", 392 | "eslint-scope": "^4.0.0", 393 | "eslint-utils": "^1.3.1", 394 | "eslint-visitor-keys": "^1.0.0", 395 | "espree": "^5.0.0", 396 | "esquery": "^1.0.1", 397 | "esutils": "^2.0.2", 398 | "file-entry-cache": "^2.0.0", 399 | "functional-red-black-tree": "^1.0.1", 400 | "glob": "^7.1.2", 401 | "globals": "^11.7.0", 402 | "ignore": "^4.0.6", 403 | "import-fresh": "^3.0.0", 404 | "imurmurhash": "^0.1.4", 405 | "inquirer": "^6.1.0", 406 | "js-yaml": "^3.12.0", 407 | "json-stable-stringify-without-jsonify": "^1.0.1", 408 | "levn": "^0.3.0", 409 | "lodash": "^4.17.5", 410 | "minimatch": "^3.0.4", 411 | "mkdirp": "^0.5.1", 412 | "natural-compare": "^1.4.0", 413 | "optionator": "^0.8.2", 414 | "path-is-inside": "^1.0.2", 415 | "pluralize": "^7.0.0", 416 | "progress": "^2.0.0", 417 | "regexpp": "^2.0.1", 418 | "semver": "^5.5.1", 419 | "strip-ansi": "^4.0.0", 420 | "strip-json-comments": "^2.0.1", 421 | "table": "^5.0.2", 422 | "text-table": "^0.2.0" 423 | } 424 | }, 425 | "eslint-scope": { 426 | "version": "4.0.0", 427 | "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.0.tgz", 428 | "integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=", 429 | "dev": true, 430 | "requires": { 431 | "esrecurse": "^4.1.0", 432 | "estraverse": "^4.1.1" 433 | } 434 | }, 435 | "eslint-utils": { 436 | "version": "1.3.1", 437 | "resolved": "http://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.3.1.tgz", 438 | "integrity": "sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI=", 439 | "dev": true 440 | }, 441 | "eslint-visitor-keys": { 442 | "version": "1.0.0", 443 | "resolved": "http://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz", 444 | "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", 445 | "dev": true 446 | }, 447 | "espree": { 448 | "version": "5.0.0", 449 | "resolved": "http://registry.npm.taobao.org/espree/download/espree-5.0.0.tgz", 450 | "integrity": "sha1-/H+YS2Kzag9UOxP7nNe59Kf1tlw=", 451 | "dev": true, 452 | "requires": { 453 | "acorn": "^6.0.2", 454 | "acorn-jsx": "^5.0.0", 455 | "eslint-visitor-keys": "^1.0.0" 456 | } 457 | }, 458 | "esprima": { 459 | "version": "4.0.1", 460 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", 461 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 462 | "dev": true 463 | }, 464 | "esquery": { 465 | "version": "1.0.1", 466 | "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz", 467 | "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", 468 | "dev": true, 469 | "requires": { 470 | "estraverse": "^4.0.0" 471 | } 472 | }, 473 | "esrecurse": { 474 | "version": "4.2.1", 475 | "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", 476 | "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", 477 | "dev": true, 478 | "requires": { 479 | "estraverse": "^4.1.0" 480 | } 481 | }, 482 | "estraverse": { 483 | "version": "4.2.0", 484 | "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", 485 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 486 | }, 487 | "esutils": { 488 | "version": "2.0.2", 489 | "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", 490 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 491 | }, 492 | "extend": { 493 | "version": "3.0.2", 494 | "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", 495 | "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" 496 | }, 497 | "external-editor": { 498 | "version": "3.0.3", 499 | "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz", 500 | "integrity": "sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic=", 501 | "dev": true, 502 | "requires": { 503 | "chardet": "^0.7.0", 504 | "iconv-lite": "^0.4.24", 505 | "tmp": "^0.0.33" 506 | } 507 | }, 508 | "extsprintf": { 509 | "version": "1.3.0", 510 | "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", 511 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 512 | }, 513 | "fast-deep-equal": { 514 | "version": "2.0.1", 515 | "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", 516 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 517 | }, 518 | "fast-json-stable-stringify": { 519 | "version": "2.0.0", 520 | "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", 521 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 522 | }, 523 | "fast-levenshtein": { 524 | "version": "2.0.6", 525 | "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", 526 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 527 | }, 528 | "figures": { 529 | "version": "2.0.0", 530 | "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", 531 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 532 | "dev": true, 533 | "requires": { 534 | "escape-string-regexp": "^1.0.5" 535 | } 536 | }, 537 | "file-entry-cache": { 538 | "version": "2.0.0", 539 | "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz", 540 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 541 | "dev": true, 542 | "requires": { 543 | "flat-cache": "^1.2.1", 544 | "object-assign": "^4.0.1" 545 | } 546 | }, 547 | "flat-cache": { 548 | "version": "1.3.4", 549 | "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.4.tgz", 550 | "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", 551 | "dev": true, 552 | "requires": { 553 | "circular-json": "^0.3.1", 554 | "graceful-fs": "^4.1.2", 555 | "rimraf": "~2.6.2", 556 | "write": "^0.2.1" 557 | } 558 | }, 559 | "forever-agent": { 560 | "version": "0.6.1", 561 | "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", 562 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 563 | }, 564 | "form-data": { 565 | "version": "2.3.3", 566 | "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", 567 | "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", 568 | "requires": { 569 | "asynckit": "^0.4.0", 570 | "combined-stream": "^1.0.6", 571 | "mime-types": "^2.1.12" 572 | } 573 | }, 574 | "fs.realpath": { 575 | "version": "1.0.0", 576 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 577 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 578 | "dev": true 579 | }, 580 | "functional-red-black-tree": { 581 | "version": "1.0.1", 582 | "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", 583 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 584 | "dev": true 585 | }, 586 | "getpass": { 587 | "version": "0.1.7", 588 | "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", 589 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 590 | "requires": { 591 | "assert-plus": "^1.0.0" 592 | } 593 | }, 594 | "glob": { 595 | "version": "7.1.3", 596 | "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", 597 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 598 | "dev": true, 599 | "requires": { 600 | "fs.realpath": "^1.0.0", 601 | "inflight": "^1.0.4", 602 | "inherits": "2", 603 | "minimatch": "^3.0.4", 604 | "once": "^1.3.0", 605 | "path-is-absolute": "^1.0.0" 606 | } 607 | }, 608 | "globals": { 609 | "version": "11.10.0", 610 | "resolved": "http://registry.npm.taobao.org/globals/download/globals-11.10.0.tgz", 611 | "integrity": "sha1-Hgl3bf/aXgGBazu0B3yLWcJOqlA=", 612 | "dev": true 613 | }, 614 | "graceful-fs": { 615 | "version": "4.1.15", 616 | "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz", 617 | "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=", 618 | "dev": true 619 | }, 620 | "har-schema": { 621 | "version": "2.0.0", 622 | "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", 623 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 624 | }, 625 | "har-validator": { 626 | "version": "5.1.3", 627 | "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", 628 | "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", 629 | "requires": { 630 | "ajv": "^6.5.5", 631 | "har-schema": "^2.0.0" 632 | } 633 | }, 634 | "has-flag": { 635 | "version": "3.0.0", 636 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 637 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 638 | "dev": true 639 | }, 640 | "html-encoding-sniffer": { 641 | "version": "1.0.2", 642 | "resolved": "http://registry.npm.taobao.org/html-encoding-sniffer/download/html-encoding-sniffer-1.0.2.tgz", 643 | "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", 644 | "requires": { 645 | "whatwg-encoding": "^1.0.1" 646 | } 647 | }, 648 | "http-signature": { 649 | "version": "1.2.0", 650 | "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", 651 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 652 | "requires": { 653 | "assert-plus": "^1.0.0", 654 | "jsprim": "^1.2.2", 655 | "sshpk": "^1.7.0" 656 | } 657 | }, 658 | "iconv-lite": { 659 | "version": "0.4.24", 660 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", 661 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 662 | "requires": { 663 | "safer-buffer": ">= 2.1.2 < 3" 664 | } 665 | }, 666 | "ignore": { 667 | "version": "4.0.6", 668 | "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", 669 | "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", 670 | "dev": true 671 | }, 672 | "import-fresh": { 673 | "version": "3.0.0", 674 | "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-3.0.0.tgz", 675 | "integrity": "sha1-o9iX9CDKsOZxI2iX91vBS0iFw5A=", 676 | "dev": true, 677 | "requires": { 678 | "parent-module": "^1.0.0", 679 | "resolve-from": "^4.0.0" 680 | } 681 | }, 682 | "imurmurhash": { 683 | "version": "0.1.4", 684 | "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", 685 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 686 | "dev": true 687 | }, 688 | "inflight": { 689 | "version": "1.0.6", 690 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 691 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 692 | "dev": true, 693 | "requires": { 694 | "once": "^1.3.0", 695 | "wrappy": "1" 696 | } 697 | }, 698 | "inherits": { 699 | "version": "2.0.3", 700 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 701 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 702 | "dev": true 703 | }, 704 | "inquirer": { 705 | "version": "6.2.1", 706 | "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.1.tgz", 707 | "integrity": "sha1-mUP8SIIWG9sLDJJ2dpx1sy2/zVI=", 708 | "dev": true, 709 | "requires": { 710 | "ansi-escapes": "^3.0.0", 711 | "chalk": "^2.0.0", 712 | "cli-cursor": "^2.1.0", 713 | "cli-width": "^2.0.0", 714 | "external-editor": "^3.0.0", 715 | "figures": "^2.0.0", 716 | "lodash": "^4.17.10", 717 | "mute-stream": "0.0.7", 718 | "run-async": "^2.2.0", 719 | "rxjs": "^6.1.0", 720 | "string-width": "^2.1.0", 721 | "strip-ansi": "^5.0.0", 722 | "through": "^2.3.6" 723 | }, 724 | "dependencies": { 725 | "ansi-regex": { 726 | "version": "4.0.0", 727 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.0.0.tgz", 728 | "integrity": "sha1-cN55Ht8CFATD/WFaqJEYrgQy5ak=", 729 | "dev": true 730 | }, 731 | "strip-ansi": { 732 | "version": "5.0.0", 733 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz", 734 | "integrity": "sha1-949otdCGbCCyybjGG1KYUI3IdW8=", 735 | "dev": true, 736 | "requires": { 737 | "ansi-regex": "^4.0.0" 738 | } 739 | } 740 | } 741 | }, 742 | "is-fullwidth-code-point": { 743 | "version": "2.0.0", 744 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 745 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 746 | "dev": true 747 | }, 748 | "is-promise": { 749 | "version": "2.1.0", 750 | "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", 751 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 752 | "dev": true 753 | }, 754 | "is-typedarray": { 755 | "version": "1.0.0", 756 | "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", 757 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 758 | }, 759 | "isexe": { 760 | "version": "2.0.0", 761 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 762 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 763 | "dev": true 764 | }, 765 | "isstream": { 766 | "version": "0.1.2", 767 | "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", 768 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 769 | }, 770 | "js-tokens": { 771 | "version": "4.0.0", 772 | "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", 773 | "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", 774 | "dev": true 775 | }, 776 | "js-yaml": { 777 | "version": "3.12.1", 778 | "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.1.tgz", 779 | "integrity": "sha1-KVyGMqGKI+BUz1ydPOyv5ngWdgA=", 780 | "dev": true, 781 | "requires": { 782 | "argparse": "^1.0.7", 783 | "esprima": "^4.0.0" 784 | } 785 | }, 786 | "jsbn": { 787 | "version": "0.1.1", 788 | "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", 789 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 790 | }, 791 | "jsdom": { 792 | "version": "11.12.0", 793 | "resolved": "http://registry.npm.taobao.org/jsdom/download/jsdom-11.12.0.tgz", 794 | "integrity": "sha1-GoDUDd03ih3lllbp5txaO6hle8g=", 795 | "requires": { 796 | "abab": "^2.0.0", 797 | "acorn": "^5.5.3", 798 | "acorn-globals": "^4.1.0", 799 | "array-equal": "^1.0.0", 800 | "cssom": ">= 0.3.2 < 0.4.0", 801 | "cssstyle": "^1.0.0", 802 | "data-urls": "^1.0.0", 803 | "domexception": "^1.0.1", 804 | "escodegen": "^1.9.1", 805 | "html-encoding-sniffer": "^1.0.2", 806 | "left-pad": "^1.3.0", 807 | "nwsapi": "^2.0.7", 808 | "parse5": "4.0.0", 809 | "pn": "^1.1.0", 810 | "request": "^2.87.0", 811 | "request-promise-native": "^1.0.5", 812 | "sax": "^1.2.4", 813 | "symbol-tree": "^3.2.2", 814 | "tough-cookie": "^2.3.4", 815 | "w3c-hr-time": "^1.0.1", 816 | "webidl-conversions": "^4.0.2", 817 | "whatwg-encoding": "^1.0.3", 818 | "whatwg-mimetype": "^2.1.0", 819 | "whatwg-url": "^6.4.1", 820 | "ws": "^5.2.0", 821 | "xml-name-validator": "^3.0.0" 822 | }, 823 | "dependencies": { 824 | "acorn": { 825 | "version": "5.7.3", 826 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.7.3.tgz", 827 | "integrity": "sha1-Z6ojG/iBKXS4UjWpZ3Hra9B+onk=" 828 | } 829 | } 830 | }, 831 | "json-schema": { 832 | "version": "0.2.3", 833 | "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", 834 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 835 | }, 836 | "json-schema-traverse": { 837 | "version": "0.4.1", 838 | "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", 839 | "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" 840 | }, 841 | "json-stable-stringify-without-jsonify": { 842 | "version": "1.0.1", 843 | "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", 844 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 845 | "dev": true 846 | }, 847 | "json-stringify-safe": { 848 | "version": "5.0.1", 849 | "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", 850 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 851 | }, 852 | "jsprim": { 853 | "version": "1.4.1", 854 | "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", 855 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 856 | "requires": { 857 | "assert-plus": "1.0.0", 858 | "extsprintf": "1.3.0", 859 | "json-schema": "0.2.3", 860 | "verror": "1.10.0" 861 | } 862 | }, 863 | "left-pad": { 864 | "version": "1.3.0", 865 | "resolved": "http://registry.npm.taobao.org/left-pad/download/left-pad-1.3.0.tgz", 866 | "integrity": "sha1-W4o6d2Xf4AEmHd6RVYnngvjJTR4=" 867 | }, 868 | "levn": { 869 | "version": "0.3.0", 870 | "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", 871 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 872 | "requires": { 873 | "prelude-ls": "~1.1.2", 874 | "type-check": "~0.3.2" 875 | } 876 | }, 877 | "lodash": { 878 | "version": "4.17.11", 879 | "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz", 880 | "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=" 881 | }, 882 | "lodash.sortby": { 883 | "version": "4.7.0", 884 | "resolved": "http://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz", 885 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 886 | }, 887 | "mime-db": { 888 | "version": "1.37.0", 889 | "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz", 890 | "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" 891 | }, 892 | "mime-types": { 893 | "version": "2.1.21", 894 | "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz", 895 | "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", 896 | "requires": { 897 | "mime-db": "~1.37.0" 898 | } 899 | }, 900 | "mimic-fn": { 901 | "version": "1.2.0", 902 | "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", 903 | "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", 904 | "dev": true 905 | }, 906 | "minimatch": { 907 | "version": "3.0.4", 908 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 909 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 910 | "dev": true, 911 | "requires": { 912 | "brace-expansion": "^1.1.7" 913 | } 914 | }, 915 | "minimist": { 916 | "version": "0.0.8", 917 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 918 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 919 | "dev": true 920 | }, 921 | "mkdirp": { 922 | "version": "0.5.1", 923 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 924 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 925 | "dev": true, 926 | "requires": { 927 | "minimist": "0.0.8" 928 | } 929 | }, 930 | "ms": { 931 | "version": "2.1.1", 932 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", 933 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", 934 | "dev": true 935 | }, 936 | "mute-stream": { 937 | "version": "0.0.7", 938 | "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", 939 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 940 | "dev": true 941 | }, 942 | "natural-compare": { 943 | "version": "1.4.0", 944 | "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", 945 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 946 | "dev": true 947 | }, 948 | "nice-try": { 949 | "version": "1.0.5", 950 | "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", 951 | "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", 952 | "dev": true 953 | }, 954 | "nwsapi": { 955 | "version": "2.0.9", 956 | "resolved": "http://registry.npm.taobao.org/nwsapi/download/nwsapi-2.0.9.tgz", 957 | "integrity": "sha1-d6wM39ytUrahFRqE5zJU7cM+0BY=" 958 | }, 959 | "oauth-sign": { 960 | "version": "0.9.0", 961 | "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", 962 | "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" 963 | }, 964 | "object-assign": { 965 | "version": "4.1.1", 966 | "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", 967 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 968 | "dev": true 969 | }, 970 | "once": { 971 | "version": "1.4.0", 972 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 973 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 974 | "dev": true, 975 | "requires": { 976 | "wrappy": "1" 977 | } 978 | }, 979 | "onetime": { 980 | "version": "2.0.1", 981 | "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", 982 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 983 | "dev": true, 984 | "requires": { 985 | "mimic-fn": "^1.0.0" 986 | } 987 | }, 988 | "optionator": { 989 | "version": "0.8.2", 990 | "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", 991 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 992 | "requires": { 993 | "deep-is": "~0.1.3", 994 | "fast-levenshtein": "~2.0.4", 995 | "levn": "~0.3.0", 996 | "prelude-ls": "~1.1.2", 997 | "type-check": "~0.3.2", 998 | "wordwrap": "~1.0.0" 999 | } 1000 | }, 1001 | "os-tmpdir": { 1002 | "version": "1.0.2", 1003 | "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", 1004 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1005 | "dev": true 1006 | }, 1007 | "parent-module": { 1008 | "version": "1.0.0", 1009 | "resolved": "http://registry.npm.taobao.org/parent-module/download/parent-module-1.0.0.tgz", 1010 | "integrity": "sha1-3yUL3FOR9KCF+1idrXYfWta4ZbU=", 1011 | "dev": true, 1012 | "requires": { 1013 | "callsites": "^3.0.0" 1014 | } 1015 | }, 1016 | "parse5": { 1017 | "version": "4.0.0", 1018 | "resolved": "http://registry.npm.taobao.org/parse5/download/parse5-4.0.0.tgz", 1019 | "integrity": "sha1-bXhlbj2o14tOwLkG98CO8d/j9gg=" 1020 | }, 1021 | "path-is-absolute": { 1022 | "version": "1.0.1", 1023 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 1024 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1025 | "dev": true 1026 | }, 1027 | "path-is-inside": { 1028 | "version": "1.0.2", 1029 | "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", 1030 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1031 | "dev": true 1032 | }, 1033 | "path-key": { 1034 | "version": "2.0.1", 1035 | "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", 1036 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1037 | "dev": true 1038 | }, 1039 | "performance-now": { 1040 | "version": "2.1.0", 1041 | "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", 1042 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1043 | }, 1044 | "pluralize": { 1045 | "version": "7.0.0", 1046 | "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz", 1047 | "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", 1048 | "dev": true 1049 | }, 1050 | "pn": { 1051 | "version": "1.1.0", 1052 | "resolved": "http://registry.npm.taobao.org/pn/download/pn-1.1.0.tgz", 1053 | "integrity": "sha1-4vTO8OIZ9GPBeas3Rj5OHs3Muvs=" 1054 | }, 1055 | "prelude-ls": { 1056 | "version": "1.1.2", 1057 | "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", 1058 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1059 | }, 1060 | "progress": { 1061 | "version": "2.0.3", 1062 | "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", 1063 | "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", 1064 | "dev": true 1065 | }, 1066 | "psl": { 1067 | "version": "1.1.31", 1068 | "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz", 1069 | "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=" 1070 | }, 1071 | "punycode": { 1072 | "version": "2.1.1", 1073 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", 1074 | "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" 1075 | }, 1076 | "qs": { 1077 | "version": "6.5.2", 1078 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", 1079 | "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" 1080 | }, 1081 | "regexpp": { 1082 | "version": "2.0.1", 1083 | "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", 1084 | "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", 1085 | "dev": true 1086 | }, 1087 | "request": { 1088 | "version": "2.88.0", 1089 | "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", 1090 | "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", 1091 | "requires": { 1092 | "aws-sign2": "~0.7.0", 1093 | "aws4": "^1.8.0", 1094 | "caseless": "~0.12.0", 1095 | "combined-stream": "~1.0.6", 1096 | "extend": "~3.0.2", 1097 | "forever-agent": "~0.6.1", 1098 | "form-data": "~2.3.2", 1099 | "har-validator": "~5.1.0", 1100 | "http-signature": "~1.2.0", 1101 | "is-typedarray": "~1.0.0", 1102 | "isstream": "~0.1.2", 1103 | "json-stringify-safe": "~5.0.1", 1104 | "mime-types": "~2.1.19", 1105 | "oauth-sign": "~0.9.0", 1106 | "performance-now": "^2.1.0", 1107 | "qs": "~6.5.2", 1108 | "safe-buffer": "^5.1.2", 1109 | "tough-cookie": "~2.4.3", 1110 | "tunnel-agent": "^0.6.0", 1111 | "uuid": "^3.3.2" 1112 | } 1113 | }, 1114 | "request-promise-core": { 1115 | "version": "1.1.1", 1116 | "resolved": "http://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.1.tgz", 1117 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 1118 | "requires": { 1119 | "lodash": "^4.13.1" 1120 | } 1121 | }, 1122 | "request-promise-native": { 1123 | "version": "1.0.5", 1124 | "resolved": "http://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.5.tgz", 1125 | "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", 1126 | "requires": { 1127 | "request-promise-core": "1.1.1", 1128 | "stealthy-require": "^1.1.0", 1129 | "tough-cookie": ">=2.3.3" 1130 | } 1131 | }, 1132 | "resolve-from": { 1133 | "version": "4.0.0", 1134 | "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", 1135 | "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", 1136 | "dev": true 1137 | }, 1138 | "restore-cursor": { 1139 | "version": "2.0.0", 1140 | "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", 1141 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1142 | "dev": true, 1143 | "requires": { 1144 | "onetime": "^2.0.0", 1145 | "signal-exit": "^3.0.2" 1146 | } 1147 | }, 1148 | "rimraf": { 1149 | "version": "2.6.3", 1150 | "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", 1151 | "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", 1152 | "dev": true, 1153 | "requires": { 1154 | "glob": "^7.1.3" 1155 | } 1156 | }, 1157 | "run-async": { 1158 | "version": "2.3.0", 1159 | "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", 1160 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1161 | "dev": true, 1162 | "requires": { 1163 | "is-promise": "^2.1.0" 1164 | } 1165 | }, 1166 | "rxjs": { 1167 | "version": "6.3.3", 1168 | "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-6.3.3.tgz", 1169 | "integrity": "sha1-PGp/pCDoRKgTkPsRWKnsYU9LrVU=", 1170 | "dev": true, 1171 | "requires": { 1172 | "tslib": "^1.9.0" 1173 | } 1174 | }, 1175 | "safe-buffer": { 1176 | "version": "5.1.2", 1177 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 1178 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 1179 | }, 1180 | "safer-buffer": { 1181 | "version": "2.1.2", 1182 | "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", 1183 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 1184 | }, 1185 | "sax": { 1186 | "version": "1.2.4", 1187 | "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", 1188 | "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" 1189 | }, 1190 | "semver": { 1191 | "version": "5.6.0", 1192 | "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz", 1193 | "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=", 1194 | "dev": true 1195 | }, 1196 | "shebang-command": { 1197 | "version": "1.2.0", 1198 | "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 1199 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1200 | "dev": true, 1201 | "requires": { 1202 | "shebang-regex": "^1.0.0" 1203 | } 1204 | }, 1205 | "shebang-regex": { 1206 | "version": "1.0.0", 1207 | "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 1208 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1209 | "dev": true 1210 | }, 1211 | "signal-exit": { 1212 | "version": "3.0.2", 1213 | "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 1214 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1215 | "dev": true 1216 | }, 1217 | "slice-ansi": { 1218 | "version": "2.0.0", 1219 | "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.0.0.tgz", 1220 | "integrity": "sha1-U3O9uFWbRWduhUHGaRbN1iUWEuc=", 1221 | "dev": true, 1222 | "requires": { 1223 | "ansi-styles": "^3.2.0", 1224 | "astral-regex": "^1.0.0", 1225 | "is-fullwidth-code-point": "^2.0.0" 1226 | } 1227 | }, 1228 | "source-map": { 1229 | "version": "0.6.1", 1230 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", 1231 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", 1232 | "optional": true 1233 | }, 1234 | "sprintf-js": { 1235 | "version": "1.0.3", 1236 | "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", 1237 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1238 | "dev": true 1239 | }, 1240 | "sshpk": { 1241 | "version": "1.16.1", 1242 | "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", 1243 | "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", 1244 | "requires": { 1245 | "asn1": "~0.2.3", 1246 | "assert-plus": "^1.0.0", 1247 | "bcrypt-pbkdf": "^1.0.0", 1248 | "dashdash": "^1.12.0", 1249 | "ecc-jsbn": "~0.1.1", 1250 | "getpass": "^0.1.1", 1251 | "jsbn": "~0.1.0", 1252 | "safer-buffer": "^2.0.2", 1253 | "tweetnacl": "~0.14.0" 1254 | } 1255 | }, 1256 | "stealthy-require": { 1257 | "version": "1.1.1", 1258 | "resolved": "http://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz", 1259 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1260 | }, 1261 | "string-width": { 1262 | "version": "2.1.1", 1263 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 1264 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 1265 | "dev": true, 1266 | "requires": { 1267 | "is-fullwidth-code-point": "^2.0.0", 1268 | "strip-ansi": "^4.0.0" 1269 | } 1270 | }, 1271 | "strip-ansi": { 1272 | "version": "4.0.0", 1273 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 1274 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1275 | "dev": true, 1276 | "requires": { 1277 | "ansi-regex": "^3.0.0" 1278 | } 1279 | }, 1280 | "strip-json-comments": { 1281 | "version": "2.0.1", 1282 | "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", 1283 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1284 | "dev": true 1285 | }, 1286 | "supports-color": { 1287 | "version": "5.5.0", 1288 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", 1289 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 1290 | "dev": true, 1291 | "requires": { 1292 | "has-flag": "^3.0.0" 1293 | } 1294 | }, 1295 | "symbol-tree": { 1296 | "version": "3.2.2", 1297 | "resolved": "http://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", 1298 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 1299 | }, 1300 | "table": { 1301 | "version": "5.2.1", 1302 | "resolved": "http://registry.npm.taobao.org/table/download/table-5.2.1.tgz", 1303 | "integrity": "sha1-54RjcCsb6fcTHDmGC8+xuBEUwqE=", 1304 | "dev": true, 1305 | "requires": { 1306 | "ajv": "^6.6.1", 1307 | "lodash": "^4.17.11", 1308 | "slice-ansi": "2.0.0", 1309 | "string-width": "^2.1.1" 1310 | } 1311 | }, 1312 | "text-table": { 1313 | "version": "0.2.0", 1314 | "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", 1315 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1316 | "dev": true 1317 | }, 1318 | "through": { 1319 | "version": "2.3.8", 1320 | "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", 1321 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1322 | "dev": true 1323 | }, 1324 | "tmp": { 1325 | "version": "0.0.33", 1326 | "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", 1327 | "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", 1328 | "dev": true, 1329 | "requires": { 1330 | "os-tmpdir": "~1.0.2" 1331 | } 1332 | }, 1333 | "tough-cookie": { 1334 | "version": "2.4.3", 1335 | "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", 1336 | "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", 1337 | "requires": { 1338 | "psl": "^1.1.24", 1339 | "punycode": "^1.4.1" 1340 | }, 1341 | "dependencies": { 1342 | "punycode": { 1343 | "version": "1.4.1", 1344 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", 1345 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1346 | } 1347 | } 1348 | }, 1349 | "tr46": { 1350 | "version": "1.0.1", 1351 | "resolved": "http://registry.npm.taobao.org/tr46/download/tr46-1.0.1.tgz", 1352 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 1353 | "requires": { 1354 | "punycode": "^2.1.0" 1355 | } 1356 | }, 1357 | "tslib": { 1358 | "version": "1.9.3", 1359 | "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz", 1360 | "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=", 1361 | "dev": true 1362 | }, 1363 | "tunnel-agent": { 1364 | "version": "0.6.0", 1365 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", 1366 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1367 | "requires": { 1368 | "safe-buffer": "^5.0.1" 1369 | } 1370 | }, 1371 | "turndown": { 1372 | "version": "5.0.3", 1373 | "resolved": "http://registry.npm.taobao.org/turndown/download/turndown-5.0.3.tgz", 1374 | "integrity": "sha1-oTULZhVdeJHxDkUUMhcLD3zXRJo=", 1375 | "requires": { 1376 | "jsdom": "^11.9.0" 1377 | } 1378 | }, 1379 | "tweetnacl": { 1380 | "version": "0.14.5", 1381 | "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", 1382 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1383 | }, 1384 | "type-check": { 1385 | "version": "0.3.2", 1386 | "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", 1387 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1388 | "requires": { 1389 | "prelude-ls": "~1.1.2" 1390 | } 1391 | }, 1392 | "uri-js": { 1393 | "version": "4.2.2", 1394 | "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", 1395 | "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", 1396 | "requires": { 1397 | "punycode": "^2.1.0" 1398 | } 1399 | }, 1400 | "uuid": { 1401 | "version": "3.3.2", 1402 | "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", 1403 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" 1404 | }, 1405 | "verror": { 1406 | "version": "1.10.0", 1407 | "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", 1408 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1409 | "requires": { 1410 | "assert-plus": "^1.0.0", 1411 | "core-util-is": "1.0.2", 1412 | "extsprintf": "^1.2.0" 1413 | } 1414 | }, 1415 | "w3c-hr-time": { 1416 | "version": "1.0.1", 1417 | "resolved": "http://registry.npm.taobao.org/w3c-hr-time/download/w3c-hr-time-1.0.1.tgz", 1418 | "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", 1419 | "requires": { 1420 | "browser-process-hrtime": "^0.1.2" 1421 | } 1422 | }, 1423 | "webidl-conversions": { 1424 | "version": "4.0.2", 1425 | "resolved": "http://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.2.tgz", 1426 | "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=" 1427 | }, 1428 | "whatwg-encoding": { 1429 | "version": "1.0.5", 1430 | "resolved": "http://registry.npm.taobao.org/whatwg-encoding/download/whatwg-encoding-1.0.5.tgz", 1431 | "integrity": "sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA=", 1432 | "requires": { 1433 | "iconv-lite": "0.4.24" 1434 | } 1435 | }, 1436 | "whatwg-mimetype": { 1437 | "version": "2.3.0", 1438 | "resolved": "http://registry.npm.taobao.org/whatwg-mimetype/download/whatwg-mimetype-2.3.0.tgz", 1439 | "integrity": "sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78=" 1440 | }, 1441 | "whatwg-url": { 1442 | "version": "6.5.0", 1443 | "resolved": "http://registry.npm.taobao.org/whatwg-url/download/whatwg-url-6.5.0.tgz", 1444 | "integrity": "sha1-8t8Cv/F2/WUHDfdK1cy7WhmZZag=", 1445 | "requires": { 1446 | "lodash.sortby": "^4.7.0", 1447 | "tr46": "^1.0.1", 1448 | "webidl-conversions": "^4.0.2" 1449 | } 1450 | }, 1451 | "which": { 1452 | "version": "1.3.1", 1453 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", 1454 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 1455 | "dev": true, 1456 | "requires": { 1457 | "isexe": "^2.0.0" 1458 | } 1459 | }, 1460 | "wordwrap": { 1461 | "version": "1.0.0", 1462 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", 1463 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1464 | }, 1465 | "wrappy": { 1466 | "version": "1.0.2", 1467 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 1468 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1469 | "dev": true 1470 | }, 1471 | "write": { 1472 | "version": "0.2.1", 1473 | "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz", 1474 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1475 | "dev": true, 1476 | "requires": { 1477 | "mkdirp": "^0.5.1" 1478 | } 1479 | }, 1480 | "ws": { 1481 | "version": "5.2.2", 1482 | "resolved": "http://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz", 1483 | "integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=", 1484 | "requires": { 1485 | "async-limiter": "~1.0.0" 1486 | } 1487 | }, 1488 | "xml-name-validator": { 1489 | "version": "3.0.0", 1490 | "resolved": "http://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-3.0.0.tgz", 1491 | "integrity": "sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo=" 1492 | } 1493 | } 1494 | } 1495 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@oliyg/juejinxiaoce", 3 | "version": "2.2.4", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/oliyg/juejinxiaoce.git" 12 | }, 13 | "keywords": [], 14 | "bin": { 15 | "juejinxiaoce": "bin/juejinxiaoce" 16 | }, 17 | "author": "OliverYoung ", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/oliyg/juejinxiaoce/issues" 21 | }, 22 | "homepage": "https://github.com/oliyg/juejinxiaoce#readme", 23 | "devDependencies": { 24 | "eslint": "^5.12.1" 25 | }, 26 | "dependencies": { 27 | "turndown": "^5.0.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Foliyg%2Fjuejinxiaoce.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Foliyg%2Fjuejinxiaoce?ref=badge_shield) 2 | 3 | # 🔥 掘金小册 markdown 转换器 4 | 5 | ![20190121001820.png](https://i.loli.net/2019/01/21/5c449f4dbc3d5.png) 6 | 7 | [github 仓库欢迎 star](https://github.com/oliyg/juejinxiaoce) 8 | 9 | 采用 node https 模块,获取已购买小册 html 代码,并将 html 代码转换为 markdown 格式文件保存本地。 10 | 11 | **注意:目前本项目有两个版本,v2 不需要使用 chromium 作为无头浏览器;v1 则使用 chromi 作为无头浏览器模拟用户登录网站;** 12 | 13 | 根据需要选择不同版本 14 | 15 | - v2: 16 | - [latest](https://github.com/oliyg/juejinxiaoce/releases) 17 | - v1 不再维护: 18 | - [release v1](https://github.com/oliyg/juejinxiaoce/releases/tag/1.1.2) 19 | 20 | ## 使用方法 21 | 22 | **⚠️ 注意:掘金不支持境外网络访问,因此不要使用代理** 23 | 24 | ### 方法一:npx 直接执行 25 | 26 | 在本地某目录中执行 `npx @oliyg/juejinxiaoce` 按照提示输入用户名密码以及小册 ID 当提示 all done 完成 27 | 28 | ``` 29 | ➜ Desktop npx @oliyg/juejinxiaoce 30 | npx: 98 安装成功,用时 10.748 秒 31 | email: 输入你的用户名密码 32 | password: 输入你的用户名密码 33 | bookId: 小册 ID 34 | ===navagating to main page 35 | ===login... 36 | ===getting book section list 37 | ===getting book HTML content 38 | 面试常用技巧 39 | ===writing html... 40 | ===getting book HTML content 41 | ===write html file success 42 | ===writing markdown... 43 | ===write markdown file success 44 | 前方的路,让我们结伴同行 45 | ===writing html... 46 | ===write html file success 47 | ===writing markdown... 48 | ===write markdown file success 49 | 50 | ====== 51 | All Done...Enjoy. 52 | ====== 53 | ``` 54 | 55 | 在执行命令的这个目录中可以找到一个名为 md xxx 的文件夹,内包含 md 文档;在上面这个例子中,我们在 Desktop 桌面目录执行命令,因此在桌面目录中会生成这个文件夹: 56 | 57 | ```shell 58 | ➜ md 1548483715543 ls -al 59 | total 40 60 | drwxr-xr-x 4 oli staff 128 1 26 14:22 . 61 | drwx------+ 9 oli staff 288 1 26 14:21 .. 62 | -rw-r--r-- 1 oli staff 4915 1 26 14:21 面试常用技巧.md 63 | -rw-r--r-- 1 oli staff 8465 1 26 14:22 前方的路,让我们结伴同行.md 64 | ``` 65 | 66 | ### 方法二:npm i 命令 67 | 68 | 使用 `npm i -g` 安装,并使用 `juejinxiaoce` 命令执行: 69 | 70 | ``` 71 | ➜ Desktop npm i -g @oliyg/juejinxiaoce 72 | /Users/oli/.nvm/versions/node/v8.12.0/bin/juejinxiaoce -> /Users/oli/.nvm/versions/node/v8.12.0/lib/node_modules/@oliyg/juejinxiaoce/bin/juejinxiaoce 73 | + @oliyg/juejinxiaoce@2.2.1 74 | added 98 packages from 201 contributors in 5.89s 75 | ➜ Desktop juejinxiaoce 76 | email: 77 | password: 78 | bookId: 79 | ===navagating to main page 80 | ===login... 81 | ... 82 | ... 83 | ``` 84 | 85 | > 小册ID见 URL 链接: 86 | > 87 | > ![20190120235353.png](https://i.loli.net/2019/01/20/5c4499929e48e.png) 88 | 89 | 执行后等待出现消息 `all done. enjoy.` 完成转换,效果如下: 90 | 91 | ![20190121000703.png](https://i.loli.net/2019/01/21/5c449ca8d869e.png) 92 | 93 | ![20190121000715.png](https://i.loli.net/2019/01/21/5c449cb443d62.png) 94 | 95 | ## 更新日志 96 | 97 | - v2.2.4 修改文件名 98 | - v2.2.0 增加命令行模式 99 | - v2.0.0 使用 node 原生 https 模块,发送请求数据获取内容,不需要安装 chromium,没有软件权限问题 100 | - v1.1.2 使用谷歌 puppeteer 作为无头浏览器获取内容,需要安装 chromium,macOS 中可能有权限问题 101 | 102 | ## 常见问题 103 | 104 | - v1.1.2 105 | - 报错:spawn EACCES 106 | - 常见于 macOS,请保证 chromium 已被正常安装 107 | 108 | ## 开源贡献 109 | 110 | - 感谢 `@yangchendoit` 提交的 pr 完善手机号码登录功能 111 | 112 | ## 免责 113 | 114 | - 不提供用户名和密码,需使用用户自己的账号密码登录 115 | - 仅作为技术讨论,学习和研究使用 116 | 117 | ## 隐私 118 | 119 | - 该项目不会存储和发送任何用户隐私数据 120 | 121 | ## License 122 | 123 | The MIT License (MIT) 124 | Copyright (c) 2019 OliverYoung 125 | 126 | 127 | Permission is hereby granted, free of charge, to any person obtaining a copy 128 | of this software and associated documentation files (the "Software"), to deal 129 | in the Software without restriction, including without limitation the rights 130 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 131 | copies of the Software, and to permit persons to whom the Software is 132 | furnished to do so, subject to the following conditions: 133 | 134 | The above copyright notice and this permission notice shall be included in all 135 | copies or substantial portions of the Software. 136 | 137 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 138 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 139 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 140 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 141 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 142 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 143 | OR OTHER DEALINGS IN THE SOFTWARE. 144 | 145 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Foliyg%2Fjuejinxiaoce.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Foliyg%2Fjuejinxiaoce?ref=badge_large) 146 | -------------------------------------------------------------------------------- /utils.js: -------------------------------------------------------------------------------- 1 | const https = require('https') 2 | const fs = require('fs') 3 | const path = require('path') 4 | const process = require('process') 5 | 6 | const mkdir = dirname => { 7 | const outputdir = path.resolve(process.env.PWD, dirname) 8 | fs.existsSync(outputdir) || fs.mkdirSync(outputdir) 9 | } 10 | 11 | const rmfile = ext => { 12 | const outputdir = path.resolve(__dirname, 'dist', ext) 13 | const fileList = fs.readdirSync(outputdir).filter(item => path.extname(item) === '.' + ext) 14 | fileList.forEach(file => { 15 | fs.unlinkSync(path.join(outputdir, file)) 16 | }) 17 | } 18 | 19 | const sleep = async(wait = 1000) => { 20 | return new Promise(res => { 21 | setTimeout(() => { 22 | res(1) 23 | }, wait) 24 | }) 25 | } 26 | 27 | function sendGet(hostname, path, headers) { 28 | return new Promise((resolve, reject) => { 29 | const req = https.request({ 30 | hostname, port: 443, path, method: 'GET' 31 | }, res => { 32 | let data = '' 33 | res.on('data', chunk => { data = data + chunk.toString() }) 34 | res.on('error', reject) 35 | res.on('end', () => { 36 | resolve({ 37 | headers: res.headers, 38 | data 39 | }) 40 | }) 41 | }) 42 | setHeaders(req, headers) 43 | req.on('error', reject) 44 | req.end() 45 | }) 46 | } 47 | 48 | function sendPost(hostname, path, data, headers) { 49 | return new Promise((resolve, reject) => { 50 | const req = https.request({ 51 | hostname, path, port: 443, method: 'POST' 52 | }, res => { 53 | let data = '' 54 | res.on('data', chunk => { data = data + chunk.toString() }) 55 | res.on('end', () => { resolve({ 56 | res, 57 | data 58 | }) }) 59 | res.on('error', reject) 60 | }) 61 | 62 | setHeaders(req, headers) 63 | req.on('error', reject) 64 | req.write(data) 65 | req.end() 66 | }) 67 | } 68 | 69 | function setHeaders(req, obj) { 70 | for (const key in obj) { 71 | if (obj.hasOwnProperty(key)) { 72 | req.setHeader(key, obj[key]) 73 | } 74 | } 75 | } 76 | 77 | function getCookieObj(cookie_arr) { 78 | cookie_arr = cookie_arr.map(item => item.split('; path=')[0]) 79 | cookie_arr = cookie_arr.map(item => item.split('=')) 80 | let result = {} 81 | cookie_arr.forEach(item => { 82 | result[item[0]] = item[1] 83 | }) 84 | return result 85 | } 86 | 87 | function getCookieArr(cookie_obj) { 88 | const result = [] 89 | for (const key in cookie_obj) { 90 | if (cookie_obj.hasOwnProperty(key)) { 91 | const value = cookie_obj[key] 92 | result.push(key + '=' + value) 93 | } 94 | } 95 | return result 96 | } 97 | 98 | module.exports = { 99 | setHeaders, getCookieObj, getCookieArr, sendPost, sendGet, sleep, rmfile, mkdir 100 | } 101 | --------------------------------------------------------------------------------