├── .eslintrc.json ├── .gitignore ├── static ├── less │ └── style.less ├── templates │ ├── partials │ │ └── sso-qq │ │ │ ├── email.tpl │ │ │ └── deauth.tpl │ └── admin │ │ └── plugins │ │ └── sso-qq.tpl └── lib │ └── admin.js ├── .editorconfig ├── README.md ├── package.json ├── plugin.json ├── .npmignore ├── library.js └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "standard" 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .idea/ 4 | -------------------------------------------------------------------------------- /static/less/style.less: -------------------------------------------------------------------------------- 1 | .qq-token i{ 2 | color:#03A9F4; 3 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # 4 space indentation 2 | [*.js] 3 | indent_style = space 4 | indent_size = 2 -------------------------------------------------------------------------------- /static/templates/partials/sso-qq/email.tpl: -------------------------------------------------------------------------------- 1 |

2 | 社区管理员要求您必须完善 Email 地址。 3 |

4 |
5 | 6 | 7 |
-------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NodeBB-插件 QQ登入 2 | 3 | 可以让你通过 QQ账户 登陆/注册 的NodeBB插件 4 | 5 | ----- 6 | > ~~`1.4.x` 我们将会加入QQ头像的选择。(类似Gravatar)~~ 7 | > `2.x.x` ~~我们加入QQ头像, 允许解绑操作。~~ 8 | > `3.x.x` 我们将加入注册表单(我们不再直接新建用户,用户可以选择登录以绑定或者填写信息注册新用户) 9 | 10 | 11 | ## 安装 12 | ``` 13 | npm install nodebb-plugin-sso-qq-fix 14 | ``` 15 | 请在后台中配置您的QQ互联 ID 和 Key. 16 | > 请把在后台中显示的 Callback URL 填写在QQ互联中。 17 | 18 | ---- 19 | > 该插件参考了: 20 | > `nodebb-plugin-sso-gihtub` 21 | > `nodebb-plugin-sso-qq` 22 | > `nodebb-plugin-sso-qq-new` 23 | > `nodebb-plugin-sso-twitter` -------------------------------------------------------------------------------- /static/templates/partials/sso-qq/deauth.tpl: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

[[user:sso.dissociate-confirm-title]]

5 |
6 |
7 | [[user:sso.dissociate-confirm, {service}]] 8 | 9 |
10 | 11 |
12 | 13 | 14 |
15 |
16 |
17 |
-------------------------------------------------------------------------------- /static/lib/admin.js: -------------------------------------------------------------------------------- 1 | define('admin/plugins/sso-qq', ['settings'], function(Settings) { 2 | 'use strict'; 3 | /* globals $, app, socket, require */ 4 | 5 | var ACP = {}; 6 | 7 | ACP.init = function() { 8 | Settings.load('sso-qq', $('.sso-qq-settings')); 9 | 10 | $('#save').on('click', function() { 11 | Settings.save('sso-qq', $('.sso-qq-settings'), function() { 12 | app.alert({ 13 | type: 'success', 14 | alert_id: 'sso-qq-saved', 15 | title: '配置已保存', 16 | message: '请重载NodeBB以便使插件生效。', 17 | clickfn: function() { 18 | socket.emit('admin.reload'); 19 | } 20 | }); 21 | }); 22 | }); 23 | }; 24 | 25 | return ACP; 26 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodebb-plugin-sso-qq-fix", 3 | "version": "2.3.11", 4 | "description": "NodeBB Plugin that allows users to login/register via their QQ account.", 5 | "main": "library.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/NodeBB-China/nodebb-plugin-sso-qq-fix" 9 | }, 10 | "keywords": [ 11 | "nodebb", 12 | "plugin", 13 | "qq", 14 | "sso", 15 | "single sign on", 16 | "registration" 17 | ], 18 | "author": { 19 | "name": "A632079", 20 | "email": "a632079@gmail.com" 21 | }, 22 | "contributors": [ 23 | { 24 | "name": "A632079", 25 | "email": "a632079@gmail.com", 26 | "url": "https://github.com/NodeBB-China/nodebb-plugin-sso-qq-fix" 27 | } 28 | ], 29 | "license": "BSD-2-Clause", 30 | "readme": "", 31 | "readmeFilename": "README.md", 32 | "bugs": { 33 | "url": "https://github.com/NodeBB-China/nodebb-plugin-sso-qq-fix/issues" 34 | }, 35 | "dependencies": { 36 | "passport-qq2015-fix": "2.0.1" 37 | }, 38 | "nbbpm": { 39 | "compatibility": "^1.11.0" 40 | }, 41 | "devDependencies": { 42 | "eslint": "*", 43 | "eslint-config-standard": "^10.2.1", 44 | "eslint-plugin-import": "^2.8.0", 45 | "eslint-plugin-node": "^5.2.1", 46 | "eslint-plugin-promise": "^3.6.0", 47 | "eslint-plugin-standard": "^3.0.1" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "nodebb-plugin-sso-qq-fix", 3 | "name": "NodeBB QQ SSO", 4 | "description": "NodeBB Plugin that allows users to login/register via their QQ account.", 5 | "url": "https://github.com/NodeBB-China/nodebb-plugin-sso-qq-fix", 6 | "library": "./library.js", 7 | "hooks": [ 8 | { 9 | "hook": "static:app.load", 10 | "method": "init" 11 | }, 12 | { 13 | "hook": "filter:auth.init", 14 | "method": "getStrategy" 15 | }, 16 | { 17 | "hook": "static:user.delete", 18 | "method": "deleteUserData" 19 | }, 20 | { 21 | "hook": "filter:auth.list", 22 | "method": "getAssociation" 23 | }, 24 | { 25 | "hook": "filter:admin.header.build", 26 | "method": "addMenuItem" 27 | }, 28 | { 29 | "hook": "filter:user.listPictures", 30 | "method": "list" 31 | }, 32 | { 33 | "hook": "filter:user.getPicture", 34 | "method": "get" 35 | }, 36 | { 37 | "hook": "filter:register.interstitial", 38 | "method": "prepareInterstitial" 39 | }, 40 | { 41 | "hook": "filter:user.whitelistFields", 42 | "method": "appendUserHashWhitelist" 43 | } 44 | ], 45 | "staticDirs": { 46 | "static": "./static" 47 | }, 48 | "templates": "static/templates", 49 | "less": [ 50 | "static/less/style.less" 51 | ], 52 | "acpScripts": [ 53 | "static/lib/admin.js" 54 | ] 55 | } -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Dd]ebug/ 47 | [Rr]elease/ 48 | x64/ 49 | build/ 50 | [Bb]in/ 51 | [Oo]bj/ 52 | 53 | # MSTest test Results 54 | [Tt]est[Rr]esult*/ 55 | [Bb]uild[Ll]og.* 56 | 57 | *_i.c 58 | *_p.c 59 | *.ilk 60 | *.meta 61 | *.obj 62 | *.pch 63 | *.pdb 64 | *.pgc 65 | *.pgd 66 | *.rsp 67 | *.sbr 68 | *.tlb 69 | *.tli 70 | *.tlh 71 | *.tmp 72 | *.tmp_proj 73 | *.log 74 | *.vspscc 75 | *.vssscc 76 | .builds 77 | *.pidb 78 | *.log 79 | *.scc 80 | 81 | # Visual C++ cache files 82 | ipch/ 83 | *.aps 84 | *.ncb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | 101 | # TeamCity is a build add-in 102 | _TeamCity* 103 | 104 | # DotCover is a Code Coverage Tool 105 | *.dotCover 106 | 107 | # NCrunch 108 | *.ncrunch* 109 | .*crunch*.local.xml 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.Publish.xml 129 | *.pubxml 130 | 131 | # NuGet Packages Directory 132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 133 | #packages/ 134 | 135 | # Windows Azure Build Output 136 | csx 137 | *.build.csdef 138 | 139 | # Windows Store app package directory 140 | AppPackages/ 141 | 142 | # Others 143 | sql/ 144 | *.Cache 145 | ClientBin/ 146 | [Ss]tyle[Cc]op.* 147 | ~$* 148 | *~ 149 | *.dbmdl 150 | *.[Pp]ublish.xml 151 | *.pfx 152 | *.publishsettings 153 | 154 | # RIA/Silverlight projects 155 | Generated_Code/ 156 | 157 | # Backup & report files from converting an old project file to a newer 158 | # Visual Studio version. Backup files are not needed, because we have git ;-) 159 | _UpgradeReport_Files/ 160 | Backup*/ 161 | UpgradeLog*.XML 162 | UpgradeLog*.htm 163 | 164 | # SQL Server files 165 | App_Data/*.mdf 166 | App_Data/*.ldf 167 | 168 | ############# 169 | ## Windows detritus 170 | ############# 171 | 172 | # Windows image file caches 173 | Thumbs.db 174 | ehthumbs.db 175 | 176 | # Folder config file 177 | Desktop.ini 178 | 179 | # Recycle Bin used on file shares 180 | $RECYCLE.BIN/ 181 | 182 | # Mac crap 183 | .DS_Store 184 | 185 | 186 | ############# 187 | ## Python 188 | ############# 189 | 190 | *.py[co] 191 | 192 | # Packages 193 | *.egg 194 | *.egg-info 195 | dist/ 196 | build/ 197 | eggs/ 198 | parts/ 199 | var/ 200 | sdist/ 201 | develop-eggs/ 202 | .installed.cfg 203 | 204 | # Installer logs 205 | pip-log.txt 206 | 207 | # Unit test / coverage reports 208 | .coverage 209 | .tox 210 | 211 | #Translations 212 | *.mo 213 | 214 | #Mr Developer 215 | .mr.developer.cfg 216 | 217 | sftp-config.json 218 | node_modules/ 219 | .idea 220 | 221 | package-lock.json 222 | yarn.lock 223 | -------------------------------------------------------------------------------- /static/templates/admin/plugins/sso-qq.tpl: -------------------------------------------------------------------------------- 1 |
2 |
QQ 单点登录
3 |
4 |
5 | 6 | 7 |

8 | 如果使用碰到问题(崩溃,删除/添加用户错误),请到我们的 issue 中反馈! 9 |

10 |
11 |
12 |

13 | 注册 QQ互联 ,然后把你的APP ID和APP Key复制到下面 14 | 15 |

16 |
17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |

30 | 请将上面的地址填写在你的QQ互联应用中。 31 |

32 |
33 | 34 |
35 |
36 |
37 | 38 | 41 | 42 | 75 | 95 | 96 | -------------------------------------------------------------------------------- /library.js: -------------------------------------------------------------------------------- 1 | (function (module) { 2 | 'use strict' 3 | // 感谢各位的支持,如果可能,我以后会使用 es6/7 的技术重写本插件的 4 | 5 | // 声明所需的模块 6 | const User = require.main.require('./src/user') 7 | const db = require.main.require('./src/database') 8 | const meta = require.main.require('./src/meta') 9 | const async = require.main.require('async') 10 | const nconf = require.main.require('nconf') 11 | // const utils = require.main.require('./src/public/src/utils') 12 | const passport = require.main.require('passport') 13 | const QQStrategy = require('passport-qq2015-fix').Strategy 14 | // const fs = require.main.require('fs') 15 | const winston = require.main.require('winston') 16 | // const path = require.main.require('path') 17 | const authenticationController = require.main.require('./src/controllers/authentication') 18 | 19 | // 定义本插件的一些信息 20 | const constants = Object.freeze({ 21 | 'name': 'QQ', 22 | 'admin': { 23 | 'icon': 'fa-qq', 24 | 'route': '/plugins/sso-qq' 25 | } 26 | }) 27 | 28 | const QQ = {} // 初始化对象 29 | 30 | // 配置好QQ的passport验证器 31 | QQ.getStrategy = function (strategies, callback) { 32 | // 获取配置 33 | meta.settings.get('sso-qq', function (err, settings) { 34 | if (!err && settings['id'] && settings['secret']) { 35 | // 配置passort 36 | passport.use('qq-token', new QQStrategy({ 37 | clientID: settings['id'], 38 | clientSecret: settings['secret'], 39 | callbackURL: nconf.get('url') + '/auth/qq/callback', 40 | passReqToCallback: true 41 | }, function (req, accessToken, refreshToken, profile, done) { 42 | try { 43 | profile = JSON.parse(profile) 44 | } catch (e) { 45 | done(e) 46 | } 47 | if (profile.ret === -1) { // Try Catch Error 48 | winston.error('[SSO-QQ]The Profile return -1,skipped.') 49 | return done(new Error("There's something wrong with your request or QQ Connect API.Please try again.")) 50 | } 51 | // 存储头像信息 52 | let avatar = (profile.figureurl_qq_2 == null) ? profile.figureurl_qq_1 : profile.figureurl_qq_2 // Set avatar image 53 | avatar = avatar.replace('http://', 'https://') 54 | // 如果用户已经登录,那么我们就绑定他 55 | if (req.hasOwnProperty('user') && req.user.hasOwnProperty('uid') && req.user.uid > 0) { 56 | // 如果用户想重复绑定的话,我们就拒绝他。 57 | QQ.hasQQID(profile.id, function (err, res) { 58 | if (err) { 59 | winston.error(err) 60 | return done(err) 61 | } else { 62 | if (res) { 63 | winston.error('[sso-qq] qqid:' + profile.id + 'is binded.') 64 | // qqid is exist 65 | return done(new Error('[[error:sso-multiple-association]]')) 66 | } else { 67 | User.setUserField(req.user.uid, 'qqid', profile.id) 68 | db.setObjectField('qqid:uid', profile.id, req.user.uid) 69 | User.setUserField(req.user.uid, 'qqpic', avatar) 70 | winston.info('[sso-qq]user:' + req.user.uid + 'is binded.(openid is ' + profile.id + ' and nickname is ' + profile.nickname + ')') 71 | return done(null, req.user) 72 | } 73 | } 74 | }) 75 | } else { 76 | // 登录方法 77 | var email = profile.id + '@noreply.qq.com' 78 | QQ.login(profile.id, profile.nickname, avatar, email, function (err, user) { // 3.29 add avatar 79 | if (err) { 80 | return done(err) 81 | } else { 82 | // Require collection of email 83 | if (email.endsWith('@norelpy.qq.com') || email.endsWith('@noreply.qq.com')) { 84 | req.session.registration = req.session.registration || {} 85 | req.session.registration.uid = user.uid 86 | req.session.registration.qqid = profile.id 87 | } 88 | authenticationController.onSuccessfulLogin(req, user.uid, function (err) { 89 | if (err) { 90 | return done(err) 91 | } else { 92 | return done(null, user) 93 | } 94 | }) 95 | } 96 | }) 97 | } 98 | })) 99 | 100 | // 定义本插件的一些信息 101 | strategies.push({ 102 | name: 'qq-token', 103 | url: '/auth/qq', 104 | callbackURL: '/auth/qq/callback', 105 | icon: 'fa-qq', 106 | scope: 'get_user_info' 107 | }) 108 | }; 109 | callback(null, strategies) 110 | }) 111 | } 112 | 113 | // 通过UID获取QQid 114 | QQ.hasQQID = function (qqid, callback) { 115 | db.isObjectField('qqid:uid', qqid, function (err, res) { 116 | if (err) { 117 | callback(err) 118 | } else { 119 | callback(null, res) 120 | } 121 | }) 122 | } 123 | 124 | QQ.getAssociation = function (data, callback) { 125 | User.getUserField(data.uid, 'qqid', function (err, qqid) { 126 | if (err) { 127 | return callback(err, data) 128 | } 129 | 130 | if (qqid) { 131 | data.associations.push({ 132 | associated: true, 133 | deauthUrl: nconf.get('url') + '/deauth/qq', 134 | name: constants.name, 135 | icon: constants.admin.icon 136 | }) 137 | } else { 138 | data.associations.push({ 139 | associated: false, 140 | url: nconf.get('url') + '/auth/qq', 141 | name: constants.name, 142 | icon: constants.admin.icon 143 | }) 144 | } 145 | 146 | callback(null, data) 147 | }) 148 | } 149 | QQ.login = function (qqID, username, avatar, email, callback) { 150 | QQ.getUidByQQID(qqID, function (err, uid) { 151 | if (err) { 152 | return callback(err) 153 | } 154 | 155 | // winston.verbose("[SSO-QQ]uid:" + uid); 156 | if (uid !== null) { 157 | // Existing User 158 | winston.info('[SSO-QQ]User:' + uid + ' is logged via sso-qq') 159 | User.setUserField(uid, 'qqpic', avatar) // 更新头像 160 | return callback(null, { 161 | uid: uid 162 | }) 163 | } else { 164 | // 为了放置可能导致的修改用户数据,结果重新建立了一个账户的问题,所以我们给他一个默认邮箱 165 | winston.info("[SSO-QQ]User isn't Exist.Try to Creat a new account.") 166 | winston.info("[SSO-QQ]New Account's Username:" + username + ' and openid:' + qqID) 167 | // New User 168 | // From SSO-Twitter 169 | User.create({ 170 | username: username, 171 | email: email 172 | }, function (err, uid) { 173 | if (err) { 174 | User.create({ 175 | username: 'QQ-' + qqID, 176 | email: email 177 | }, function (err, uid) { 178 | if (err) { 179 | return callback(err) 180 | } else { 181 | // Save qq-specific information to the user 182 | User.setUserField(uid, 'qqid', qqID) 183 | db.setObjectField('qqid:uid', qqID, uid) 184 | // Save their photo, if present 185 | User.setUserField(uid, 'picture', avatar) 186 | User.setUserField(uid, 'qqpic', avatar) 187 | callback(null, { 188 | uid: uid 189 | }) 190 | } 191 | }) 192 | } else { 193 | // Save qq-specific information to the user 194 | User.setUserField(uid, 'qqid', qqID) 195 | db.setObjectField('qqid:uid', qqID, uid) 196 | // Save their photo, if present 197 | User.setUserField(uid, 'picture', avatar) 198 | User.setUserField(uid, 'qqpic', avatar) 199 | callback(null, { 200 | uid: uid 201 | }) 202 | } 203 | }) 204 | } 205 | }) 206 | } 207 | 208 | QQ.getUidByQQID = function (qqID, callback) { 209 | db.getObjectField('qqid:uid', qqID, function (err, uid) { 210 | if (err) { 211 | callback(err) 212 | } else { 213 | callback(null, uid) 214 | } 215 | }) 216 | } 217 | 218 | QQ.addMenuItem = function (header, callback) { 219 | header.authentication.push({ 220 | 'route': constants.admin.route, 221 | 'icon': constants.admin.icon, 222 | 'name': 'QQ 社会化登陆' 223 | }) 224 | 225 | callback(null, header) 226 | } 227 | 228 | QQ.init = function (data, callback) { 229 | var hostHelpers = require.main.require('./src/routes/helpers') 230 | 231 | function renderAdmin (req, res) { 232 | res.render('admin/plugins/sso-qq', { 233 | callbackURL: nconf.get('url') + '/auth/qq/callback' 234 | }) 235 | } 236 | data.router.get('/admin/plugins/sso-qq', data.middleware.admin.buildHeader, renderAdmin) 237 | data.router.get('/api/admin/plugins/sso-qq', renderAdmin) 238 | hostHelpers.setupPageRoute(data.router, '/deauth/qq', data.middleware, [data.middleware.requireUser], function (req, res) { 239 | res.render('partials/sso-qq/deauth', { 240 | service: 'QQ' 241 | }) 242 | }) 243 | data.router.get('/auth/qq/callback', function (req, res, next) { 244 | // passport-qq checks that the oauth_token 245 | // parameter is the same as the one it generated. 246 | // 247 | // Twitter does not support OAuth2, so the "state" 248 | // query string argument is not present. 249 | 250 | req.query.state = req.session.ssoState 251 | // console.log(req.query) 252 | next() 253 | }) 254 | 255 | data.router.post('/deauth/qq', [data.middleware.requireUser, data.middleware.applyCSRF], function (req, res, next) { 256 | QQ.deleteUserData({ 257 | uid: req.user.uid 258 | }, function (err, uid) { 259 | if (err) { 260 | return next(err) 261 | } 262 | User.getUserField(uid, 'userslug', function (err, userslug) { 263 | if (err) { 264 | return next(err) 265 | } 266 | res.redirect(nconf.get('relative_path') + '/user/' + userslug + '/edit') 267 | }) 268 | }) 269 | }) 270 | callback() 271 | } 272 | 273 | QQ.appendUserHashWhitelist = function (data, callback) { 274 | data.whitelist.push('qqid') 275 | data.whitelist.push('qqpic') 276 | return setImmediate(callback, null, data) 277 | } 278 | 279 | // 删除用户时触发的事件 280 | QQ.deleteUserData = function (data, callback) { 281 | const uid = data.uid 282 | 283 | async.waterfall([ 284 | async.apply(User.getUserField, uid, 'qqid'), 285 | function (oAuthIdToDelete, next) { 286 | db.deleteObjectField('qqid:uid', oAuthIdToDelete, next) 287 | }, 288 | function (next) { 289 | db.deleteObjectField('user:' + uid, 'qqid', next) 290 | } 291 | ], function (err) { 292 | if (err) { 293 | winston.error('[sso-qq] Could not remove OAuthId data for uid ' + uid + '. Error: ' + err) 294 | return callback(err) 295 | } 296 | callback(null, uid) 297 | }) 298 | } 299 | QQ.prepareInterstitial = (data, callback) => { 300 | // Only execute if: 301 | // - uid and qqid are set in session 302 | // - email ends with "@noreply.qq.com" 303 | if (data.userData.hasOwnProperty('uid') && data.userData.hasOwnProperty('qqid')) { 304 | User.getUserField(data.userData.uid, 'email', function (err, email) { 305 | if (err) { 306 | return callback(err) 307 | } 308 | if (email && (email.endsWith('@noreply.qq.com') || email.endsWith('@norelpy.qq.com'))) { 309 | data.interstitials.push({ 310 | template: 'partials/sso-qq/email.tpl', 311 | data: {}, 312 | callback: QQ.storeAdditionalData 313 | }) 314 | } 315 | 316 | callback(null, data) 317 | }) 318 | } else { 319 | callback(null, data) 320 | } 321 | } 322 | QQ.get = (data, callback) => { 323 | if (data.type === 'qq') { 324 | QQ.getQQPicture(data.uid, function (err, QQPicture) { 325 | if (err) { 326 | winston.error(err) 327 | return callback(null, data) 328 | } 329 | if (QQPicture == null) { 330 | winston.error('[sso-qq]uid:' + data.uid + 'is invalid,skipping...') 331 | return callback(null, data) 332 | } 333 | data.picture = QQPicture 334 | callback(null, data) 335 | }) 336 | } else { 337 | callback(null, data) 338 | } 339 | } 340 | QQ.list = (data, callback) => { 341 | QQ.getQQPicture(data.uid, function (err, QQPicture) { 342 | if (err) { 343 | winston.error(err) 344 | return callback(null, data) 345 | } 346 | if (QQPicture == null) { 347 | winston.error('[sso-qq]uid:' + data.uid + 'is invalid,skipping...') 348 | return callback(null, data) 349 | } 350 | data.pictures.push({ 351 | type: 'qq', 352 | url: QQPicture, 353 | text: 'QQ头像' 354 | }) 355 | callback(null, data) 356 | }) 357 | } 358 | QQ.getQQPicture = function (uid, callback) { 359 | User.getUserField(uid, 'qqpic', function (err, pic) { 360 | if (err) { 361 | return callback(err) 362 | } 363 | callback(null, pic) 364 | }) 365 | } 366 | 367 | QQ.storeAdditionalData = function (userData, data, callback) { 368 | async.waterfall([ 369 | // Reset email confirm throttle 370 | async.apply(db.delete, 'uid:' + userData.uid + ':confirm:email:sent'), 371 | async.apply(User.getUserField, userData.uid, 'email'), 372 | function (email, next) { 373 | // Remove the old email from sorted set reference 374 | email = email.toLowerCase() 375 | db.sortedSetRemove('email:uid', email, next) 376 | }, 377 | async.apply(User.setUserField, userData.uid, 'email', data.email), 378 | async.apply(User.email.sendValidationEmail, userData.uid, data.email) 379 | ], callback) 380 | } 381 | module.exports = QQ 382 | }(module)) 383 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha1-BuKrGb21NThVWaq7W6WXKUgoAPg= 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ= 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | acorn-jsx@^5.0.0: 22 | version "5.0.1" 23 | resolved "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 24 | integrity sha1-MqBk/ZJUKSFqCbFBECv90YX65A4= 25 | 26 | acorn@^6.0.2: 27 | version "6.0.4" 28 | resolved "http://registry.npm.taobao.org/acorn/download/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" 29 | integrity sha1-dzd+c1O3LsUQRVCqLSCXov1At1Q= 30 | 31 | ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: 32 | version "6.6.1" 33 | resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" 34 | integrity sha1-Y2D17Q2A8jLMKylMNi1dwuU43WE= 35 | dependencies: 36 | fast-deep-equal "^2.0.1" 37 | fast-json-stable-stringify "^2.0.0" 38 | json-schema-traverse "^0.4.1" 39 | uri-js "^4.2.2" 40 | 41 | ansi-escapes@^3.0.0: 42 | version "3.1.0" 43 | resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 44 | integrity sha1-9zIHu4EgfXX9bIPxJa8m7qN4yjA= 45 | 46 | ansi-regex@^3.0.0: 47 | version "3.0.0" 48 | resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 49 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 50 | 51 | ansi-regex@^4.0.0: 52 | version "4.0.0" 53 | resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" 54 | integrity sha1-cN55Ht8CFATD/WFaqJEYrgQy5ak= 55 | 56 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 57 | version "3.2.1" 58 | resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 59 | integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= 60 | dependencies: 61 | color-convert "^1.9.0" 62 | 63 | argparse@^1.0.7: 64 | version "1.0.10" 65 | resolved "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 66 | integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= 67 | dependencies: 68 | sprintf-js "~1.0.2" 69 | 70 | asn1@~0.2.3: 71 | version "0.2.4" 72 | resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 73 | integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= 74 | dependencies: 75 | safer-buffer "~2.1.0" 76 | 77 | assert-plus@1.0.0, assert-plus@^1.0.0: 78 | version "1.0.0" 79 | resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 80 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 81 | 82 | astral-regex@^1.0.0: 83 | version "1.0.0" 84 | resolved "http://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 85 | integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= 86 | 87 | asynckit@^0.4.0: 88 | version "0.4.0" 89 | resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 90 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 91 | 92 | aws-sign2@~0.7.0: 93 | version "0.7.0" 94 | resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 95 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 96 | 97 | aws4@^1.8.0: 98 | version "1.8.0" 99 | resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 100 | integrity sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8= 101 | 102 | balanced-match@^1.0.0: 103 | version "1.0.0" 104 | resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 105 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 106 | 107 | bcrypt-pbkdf@^1.0.0: 108 | version "1.0.2" 109 | resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 110 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 111 | dependencies: 112 | tweetnacl "^0.14.3" 113 | 114 | brace-expansion@^1.1.7: 115 | version "1.1.11" 116 | resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 117 | integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= 118 | dependencies: 119 | balanced-match "^1.0.0" 120 | concat-map "0.0.1" 121 | 122 | builtin-modules@^1.0.0: 123 | version "1.1.1" 124 | resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 125 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 126 | 127 | caller-path@^0.1.0: 128 | version "0.1.0" 129 | resolved "http://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 130 | integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= 131 | dependencies: 132 | callsites "^0.2.0" 133 | 134 | callsites@^0.2.0: 135 | version "0.2.0" 136 | resolved "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 137 | integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= 138 | 139 | caseless@~0.12.0: 140 | version "0.12.0" 141 | resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 142 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 143 | 144 | chalk@^2.0.0, chalk@^2.1.0: 145 | version "2.4.1" 146 | resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 147 | integrity sha1-GMSasWoDe26wFSzIPjRxM4IVtm4= 148 | dependencies: 149 | ansi-styles "^3.2.1" 150 | escape-string-regexp "^1.0.5" 151 | supports-color "^5.3.0" 152 | 153 | chardet@^0.7.0: 154 | version "0.7.0" 155 | resolved "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 156 | integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= 157 | 158 | circular-json@^0.3.1: 159 | version "0.3.3" 160 | resolved "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 161 | integrity sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY= 162 | 163 | cli-cursor@^2.1.0: 164 | version "2.1.0" 165 | resolved "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 166 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 167 | dependencies: 168 | restore-cursor "^2.0.0" 169 | 170 | cli-width@^2.0.0: 171 | version "2.2.0" 172 | resolved "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 173 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 174 | 175 | color-convert@^1.9.0: 176 | version "1.9.3" 177 | resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 178 | integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= 179 | dependencies: 180 | color-name "1.1.3" 181 | 182 | color-name@1.1.3: 183 | version "1.1.3" 184 | resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 185 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 186 | 187 | combined-stream@^1.0.6, combined-stream@~1.0.6: 188 | version "1.0.7" 189 | resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 190 | integrity sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg= 191 | dependencies: 192 | delayed-stream "~1.0.0" 193 | 194 | concat-map@0.0.1: 195 | version "0.0.1" 196 | resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 197 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 198 | 199 | contains-path@^0.1.0: 200 | version "0.1.0" 201 | resolved "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 202 | integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 203 | 204 | core-util-is@1.0.2: 205 | version "1.0.2" 206 | resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 207 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 208 | 209 | cross-spawn@^6.0.5: 210 | version "6.0.5" 211 | resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 212 | integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= 213 | dependencies: 214 | nice-try "^1.0.4" 215 | path-key "^2.0.1" 216 | semver "^5.5.0" 217 | shebang-command "^1.2.0" 218 | which "^1.2.9" 219 | 220 | dashdash@^1.12.0: 221 | version "1.14.1" 222 | resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 223 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 224 | dependencies: 225 | assert-plus "^1.0.0" 226 | 227 | debug@^2.6.8, debug@^2.6.9: 228 | version "2.6.9" 229 | resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 230 | integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= 231 | dependencies: 232 | ms "2.0.0" 233 | 234 | debug@^4.0.1: 235 | version "4.1.0" 236 | resolved "http://registry.npm.taobao.org/debug/download/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" 237 | integrity sha1-NzaHv/pnizixzZH4YbY4UANd3Ic= 238 | dependencies: 239 | ms "^2.1.1" 240 | 241 | deep-is@~0.1.3: 242 | version "0.1.3" 243 | resolved "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 244 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 245 | 246 | delayed-stream@~1.0.0: 247 | version "1.0.0" 248 | resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 249 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 250 | 251 | doctrine@1.5.0: 252 | version "1.5.0" 253 | resolved "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 254 | integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 255 | dependencies: 256 | esutils "^2.0.2" 257 | isarray "^1.0.0" 258 | 259 | doctrine@^2.1.0: 260 | version "2.1.0" 261 | resolved "http://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 262 | integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= 263 | dependencies: 264 | esutils "^2.0.2" 265 | 266 | ecc-jsbn@~0.1.1: 267 | version "0.1.2" 268 | resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 269 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 270 | dependencies: 271 | jsbn "~0.1.0" 272 | safer-buffer "^2.1.0" 273 | 274 | error-ex@^1.2.0: 275 | version "1.3.2" 276 | resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 277 | integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= 278 | dependencies: 279 | is-arrayish "^0.2.1" 280 | 281 | escape-string-regexp@^1.0.5: 282 | version "1.0.5" 283 | resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 284 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 285 | 286 | eslint-config-standard@^10.2.1: 287 | version "10.2.1" 288 | resolved "http://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" 289 | integrity sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE= 290 | 291 | eslint-import-resolver-node@^0.3.1: 292 | version "0.3.2" 293 | resolved "http://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 294 | integrity sha1-WPFfuDm40FdsqYBBNHaqskcttmo= 295 | dependencies: 296 | debug "^2.6.9" 297 | resolve "^1.5.0" 298 | 299 | eslint-module-utils@^2.2.0: 300 | version "2.2.0" 301 | resolved "http://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" 302 | integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= 303 | dependencies: 304 | debug "^2.6.8" 305 | pkg-dir "^1.0.0" 306 | 307 | eslint-plugin-import@^2.8.0: 308 | version "2.14.0" 309 | resolved "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" 310 | integrity sha1-axdibS4+atUs/OiAeoRdFeIhEag= 311 | dependencies: 312 | contains-path "^0.1.0" 313 | debug "^2.6.8" 314 | doctrine "1.5.0" 315 | eslint-import-resolver-node "^0.3.1" 316 | eslint-module-utils "^2.2.0" 317 | has "^1.0.1" 318 | lodash "^4.17.4" 319 | minimatch "^3.0.3" 320 | read-pkg-up "^2.0.0" 321 | resolve "^1.6.0" 322 | 323 | eslint-plugin-node@^5.2.1: 324 | version "5.2.1" 325 | resolved "http://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" 326 | integrity sha1-gN8yU8TXkBBF7If6ZgooTjK9yik= 327 | dependencies: 328 | ignore "^3.3.6" 329 | minimatch "^3.0.4" 330 | resolve "^1.3.3" 331 | semver "5.3.0" 332 | 333 | eslint-plugin-promise@^3.6.0: 334 | version "3.8.0" 335 | resolved "http://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" 336 | integrity sha1-ZevyeoRePB6db2pWIt3TgBaUtiE= 337 | 338 | eslint-plugin-standard@^3.0.1: 339 | version "3.1.0" 340 | resolved "http://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" 341 | integrity sha1-Kp4hJZukxHwC1TstDJE11LECLUc= 342 | 343 | eslint-scope@^4.0.0: 344 | version "4.0.0" 345 | resolved "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 346 | integrity sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI= 347 | dependencies: 348 | esrecurse "^4.1.0" 349 | estraverse "^4.1.1" 350 | 351 | eslint-utils@^1.3.1: 352 | version "1.3.1" 353 | resolved "http://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 354 | integrity sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI= 355 | 356 | eslint-visitor-keys@^1.0.0: 357 | version "1.0.0" 358 | resolved "http://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 359 | integrity sha1-PzGA+y4pEBdxastMnW1bXDSmqB0= 360 | 361 | eslint@*: 362 | version "5.9.0" 363 | resolved "http://registry.npm.taobao.org/eslint/download/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e" 364 | integrity sha1-sjS20V74S1hJxt4q9DGVotWdQI4= 365 | dependencies: 366 | "@babel/code-frame" "^7.0.0" 367 | ajv "^6.5.3" 368 | chalk "^2.1.0" 369 | cross-spawn "^6.0.5" 370 | debug "^4.0.1" 371 | doctrine "^2.1.0" 372 | eslint-scope "^4.0.0" 373 | eslint-utils "^1.3.1" 374 | eslint-visitor-keys "^1.0.0" 375 | espree "^4.0.0" 376 | esquery "^1.0.1" 377 | esutils "^2.0.2" 378 | file-entry-cache "^2.0.0" 379 | functional-red-black-tree "^1.0.1" 380 | glob "^7.1.2" 381 | globals "^11.7.0" 382 | ignore "^4.0.6" 383 | imurmurhash "^0.1.4" 384 | inquirer "^6.1.0" 385 | is-resolvable "^1.1.0" 386 | js-yaml "^3.12.0" 387 | json-stable-stringify-without-jsonify "^1.0.1" 388 | levn "^0.3.0" 389 | lodash "^4.17.5" 390 | minimatch "^3.0.4" 391 | mkdirp "^0.5.1" 392 | natural-compare "^1.4.0" 393 | optionator "^0.8.2" 394 | path-is-inside "^1.0.2" 395 | pluralize "^7.0.0" 396 | progress "^2.0.0" 397 | regexpp "^2.0.1" 398 | require-uncached "^1.0.3" 399 | semver "^5.5.1" 400 | strip-ansi "^4.0.0" 401 | strip-json-comments "^2.0.1" 402 | table "^5.0.2" 403 | text-table "^0.2.0" 404 | 405 | espree@^4.0.0: 406 | version "4.1.0" 407 | resolved "http://registry.npm.taobao.org/espree/download/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" 408 | integrity sha1-co1UUeD9FWwEOEp62J7VH/VOsl8= 409 | dependencies: 410 | acorn "^6.0.2" 411 | acorn-jsx "^5.0.0" 412 | eslint-visitor-keys "^1.0.0" 413 | 414 | esprima@^4.0.0: 415 | version "4.0.1" 416 | resolved "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 417 | integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= 418 | 419 | esquery@^1.0.1: 420 | version "1.0.1" 421 | resolved "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 422 | integrity sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg= 423 | dependencies: 424 | estraverse "^4.0.0" 425 | 426 | esrecurse@^4.1.0: 427 | version "4.2.1" 428 | resolved "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 429 | integrity sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8= 430 | dependencies: 431 | estraverse "^4.1.0" 432 | 433 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 434 | version "4.2.0" 435 | resolved "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 436 | integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= 437 | 438 | esutils@^2.0.2: 439 | version "2.0.2" 440 | resolved "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 441 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 442 | 443 | extend@~3.0.2: 444 | version "3.0.2" 445 | resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 446 | integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= 447 | 448 | external-editor@^3.0.0: 449 | version "3.0.3" 450 | resolved "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 451 | integrity sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic= 452 | dependencies: 453 | chardet "^0.7.0" 454 | iconv-lite "^0.4.24" 455 | tmp "^0.0.33" 456 | 457 | extsprintf@1.3.0: 458 | version "1.3.0" 459 | resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 460 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 461 | 462 | extsprintf@^1.2.0: 463 | version "1.4.0" 464 | resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 465 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 466 | 467 | fast-deep-equal@^2.0.1: 468 | version "2.0.1" 469 | resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 470 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 471 | 472 | fast-json-stable-stringify@^2.0.0: 473 | version "2.0.0" 474 | resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 475 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 476 | 477 | fast-levenshtein@~2.0.4: 478 | version "2.0.6" 479 | resolved "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 480 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 481 | 482 | figures@^2.0.0: 483 | version "2.0.0" 484 | resolved "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 485 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 486 | dependencies: 487 | escape-string-regexp "^1.0.5" 488 | 489 | file-entry-cache@^2.0.0: 490 | version "2.0.0" 491 | resolved "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 492 | integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= 493 | dependencies: 494 | flat-cache "^1.2.1" 495 | object-assign "^4.0.1" 496 | 497 | find-up@^1.0.0: 498 | version "1.1.2" 499 | resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 500 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 501 | dependencies: 502 | path-exists "^2.0.0" 503 | pinkie-promise "^2.0.0" 504 | 505 | find-up@^2.0.0: 506 | version "2.1.0" 507 | resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 508 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 509 | dependencies: 510 | locate-path "^2.0.0" 511 | 512 | flat-cache@^1.2.1: 513 | version "1.3.4" 514 | resolved "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" 515 | integrity sha1-LC73dSXMKSkAff/6HdMUqpyd7m8= 516 | dependencies: 517 | circular-json "^0.3.1" 518 | graceful-fs "^4.1.2" 519 | rimraf "~2.6.2" 520 | write "^0.2.1" 521 | 522 | forever-agent@~0.6.1: 523 | version "0.6.1" 524 | resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 525 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 526 | 527 | form-data@~2.3.2: 528 | version "2.3.3" 529 | resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 530 | integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= 531 | dependencies: 532 | asynckit "^0.4.0" 533 | combined-stream "^1.0.6" 534 | mime-types "^2.1.12" 535 | 536 | fs.realpath@^1.0.0: 537 | version "1.0.0" 538 | resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 539 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 540 | 541 | function-bind@^1.1.1: 542 | version "1.1.1" 543 | resolved "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 544 | integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= 545 | 546 | functional-red-black-tree@^1.0.1: 547 | version "1.0.1" 548 | resolved "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 549 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 550 | 551 | getpass@^0.1.1: 552 | version "0.1.7" 553 | resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 554 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 555 | dependencies: 556 | assert-plus "^1.0.0" 557 | 558 | glob@^7.0.5, glob@^7.1.2: 559 | version "7.1.3" 560 | resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 561 | integrity sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE= 562 | dependencies: 563 | fs.realpath "^1.0.0" 564 | inflight "^1.0.4" 565 | inherits "2" 566 | minimatch "^3.0.4" 567 | once "^1.3.0" 568 | path-is-absolute "^1.0.0" 569 | 570 | globals@^11.7.0: 571 | version "11.9.0" 572 | resolved "http://registry.npm.taobao.org/globals/download/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" 573 | integrity sha1-veI2gI6YfykHaKk9BlBg145qskk= 574 | 575 | graceful-fs@^4.1.2: 576 | version "4.1.15" 577 | resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 578 | integrity sha1-/7cD4QZuig7qpMi4C6klPu77+wA= 579 | 580 | har-schema@^2.0.0: 581 | version "2.0.0" 582 | resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 583 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 584 | 585 | har-validator@~5.1.0: 586 | version "5.1.3" 587 | resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 588 | integrity sha1-HvievT5JllV2de7ZiTEQ3DUPoIA= 589 | dependencies: 590 | ajv "^6.5.5" 591 | har-schema "^2.0.0" 592 | 593 | has-flag@^3.0.0: 594 | version "3.0.0" 595 | resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 596 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 597 | 598 | has@^1.0.1: 599 | version "1.0.3" 600 | resolved "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 601 | integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= 602 | dependencies: 603 | function-bind "^1.1.1" 604 | 605 | hosted-git-info@^2.1.4: 606 | version "2.7.1" 607 | resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 608 | integrity sha1-l/I2l3vW4SVAiTD/bePuxigewEc= 609 | 610 | http-signature@~1.2.0: 611 | version "1.2.0" 612 | resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 613 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 614 | dependencies: 615 | assert-plus "^1.0.0" 616 | jsprim "^1.2.2" 617 | sshpk "^1.7.0" 618 | 619 | iconv-lite@^0.4.24: 620 | version "0.4.24" 621 | resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 622 | integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= 623 | dependencies: 624 | safer-buffer ">= 2.1.2 < 3" 625 | 626 | ignore@^3.3.6: 627 | version "3.3.10" 628 | resolved "http://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 629 | integrity sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM= 630 | 631 | ignore@^4.0.6: 632 | version "4.0.6" 633 | resolved "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 634 | integrity sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw= 635 | 636 | imurmurhash@^0.1.4: 637 | version "0.1.4" 638 | resolved "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 639 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 640 | 641 | inflight@^1.0.4: 642 | version "1.0.6" 643 | resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 644 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 645 | dependencies: 646 | once "^1.3.0" 647 | wrappy "1" 648 | 649 | inherits@2: 650 | version "2.0.3" 651 | resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 652 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 653 | 654 | inquirer@^6.1.0: 655 | version "6.2.1" 656 | resolved "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" 657 | integrity sha1-mUP8SIIWG9sLDJJ2dpx1sy2/zVI= 658 | dependencies: 659 | ansi-escapes "^3.0.0" 660 | chalk "^2.0.0" 661 | cli-cursor "^2.1.0" 662 | cli-width "^2.0.0" 663 | external-editor "^3.0.0" 664 | figures "^2.0.0" 665 | lodash "^4.17.10" 666 | mute-stream "0.0.7" 667 | run-async "^2.2.0" 668 | rxjs "^6.1.0" 669 | string-width "^2.1.0" 670 | strip-ansi "^5.0.0" 671 | through "^2.3.6" 672 | 673 | is-arrayish@^0.2.1: 674 | version "0.2.1" 675 | resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 676 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 677 | 678 | is-builtin-module@^1.0.0: 679 | version "1.0.0" 680 | resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 681 | integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= 682 | dependencies: 683 | builtin-modules "^1.0.0" 684 | 685 | is-fullwidth-code-point@^2.0.0: 686 | version "2.0.0" 687 | resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 688 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 689 | 690 | is-promise@^2.1.0: 691 | version "2.1.0" 692 | resolved "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 693 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 694 | 695 | is-resolvable@^1.1.0: 696 | version "1.1.0" 697 | resolved "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 698 | integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= 699 | 700 | is-typedarray@~1.0.0: 701 | version "1.0.0" 702 | resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 703 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 704 | 705 | isarray@^1.0.0: 706 | version "1.0.0" 707 | resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 708 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 709 | 710 | isexe@^2.0.0: 711 | version "2.0.0" 712 | resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 713 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 714 | 715 | isstream@~0.1.2: 716 | version "0.1.2" 717 | resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 718 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 719 | 720 | js-tokens@^4.0.0: 721 | version "4.0.0" 722 | resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 723 | integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= 724 | 725 | js-yaml@^3.12.0: 726 | version "3.12.0" 727 | resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 728 | integrity sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E= 729 | dependencies: 730 | argparse "^1.0.7" 731 | esprima "^4.0.0" 732 | 733 | jsbn@~0.1.0: 734 | version "0.1.1" 735 | resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 736 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 737 | 738 | json-schema-traverse@^0.4.1: 739 | version "0.4.1" 740 | resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 741 | integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= 742 | 743 | json-schema@0.2.3: 744 | version "0.2.3" 745 | resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 746 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 747 | 748 | json-stable-stringify-without-jsonify@^1.0.1: 749 | version "1.0.1" 750 | resolved "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 751 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 752 | 753 | json-stringify-safe@~5.0.1: 754 | version "5.0.1" 755 | resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 756 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 757 | 758 | jsprim@^1.2.2: 759 | version "1.4.1" 760 | resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 761 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 762 | dependencies: 763 | assert-plus "1.0.0" 764 | extsprintf "1.3.0" 765 | json-schema "0.2.3" 766 | verror "1.10.0" 767 | 768 | levn@^0.3.0, levn@~0.3.0: 769 | version "0.3.0" 770 | resolved "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 771 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 772 | dependencies: 773 | prelude-ls "~1.1.2" 774 | type-check "~0.3.2" 775 | 776 | load-json-file@^2.0.0: 777 | version "2.0.0" 778 | resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 779 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 780 | dependencies: 781 | graceful-fs "^4.1.2" 782 | parse-json "^2.2.0" 783 | pify "^2.0.0" 784 | strip-bom "^3.0.0" 785 | 786 | locate-path@^2.0.0: 787 | version "2.0.0" 788 | resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 789 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 790 | dependencies: 791 | p-locate "^2.0.0" 792 | path-exists "^3.0.0" 793 | 794 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: 795 | version "4.17.11" 796 | resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 797 | integrity sha1-s56mIp72B+zYniyN8SU2iRysm40= 798 | 799 | mime-db@~1.37.0: 800 | version "1.37.0" 801 | resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 802 | integrity sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng= 803 | 804 | mime-types@^2.1.12, mime-types@~2.1.19: 805 | version "2.1.21" 806 | resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 807 | integrity sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y= 808 | dependencies: 809 | mime-db "~1.37.0" 810 | 811 | mimic-fn@^1.0.0: 812 | version "1.2.0" 813 | resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 814 | integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= 815 | 816 | minimatch@^3.0.3, minimatch@^3.0.4: 817 | version "3.0.4" 818 | resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 819 | integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= 820 | dependencies: 821 | brace-expansion "^1.1.7" 822 | 823 | minimist@0.0.8: 824 | version "0.0.8" 825 | resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 826 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 827 | 828 | mkdirp@^0.5.1: 829 | version "0.5.1" 830 | resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 831 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 832 | dependencies: 833 | minimist "0.0.8" 834 | 835 | ms@2.0.0: 836 | version "2.0.0" 837 | resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 838 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 839 | 840 | ms@^2.1.1: 841 | version "2.1.1" 842 | resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 843 | integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= 844 | 845 | mute-stream@0.0.7: 846 | version "0.0.7" 847 | resolved "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 848 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 849 | 850 | natural-compare@^1.4.0: 851 | version "1.4.0" 852 | resolved "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 853 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 854 | 855 | nice-try@^1.0.4: 856 | version "1.0.5" 857 | resolved "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 858 | integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= 859 | 860 | normalize-package-data@^2.3.2: 861 | version "2.4.0" 862 | resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 863 | integrity sha1-EvlaMH1YNSB1oEkHuErIvpisAS8= 864 | dependencies: 865 | hosted-git-info "^2.1.4" 866 | is-builtin-module "^1.0.0" 867 | semver "2 || 3 || 4 || 5" 868 | validate-npm-package-license "^3.0.1" 869 | 870 | oauth-sign@~0.9.0: 871 | version "0.9.0" 872 | resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 873 | integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= 874 | 875 | object-assign@^4.0.1: 876 | version "4.1.1" 877 | resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 878 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 879 | 880 | once@^1.3.0: 881 | version "1.4.0" 882 | resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 883 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 884 | dependencies: 885 | wrappy "1" 886 | 887 | onetime@^2.0.0: 888 | version "2.0.1" 889 | resolved "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 890 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 891 | dependencies: 892 | mimic-fn "^1.0.0" 893 | 894 | optionator@^0.8.2: 895 | version "0.8.2" 896 | resolved "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 897 | integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= 898 | dependencies: 899 | deep-is "~0.1.3" 900 | fast-levenshtein "~2.0.4" 901 | levn "~0.3.0" 902 | prelude-ls "~1.1.2" 903 | type-check "~0.3.2" 904 | wordwrap "~1.0.0" 905 | 906 | os-tmpdir@~1.0.2: 907 | version "1.0.2" 908 | resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 909 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 910 | 911 | p-limit@^1.1.0: 912 | version "1.3.0" 913 | resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 914 | integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= 915 | dependencies: 916 | p-try "^1.0.0" 917 | 918 | p-locate@^2.0.0: 919 | version "2.0.0" 920 | resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 921 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 922 | dependencies: 923 | p-limit "^1.1.0" 924 | 925 | p-try@^1.0.0: 926 | version "1.0.0" 927 | resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 928 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 929 | 930 | parse-json@^2.2.0: 931 | version "2.2.0" 932 | resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 933 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 934 | dependencies: 935 | error-ex "^1.2.0" 936 | 937 | passport-qq2015-fix@2.0.1: 938 | version "2.0.1" 939 | resolved "http://registry.npm.taobao.org/passport-qq2015-fix/download/passport-qq2015-fix-2.0.1.tgz#487f0c813e617716b4dbbd6994dcbb9b84d59754" 940 | integrity sha1-SH8MgT5hdxa0271plNy7m4TVl1Q= 941 | dependencies: 942 | passport-strategy "1.x.x" 943 | request "^2.67.0" 944 | 945 | passport-strategy@1.x.x: 946 | version "1.0.0" 947 | resolved "http://registry.npm.taobao.org/passport-strategy/download/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" 948 | integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= 949 | 950 | path-exists@^2.0.0: 951 | version "2.1.0" 952 | resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 953 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 954 | dependencies: 955 | pinkie-promise "^2.0.0" 956 | 957 | path-exists@^3.0.0: 958 | version "3.0.0" 959 | resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 960 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 961 | 962 | path-is-absolute@^1.0.0: 963 | version "1.0.1" 964 | resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 965 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 966 | 967 | path-is-inside@^1.0.2: 968 | version "1.0.2" 969 | resolved "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 970 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 971 | 972 | path-key@^2.0.1: 973 | version "2.0.1" 974 | resolved "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 975 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 976 | 977 | path-parse@^1.0.5: 978 | version "1.0.6" 979 | resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 980 | integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= 981 | 982 | path-type@^2.0.0: 983 | version "2.0.0" 984 | resolved "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 985 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 986 | dependencies: 987 | pify "^2.0.0" 988 | 989 | performance-now@^2.1.0: 990 | version "2.1.0" 991 | resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 992 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 993 | 994 | pify@^2.0.0: 995 | version "2.3.0" 996 | resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 997 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 998 | 999 | pinkie-promise@^2.0.0: 1000 | version "2.0.1" 1001 | resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1002 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1003 | dependencies: 1004 | pinkie "^2.0.0" 1005 | 1006 | pinkie@^2.0.0: 1007 | version "2.0.4" 1008 | resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1009 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1010 | 1011 | pkg-dir@^1.0.0: 1012 | version "1.0.0" 1013 | resolved "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1014 | integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= 1015 | dependencies: 1016 | find-up "^1.0.0" 1017 | 1018 | pluralize@^7.0.0: 1019 | version "7.0.0" 1020 | resolved "http://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1021 | integrity sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c= 1022 | 1023 | prelude-ls@~1.1.2: 1024 | version "1.1.2" 1025 | resolved "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1026 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1027 | 1028 | progress@^2.0.0: 1029 | version "2.0.1" 1030 | resolved "http://registry.npm.taobao.org/progress/download/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" 1031 | integrity sha1-ySQhaTQrHCnSdYiclXNGIbGVLjE= 1032 | 1033 | psl@^1.1.24: 1034 | version "1.1.29" 1035 | resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 1036 | integrity sha1-YPWA02AXC7cip5fMcEQR5tqFDGc= 1037 | 1038 | punycode@^1.4.1: 1039 | version "1.4.1" 1040 | resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1041 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1042 | 1043 | punycode@^2.1.0: 1044 | version "2.1.1" 1045 | resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1046 | integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= 1047 | 1048 | qs@~6.5.2: 1049 | version "6.5.2" 1050 | resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1051 | integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= 1052 | 1053 | read-pkg-up@^2.0.0: 1054 | version "2.0.0" 1055 | resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1056 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 1057 | dependencies: 1058 | find-up "^2.0.0" 1059 | read-pkg "^2.0.0" 1060 | 1061 | read-pkg@^2.0.0: 1062 | version "2.0.0" 1063 | resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1064 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 1065 | dependencies: 1066 | load-json-file "^2.0.0" 1067 | normalize-package-data "^2.3.2" 1068 | path-type "^2.0.0" 1069 | 1070 | regexpp@^2.0.1: 1071 | version "2.0.1" 1072 | resolved "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1073 | integrity sha1-jRnTHPYySCtYkEn4KB+T28uk0H8= 1074 | 1075 | request@^2.67.0: 1076 | version "2.88.0" 1077 | resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1078 | integrity sha1-nC/KT301tZLv5Xx/ClXoEFIST+8= 1079 | dependencies: 1080 | aws-sign2 "~0.7.0" 1081 | aws4 "^1.8.0" 1082 | caseless "~0.12.0" 1083 | combined-stream "~1.0.6" 1084 | extend "~3.0.2" 1085 | forever-agent "~0.6.1" 1086 | form-data "~2.3.2" 1087 | har-validator "~5.1.0" 1088 | http-signature "~1.2.0" 1089 | is-typedarray "~1.0.0" 1090 | isstream "~0.1.2" 1091 | json-stringify-safe "~5.0.1" 1092 | mime-types "~2.1.19" 1093 | oauth-sign "~0.9.0" 1094 | performance-now "^2.1.0" 1095 | qs "~6.5.2" 1096 | safe-buffer "^5.1.2" 1097 | tough-cookie "~2.4.3" 1098 | tunnel-agent "^0.6.0" 1099 | uuid "^3.3.2" 1100 | 1101 | require-uncached@^1.0.3: 1102 | version "1.0.3" 1103 | resolved "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1104 | integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= 1105 | dependencies: 1106 | caller-path "^0.1.0" 1107 | resolve-from "^1.0.0" 1108 | 1109 | resolve-from@^1.0.0: 1110 | version "1.0.1" 1111 | resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1112 | integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= 1113 | 1114 | resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: 1115 | version "1.8.1" 1116 | resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 1117 | integrity sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY= 1118 | dependencies: 1119 | path-parse "^1.0.5" 1120 | 1121 | restore-cursor@^2.0.0: 1122 | version "2.0.0" 1123 | resolved "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1124 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1125 | dependencies: 1126 | onetime "^2.0.0" 1127 | signal-exit "^3.0.2" 1128 | 1129 | rimraf@~2.6.2: 1130 | version "2.6.2" 1131 | resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1132 | integrity sha1-LtgVDSShbqhlHm1u8PR8QVjOejY= 1133 | dependencies: 1134 | glob "^7.0.5" 1135 | 1136 | run-async@^2.2.0: 1137 | version "2.3.0" 1138 | resolved "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1139 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 1140 | dependencies: 1141 | is-promise "^2.1.0" 1142 | 1143 | rxjs@^6.1.0: 1144 | version "6.3.3" 1145 | resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" 1146 | integrity sha1-PGp/pCDoRKgTkPsRWKnsYU9LrVU= 1147 | dependencies: 1148 | tslib "^1.9.0" 1149 | 1150 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 1151 | version "5.1.2" 1152 | resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1153 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= 1154 | 1155 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1156 | version "2.1.2" 1157 | resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1158 | integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= 1159 | 1160 | "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: 1161 | version "5.6.0" 1162 | resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1163 | integrity sha1-fnQlb7qknHWqfHogXMInmcrIAAQ= 1164 | 1165 | semver@5.3.0: 1166 | version "5.3.0" 1167 | resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1168 | integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= 1169 | 1170 | shebang-command@^1.2.0: 1171 | version "1.2.0" 1172 | resolved "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1173 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1174 | dependencies: 1175 | shebang-regex "^1.0.0" 1176 | 1177 | shebang-regex@^1.0.0: 1178 | version "1.0.0" 1179 | resolved "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1180 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1181 | 1182 | signal-exit@^3.0.2: 1183 | version "3.0.2" 1184 | resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1185 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1186 | 1187 | slice-ansi@2.0.0: 1188 | version "2.0.0" 1189 | resolved "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7" 1190 | integrity sha1-U3O9uFWbRWduhUHGaRbN1iUWEuc= 1191 | dependencies: 1192 | ansi-styles "^3.2.0" 1193 | astral-regex "^1.0.0" 1194 | is-fullwidth-code-point "^2.0.0" 1195 | 1196 | spdx-correct@^3.0.0: 1197 | version "3.0.2" 1198 | resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" 1199 | integrity sha1-GbtAnpG0exrVQVkkP3MSqFjbPC4= 1200 | dependencies: 1201 | spdx-expression-parse "^3.0.0" 1202 | spdx-license-ids "^3.0.0" 1203 | 1204 | spdx-exceptions@^2.1.0: 1205 | version "2.2.0" 1206 | resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 1207 | integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= 1208 | 1209 | spdx-expression-parse@^3.0.0: 1210 | version "3.0.0" 1211 | resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1212 | integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= 1213 | dependencies: 1214 | spdx-exceptions "^2.1.0" 1215 | spdx-license-ids "^3.0.0" 1216 | 1217 | spdx-license-ids@^3.0.0: 1218 | version "3.0.2" 1219 | resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" 1220 | integrity sha1-pZ78CXhMKlutoTz+r1x13SFARNI= 1221 | 1222 | sprintf-js@~1.0.2: 1223 | version "1.0.3" 1224 | resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1225 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1226 | 1227 | sshpk@^1.7.0: 1228 | version "1.15.2" 1229 | resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" 1230 | integrity sha1-yUbWvZsaOdDoY1dj9SQtbtbctik= 1231 | dependencies: 1232 | asn1 "~0.2.3" 1233 | assert-plus "^1.0.0" 1234 | bcrypt-pbkdf "^1.0.0" 1235 | dashdash "^1.12.0" 1236 | ecc-jsbn "~0.1.1" 1237 | getpass "^0.1.1" 1238 | jsbn "~0.1.0" 1239 | safer-buffer "^2.0.2" 1240 | tweetnacl "~0.14.0" 1241 | 1242 | string-width@^2.1.0, string-width@^2.1.1: 1243 | version "2.1.1" 1244 | resolved "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1245 | integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= 1246 | dependencies: 1247 | is-fullwidth-code-point "^2.0.0" 1248 | strip-ansi "^4.0.0" 1249 | 1250 | strip-ansi@^4.0.0: 1251 | version "4.0.0" 1252 | resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1253 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1254 | dependencies: 1255 | ansi-regex "^3.0.0" 1256 | 1257 | strip-ansi@^5.0.0: 1258 | version "5.0.0" 1259 | resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" 1260 | integrity sha1-949otdCGbCCyybjGG1KYUI3IdW8= 1261 | dependencies: 1262 | ansi-regex "^4.0.0" 1263 | 1264 | strip-bom@^3.0.0: 1265 | version "3.0.0" 1266 | resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1267 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1268 | 1269 | strip-json-comments@^2.0.1: 1270 | version "2.0.1" 1271 | resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1272 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1273 | 1274 | supports-color@^5.3.0: 1275 | version "5.5.0" 1276 | resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1277 | integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= 1278 | dependencies: 1279 | has-flag "^3.0.0" 1280 | 1281 | table@^5.0.2: 1282 | version "5.1.1" 1283 | resolved "http://registry.npm.taobao.org/table/download/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837" 1284 | integrity sha1-kgMBkvG3tRtu6rI+1BaGLke3CDc= 1285 | dependencies: 1286 | ajv "^6.6.1" 1287 | lodash "^4.17.11" 1288 | slice-ansi "2.0.0" 1289 | string-width "^2.1.1" 1290 | 1291 | text-table@^0.2.0: 1292 | version "0.2.0" 1293 | resolved "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1294 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1295 | 1296 | through@^2.3.6: 1297 | version "2.3.8" 1298 | resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1299 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1300 | 1301 | tmp@^0.0.33: 1302 | version "0.0.33" 1303 | resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1304 | integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= 1305 | dependencies: 1306 | os-tmpdir "~1.0.2" 1307 | 1308 | tough-cookie@~2.4.3: 1309 | version "2.4.3" 1310 | resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1311 | integrity sha1-U/Nto/R3g7CSWvoG/587FlKA94E= 1312 | dependencies: 1313 | psl "^1.1.24" 1314 | punycode "^1.4.1" 1315 | 1316 | tslib@^1.9.0: 1317 | version "1.9.3" 1318 | resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1319 | integrity sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY= 1320 | 1321 | tunnel-agent@^0.6.0: 1322 | version "0.6.0" 1323 | resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1324 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1325 | dependencies: 1326 | safe-buffer "^5.0.1" 1327 | 1328 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1329 | version "0.14.5" 1330 | resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1331 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1332 | 1333 | type-check@~0.3.2: 1334 | version "0.3.2" 1335 | resolved "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1336 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1337 | dependencies: 1338 | prelude-ls "~1.1.2" 1339 | 1340 | uri-js@^4.2.2: 1341 | version "4.2.2" 1342 | resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1343 | integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA= 1344 | dependencies: 1345 | punycode "^2.1.0" 1346 | 1347 | uuid@^3.3.2: 1348 | version "3.3.2" 1349 | resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1350 | integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= 1351 | 1352 | validate-npm-package-license@^3.0.1: 1353 | version "3.0.4" 1354 | resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1355 | integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= 1356 | dependencies: 1357 | spdx-correct "^3.0.0" 1358 | spdx-expression-parse "^3.0.0" 1359 | 1360 | verror@1.10.0: 1361 | version "1.10.0" 1362 | resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1363 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1364 | dependencies: 1365 | assert-plus "^1.0.0" 1366 | core-util-is "1.0.2" 1367 | extsprintf "^1.2.0" 1368 | 1369 | which@^1.2.9: 1370 | version "1.3.1" 1371 | resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1372 | integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= 1373 | dependencies: 1374 | isexe "^2.0.0" 1375 | 1376 | wordwrap@~1.0.0: 1377 | version "1.0.0" 1378 | resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1379 | integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 1380 | 1381 | wrappy@1: 1382 | version "1.0.2" 1383 | resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1384 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1385 | 1386 | write@^0.2.1: 1387 | version "0.2.1" 1388 | resolved "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1389 | integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= 1390 | dependencies: 1391 | mkdirp "^0.5.1" 1392 | --------------------------------------------------------------------------------