├── .gitignore ├── .leanignore ├── LICENSE ├── README.md ├── app.js ├── assets └── imgs │ ├── .DS_Store │ ├── admin-page.png │ ├── all-envs.png │ ├── cron4.png │ ├── demo-login.png │ ├── deploy.png │ ├── deploy2.png │ ├── deploy4.png │ ├── dploy-log.png │ ├── env-setup.png │ ├── envs.png │ ├── rainbow-theme.png │ ├── reboot.png │ ├── signup2.png │ ├── src-deploy.png │ ├── src-setup.png │ ├── sub-domain.png │ └── wei-ming-ming.png ├── cloud.js ├── nodemon.json ├── package-lock.json ├── package.json ├── public ├── images │ └── settings.png └── stylesheets │ └── style.css ├── routes ├── comments.js └── sign-up.js ├── server-cluster.js ├── server.js ├── utilities ├── check-spam.js └── send-mail.js └── views ├── comments.ejs ├── error.ejs ├── index.ejs └── sign-up.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | start.sh 4 | .avoscloud 5 | .leancloud 6 | 7 | # VIM 8 | *~ 9 | *.swp 10 | -------------------------------------------------------------------------------- /.leanignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .avoscloud/ 3 | .leancloud/ 4 | node_modules/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Deserts 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Valine Admin 是 [Valine 评论系统](https://deserts.io/diy-a-comment-system/)的扩展和增强,主要实现评论邮件通知、评论管理、垃圾评论过滤等功能。支持完全自定义的邮件通知模板。基于Akismet API实现准确的垃圾评论过滤。此外,使用云函数等技术解决了免费版云引擎休眠问题,支持云引擎自动唤醒,漏发邮件自动补发。兼容云淡风轻及Deserts维护的多版本Valine。 2 | 3 | > NOTE: **该项目基于LeanCloud云引擎示例代码实现,您可以自由地复制和修改。包含了一些 trick 实现资源的最大化利用 ,但请勿滥用免费资源。引用本说明文档及Deserts博客上的相关文章务必注明来源。** 4 | 5 | [评论在线演示及相关功能测试](https://panjunwen.github.io/Valine/) 6 | 7 | ## 相关项目 8 | 9 | 评论框前端:[Valine on Github](https://github.com/DesertsP/Valine) 10 | 11 | [Disqus2LeanCloud数据迁移](https://github.com/DesertsP/disqus2valine/) 12 | 13 | 14 | 15 | ## 云引擎"一键"部署 16 | 17 | 进入评论系统数据库所在的LeanCloud应用。进入「云引擎-设置」,设置环境变量以及云引擎域名。**以下参数需要正确设置。云引擎域名(ADMIN_URL参数)用于评论后台管理,如[](https://deserts-io.avosapps.us/) 。 18 | 19 | 20 | 变量 | 示例 | 说明 21 | --- | ------ | --------- 22 | SITE_NAME | Deserts | [必填]博客名称 23 | SITE_URL | https://panjunwen.com | [必填]首页地址 24 | **SMTP_SERVICE** | QQ | [新版支持]邮件服务提供商,支持 QQ、163、126、Gmail 以及 [更多](https://nodemailer.com/smtp/well-known/#supported-services) 25 | SMTP_USER | xxxxxx@qq.com | [必填]SMTP登录用户 26 | SMTP_PASS | ccxxxxxxxxch | [必填]SMTP登录密码(QQ邮箱需要获取独立密码) 27 | SENDER_NAME | Deserts | [必填]发件人 28 | SENDER_EMAIL | xxxxxx@qq.com | [必填]发件邮箱 29 | ADMIN_URL | https://xxx.leanapp.cn/ | [建议]Web主机二级域名(云引擎域名),用于自动唤醒 30 | BLOGGER_EMAIL | xxxxx@gmail.com | [可选]博主通知收件地址,默认使用SENDER_EMAIL 31 | AKISMET_KEY | xxxxxxxx | [可选]Akismet Key 用于垃圾评论检测,设为MANUAL_REVIEW开启人工审核,留空不使用反垃圾 32 | 33 | ![](assets/imgs/envs.png) 34 | 35 | 切换到「云引擎-部署」,部署模式选择「部署项目-Git部署」,分支「master」,手动部署目标环境为「生产环境」在[Leancloud](https://leancloud.cn/dashboard/#/apps)云引擎设置界面,填写代码库并保存:https://github.com/DesertsP/Valine-Admin.git,即可一键部署。 36 | 37 | ![deploy3](assets/imgs/deploy4.png) 38 | 39 | ## 评论管理 40 | 41 | 首先需要设置管理员信息。访问管理员注册页面`https://云引擎域名/sign-up`,注册管理员登录信息,如:[https://deserts-io.avosapps.us/sign-up](https://deserts-io.avosapps.us/sign-up) 42 | 43 | ![signup](assets/imgs/signup2.png) 44 | 45 | 46 | - 注:使用原版Valine如果遇到注册页面不显示直接跳转至登录页的情况,请手动删除_User表中的全部数据。 47 | ## 定时任务设置 48 | 49 | 关于自动休眠的官方说法:[点击查看](https://leancloud.cn/docs/leanengine_plan.html#hash633315134)。目前实现了两种云函数定时任务来解决云引擎休眠的问题: 50 | 51 | - 自动唤醒,定时访问Web APP二级域名防止云引擎休眠; 52 | - 每天定时检查过去24小时内漏发的邮件通知。 53 | 54 | 进入「云引擎-定时任务」,创建两个定时任务。 55 | 56 | ![](assets/imgs/cron4.png) 57 | 58 | 59 | 选择self-wake云函数,Cron表达式为`0 */30 0-16 * * ?`,表示每天早0点到晚16点每隔30分钟访问云引擎。 60 | 61 | 选择resend-mails云函数,Cron表达式为`0 0 0 * * ?`,表示每天0点检查过去24小时内漏发的通知邮件并补发。 62 | 63 | - [关于国际版时区的问题](https://github.com/DesertsP/Valine-Admin/issues/63#issuecomment-533784574):国际版使用UTC-0时间,注意与国内时间对应。 64 | 65 | **至此,Valine Admin 已经可以正常工作,以下是可选配置。** 66 | 67 | ------------------ 68 | 69 | ## 更多设置 70 | 71 | #### 邮件通知模板 72 | 73 | 邮件通知模板在云引擎环境变量中设定,可自定义通知邮件标题及内容模板。 74 | 75 | 环境变量 | 示例 | 说明 76 | --- | ------ | ------ 77 | MAIL_SUBJECT | ${PARENT_NICK},您在${SITE_NAME}上的评论收到了回复 | [可选]@通知邮件主题(标题)模板 78 | MAIL_TEMPLATE | 见下文 | [可选]@通知邮件内容模板 79 | MAIL_SUBJECT_ADMIN | ${SITE_NAME}上有新评论了 | [可选]博主邮件通知主题模板 80 | MAIL_TEMPLATE_ADMIN | 见下文 | [可选]博主邮件通知内容模板 81 | 82 | 83 | 邮件通知包含两种,分别是被@通知和博主通知,这两种模板都可以完全自定义。默认使用经典的蓝色风格模板(样式来源未知)。 84 | 85 | 默认被@通知邮件内容模板如下: 86 | 87 | ```html 88 |

您在 ${SITE_NAME}上的评论有了新的回复

${PARENT_NICK} 同学,您曾发表评论:
${PARENT_COMMENT}

${NICK}回复说:

${COMMENT}

您可以点击查看回复的完整內容,欢迎再次光临${SITE_NAME}

89 | ``` 90 | 91 | 效果如下图: 92 | 93 | ![mail-blue-template](assets/imgs/wei-ming-ming.png) 94 | 95 | @通知模板中的可用变量如下(注,这是邮件模板变量,是指嵌入到HTML邮件模板中的变量,请勿与云引擎环境变量混淆): 96 | 97 | 模板变量 | 说明 98 | ----|---- 99 | SITE_NAME | 博客名称 100 | SITE_URL | 博客首页地址 101 | POST_URL | 文章地址(完整路径) 102 | PARENT_NICK | 收件人昵称(被@者,父级评论人) 103 | PARENT_COMMENT | 父级评论内容 104 | NICK | 新评论者昵称 105 | COMMENT | 新评论内容 106 | 107 | 108 | 默认博主通知邮件内容模板如下: 109 | 110 | ```html 111 |

您在${SITE_NAME}上的文章有了新的评论

${NICK}回复说:

${COMMENT}

您可以点击查看回复的完整內容

112 | ``` 113 | 114 | 博主通知邮件模板中的可用变量与@通知中的基本一致,**```PARENT_NICK``` 和 ```PARENT_COMMENT``` 变量不再可用。** 115 | 116 | 117 | 这里还提供一个彩虹风格的@通知邮件模板代码: 118 | 119 | ```html 120 |

您在 ${SITE_NAME}上的留言有新回复啦!

${PARENT_NICK} 同学,您曾在文章上发表评论:

${PARENT_COMMENT}

${NICK} 给您的回复如下:

${COMMENT}

您可以点击查看回复的完整內容,欢迎再次光临 ${SITE_NAME}

121 | ``` 122 | 123 | 效果如图: 124 | 125 | ![彩虹模板](assets/imgs/rainbow-theme.png) 126 | 127 | 128 | #### 垃圾评论检测 129 | 130 | > Akismet (Automattic Kismet)是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的WordPress 创始人 Matt Mullenweg,Akismet也是WordPress默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤留言Spam。有了Akismet之后,基本上不用担心垃圾留言的烦恼了。 131 | > 启用Akismet后,当博客再收到留言会自动将其提交到Akismet并与Akismet上的黑名单进行比对,如果名列该黑名单中,则该条留言会被标记为垃圾评论且不会发布。 132 | 133 | 如果还没有Akismet Key,你可以去 [AKISMET FOR DEVELOPERS 免费申请一个](https://akismet.com/development/); 134 | **当AKISMET_KEY设为MANUAL_REVIEW时,开启人工审核模式;** 135 | 如果你不需要反垃圾评论,Akismet Key 环境变量可以忽略。 136 | 137 | **为了实现较为精准的垃圾评论识别,采集的判据除了评论内容、邮件地址和网站地址外,还包括评论者的IP地址、浏览器信息等,但仅在云引擎后台使用这些数据,确保隐私和安全。** 138 | 139 | **如果使用了本站最新的Valine和Valine Admin,并设置了Akismet Key,可以有效地拦截垃圾评论。被标为垃圾的评论可以在管理页面取消标注。** 140 | 141 | 环境变量 | 示例 | 说明 142 | --- | ------ | ------ 143 | AKISMET_KEY | xxxxxxxxxxxx | [可选]Akismet Key 用于垃圾评论检测 144 | 145 | #### 手动配置邮件服务器 146 | 147 | - 自定义邮件服务器地址和端口信息,删除SMTP_SERVICE环境变量,新增以下变量: 148 | 149 | 变量 | 示例 | 说明 150 | ----|------|------ 151 | SMTP_HOST | smtp.qq.com | [可选]SMTP_SERVICE留空时,自定义SMTP服务器地址 152 | SMTP_PORT | 465 | [可选]SMTP_SERVICE留空时,自定义SMTP端口 153 | SMTP_SECURE | true | [可选]使用TLS 154 | 155 | 156 | ### Troubleshooting 157 | 158 | - 部署失败,请在评论中附图,或去Github发起Issue 159 | - 邮件发送失败,确保环境变量都没问题后,重启云引擎 160 | ![重启云引擎](assets/imgs/reboot.png) 161 | - 博主通知模板中不要出现`PARENT*`相关参数(请勿混用模板) 162 | - 点击邮件中的链接跳转至相应评论,这一细节实现需要在Web前端添加一点额外的代码: 163 | ``` javascript 164 | 174 | ``` 175 | 176 | 177 | 178 | ------------------ 179 | 180 | ## 开发者文档 181 | 182 | **以下内容仅用于 LeanEngine 开发,普通用户无需理会** 183 | 184 | 首先确认本机已经安装 [Node.js](http://nodejs.org/) 运行环境和 [LeanCloud 命令行工具](https://leancloud.cn/docs/leanengine_cli.html),然后执行下列指令: 185 | 186 | ``` 187 | $ git clone https://github.com/DesertsP/Valine-Admin.git 188 | $ cd Valine-Admin 189 | ``` 190 | 191 | 安装依赖: 192 | 193 | ``` 194 | npm install 195 | ``` 196 | 197 | 登录并关联应用: 198 | 199 | ``` 200 | lean login 201 | lean switch 202 | ``` 203 | 204 | 启动项目: 205 | 206 | ``` 207 | lean up 208 | ``` 209 | 210 | 之后你就可以在 [localhost:3000](http://localhost:3000) 访问到你的应用了。 211 | 212 | 部署到预备环境(若无预备环境则直接部署到生产环境): 213 | ``` 214 | lean deploy 215 | ``` 216 | 217 | ## License 218 | 219 | [MIT License](https://github.com/panjunwen/LeanComment/blob/master/LICENSE) 220 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require('express'); 4 | var timeout = require('connect-timeout'); 5 | var path = require('path'); 6 | var cookieParser = require('cookie-parser'); 7 | var bodyParser = require('body-parser'); 8 | var AV = require('leanengine'); 9 | 10 | // 加载云函数定义,你可以将云函数拆分到多个文件方便管理,但需要在主文件中加载它们 11 | require('./cloud'); 12 | 13 | var app = express(); 14 | 15 | // 设置模板引擎 16 | app.set('views', path.join(__dirname, 'views')); 17 | app.set('view engine', 'ejs'); 18 | 19 | app.use(express.static('public')); 20 | 21 | // 设置默认超时时间 22 | app.use(timeout('15s')); 23 | 24 | // 加载云引擎中间件 25 | app.use(AV.express()); 26 | 27 | app.enable('trust proxy'); 28 | // 需要重定向到 HTTPS 可去除下一行的注释。 29 | app.use(AV.Cloud.HttpsRedirect()); 30 | 31 | app.use(bodyParser.json()); 32 | app.use(bodyParser.urlencoded({ extended: false })); 33 | app.use(cookieParser()); 34 | app.use(AV.Cloud.CookieSession({ secret: 'my secret', maxAge: 3600000, fetchUser: true })); 35 | 36 | app.get('/', function(req, res) { 37 | if (req.currentUser) { 38 | res.redirect('/comments'); 39 | } else { 40 | res.render('index'); 41 | } 42 | }); 43 | 44 | // 可以将一类的路由单独保存在一个文件中 45 | app.use('/comments', require('./routes/comments')); 46 | app.use('/sign-up', require('./routes/sign-up')); 47 | 48 | // 处理登录请求(可能来自登录界面中的表单) 49 | app.post('/login', function (req, res) { 50 | AV.User.logIn(req.body.username, req.body.password).then(function (user) { 51 | let adminMail = process.env.BLOGGER_EMAIL || process.env.SMTP_USER; 52 | if (user.get('email') === adminMail) { 53 | res.saveCurrentUser(user); // 保存当前用户到 Cookie 54 | res.redirect('/comments'); 55 | } 56 | else { 57 | res.redirect('/'); 58 | } 59 | }, function (error) { 60 | //登录失败,跳转到登录页面 61 | res.redirect('/'); 62 | }); 63 | }); 64 | 65 | // 登出账号 66 | app.get('/logout', function(req, res) { 67 | req.currentUser.logOut(); 68 | res.clearCurrentUser(); // 从 Cookie 中删除用户 69 | res.redirect('/'); 70 | }); 71 | 72 | app.use(function(req, res, next) { 73 | // 如果任何一个路由都没有返回响应,则抛出一个 404 异常给后续的异常处理器 74 | if (!res.headersSent) { 75 | var err = new Error('Not Found'); 76 | err.status = 404; 77 | next(err); 78 | } 79 | }); 80 | // error handlers 81 | app.use(function(err, req, res, next) { 82 | if (req.timedout && req.headers.upgrade === 'websocket') { 83 | // 忽略 websocket 的超时 84 | return; 85 | } 86 | 87 | var statusCode = err.status || 500; 88 | if (statusCode === 500) { 89 | console.error(err.stack || err); 90 | } 91 | if (req.timedout) { 92 | console.error('请求超时: url=%s, timeout=%d, 请确认方法执行耗时很长,或没有正确的 response 回调。', req.originalUrl, err.timeout); 93 | } 94 | res.status(statusCode); 95 | // 默认不输出异常详情 96 | var error = {}; 97 | if (app.get('env') === 'development') { 98 | // 如果是开发环境,则将异常堆栈输出到页面,方便开发调试 99 | error = err; 100 | } 101 | res.render('error', { 102 | message: err.message, 103 | error: error 104 | }); 105 | }); 106 | 107 | app.locals.dateFormat = function (date) { 108 | var vDay = padWithZeros(date.getDate(), 2); 109 | var vMonth = padWithZeros(date.getMonth() + 1, 2); 110 | var vYear = padWithZeros(date.getFullYear(), 2); 111 | var vHour = padWithZeros(date.getHours(), 2); 112 | var vMinute = padWithZeros(date.getMinutes(), 2); 113 | var vSecond = padWithZeros(date.getSeconds(), 2); 114 | // return `${vYear}-${vMonth}-${vDay}`; 115 | return `${vYear}-${vMonth}-${vDay} ${vHour}:${vMinute}:${vSecond}`; 116 | }; 117 | 118 | const padWithZeros = (vNumber, width) => { 119 | var numAsString = vNumber.toString(); 120 | while (numAsString.length < width) { 121 | numAsString = '0' + numAsString; 122 | } 123 | return numAsString; 124 | }; 125 | 126 | module.exports = app; 127 | -------------------------------------------------------------------------------- /assets/imgs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/.DS_Store -------------------------------------------------------------------------------- /assets/imgs/admin-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/admin-page.png -------------------------------------------------------------------------------- /assets/imgs/all-envs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/all-envs.png -------------------------------------------------------------------------------- /assets/imgs/cron4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/cron4.png -------------------------------------------------------------------------------- /assets/imgs/demo-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/demo-login.png -------------------------------------------------------------------------------- /assets/imgs/deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/deploy.png -------------------------------------------------------------------------------- /assets/imgs/deploy2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/deploy2.png -------------------------------------------------------------------------------- /assets/imgs/deploy4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/deploy4.png -------------------------------------------------------------------------------- /assets/imgs/dploy-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/dploy-log.png -------------------------------------------------------------------------------- /assets/imgs/env-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/env-setup.png -------------------------------------------------------------------------------- /assets/imgs/envs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/envs.png -------------------------------------------------------------------------------- /assets/imgs/rainbow-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/rainbow-theme.png -------------------------------------------------------------------------------- /assets/imgs/reboot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/reboot.png -------------------------------------------------------------------------------- /assets/imgs/signup2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/signup2.png -------------------------------------------------------------------------------- /assets/imgs/src-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/src-deploy.png -------------------------------------------------------------------------------- /assets/imgs/src-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/src-setup.png -------------------------------------------------------------------------------- /assets/imgs/sub-domain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/sub-domain.png -------------------------------------------------------------------------------- /assets/imgs/wei-ming-ming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/assets/imgs/wei-ming-ming.png -------------------------------------------------------------------------------- /cloud.js: -------------------------------------------------------------------------------- 1 | const AV = require('leanengine'); 2 | const mail = require('./utilities/send-mail'); 3 | const Comment = AV.Object.extend('Comment'); 4 | const request = require('request'); 5 | const spam = require('./utilities/check-spam'); 6 | 7 | function sendNotification(currentComment, defaultIp) { 8 | let ip = currentComment.get('ip') || defaultIp; 9 | console.log('IP: %s', ip); 10 | spam.checkSpam(currentComment, ip); 11 | 12 | // 发送博主通知邮件 13 | bloggerMail = process.env.BLOGGER_EMAIL || process.env.SENDER_EMAIL; 14 | if (currentComment.get('mail') !== bloggerMail) { 15 | mail.notice(currentComment); 16 | } 17 | 18 | // AT评论通知 19 | let rid =currentComment.get('pid') || currentComment.get('rid'); 20 | 21 | if (!rid) { 22 | console.log("这条评论没有 @ 任何人"); 23 | return; 24 | } else if (currentComment.get('isSpam')) { 25 | console.log('评论未通过审核,通知邮件暂不发送'); 26 | return; 27 | } 28 | 29 | let query = new AV.Query('Comment'); 30 | query.get(rid).then(function (parentComment) { 31 | if (parentComment.get('mail') && parentComment.get('mail') !== process.env.BLOGGER_EMAIL) { 32 | mail.send(currentComment, parentComment); 33 | } else { 34 | console.log('被@者匿名,不会发送通知'); 35 | } 36 | 37 | }, function (error) { 38 | console.warn('获取@对象失败!'); 39 | }); 40 | } 41 | 42 | AV.Cloud.afterSave('Comment', function (req) { 43 | let currentComment = req.object; 44 | // 检查垃圾评论 45 | return sendNotification(currentComment, req.meta.remoteAddress); 46 | }); 47 | 48 | AV.Cloud.define('resend_mails', function(req) { 49 | let query = new AV.Query(Comment); 50 | query.greaterThanOrEqualTo('createdAt', new Date(new Date().getTime() - 24*60*60*1000)); 51 | query.notEqualTo('isNotified', true); 52 | // 如果你的评论量很大,可以适当调高数量限制,最高1000 53 | query.limit(200); 54 | return query.find().then(function(results) { 55 | new Promise((resolve, reject)=>{ 56 | count = results.length; 57 | for (var i = 0; i < results.length; i++ ) { 58 | sendNotification(results[i], req.meta.remoteAddress); 59 | } 60 | resolve(count); 61 | }).then((count)=>{ 62 | console.log(`昨日${count}条未成功发送的通知邮件处理完毕!`); 63 | }).catch(()=>{ 64 | 65 | }); 66 | }); 67 | }); 68 | 69 | AV.Cloud.define('self_wake', function(req) { 70 | request(process.env.ADMIN_URL, function (error, response, body) { 71 | console.log('自唤醒任务执行成功,响应状态码为:', response && response.statusCode); 72 | }); 73 | }); 74 | 75 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["views/*", "public/*"] 3 | } 4 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Valine-Admin", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", 10 | "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", 11 | "dev": true 12 | }, 13 | "accepts": { 14 | "version": "1.2.13", 15 | "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.2.13.tgz", 16 | "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", 17 | "requires": { 18 | "mime-types": "~2.1.6", 19 | "negotiator": "0.5.3" 20 | } 21 | }, 22 | "ajv": { 23 | "version": "6.8.1", 24 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.8.1.tgz", 25 | "integrity": "sha1-CJC5N0KYXr+Jc802XFsjkgzjyyA=", 26 | "requires": { 27 | "fast-deep-equal": "^2.0.1", 28 | "fast-json-stable-stringify": "^2.0.0", 29 | "json-schema-traverse": "^0.4.1", 30 | "uri-js": "^4.2.2" 31 | } 32 | }, 33 | "akismet-api": { 34 | "version": "3.0.0", 35 | "resolved": "http://registry.npm.taobao.org/akismet-api/download/akismet-api-3.0.0.tgz", 36 | "integrity": "sha1-00k9sX7rfHuOYSaILVeVrGsDm04=", 37 | "requires": { 38 | "bluebird": "^3.1.1", 39 | "superagent": "^3.0.0" 40 | } 41 | }, 42 | "ansi-align": { 43 | "version": "2.0.0", 44 | "resolved": "http://registry.npm.taobao.org/ansi-align/download/ansi-align-2.0.0.tgz", 45 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 46 | "dev": true, 47 | "requires": { 48 | "string-width": "^2.0.0" 49 | }, 50 | "dependencies": { 51 | "ansi-regex": { 52 | "version": "3.0.0", 53 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 54 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 55 | "dev": true 56 | }, 57 | "is-fullwidth-code-point": { 58 | "version": "2.0.0", 59 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 60 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 61 | "dev": true 62 | }, 63 | "string-width": { 64 | "version": "2.1.1", 65 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 66 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 67 | "dev": true, 68 | "requires": { 69 | "is-fullwidth-code-point": "^2.0.0", 70 | "strip-ansi": "^4.0.0" 71 | } 72 | }, 73 | "strip-ansi": { 74 | "version": "4.0.0", 75 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 76 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 77 | "dev": true, 78 | "requires": { 79 | "ansi-regex": "^3.0.0" 80 | } 81 | } 82 | } 83 | }, 84 | "ansi-regex": { 85 | "version": "2.1.1", 86 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", 87 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 88 | }, 89 | "ansi-styles": { 90 | "version": "3.2.1", 91 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", 92 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 93 | "dev": true, 94 | "requires": { 95 | "color-convert": "^1.9.0" 96 | } 97 | }, 98 | "anymatch": { 99 | "version": "2.0.0", 100 | "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", 101 | "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", 102 | "dev": true, 103 | "requires": { 104 | "micromatch": "^3.1.4", 105 | "normalize-path": "^2.1.1" 106 | }, 107 | "dependencies": { 108 | "normalize-path": { 109 | "version": "2.1.1", 110 | "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", 111 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 112 | "dev": true, 113 | "requires": { 114 | "remove-trailing-separator": "^1.0.1" 115 | } 116 | } 117 | } 118 | }, 119 | "arr-diff": { 120 | "version": "4.0.0", 121 | "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", 122 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 123 | "dev": true 124 | }, 125 | "arr-flatten": { 126 | "version": "1.1.0", 127 | "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", 128 | "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", 129 | "dev": true 130 | }, 131 | "arr-union": { 132 | "version": "3.1.0", 133 | "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", 134 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 135 | "dev": true 136 | }, 137 | "array-unique": { 138 | "version": "0.3.2", 139 | "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", 140 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 141 | "dev": true 142 | }, 143 | "ascli": { 144 | "version": "1.0.1", 145 | "resolved": "http://registry.npm.taobao.org/ascli/download/ascli-1.0.1.tgz", 146 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 147 | "requires": { 148 | "colour": "~0.7.1", 149 | "optjs": "~3.2.2" 150 | } 151 | }, 152 | "asn1": { 153 | "version": "0.2.4", 154 | "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", 155 | "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", 156 | "requires": { 157 | "safer-buffer": "~2.1.0" 158 | } 159 | }, 160 | "assert-plus": { 161 | "version": "1.0.0", 162 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 163 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 164 | }, 165 | "assign-symbols": { 166 | "version": "1.0.0", 167 | "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", 168 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 169 | "dev": true 170 | }, 171 | "async-each": { 172 | "version": "1.0.1", 173 | "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", 174 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 175 | "dev": true 176 | }, 177 | "async-limiter": { 178 | "version": "1.0.0", 179 | "resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz", 180 | "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" 181 | }, 182 | "asynckit": { 183 | "version": "0.4.0", 184 | "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", 185 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 186 | }, 187 | "atob": { 188 | "version": "2.1.2", 189 | "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", 190 | "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", 191 | "dev": true 192 | }, 193 | "aws-sign2": { 194 | "version": "0.7.0", 195 | "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", 196 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 197 | }, 198 | "aws4": { 199 | "version": "1.8.0", 200 | "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", 201 | "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=" 202 | }, 203 | "axios": { 204 | "version": "0.18.1", 205 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 206 | "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", 207 | "requires": { 208 | "follow-redirects": "1.5.10", 209 | "is-buffer": "^2.0.2" 210 | }, 211 | "dependencies": { 212 | "debug": { 213 | "version": "3.1.0", 214 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 215 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 216 | "requires": { 217 | "ms": "2.0.0" 218 | } 219 | }, 220 | "follow-redirects": { 221 | "version": "1.5.10", 222 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 223 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 224 | "requires": { 225 | "debug": "=3.1.0" 226 | } 227 | }, 228 | "is-buffer": { 229 | "version": "2.0.4", 230 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 231 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 232 | }, 233 | "ms": { 234 | "version": "2.0.0", 235 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 236 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 237 | } 238 | } 239 | }, 240 | "babel-runtime": { 241 | "version": "6.26.0", 242 | "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", 243 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 244 | "requires": { 245 | "core-js": "^2.4.0", 246 | "regenerator-runtime": "^0.11.0" 247 | } 248 | }, 249 | "balanced-match": { 250 | "version": "1.0.0", 251 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 252 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 253 | }, 254 | "base": { 255 | "version": "0.11.2", 256 | "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", 257 | "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", 258 | "dev": true, 259 | "requires": { 260 | "cache-base": "^1.0.1", 261 | "class-utils": "^0.3.5", 262 | "component-emitter": "^1.2.1", 263 | "define-property": "^1.0.0", 264 | "isobject": "^3.0.1", 265 | "mixin-deep": "^1.2.0", 266 | "pascalcase": "^0.1.1" 267 | }, 268 | "dependencies": { 269 | "define-property": { 270 | "version": "1.0.0", 271 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", 272 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 273 | "dev": true, 274 | "requires": { 275 | "is-descriptor": "^1.0.0" 276 | } 277 | }, 278 | "is-accessor-descriptor": { 279 | "version": "1.0.0", 280 | "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", 281 | "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", 282 | "dev": true, 283 | "requires": { 284 | "kind-of": "^6.0.0" 285 | } 286 | }, 287 | "is-data-descriptor": { 288 | "version": "1.0.0", 289 | "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", 290 | "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", 291 | "dev": true, 292 | "requires": { 293 | "kind-of": "^6.0.0" 294 | } 295 | }, 296 | "is-descriptor": { 297 | "version": "1.0.2", 298 | "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", 299 | "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", 300 | "dev": true, 301 | "requires": { 302 | "is-accessor-descriptor": "^1.0.0", 303 | "is-data-descriptor": "^1.0.0", 304 | "kind-of": "^6.0.2" 305 | } 306 | } 307 | } 308 | }, 309 | "base64-arraybuffer": { 310 | "version": "0.1.5", 311 | "resolved": "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz", 312 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 313 | }, 314 | "bcrypt-pbkdf": { 315 | "version": "1.0.2", 316 | "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", 317 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 318 | "requires": { 319 | "tweetnacl": "^0.14.3" 320 | } 321 | }, 322 | "binary-extensions": { 323 | "version": "1.13.0", 324 | "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.0.tgz", 325 | "integrity": "sha1-lSPgATBqMkRLkHQj8d4hZCIvarE=", 326 | "dev": true 327 | }, 328 | "bluebird": { 329 | "version": "3.5.3", 330 | "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz", 331 | "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=" 332 | }, 333 | "body-parser": { 334 | "version": "1.12.3", 335 | "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.12.3.tgz", 336 | "integrity": "sha1-X0C/F+eCO+aJXU01WCdS42z5f3E=", 337 | "requires": { 338 | "bytes": "1.0.0", 339 | "content-type": "~1.0.1", 340 | "debug": "~2.1.3", 341 | "depd": "~1.0.1", 342 | "iconv-lite": "0.4.8", 343 | "on-finished": "~2.2.0", 344 | "qs": "2.4.1", 345 | "raw-body": "1.3.4", 346 | "type-is": "~1.6.1" 347 | }, 348 | "dependencies": { 349 | "debug": { 350 | "version": "2.1.3", 351 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.1.3.tgz", 352 | "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", 353 | "requires": { 354 | "ms": "0.7.0" 355 | } 356 | }, 357 | "ms": { 358 | "version": "0.7.0", 359 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.0.tgz", 360 | "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" 361 | }, 362 | "qs": { 363 | "version": "2.4.1", 364 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-2.4.1.tgz", 365 | "integrity": "sha1-aMuuqXEBNCaoDBQE+taxprEXUkU=" 366 | } 367 | } 368 | }, 369 | "boxen": { 370 | "version": "1.3.0", 371 | "resolved": "http://registry.npm.taobao.org/boxen/download/boxen-1.3.0.tgz", 372 | "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", 373 | "dev": true, 374 | "requires": { 375 | "ansi-align": "^2.0.0", 376 | "camelcase": "^4.0.0", 377 | "chalk": "^2.0.1", 378 | "cli-boxes": "^1.0.0", 379 | "string-width": "^2.0.0", 380 | "term-size": "^1.2.0", 381 | "widest-line": "^2.0.0" 382 | }, 383 | "dependencies": { 384 | "ansi-regex": { 385 | "version": "3.0.0", 386 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 387 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 388 | "dev": true 389 | }, 390 | "camelcase": { 391 | "version": "4.1.0", 392 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", 393 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 394 | "dev": true 395 | }, 396 | "is-fullwidth-code-point": { 397 | "version": "2.0.0", 398 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 399 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 400 | "dev": true 401 | }, 402 | "string-width": { 403 | "version": "2.1.1", 404 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 405 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 406 | "dev": true, 407 | "requires": { 408 | "is-fullwidth-code-point": "^2.0.0", 409 | "strip-ansi": "^4.0.0" 410 | } 411 | }, 412 | "strip-ansi": { 413 | "version": "4.0.0", 414 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 415 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 416 | "dev": true, 417 | "requires": { 418 | "ansi-regex": "^3.0.0" 419 | } 420 | } 421 | } 422 | }, 423 | "brace-expansion": { 424 | "version": "1.1.11", 425 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 426 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 427 | "requires": { 428 | "balanced-match": "^1.0.0", 429 | "concat-map": "0.0.1" 430 | } 431 | }, 432 | "braces": { 433 | "version": "2.3.2", 434 | "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", 435 | "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", 436 | "dev": true, 437 | "requires": { 438 | "arr-flatten": "^1.1.0", 439 | "array-unique": "^0.3.2", 440 | "extend-shallow": "^2.0.1", 441 | "fill-range": "^4.0.0", 442 | "isobject": "^3.0.1", 443 | "repeat-element": "^1.1.2", 444 | "snapdragon": "^0.8.1", 445 | "snapdragon-node": "^2.0.1", 446 | "split-string": "^3.0.2", 447 | "to-regex": "^3.0.1" 448 | }, 449 | "dependencies": { 450 | "extend-shallow": { 451 | "version": "2.0.1", 452 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 453 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 454 | "dev": true, 455 | "requires": { 456 | "is-extendable": "^0.1.0" 457 | } 458 | } 459 | } 460 | }, 461 | "bytebuffer": { 462 | "version": "5.0.1", 463 | "resolved": "http://registry.npm.taobao.org/bytebuffer/download/bytebuffer-5.0.1.tgz", 464 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 465 | "requires": { 466 | "long": "~3" 467 | } 468 | }, 469 | "bytes": { 470 | "version": "1.0.0", 471 | "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-1.0.0.tgz", 472 | "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" 473 | }, 474 | "cache-base": { 475 | "version": "1.0.1", 476 | "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", 477 | "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", 478 | "dev": true, 479 | "requires": { 480 | "collection-visit": "^1.0.0", 481 | "component-emitter": "^1.2.1", 482 | "get-value": "^2.0.6", 483 | "has-value": "^1.0.0", 484 | "isobject": "^3.0.1", 485 | "set-value": "^2.0.0", 486 | "to-object-path": "^0.3.0", 487 | "union-value": "^1.0.0", 488 | "unset-value": "^1.0.0" 489 | } 490 | }, 491 | "camelcase": { 492 | "version": "2.1.1", 493 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", 494 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 495 | }, 496 | "capture-stack-trace": { 497 | "version": "1.0.1", 498 | "resolved": "http://registry.npm.taobao.org/capture-stack-trace/download/capture-stack-trace-1.0.1.tgz", 499 | "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=", 500 | "dev": true 501 | }, 502 | "caseless": { 503 | "version": "0.12.0", 504 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", 505 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 506 | }, 507 | "chalk": { 508 | "version": "2.4.2", 509 | "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", 510 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 511 | "dev": true, 512 | "requires": { 513 | "ansi-styles": "^3.2.1", 514 | "escape-string-regexp": "^1.0.5", 515 | "supports-color": "^5.3.0" 516 | } 517 | }, 518 | "charenc": { 519 | "version": "0.0.2", 520 | "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz", 521 | "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" 522 | }, 523 | "chokidar": { 524 | "version": "2.1.0", 525 | "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.1.0.tgz", 526 | "integrity": "sha1-X8tw0LKOvghn6w8J1fagjymh76A=", 527 | "dev": true, 528 | "requires": { 529 | "anymatch": "^2.0.0", 530 | "async-each": "^1.0.1", 531 | "braces": "^2.3.2", 532 | "fsevents": "^1.2.7", 533 | "glob-parent": "^3.1.0", 534 | "inherits": "^2.0.3", 535 | "is-binary-path": "^1.0.0", 536 | "is-glob": "^4.0.0", 537 | "normalize-path": "^3.0.0", 538 | "path-is-absolute": "^1.0.0", 539 | "readdirp": "^2.2.1", 540 | "upath": "^1.1.0" 541 | } 542 | }, 543 | "ci-info": { 544 | "version": "1.6.0", 545 | "resolved": "http://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", 546 | "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", 547 | "dev": true 548 | }, 549 | "class-utils": { 550 | "version": "0.3.6", 551 | "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", 552 | "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", 553 | "dev": true, 554 | "requires": { 555 | "arr-union": "^3.1.0", 556 | "define-property": "^0.2.5", 557 | "isobject": "^3.0.0", 558 | "static-extend": "^0.1.1" 559 | }, 560 | "dependencies": { 561 | "define-property": { 562 | "version": "0.2.5", 563 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", 564 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 565 | "dev": true, 566 | "requires": { 567 | "is-descriptor": "^0.1.0" 568 | } 569 | } 570 | } 571 | }, 572 | "cli-boxes": { 573 | "version": "1.0.0", 574 | "resolved": "http://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz", 575 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", 576 | "dev": true 577 | }, 578 | "cliui": { 579 | "version": "3.2.0", 580 | "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", 581 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 582 | "requires": { 583 | "string-width": "^1.0.1", 584 | "strip-ansi": "^3.0.1", 585 | "wrap-ansi": "^2.0.0" 586 | } 587 | }, 588 | "code-point-at": { 589 | "version": "1.1.0", 590 | "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", 591 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 592 | }, 593 | "collection-visit": { 594 | "version": "1.0.0", 595 | "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", 596 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 597 | "dev": true, 598 | "requires": { 599 | "map-visit": "^1.0.0", 600 | "object-visit": "^1.0.0" 601 | } 602 | }, 603 | "color-convert": { 604 | "version": "1.9.3", 605 | "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", 606 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 607 | "dev": true, 608 | "requires": { 609 | "color-name": "1.1.3" 610 | } 611 | }, 612 | "color-name": { 613 | "version": "1.1.3", 614 | "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 615 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 616 | "dev": true 617 | }, 618 | "colour": { 619 | "version": "0.7.1", 620 | "resolved": "http://registry.npm.taobao.org/colour/download/colour-0.7.1.tgz", 621 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 622 | }, 623 | "combined-stream": { 624 | "version": "1.0.7", 625 | "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz", 626 | "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", 627 | "requires": { 628 | "delayed-stream": "~1.0.0" 629 | } 630 | }, 631 | "component-emitter": { 632 | "version": "1.2.1", 633 | "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz", 634 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 635 | }, 636 | "concat-map": { 637 | "version": "0.0.1", 638 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 639 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 640 | }, 641 | "configstore": { 642 | "version": "3.1.2", 643 | "resolved": "http://registry.npm.taobao.org/configstore/download/configstore-3.1.2.tgz", 644 | "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", 645 | "dev": true, 646 | "requires": { 647 | "dot-prop": "^4.1.0", 648 | "graceful-fs": "^4.1.2", 649 | "make-dir": "^1.0.0", 650 | "unique-string": "^1.0.0", 651 | "write-file-atomic": "^2.0.0", 652 | "xdg-basedir": "^3.0.0" 653 | } 654 | }, 655 | "connect": { 656 | "version": "3.6.6", 657 | "resolved": "http://registry.npm.taobao.org/connect/download/connect-3.6.6.tgz", 658 | "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", 659 | "requires": { 660 | "debug": "2.6.9", 661 | "finalhandler": "1.1.0", 662 | "parseurl": "~1.3.2", 663 | "utils-merge": "1.0.1" 664 | }, 665 | "dependencies": { 666 | "debug": { 667 | "version": "2.6.9", 668 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 669 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 670 | "requires": { 671 | "ms": "2.0.0" 672 | } 673 | }, 674 | "ee-first": { 675 | "version": "1.1.1", 676 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 677 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 678 | }, 679 | "escape-html": { 680 | "version": "1.0.3", 681 | "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", 682 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 683 | }, 684 | "finalhandler": { 685 | "version": "1.1.0", 686 | "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.0.tgz", 687 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", 688 | "requires": { 689 | "debug": "2.6.9", 690 | "encodeurl": "~1.0.1", 691 | "escape-html": "~1.0.3", 692 | "on-finished": "~2.3.0", 693 | "parseurl": "~1.3.2", 694 | "statuses": "~1.3.1", 695 | "unpipe": "~1.0.0" 696 | } 697 | }, 698 | "ms": { 699 | "version": "2.0.0", 700 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 701 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 702 | }, 703 | "on-finished": { 704 | "version": "2.3.0", 705 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 706 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 707 | "requires": { 708 | "ee-first": "1.1.1" 709 | } 710 | }, 711 | "statuses": { 712 | "version": "1.3.1", 713 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz", 714 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 715 | }, 716 | "utils-merge": { 717 | "version": "1.0.1", 718 | "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", 719 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 720 | } 721 | } 722 | }, 723 | "connect-timeout": { 724 | "version": "1.9.0", 725 | "resolved": "http://registry.npm.taobao.org/connect-timeout/download/connect-timeout-1.9.0.tgz", 726 | "integrity": "sha1-vCcyaxIhA3FL6/oNlYurM/ZSLjo=", 727 | "requires": { 728 | "http-errors": "~1.6.1", 729 | "ms": "2.0.0", 730 | "on-finished": "~2.3.0", 731 | "on-headers": "~1.0.1" 732 | }, 733 | "dependencies": { 734 | "ee-first": { 735 | "version": "1.1.1", 736 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 737 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 738 | }, 739 | "ms": { 740 | "version": "2.0.0", 741 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 742 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 743 | }, 744 | "on-finished": { 745 | "version": "2.3.0", 746 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 747 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 748 | "requires": { 749 | "ee-first": "1.1.1" 750 | } 751 | } 752 | } 753 | }, 754 | "content-disposition": { 755 | "version": "0.5.0", 756 | "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.0.tgz", 757 | "integrity": "sha1-QoT+auBjCHRjnkToCkGMKTQTXp4=" 758 | }, 759 | "content-type": { 760 | "version": "1.0.4", 761 | "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", 762 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 763 | }, 764 | "cookie": { 765 | "version": "0.3.1", 766 | "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", 767 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 768 | }, 769 | "cookie-parser": { 770 | "version": "1.4.3", 771 | "resolved": "http://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.3.tgz", 772 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 773 | "requires": { 774 | "cookie": "0.3.1", 775 | "cookie-signature": "1.0.6" 776 | } 777 | }, 778 | "cookie-signature": { 779 | "version": "1.0.6", 780 | "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", 781 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 782 | }, 783 | "cookiejar": { 784 | "version": "2.1.2", 785 | "resolved": "http://registry.npm.taobao.org/cookiejar/download/cookiejar-2.1.2.tgz", 786 | "integrity": "sha1-3YojVTB1L5iPmghE8/xYnjERElw=" 787 | }, 788 | "cookies": { 789 | "version": "0.6.2", 790 | "resolved": "http://registry.npm.taobao.org/cookies/download/cookies-0.6.2.tgz", 791 | "integrity": "sha1-asGwUolSCOj8TE9fhqntMbnLXM8=", 792 | "requires": { 793 | "depd": "~1.1.0", 794 | "keygrip": "~1.0.1" 795 | }, 796 | "dependencies": { 797 | "depd": { 798 | "version": "1.1.2", 799 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", 800 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 801 | } 802 | } 803 | }, 804 | "copy-descriptor": { 805 | "version": "0.1.1", 806 | "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", 807 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 808 | "dev": true 809 | }, 810 | "core-js": { 811 | "version": "2.6.4", 812 | "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.4.tgz", 813 | "integrity": "sha1-uIl8BixNdp3TCgrFxzl2xH+S6g0=" 814 | }, 815 | "core-util-is": { 816 | "version": "1.0.2", 817 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 818 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 819 | }, 820 | "crc": { 821 | "version": "3.2.1", 822 | "resolved": "http://registry.npm.taobao.org/crc/download/crc-3.2.1.tgz", 823 | "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=" 824 | }, 825 | "create-error-class": { 826 | "version": "3.0.2", 827 | "resolved": "http://registry.npm.taobao.org/create-error-class/download/create-error-class-3.0.2.tgz", 828 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 829 | "dev": true, 830 | "requires": { 831 | "capture-stack-trace": "^1.0.0" 832 | } 833 | }, 834 | "cross-spawn": { 835 | "version": "5.1.0", 836 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", 837 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 838 | "dev": true, 839 | "requires": { 840 | "lru-cache": "^4.0.1", 841 | "shebang-command": "^1.2.0", 842 | "which": "^1.2.9" 843 | } 844 | }, 845 | "crypt": { 846 | "version": "0.0.2", 847 | "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz", 848 | "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" 849 | }, 850 | "crypto-random-string": { 851 | "version": "1.0.0", 852 | "resolved": "http://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-1.0.0.tgz", 853 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 854 | "dev": true 855 | }, 856 | "dashdash": { 857 | "version": "1.14.1", 858 | "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", 859 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 860 | "requires": { 861 | "assert-plus": "^1.0.0" 862 | } 863 | }, 864 | "debug": { 865 | "version": "3.2.6", 866 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", 867 | "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", 868 | "requires": { 869 | "ms": "^2.1.1" 870 | } 871 | }, 872 | "decamelize": { 873 | "version": "1.2.0", 874 | "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", 875 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 876 | }, 877 | "decode-uri-component": { 878 | "version": "0.2.0", 879 | "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", 880 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 881 | "dev": true 882 | }, 883 | "deep-extend": { 884 | "version": "0.6.0", 885 | "resolved": "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz", 886 | "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", 887 | "dev": true 888 | }, 889 | "define-property": { 890 | "version": "2.0.2", 891 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", 892 | "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", 893 | "dev": true, 894 | "requires": { 895 | "is-descriptor": "^1.0.2", 896 | "isobject": "^3.0.1" 897 | }, 898 | "dependencies": { 899 | "is-accessor-descriptor": { 900 | "version": "1.0.0", 901 | "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", 902 | "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", 903 | "dev": true, 904 | "requires": { 905 | "kind-of": "^6.0.0" 906 | } 907 | }, 908 | "is-data-descriptor": { 909 | "version": "1.0.0", 910 | "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", 911 | "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", 912 | "dev": true, 913 | "requires": { 914 | "kind-of": "^6.0.0" 915 | } 916 | }, 917 | "is-descriptor": { 918 | "version": "1.0.2", 919 | "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", 920 | "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", 921 | "dev": true, 922 | "requires": { 923 | "is-accessor-descriptor": "^1.0.0", 924 | "is-data-descriptor": "^1.0.0", 925 | "kind-of": "^6.0.2" 926 | } 927 | } 928 | } 929 | }, 930 | "delayed-stream": { 931 | "version": "1.0.0", 932 | "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", 933 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 934 | }, 935 | "depd": { 936 | "version": "1.0.1", 937 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.0.1.tgz", 938 | "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" 939 | }, 940 | "destroy": { 941 | "version": "1.0.3", 942 | "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.3.tgz", 943 | "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=" 944 | }, 945 | "dot-prop": { 946 | "version": "4.2.0", 947 | "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz", 948 | "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", 949 | "dev": true, 950 | "requires": { 951 | "is-obj": "^1.0.0" 952 | } 953 | }, 954 | "duplexer3": { 955 | "version": "0.1.4", 956 | "resolved": "http://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz", 957 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 958 | "dev": true 959 | }, 960 | "ecc-jsbn": { 961 | "version": "0.1.2", 962 | "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", 963 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 964 | "requires": { 965 | "jsbn": "~0.1.0", 966 | "safer-buffer": "^2.1.0" 967 | } 968 | }, 969 | "ee-first": { 970 | "version": "1.1.0", 971 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.0.tgz", 972 | "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=" 973 | }, 974 | "ejs": { 975 | "version": "2.5.5", 976 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.5.tgz", 977 | "integrity": "sha1-bvTpVOp9z1T2aq0v56pCGTLZ7Xc=" 978 | }, 979 | "encodeurl": { 980 | "version": "1.0.2", 981 | "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", 982 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 983 | }, 984 | "es6-promise": { 985 | "version": "4.2.3", 986 | "resolved": "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.3.tgz", 987 | "integrity": "sha1-KUVLjbIbc/vvHfBww13Am3/WBsQ=" 988 | }, 989 | "escape-html": { 990 | "version": "1.0.1", 991 | "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.1.tgz", 992 | "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=" 993 | }, 994 | "escape-string-regexp": { 995 | "version": "1.0.5", 996 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 997 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 998 | "dev": true 999 | }, 1000 | "etag": { 1001 | "version": "1.5.1", 1002 | "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.5.1.tgz", 1003 | "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=", 1004 | "requires": { 1005 | "crc": "3.2.1" 1006 | } 1007 | }, 1008 | "eventemitter3": { 1009 | "version": "2.0.3", 1010 | "resolved": "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-2.0.3.tgz", 1011 | "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" 1012 | }, 1013 | "execa": { 1014 | "version": "0.7.0", 1015 | "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz", 1016 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 1017 | "dev": true, 1018 | "requires": { 1019 | "cross-spawn": "^5.0.1", 1020 | "get-stream": "^3.0.0", 1021 | "is-stream": "^1.1.0", 1022 | "npm-run-path": "^2.0.0", 1023 | "p-finally": "^1.0.0", 1024 | "signal-exit": "^3.0.0", 1025 | "strip-eof": "^1.0.0" 1026 | } 1027 | }, 1028 | "expand-brackets": { 1029 | "version": "2.1.4", 1030 | "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", 1031 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1032 | "dev": true, 1033 | "requires": { 1034 | "debug": "^2.3.3", 1035 | "define-property": "^0.2.5", 1036 | "extend-shallow": "^2.0.1", 1037 | "posix-character-classes": "^0.1.0", 1038 | "regex-not": "^1.0.0", 1039 | "snapdragon": "^0.8.1", 1040 | "to-regex": "^3.0.1" 1041 | }, 1042 | "dependencies": { 1043 | "debug": { 1044 | "version": "2.6.9", 1045 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 1046 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 1047 | "dev": true, 1048 | "requires": { 1049 | "ms": "2.0.0" 1050 | } 1051 | }, 1052 | "define-property": { 1053 | "version": "0.2.5", 1054 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", 1055 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1056 | "dev": true, 1057 | "requires": { 1058 | "is-descriptor": "^0.1.0" 1059 | } 1060 | }, 1061 | "extend-shallow": { 1062 | "version": "2.0.1", 1063 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 1064 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1065 | "dev": true, 1066 | "requires": { 1067 | "is-extendable": "^0.1.0" 1068 | } 1069 | }, 1070 | "ms": { 1071 | "version": "2.0.0", 1072 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 1073 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1074 | "dev": true 1075 | } 1076 | } 1077 | }, 1078 | "express": { 1079 | "version": "4.12.3", 1080 | "resolved": "http://registry.npm.taobao.org/express/download/express-4.12.3.tgz", 1081 | "integrity": "sha1-a52UrsWuAycNhtOQwneoxaWtDuI=", 1082 | "requires": { 1083 | "accepts": "~1.2.5", 1084 | "content-disposition": "0.5.0", 1085 | "content-type": "~1.0.1", 1086 | "cookie": "0.1.2", 1087 | "cookie-signature": "1.0.6", 1088 | "debug": "~2.1.3", 1089 | "depd": "~1.0.0", 1090 | "escape-html": "1.0.1", 1091 | "etag": "~1.5.1", 1092 | "finalhandler": "0.3.4", 1093 | "fresh": "0.2.4", 1094 | "merge-descriptors": "1.0.0", 1095 | "methods": "~1.1.1", 1096 | "on-finished": "~2.2.0", 1097 | "parseurl": "~1.3.0", 1098 | "path-to-regexp": "0.1.3", 1099 | "proxy-addr": "~1.0.7", 1100 | "qs": "2.4.1", 1101 | "range-parser": "~1.0.2", 1102 | "send": "0.12.2", 1103 | "serve-static": "~1.9.2", 1104 | "type-is": "~1.6.1", 1105 | "utils-merge": "1.0.0", 1106 | "vary": "~1.0.0" 1107 | }, 1108 | "dependencies": { 1109 | "cookie": { 1110 | "version": "0.1.2", 1111 | "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.1.2.tgz", 1112 | "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" 1113 | }, 1114 | "debug": { 1115 | "version": "2.1.3", 1116 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.1.3.tgz", 1117 | "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", 1118 | "requires": { 1119 | "ms": "0.7.0" 1120 | } 1121 | }, 1122 | "ms": { 1123 | "version": "0.7.0", 1124 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.0.tgz", 1125 | "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" 1126 | }, 1127 | "qs": { 1128 | "version": "2.4.1", 1129 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-2.4.1.tgz", 1130 | "integrity": "sha1-aMuuqXEBNCaoDBQE+taxprEXUkU=" 1131 | } 1132 | } 1133 | }, 1134 | "extend": { 1135 | "version": "3.0.2", 1136 | "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", 1137 | "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" 1138 | }, 1139 | "extend-shallow": { 1140 | "version": "3.0.2", 1141 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", 1142 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1143 | "dev": true, 1144 | "requires": { 1145 | "assign-symbols": "^1.0.0", 1146 | "is-extendable": "^1.0.1" 1147 | }, 1148 | "dependencies": { 1149 | "is-extendable": { 1150 | "version": "1.0.1", 1151 | "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", 1152 | "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", 1153 | "dev": true, 1154 | "requires": { 1155 | "is-plain-object": "^2.0.4" 1156 | } 1157 | } 1158 | } 1159 | }, 1160 | "extglob": { 1161 | "version": "2.0.4", 1162 | "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", 1163 | "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", 1164 | "dev": true, 1165 | "requires": { 1166 | "array-unique": "^0.3.2", 1167 | "define-property": "^1.0.0", 1168 | "expand-brackets": "^2.1.4", 1169 | "extend-shallow": "^2.0.1", 1170 | "fragment-cache": "^0.2.1", 1171 | "regex-not": "^1.0.0", 1172 | "snapdragon": "^0.8.1", 1173 | "to-regex": "^3.0.1" 1174 | }, 1175 | "dependencies": { 1176 | "define-property": { 1177 | "version": "1.0.0", 1178 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", 1179 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1180 | "dev": true, 1181 | "requires": { 1182 | "is-descriptor": "^1.0.0" 1183 | } 1184 | }, 1185 | "extend-shallow": { 1186 | "version": "2.0.1", 1187 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 1188 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1189 | "dev": true, 1190 | "requires": { 1191 | "is-extendable": "^0.1.0" 1192 | } 1193 | }, 1194 | "is-accessor-descriptor": { 1195 | "version": "1.0.0", 1196 | "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", 1197 | "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", 1198 | "dev": true, 1199 | "requires": { 1200 | "kind-of": "^6.0.0" 1201 | } 1202 | }, 1203 | "is-data-descriptor": { 1204 | "version": "1.0.0", 1205 | "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", 1206 | "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", 1207 | "dev": true, 1208 | "requires": { 1209 | "kind-of": "^6.0.0" 1210 | } 1211 | }, 1212 | "is-descriptor": { 1213 | "version": "1.0.2", 1214 | "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", 1215 | "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", 1216 | "dev": true, 1217 | "requires": { 1218 | "is-accessor-descriptor": "^1.0.0", 1219 | "is-data-descriptor": "^1.0.0", 1220 | "kind-of": "^6.0.2" 1221 | } 1222 | } 1223 | } 1224 | }, 1225 | "extsprintf": { 1226 | "version": "1.3.0", 1227 | "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", 1228 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 1229 | }, 1230 | "fast-deep-equal": { 1231 | "version": "2.0.1", 1232 | "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", 1233 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 1234 | }, 1235 | "fast-json-stable-stringify": { 1236 | "version": "2.0.0", 1237 | "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", 1238 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 1239 | }, 1240 | "fill-range": { 1241 | "version": "4.0.0", 1242 | "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", 1243 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1244 | "dev": true, 1245 | "requires": { 1246 | "extend-shallow": "^2.0.1", 1247 | "is-number": "^3.0.0", 1248 | "repeat-string": "^1.6.1", 1249 | "to-regex-range": "^2.1.0" 1250 | }, 1251 | "dependencies": { 1252 | "extend-shallow": { 1253 | "version": "2.0.1", 1254 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 1255 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1256 | "dev": true, 1257 | "requires": { 1258 | "is-extendable": "^0.1.0" 1259 | } 1260 | } 1261 | } 1262 | }, 1263 | "finalhandler": { 1264 | "version": "0.3.4", 1265 | "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-0.3.4.tgz", 1266 | "integrity": "sha1-R4fTVz0HmuiwdTbyawuRHrryoqw=", 1267 | "requires": { 1268 | "debug": "~2.1.3", 1269 | "escape-html": "1.0.1", 1270 | "on-finished": "~2.2.0" 1271 | }, 1272 | "dependencies": { 1273 | "debug": { 1274 | "version": "2.1.3", 1275 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.1.3.tgz", 1276 | "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", 1277 | "requires": { 1278 | "ms": "0.7.0" 1279 | } 1280 | }, 1281 | "ms": { 1282 | "version": "0.7.0", 1283 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.0.tgz", 1284 | "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" 1285 | } 1286 | } 1287 | }, 1288 | "for-in": { 1289 | "version": "1.0.2", 1290 | "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", 1291 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1292 | "dev": true 1293 | }, 1294 | "forever-agent": { 1295 | "version": "0.6.1", 1296 | "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", 1297 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1298 | }, 1299 | "form-data": { 1300 | "version": "2.3.3", 1301 | "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", 1302 | "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", 1303 | "requires": { 1304 | "asynckit": "^0.4.0", 1305 | "combined-stream": "^1.0.6", 1306 | "mime-types": "^2.1.12" 1307 | } 1308 | }, 1309 | "formidable": { 1310 | "version": "1.2.1", 1311 | "resolved": "http://registry.npm.taobao.org/formidable/download/formidable-1.2.1.tgz", 1312 | "integrity": "sha1-cPt8oCkO5v+WEJBBX0s989IIJlk=" 1313 | }, 1314 | "forwarded": { 1315 | "version": "0.1.2", 1316 | "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", 1317 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1318 | }, 1319 | "fragment-cache": { 1320 | "version": "0.2.1", 1321 | "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", 1322 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1323 | "dev": true, 1324 | "requires": { 1325 | "map-cache": "^0.2.2" 1326 | } 1327 | }, 1328 | "fresh": { 1329 | "version": "0.2.4", 1330 | "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.2.4.tgz", 1331 | "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=" 1332 | }, 1333 | "fs.realpath": { 1334 | "version": "1.0.0", 1335 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 1336 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1337 | }, 1338 | "fsevents": { 1339 | "version": "1.2.7", 1340 | "resolved": "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.7.tgz", 1341 | "integrity": "sha1-SFG2ZKN4PlIAOzxm6w7uEHSTOqQ=", 1342 | "dev": true, 1343 | "optional": true, 1344 | "requires": { 1345 | "nan": "^2.9.2", 1346 | "node-pre-gyp": "^0.10.0" 1347 | }, 1348 | "dependencies": { 1349 | "abbrev": { 1350 | "version": "1.1.1", 1351 | "bundled": true, 1352 | "dev": true, 1353 | "optional": true 1354 | }, 1355 | "ansi-regex": { 1356 | "version": "2.1.1", 1357 | "bundled": true, 1358 | "dev": true, 1359 | "optional": true 1360 | }, 1361 | "aproba": { 1362 | "version": "1.2.0", 1363 | "bundled": true, 1364 | "dev": true, 1365 | "optional": true 1366 | }, 1367 | "are-we-there-yet": { 1368 | "version": "1.1.5", 1369 | "bundled": true, 1370 | "dev": true, 1371 | "optional": true, 1372 | "requires": { 1373 | "delegates": "^1.0.0", 1374 | "readable-stream": "^2.0.6" 1375 | } 1376 | }, 1377 | "balanced-match": { 1378 | "version": "1.0.0", 1379 | "bundled": true, 1380 | "dev": true, 1381 | "optional": true 1382 | }, 1383 | "brace-expansion": { 1384 | "version": "1.1.11", 1385 | "bundled": true, 1386 | "dev": true, 1387 | "optional": true, 1388 | "requires": { 1389 | "balanced-match": "^1.0.0", 1390 | "concat-map": "0.0.1" 1391 | } 1392 | }, 1393 | "chownr": { 1394 | "version": "1.1.1", 1395 | "bundled": true, 1396 | "dev": true, 1397 | "optional": true 1398 | }, 1399 | "code-point-at": { 1400 | "version": "1.1.0", 1401 | "bundled": true, 1402 | "dev": true, 1403 | "optional": true 1404 | }, 1405 | "concat-map": { 1406 | "version": "0.0.1", 1407 | "bundled": true, 1408 | "dev": true, 1409 | "optional": true 1410 | }, 1411 | "console-control-strings": { 1412 | "version": "1.1.0", 1413 | "bundled": true, 1414 | "dev": true, 1415 | "optional": true 1416 | }, 1417 | "core-util-is": { 1418 | "version": "1.0.2", 1419 | "bundled": true, 1420 | "dev": true, 1421 | "optional": true 1422 | }, 1423 | "debug": { 1424 | "version": "2.6.9", 1425 | "bundled": true, 1426 | "dev": true, 1427 | "optional": true, 1428 | "requires": { 1429 | "ms": "2.0.0" 1430 | } 1431 | }, 1432 | "deep-extend": { 1433 | "version": "0.6.0", 1434 | "bundled": true, 1435 | "dev": true, 1436 | "optional": true 1437 | }, 1438 | "delegates": { 1439 | "version": "1.0.0", 1440 | "bundled": true, 1441 | "dev": true, 1442 | "optional": true 1443 | }, 1444 | "detect-libc": { 1445 | "version": "1.0.3", 1446 | "bundled": true, 1447 | "dev": true, 1448 | "optional": true 1449 | }, 1450 | "fs-minipass": { 1451 | "version": "1.2.5", 1452 | "bundled": true, 1453 | "dev": true, 1454 | "optional": true, 1455 | "requires": { 1456 | "minipass": "^2.2.1" 1457 | } 1458 | }, 1459 | "fs.realpath": { 1460 | "version": "1.0.0", 1461 | "bundled": true, 1462 | "dev": true, 1463 | "optional": true 1464 | }, 1465 | "gauge": { 1466 | "version": "2.7.4", 1467 | "bundled": true, 1468 | "dev": true, 1469 | "optional": true, 1470 | "requires": { 1471 | "aproba": "^1.0.3", 1472 | "console-control-strings": "^1.0.0", 1473 | "has-unicode": "^2.0.0", 1474 | "object-assign": "^4.1.0", 1475 | "signal-exit": "^3.0.0", 1476 | "string-width": "^1.0.1", 1477 | "strip-ansi": "^3.0.1", 1478 | "wide-align": "^1.1.0" 1479 | } 1480 | }, 1481 | "glob": { 1482 | "version": "7.1.3", 1483 | "bundled": true, 1484 | "dev": true, 1485 | "optional": true, 1486 | "requires": { 1487 | "fs.realpath": "^1.0.0", 1488 | "inflight": "^1.0.4", 1489 | "inherits": "2", 1490 | "minimatch": "^3.0.4", 1491 | "once": "^1.3.0", 1492 | "path-is-absolute": "^1.0.0" 1493 | } 1494 | }, 1495 | "has-unicode": { 1496 | "version": "2.0.1", 1497 | "bundled": true, 1498 | "dev": true, 1499 | "optional": true 1500 | }, 1501 | "iconv-lite": { 1502 | "version": "0.4.24", 1503 | "bundled": true, 1504 | "dev": true, 1505 | "optional": true, 1506 | "requires": { 1507 | "safer-buffer": ">= 2.1.2 < 3" 1508 | } 1509 | }, 1510 | "ignore-walk": { 1511 | "version": "3.0.1", 1512 | "bundled": true, 1513 | "dev": true, 1514 | "optional": true, 1515 | "requires": { 1516 | "minimatch": "^3.0.4" 1517 | } 1518 | }, 1519 | "inflight": { 1520 | "version": "1.0.6", 1521 | "bundled": true, 1522 | "dev": true, 1523 | "optional": true, 1524 | "requires": { 1525 | "once": "^1.3.0", 1526 | "wrappy": "1" 1527 | } 1528 | }, 1529 | "inherits": { 1530 | "version": "2.0.3", 1531 | "bundled": true, 1532 | "dev": true, 1533 | "optional": true 1534 | }, 1535 | "ini": { 1536 | "version": "1.3.5", 1537 | "bundled": true, 1538 | "dev": true, 1539 | "optional": true 1540 | }, 1541 | "is-fullwidth-code-point": { 1542 | "version": "1.0.0", 1543 | "bundled": true, 1544 | "dev": true, 1545 | "optional": true, 1546 | "requires": { 1547 | "number-is-nan": "^1.0.0" 1548 | } 1549 | }, 1550 | "isarray": { 1551 | "version": "1.0.0", 1552 | "bundled": true, 1553 | "dev": true, 1554 | "optional": true 1555 | }, 1556 | "minimatch": { 1557 | "version": "3.0.4", 1558 | "bundled": true, 1559 | "dev": true, 1560 | "optional": true, 1561 | "requires": { 1562 | "brace-expansion": "^1.1.7" 1563 | } 1564 | }, 1565 | "minimist": { 1566 | "version": "0.0.8", 1567 | "bundled": true, 1568 | "dev": true, 1569 | "optional": true 1570 | }, 1571 | "minipass": { 1572 | "version": "2.3.5", 1573 | "bundled": true, 1574 | "dev": true, 1575 | "optional": true, 1576 | "requires": { 1577 | "safe-buffer": "^5.1.2", 1578 | "yallist": "^3.0.0" 1579 | } 1580 | }, 1581 | "minizlib": { 1582 | "version": "1.2.1", 1583 | "bundled": true, 1584 | "dev": true, 1585 | "optional": true, 1586 | "requires": { 1587 | "minipass": "^2.2.1" 1588 | } 1589 | }, 1590 | "mkdirp": { 1591 | "version": "0.5.1", 1592 | "bundled": true, 1593 | "dev": true, 1594 | "optional": true, 1595 | "requires": { 1596 | "minimist": "0.0.8" 1597 | } 1598 | }, 1599 | "ms": { 1600 | "version": "2.0.0", 1601 | "bundled": true, 1602 | "dev": true, 1603 | "optional": true 1604 | }, 1605 | "needle": { 1606 | "version": "2.2.4", 1607 | "bundled": true, 1608 | "dev": true, 1609 | "optional": true, 1610 | "requires": { 1611 | "debug": "^2.1.2", 1612 | "iconv-lite": "^0.4.4", 1613 | "sax": "^1.2.4" 1614 | } 1615 | }, 1616 | "node-pre-gyp": { 1617 | "version": "0.10.3", 1618 | "bundled": true, 1619 | "dev": true, 1620 | "optional": true, 1621 | "requires": { 1622 | "detect-libc": "^1.0.2", 1623 | "mkdirp": "^0.5.1", 1624 | "needle": "^2.2.1", 1625 | "nopt": "^4.0.1", 1626 | "npm-packlist": "^1.1.6", 1627 | "npmlog": "^4.0.2", 1628 | "rc": "^1.2.7", 1629 | "rimraf": "^2.6.1", 1630 | "semver": "^5.3.0", 1631 | "tar": "^4" 1632 | } 1633 | }, 1634 | "nopt": { 1635 | "version": "4.0.1", 1636 | "bundled": true, 1637 | "dev": true, 1638 | "optional": true, 1639 | "requires": { 1640 | "abbrev": "1", 1641 | "osenv": "^0.1.4" 1642 | } 1643 | }, 1644 | "npm-bundled": { 1645 | "version": "1.0.5", 1646 | "bundled": true, 1647 | "dev": true, 1648 | "optional": true 1649 | }, 1650 | "npm-packlist": { 1651 | "version": "1.2.0", 1652 | "bundled": true, 1653 | "dev": true, 1654 | "optional": true, 1655 | "requires": { 1656 | "ignore-walk": "^3.0.1", 1657 | "npm-bundled": "^1.0.1" 1658 | } 1659 | }, 1660 | "npmlog": { 1661 | "version": "4.1.2", 1662 | "bundled": true, 1663 | "dev": true, 1664 | "optional": true, 1665 | "requires": { 1666 | "are-we-there-yet": "~1.1.2", 1667 | "console-control-strings": "~1.1.0", 1668 | "gauge": "~2.7.3", 1669 | "set-blocking": "~2.0.0" 1670 | } 1671 | }, 1672 | "number-is-nan": { 1673 | "version": "1.0.1", 1674 | "bundled": true, 1675 | "dev": true, 1676 | "optional": true 1677 | }, 1678 | "object-assign": { 1679 | "version": "4.1.1", 1680 | "bundled": true, 1681 | "dev": true, 1682 | "optional": true 1683 | }, 1684 | "once": { 1685 | "version": "1.4.0", 1686 | "bundled": true, 1687 | "dev": true, 1688 | "optional": true, 1689 | "requires": { 1690 | "wrappy": "1" 1691 | } 1692 | }, 1693 | "os-homedir": { 1694 | "version": "1.0.2", 1695 | "bundled": true, 1696 | "dev": true, 1697 | "optional": true 1698 | }, 1699 | "os-tmpdir": { 1700 | "version": "1.0.2", 1701 | "bundled": true, 1702 | "dev": true, 1703 | "optional": true 1704 | }, 1705 | "osenv": { 1706 | "version": "0.1.5", 1707 | "bundled": true, 1708 | "dev": true, 1709 | "optional": true, 1710 | "requires": { 1711 | "os-homedir": "^1.0.0", 1712 | "os-tmpdir": "^1.0.0" 1713 | } 1714 | }, 1715 | "path-is-absolute": { 1716 | "version": "1.0.1", 1717 | "bundled": true, 1718 | "dev": true, 1719 | "optional": true 1720 | }, 1721 | "process-nextick-args": { 1722 | "version": "2.0.0", 1723 | "bundled": true, 1724 | "dev": true, 1725 | "optional": true 1726 | }, 1727 | "rc": { 1728 | "version": "1.2.8", 1729 | "bundled": true, 1730 | "dev": true, 1731 | "optional": true, 1732 | "requires": { 1733 | "deep-extend": "^0.6.0", 1734 | "ini": "~1.3.0", 1735 | "minimist": "^1.2.0", 1736 | "strip-json-comments": "~2.0.1" 1737 | }, 1738 | "dependencies": { 1739 | "minimist": { 1740 | "version": "1.2.0", 1741 | "bundled": true, 1742 | "dev": true, 1743 | "optional": true 1744 | } 1745 | } 1746 | }, 1747 | "readable-stream": { 1748 | "version": "2.3.6", 1749 | "bundled": true, 1750 | "dev": true, 1751 | "optional": true, 1752 | "requires": { 1753 | "core-util-is": "~1.0.0", 1754 | "inherits": "~2.0.3", 1755 | "isarray": "~1.0.0", 1756 | "process-nextick-args": "~2.0.0", 1757 | "safe-buffer": "~5.1.1", 1758 | "string_decoder": "~1.1.1", 1759 | "util-deprecate": "~1.0.1" 1760 | } 1761 | }, 1762 | "rimraf": { 1763 | "version": "2.6.3", 1764 | "bundled": true, 1765 | "dev": true, 1766 | "optional": true, 1767 | "requires": { 1768 | "glob": "^7.1.3" 1769 | } 1770 | }, 1771 | "safe-buffer": { 1772 | "version": "5.1.2", 1773 | "bundled": true, 1774 | "dev": true, 1775 | "optional": true 1776 | }, 1777 | "safer-buffer": { 1778 | "version": "2.1.2", 1779 | "bundled": true, 1780 | "dev": true, 1781 | "optional": true 1782 | }, 1783 | "sax": { 1784 | "version": "1.2.4", 1785 | "bundled": true, 1786 | "dev": true, 1787 | "optional": true 1788 | }, 1789 | "semver": { 1790 | "version": "5.6.0", 1791 | "bundled": true, 1792 | "dev": true, 1793 | "optional": true 1794 | }, 1795 | "set-blocking": { 1796 | "version": "2.0.0", 1797 | "bundled": true, 1798 | "dev": true, 1799 | "optional": true 1800 | }, 1801 | "signal-exit": { 1802 | "version": "3.0.2", 1803 | "bundled": true, 1804 | "dev": true, 1805 | "optional": true 1806 | }, 1807 | "string-width": { 1808 | "version": "1.0.2", 1809 | "bundled": true, 1810 | "dev": true, 1811 | "optional": true, 1812 | "requires": { 1813 | "code-point-at": "^1.0.0", 1814 | "is-fullwidth-code-point": "^1.0.0", 1815 | "strip-ansi": "^3.0.0" 1816 | } 1817 | }, 1818 | "string_decoder": { 1819 | "version": "1.1.1", 1820 | "bundled": true, 1821 | "dev": true, 1822 | "optional": true, 1823 | "requires": { 1824 | "safe-buffer": "~5.1.0" 1825 | } 1826 | }, 1827 | "strip-ansi": { 1828 | "version": "3.0.1", 1829 | "bundled": true, 1830 | "dev": true, 1831 | "optional": true, 1832 | "requires": { 1833 | "ansi-regex": "^2.0.0" 1834 | } 1835 | }, 1836 | "strip-json-comments": { 1837 | "version": "2.0.1", 1838 | "bundled": true, 1839 | "dev": true, 1840 | "optional": true 1841 | }, 1842 | "tar": { 1843 | "version": "4.4.8", 1844 | "bundled": true, 1845 | "dev": true, 1846 | "optional": true, 1847 | "requires": { 1848 | "chownr": "^1.1.1", 1849 | "fs-minipass": "^1.2.5", 1850 | "minipass": "^2.3.4", 1851 | "minizlib": "^1.1.1", 1852 | "mkdirp": "^0.5.0", 1853 | "safe-buffer": "^5.1.2", 1854 | "yallist": "^3.0.2" 1855 | } 1856 | }, 1857 | "util-deprecate": { 1858 | "version": "1.0.2", 1859 | "bundled": true, 1860 | "dev": true, 1861 | "optional": true 1862 | }, 1863 | "wide-align": { 1864 | "version": "1.1.3", 1865 | "bundled": true, 1866 | "dev": true, 1867 | "optional": true, 1868 | "requires": { 1869 | "string-width": "^1.0.2 || 2" 1870 | } 1871 | }, 1872 | "wrappy": { 1873 | "version": "1.0.2", 1874 | "bundled": true, 1875 | "dev": true, 1876 | "optional": true 1877 | }, 1878 | "yallist": { 1879 | "version": "3.0.3", 1880 | "bundled": true, 1881 | "dev": true, 1882 | "optional": true 1883 | } 1884 | } 1885 | }, 1886 | "get-stream": { 1887 | "version": "3.0.0", 1888 | "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", 1889 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 1890 | "dev": true 1891 | }, 1892 | "get-value": { 1893 | "version": "2.0.6", 1894 | "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", 1895 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1896 | "dev": true 1897 | }, 1898 | "getpass": { 1899 | "version": "0.1.7", 1900 | "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", 1901 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1902 | "requires": { 1903 | "assert-plus": "^1.0.0" 1904 | } 1905 | }, 1906 | "glob": { 1907 | "version": "7.1.3", 1908 | "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", 1909 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 1910 | "requires": { 1911 | "fs.realpath": "^1.0.0", 1912 | "inflight": "^1.0.4", 1913 | "inherits": "2", 1914 | "minimatch": "^3.0.4", 1915 | "once": "^1.3.0", 1916 | "path-is-absolute": "^1.0.0" 1917 | } 1918 | }, 1919 | "glob-parent": { 1920 | "version": "3.1.0", 1921 | "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", 1922 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1923 | "dev": true, 1924 | "requires": { 1925 | "is-glob": "^3.1.0", 1926 | "path-dirname": "^1.0.0" 1927 | }, 1928 | "dependencies": { 1929 | "is-glob": { 1930 | "version": "3.1.0", 1931 | "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", 1932 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1933 | "dev": true, 1934 | "requires": { 1935 | "is-extglob": "^2.1.0" 1936 | } 1937 | } 1938 | } 1939 | }, 1940 | "global-dirs": { 1941 | "version": "0.1.1", 1942 | "resolved": "http://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz", 1943 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1944 | "dev": true, 1945 | "requires": { 1946 | "ini": "^1.3.4" 1947 | } 1948 | }, 1949 | "got": { 1950 | "version": "6.7.1", 1951 | "resolved": "http://registry.npm.taobao.org/got/download/got-6.7.1.tgz", 1952 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1953 | "dev": true, 1954 | "requires": { 1955 | "create-error-class": "^3.0.0", 1956 | "duplexer3": "^0.1.4", 1957 | "get-stream": "^3.0.0", 1958 | "is-redirect": "^1.0.0", 1959 | "is-retry-allowed": "^1.0.0", 1960 | "is-stream": "^1.0.0", 1961 | "lowercase-keys": "^1.0.0", 1962 | "safe-buffer": "^5.0.1", 1963 | "timed-out": "^4.0.0", 1964 | "unzip-response": "^2.0.1", 1965 | "url-parse-lax": "^1.0.0" 1966 | } 1967 | }, 1968 | "graceful-fs": { 1969 | "version": "4.1.15", 1970 | "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz", 1971 | "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=", 1972 | "dev": true 1973 | }, 1974 | "har-schema": { 1975 | "version": "2.0.0", 1976 | "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", 1977 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1978 | }, 1979 | "har-validator": { 1980 | "version": "5.1.3", 1981 | "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", 1982 | "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", 1983 | "requires": { 1984 | "ajv": "^6.5.5", 1985 | "har-schema": "^2.0.0" 1986 | } 1987 | }, 1988 | "has-flag": { 1989 | "version": "3.0.0", 1990 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 1991 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1992 | "dev": true 1993 | }, 1994 | "has-value": { 1995 | "version": "1.0.0", 1996 | "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", 1997 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1998 | "dev": true, 1999 | "requires": { 2000 | "get-value": "^2.0.6", 2001 | "has-values": "^1.0.0", 2002 | "isobject": "^3.0.0" 2003 | } 2004 | }, 2005 | "has-values": { 2006 | "version": "1.0.0", 2007 | "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", 2008 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 2009 | "dev": true, 2010 | "requires": { 2011 | "is-number": "^3.0.0", 2012 | "kind-of": "^4.0.0" 2013 | }, 2014 | "dependencies": { 2015 | "kind-of": { 2016 | "version": "4.0.0", 2017 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", 2018 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 2019 | "dev": true, 2020 | "requires": { 2021 | "is-buffer": "^1.1.5" 2022 | } 2023 | } 2024 | } 2025 | }, 2026 | "http-errors": { 2027 | "version": "1.6.3", 2028 | "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", 2029 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 2030 | "requires": { 2031 | "depd": "~1.1.2", 2032 | "inherits": "2.0.3", 2033 | "setprototypeof": "1.1.0", 2034 | "statuses": ">= 1.4.0 < 2" 2035 | }, 2036 | "dependencies": { 2037 | "depd": { 2038 | "version": "1.1.2", 2039 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", 2040 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 2041 | } 2042 | } 2043 | }, 2044 | "http-signature": { 2045 | "version": "1.2.0", 2046 | "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", 2047 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 2048 | "requires": { 2049 | "assert-plus": "^1.0.0", 2050 | "jsprim": "^1.2.2", 2051 | "sshpk": "^1.7.0" 2052 | } 2053 | }, 2054 | "iconv-lite": { 2055 | "version": "0.4.8", 2056 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.8.tgz", 2057 | "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" 2058 | }, 2059 | "ignore-by-default": { 2060 | "version": "1.0.1", 2061 | "resolved": "http://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz", 2062 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 2063 | "dev": true 2064 | }, 2065 | "import-lazy": { 2066 | "version": "2.1.0", 2067 | "resolved": "http://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz", 2068 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 2069 | "dev": true 2070 | }, 2071 | "imurmurhash": { 2072 | "version": "0.1.4", 2073 | "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", 2074 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2075 | "dev": true 2076 | }, 2077 | "inflight": { 2078 | "version": "1.0.6", 2079 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 2080 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2081 | "requires": { 2082 | "once": "^1.3.0", 2083 | "wrappy": "1" 2084 | } 2085 | }, 2086 | "inherits": { 2087 | "version": "2.0.3", 2088 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 2089 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2090 | }, 2091 | "ini": { 2092 | "version": "1.3.5", 2093 | "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", 2094 | "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", 2095 | "dev": true 2096 | }, 2097 | "invert-kv": { 2098 | "version": "1.0.0", 2099 | "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", 2100 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 2101 | }, 2102 | "ipaddr.js": { 2103 | "version": "1.0.5", 2104 | "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.0.5.tgz", 2105 | "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c=" 2106 | }, 2107 | "is-accessor-descriptor": { 2108 | "version": "0.1.6", 2109 | "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", 2110 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 2111 | "dev": true, 2112 | "requires": { 2113 | "kind-of": "^3.0.2" 2114 | }, 2115 | "dependencies": { 2116 | "kind-of": { 2117 | "version": "3.2.2", 2118 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 2119 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2120 | "dev": true, 2121 | "requires": { 2122 | "is-buffer": "^1.1.5" 2123 | } 2124 | } 2125 | } 2126 | }, 2127 | "is-binary-path": { 2128 | "version": "1.0.1", 2129 | "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", 2130 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 2131 | "dev": true, 2132 | "requires": { 2133 | "binary-extensions": "^1.0.0" 2134 | } 2135 | }, 2136 | "is-buffer": { 2137 | "version": "1.1.6", 2138 | "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", 2139 | "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" 2140 | }, 2141 | "is-ci": { 2142 | "version": "1.2.1", 2143 | "resolved": "http://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz", 2144 | "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", 2145 | "dev": true, 2146 | "requires": { 2147 | "ci-info": "^1.5.0" 2148 | } 2149 | }, 2150 | "is-data-descriptor": { 2151 | "version": "0.1.4", 2152 | "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", 2153 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 2154 | "dev": true, 2155 | "requires": { 2156 | "kind-of": "^3.0.2" 2157 | }, 2158 | "dependencies": { 2159 | "kind-of": { 2160 | "version": "3.2.2", 2161 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 2162 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2163 | "dev": true, 2164 | "requires": { 2165 | "is-buffer": "^1.1.5" 2166 | } 2167 | } 2168 | } 2169 | }, 2170 | "is-descriptor": { 2171 | "version": "0.1.6", 2172 | "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", 2173 | "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", 2174 | "dev": true, 2175 | "requires": { 2176 | "is-accessor-descriptor": "^0.1.6", 2177 | "is-data-descriptor": "^0.1.4", 2178 | "kind-of": "^5.0.0" 2179 | }, 2180 | "dependencies": { 2181 | "kind-of": { 2182 | "version": "5.1.0", 2183 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", 2184 | "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", 2185 | "dev": true 2186 | } 2187 | } 2188 | }, 2189 | "is-extendable": { 2190 | "version": "0.1.1", 2191 | "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", 2192 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 2193 | "dev": true 2194 | }, 2195 | "is-extglob": { 2196 | "version": "2.1.1", 2197 | "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", 2198 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2199 | "dev": true 2200 | }, 2201 | "is-fullwidth-code-point": { 2202 | "version": "1.0.0", 2203 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", 2204 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2205 | "requires": { 2206 | "number-is-nan": "^1.0.0" 2207 | } 2208 | }, 2209 | "is-glob": { 2210 | "version": "4.0.0", 2211 | "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz", 2212 | "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", 2213 | "dev": true, 2214 | "requires": { 2215 | "is-extglob": "^2.1.1" 2216 | } 2217 | }, 2218 | "is-installed-globally": { 2219 | "version": "0.1.0", 2220 | "resolved": "http://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.1.0.tgz", 2221 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 2222 | "dev": true, 2223 | "requires": { 2224 | "global-dirs": "^0.1.0", 2225 | "is-path-inside": "^1.0.0" 2226 | } 2227 | }, 2228 | "is-npm": { 2229 | "version": "1.0.0", 2230 | "resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz", 2231 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", 2232 | "dev": true 2233 | }, 2234 | "is-number": { 2235 | "version": "3.0.0", 2236 | "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", 2237 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2238 | "dev": true, 2239 | "requires": { 2240 | "kind-of": "^3.0.2" 2241 | }, 2242 | "dependencies": { 2243 | "kind-of": { 2244 | "version": "3.2.2", 2245 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 2246 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2247 | "dev": true, 2248 | "requires": { 2249 | "is-buffer": "^1.1.5" 2250 | } 2251 | } 2252 | } 2253 | }, 2254 | "is-obj": { 2255 | "version": "1.0.1", 2256 | "resolved": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", 2257 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 2258 | "dev": true 2259 | }, 2260 | "is-path-inside": { 2261 | "version": "1.0.1", 2262 | "resolved": "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz", 2263 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 2264 | "dev": true, 2265 | "requires": { 2266 | "path-is-inside": "^1.0.1" 2267 | } 2268 | }, 2269 | "is-plain-object": { 2270 | "version": "2.0.4", 2271 | "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", 2272 | "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", 2273 | "dev": true, 2274 | "requires": { 2275 | "isobject": "^3.0.1" 2276 | } 2277 | }, 2278 | "is-redirect": { 2279 | "version": "1.0.0", 2280 | "resolved": "http://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz", 2281 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", 2282 | "dev": true 2283 | }, 2284 | "is-retry-allowed": { 2285 | "version": "1.1.0", 2286 | "resolved": "http://registry.npm.taobao.org/is-retry-allowed/download/is-retry-allowed-1.1.0.tgz", 2287 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", 2288 | "dev": true 2289 | }, 2290 | "is-stream": { 2291 | "version": "1.1.0", 2292 | "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", 2293 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 2294 | "dev": true 2295 | }, 2296 | "is-typedarray": { 2297 | "version": "1.0.0", 2298 | "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", 2299 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 2300 | }, 2301 | "is-windows": { 2302 | "version": "1.0.2", 2303 | "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", 2304 | "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", 2305 | "dev": true 2306 | }, 2307 | "isarray": { 2308 | "version": "1.0.0", 2309 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", 2310 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2311 | }, 2312 | "isexe": { 2313 | "version": "2.0.0", 2314 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 2315 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2316 | "dev": true 2317 | }, 2318 | "isobject": { 2319 | "version": "3.0.1", 2320 | "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", 2321 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 2322 | "dev": true 2323 | }, 2324 | "isstream": { 2325 | "version": "0.1.2", 2326 | "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", 2327 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 2328 | }, 2329 | "javascript-state-machine": { 2330 | "version": "2.4.0", 2331 | "resolved": "http://registry.npm.taobao.org/javascript-state-machine/download/javascript-state-machine-2.4.0.tgz", 2332 | "integrity": "sha1-2L4x7DjySsGhgy8LZy/DzV95yW4=" 2333 | }, 2334 | "jsbn": { 2335 | "version": "0.1.1", 2336 | "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", 2337 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 2338 | }, 2339 | "json-schema": { 2340 | "version": "0.2.3", 2341 | "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", 2342 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 2343 | }, 2344 | "json-schema-traverse": { 2345 | "version": "0.4.1", 2346 | "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", 2347 | "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" 2348 | }, 2349 | "json-stringify-safe": { 2350 | "version": "5.0.1", 2351 | "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", 2352 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 2353 | }, 2354 | "jsprim": { 2355 | "version": "1.4.1", 2356 | "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", 2357 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 2358 | "requires": { 2359 | "assert-plus": "1.0.0", 2360 | "extsprintf": "1.3.0", 2361 | "json-schema": "0.2.3", 2362 | "verror": "1.10.0" 2363 | } 2364 | }, 2365 | "keygrip": { 2366 | "version": "1.0.3", 2367 | "resolved": "http://registry.npm.taobao.org/keygrip/download/keygrip-1.0.3.tgz", 2368 | "integrity": "sha1-OZ1wnwrtK6sKBZ4M3TpQI6BT4dw=" 2369 | }, 2370 | "kind-of": { 2371 | "version": "6.0.2", 2372 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", 2373 | "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", 2374 | "dev": true 2375 | }, 2376 | "latest-version": { 2377 | "version": "3.1.0", 2378 | "resolved": "http://registry.npm.taobao.org/latest-version/download/latest-version-3.1.0.tgz", 2379 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 2380 | "dev": true, 2381 | "requires": { 2382 | "package-json": "^4.0.0" 2383 | } 2384 | }, 2385 | "lcid": { 2386 | "version": "1.0.0", 2387 | "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", 2388 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2389 | "requires": { 2390 | "invert-kv": "^1.0.0" 2391 | } 2392 | }, 2393 | "leancloud-cors-headers": { 2394 | "version": "0.1.0", 2395 | "resolved": "http://registry.npm.taobao.org/leancloud-cors-headers/download/leancloud-cors-headers-0.1.0.tgz", 2396 | "integrity": "sha1-papLNyWnmlVd/GeybDUP4zyAzzw=" 2397 | }, 2398 | "leancloud-realtime": { 2399 | "version": "4.2.1", 2400 | "resolved": "http://registry.npm.taobao.org/leancloud-realtime/download/leancloud-realtime-4.2.1.tgz", 2401 | "integrity": "sha1-QzbLBV7SRvtnFXqgmjIYvbfYcAM=", 2402 | "requires": { 2403 | "axios": "^0.18.0", 2404 | "babel-runtime": "^6.6.1", 2405 | "base64-arraybuffer": "^0.1.5", 2406 | "debug": "^3.1.0", 2407 | "eventemitter3": "^3.0.0", 2408 | "javascript-state-machine": "^2.3.5", 2409 | "lodash": "^4.17.10", 2410 | "protobufjs": "^5.0.1", 2411 | "uuid": "^3.0.0", 2412 | "ws": "^5.2.1" 2413 | }, 2414 | "dependencies": { 2415 | "eventemitter3": { 2416 | "version": "3.1.0", 2417 | "resolved": "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-3.1.0.tgz", 2418 | "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=" 2419 | } 2420 | } 2421 | }, 2422 | "leancloud-realtime-plugin-live-query": { 2423 | "version": "1.1.2", 2424 | "resolved": "http://registry.npm.taobao.org/leancloud-realtime-plugin-live-query/download/leancloud-realtime-plugin-live-query-1.1.2.tgz", 2425 | "integrity": "sha1-FsS6G6vguQe89jxOyFRioKs0lmI=" 2426 | }, 2427 | "leancloud-storage": { 2428 | "version": "3.11.1", 2429 | "resolved": "http://registry.npm.taobao.org/leancloud-storage/download/leancloud-storage-3.11.1.tgz", 2430 | "integrity": "sha1-ryeHThn5NGR+2ahqihlQe9b2Sec=", 2431 | "requires": { 2432 | "debug": "^3.1.0", 2433 | "es6-promise": "4.2.3", 2434 | "eventemitter3": "^2.0.3", 2435 | "leancloud-realtime": "^4.2.0", 2436 | "leancloud-realtime-plugin-live-query": "^1.1.2", 2437 | "localstorage-memory": "^1.0.1", 2438 | "md5": "^2.0.0", 2439 | "superagent": "^3.3.1", 2440 | "underscore": "^1.8.3", 2441 | "uuid": "^3.3.2" 2442 | } 2443 | }, 2444 | "leanengine": { 2445 | "version": "3.3.2", 2446 | "resolved": "http://registry.npm.taobao.org/leanengine/download/leanengine-3.3.2.tgz", 2447 | "integrity": "sha1-fZGYeP0iPDhyigW02gFf8ciELac=", 2448 | "requires": { 2449 | "body-parser": "^1.16.0", 2450 | "connect": "^3.5.0", 2451 | "connect-timeout": "^1.8.0", 2452 | "cookies": "^0.6.2", 2453 | "debug": "^2.6.0", 2454 | "leancloud-cors-headers": "^0.1.0", 2455 | "on-headers": "^1.0.1", 2456 | "underscore": "^1.8.3" 2457 | }, 2458 | "dependencies": { 2459 | "body-parser": { 2460 | "version": "1.18.3", 2461 | "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.3.tgz", 2462 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 2463 | "requires": { 2464 | "bytes": "3.0.0", 2465 | "content-type": "~1.0.4", 2466 | "debug": "2.6.9", 2467 | "depd": "~1.1.2", 2468 | "http-errors": "~1.6.3", 2469 | "iconv-lite": "0.4.23", 2470 | "on-finished": "~2.3.0", 2471 | "qs": "6.5.2", 2472 | "raw-body": "2.3.3", 2473 | "type-is": "~1.6.16" 2474 | } 2475 | }, 2476 | "bytes": { 2477 | "version": "3.0.0", 2478 | "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", 2479 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 2480 | }, 2481 | "debug": { 2482 | "version": "2.6.9", 2483 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 2484 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 2485 | "requires": { 2486 | "ms": "2.0.0" 2487 | } 2488 | }, 2489 | "depd": { 2490 | "version": "1.1.2", 2491 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", 2492 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 2493 | }, 2494 | "ee-first": { 2495 | "version": "1.1.1", 2496 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 2497 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 2498 | }, 2499 | "iconv-lite": { 2500 | "version": "0.4.23", 2501 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz", 2502 | "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", 2503 | "requires": { 2504 | "safer-buffer": ">= 2.1.2 < 3" 2505 | } 2506 | }, 2507 | "ms": { 2508 | "version": "2.0.0", 2509 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 2510 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2511 | }, 2512 | "on-finished": { 2513 | "version": "2.3.0", 2514 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 2515 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2516 | "requires": { 2517 | "ee-first": "1.1.1" 2518 | } 2519 | }, 2520 | "qs": { 2521 | "version": "6.5.2", 2522 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", 2523 | "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" 2524 | }, 2525 | "raw-body": { 2526 | "version": "2.3.3", 2527 | "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.3.tgz", 2528 | "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", 2529 | "requires": { 2530 | "bytes": "3.0.0", 2531 | "http-errors": "1.6.3", 2532 | "iconv-lite": "0.4.23", 2533 | "unpipe": "1.0.0" 2534 | } 2535 | } 2536 | } 2537 | }, 2538 | "localstorage-memory": { 2539 | "version": "1.0.3", 2540 | "resolved": "http://registry.npm.taobao.org/localstorage-memory/download/localstorage-memory-1.0.3.tgz", 2541 | "integrity": "sha1-Vms3lo/gxNdro2ptpWT6YTlFynI=" 2542 | }, 2543 | "lodash": { 2544 | "version": "4.17.19", 2545 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 2546 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 2547 | }, 2548 | "long": { 2549 | "version": "3.2.0", 2550 | "resolved": "http://registry.npm.taobao.org/long/download/long-3.2.0.tgz", 2551 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 2552 | }, 2553 | "lowercase-keys": { 2554 | "version": "1.0.1", 2555 | "resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz", 2556 | "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", 2557 | "dev": true 2558 | }, 2559 | "lru-cache": { 2560 | "version": "4.1.5", 2561 | "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", 2562 | "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", 2563 | "dev": true, 2564 | "requires": { 2565 | "pseudomap": "^1.0.2", 2566 | "yallist": "^2.1.2" 2567 | } 2568 | }, 2569 | "make-dir": { 2570 | "version": "1.3.0", 2571 | "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz", 2572 | "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", 2573 | "dev": true, 2574 | "requires": { 2575 | "pify": "^3.0.0" 2576 | } 2577 | }, 2578 | "map-cache": { 2579 | "version": "0.2.2", 2580 | "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", 2581 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 2582 | "dev": true 2583 | }, 2584 | "map-visit": { 2585 | "version": "1.0.0", 2586 | "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", 2587 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 2588 | "dev": true, 2589 | "requires": { 2590 | "object-visit": "^1.0.0" 2591 | } 2592 | }, 2593 | "md5": { 2594 | "version": "2.2.1", 2595 | "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz", 2596 | "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", 2597 | "requires": { 2598 | "charenc": "~0.0.1", 2599 | "crypt": "~0.0.1", 2600 | "is-buffer": "~1.1.1" 2601 | } 2602 | }, 2603 | "media-typer": { 2604 | "version": "0.3.0", 2605 | "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", 2606 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2607 | }, 2608 | "merge-descriptors": { 2609 | "version": "1.0.0", 2610 | "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.0.tgz", 2611 | "integrity": "sha1-IWnPdTjhsMyH+4jhUC2EdLv3mGQ=" 2612 | }, 2613 | "methods": { 2614 | "version": "1.1.2", 2615 | "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", 2616 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2617 | }, 2618 | "micromatch": { 2619 | "version": "3.1.10", 2620 | "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", 2621 | "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", 2622 | "dev": true, 2623 | "requires": { 2624 | "arr-diff": "^4.0.0", 2625 | "array-unique": "^0.3.2", 2626 | "braces": "^2.3.1", 2627 | "define-property": "^2.0.2", 2628 | "extend-shallow": "^3.0.2", 2629 | "extglob": "^2.0.4", 2630 | "fragment-cache": "^0.2.1", 2631 | "kind-of": "^6.0.2", 2632 | "nanomatch": "^1.2.9", 2633 | "object.pick": "^1.3.0", 2634 | "regex-not": "^1.0.0", 2635 | "snapdragon": "^0.8.1", 2636 | "to-regex": "^3.0.2" 2637 | } 2638 | }, 2639 | "mime": { 2640 | "version": "1.6.0", 2641 | "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", 2642 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" 2643 | }, 2644 | "mime-db": { 2645 | "version": "1.37.0", 2646 | "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz", 2647 | "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" 2648 | }, 2649 | "mime-types": { 2650 | "version": "2.1.21", 2651 | "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz", 2652 | "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", 2653 | "requires": { 2654 | "mime-db": "~1.37.0" 2655 | } 2656 | }, 2657 | "minimatch": { 2658 | "version": "3.0.4", 2659 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 2660 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 2661 | "requires": { 2662 | "brace-expansion": "^1.1.7" 2663 | } 2664 | }, 2665 | "minimist": { 2666 | "version": "1.2.0", 2667 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", 2668 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 2669 | "dev": true 2670 | }, 2671 | "mixin-deep": { 2672 | "version": "1.3.2", 2673 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 2674 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 2675 | "dev": true, 2676 | "requires": { 2677 | "for-in": "^1.0.2", 2678 | "is-extendable": "^1.0.1" 2679 | }, 2680 | "dependencies": { 2681 | "is-extendable": { 2682 | "version": "1.0.1", 2683 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2684 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2685 | "dev": true, 2686 | "requires": { 2687 | "is-plain-object": "^2.0.4" 2688 | } 2689 | } 2690 | } 2691 | }, 2692 | "ms": { 2693 | "version": "2.1.1", 2694 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", 2695 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" 2696 | }, 2697 | "nan": { 2698 | "version": "2.12.1", 2699 | "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.12.1.tgz", 2700 | "integrity": "sha1-exqhk+mqhgV+PHu9CsRI53CSVVI=", 2701 | "dev": true, 2702 | "optional": true 2703 | }, 2704 | "nanomatch": { 2705 | "version": "1.2.13", 2706 | "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", 2707 | "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", 2708 | "dev": true, 2709 | "requires": { 2710 | "arr-diff": "^4.0.0", 2711 | "array-unique": "^0.3.2", 2712 | "define-property": "^2.0.2", 2713 | "extend-shallow": "^3.0.2", 2714 | "fragment-cache": "^0.2.1", 2715 | "is-windows": "^1.0.2", 2716 | "kind-of": "^6.0.2", 2717 | "object.pick": "^1.3.0", 2718 | "regex-not": "^1.0.0", 2719 | "snapdragon": "^0.8.1", 2720 | "to-regex": "^3.0.1" 2721 | } 2722 | }, 2723 | "negotiator": { 2724 | "version": "0.5.3", 2725 | "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.5.3.tgz", 2726 | "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" 2727 | }, 2728 | "nodemailer": { 2729 | "version": "4.7.0", 2730 | "resolved": "http://registry.npm.taobao.org/nodemailer/download/nodemailer-4.7.0.tgz", 2731 | "integrity": "sha1-RCDgar//130GGPGE6kkEfbhPStg=" 2732 | }, 2733 | "nodemon": { 2734 | "version": "1.18.9", 2735 | "resolved": "http://registry.npm.taobao.org/nodemon/download/nodemon-1.18.9.tgz", 2736 | "integrity": "sha1-kLRn79OzyBuUUzgK6yosulNdDq0=", 2737 | "dev": true, 2738 | "requires": { 2739 | "chokidar": "^2.0.4", 2740 | "debug": "^3.1.0", 2741 | "ignore-by-default": "^1.0.1", 2742 | "minimatch": "^3.0.4", 2743 | "pstree.remy": "^1.1.6", 2744 | "semver": "^5.5.0", 2745 | "supports-color": "^5.2.0", 2746 | "touch": "^3.1.0", 2747 | "undefsafe": "^2.0.2", 2748 | "update-notifier": "^2.5.0" 2749 | } 2750 | }, 2751 | "nopt": { 2752 | "version": "1.0.10", 2753 | "resolved": "http://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz", 2754 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 2755 | "dev": true, 2756 | "requires": { 2757 | "abbrev": "1" 2758 | } 2759 | }, 2760 | "normalize-path": { 2761 | "version": "3.0.0", 2762 | "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", 2763 | "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", 2764 | "dev": true 2765 | }, 2766 | "npm-run-path": { 2767 | "version": "2.0.2", 2768 | "resolved": "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", 2769 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 2770 | "dev": true, 2771 | "requires": { 2772 | "path-key": "^2.0.0" 2773 | } 2774 | }, 2775 | "number-is-nan": { 2776 | "version": "1.0.1", 2777 | "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", 2778 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2779 | }, 2780 | "oauth-sign": { 2781 | "version": "0.9.0", 2782 | "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", 2783 | "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" 2784 | }, 2785 | "object-copy": { 2786 | "version": "0.1.0", 2787 | "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", 2788 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2789 | "dev": true, 2790 | "requires": { 2791 | "copy-descriptor": "^0.1.0", 2792 | "define-property": "^0.2.5", 2793 | "kind-of": "^3.0.3" 2794 | }, 2795 | "dependencies": { 2796 | "define-property": { 2797 | "version": "0.2.5", 2798 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", 2799 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2800 | "dev": true, 2801 | "requires": { 2802 | "is-descriptor": "^0.1.0" 2803 | } 2804 | }, 2805 | "kind-of": { 2806 | "version": "3.2.2", 2807 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 2808 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2809 | "dev": true, 2810 | "requires": { 2811 | "is-buffer": "^1.1.5" 2812 | } 2813 | } 2814 | } 2815 | }, 2816 | "object-visit": { 2817 | "version": "1.0.1", 2818 | "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", 2819 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2820 | "dev": true, 2821 | "requires": { 2822 | "isobject": "^3.0.0" 2823 | } 2824 | }, 2825 | "object.pick": { 2826 | "version": "1.3.0", 2827 | "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", 2828 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2829 | "dev": true, 2830 | "requires": { 2831 | "isobject": "^3.0.1" 2832 | } 2833 | }, 2834 | "on-finished": { 2835 | "version": "2.2.1", 2836 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.2.1.tgz", 2837 | "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=", 2838 | "requires": { 2839 | "ee-first": "1.1.0" 2840 | } 2841 | }, 2842 | "on-headers": { 2843 | "version": "1.0.1", 2844 | "resolved": "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz", 2845 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 2846 | }, 2847 | "once": { 2848 | "version": "1.4.0", 2849 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 2850 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2851 | "requires": { 2852 | "wrappy": "1" 2853 | } 2854 | }, 2855 | "optjs": { 2856 | "version": "3.2.2", 2857 | "resolved": "http://registry.npm.taobao.org/optjs/download/optjs-3.2.2.tgz", 2858 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 2859 | }, 2860 | "os-locale": { 2861 | "version": "1.4.0", 2862 | "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", 2863 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2864 | "requires": { 2865 | "lcid": "^1.0.0" 2866 | } 2867 | }, 2868 | "p-finally": { 2869 | "version": "1.0.0", 2870 | "resolved": "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", 2871 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 2872 | "dev": true 2873 | }, 2874 | "package-json": { 2875 | "version": "4.0.1", 2876 | "resolved": "http://registry.npm.taobao.org/package-json/download/package-json-4.0.1.tgz", 2877 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 2878 | "dev": true, 2879 | "requires": { 2880 | "got": "^6.7.1", 2881 | "registry-auth-token": "^3.0.1", 2882 | "registry-url": "^3.0.3", 2883 | "semver": "^5.1.0" 2884 | } 2885 | }, 2886 | "parseurl": { 2887 | "version": "1.3.2", 2888 | "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", 2889 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2890 | }, 2891 | "pascalcase": { 2892 | "version": "0.1.1", 2893 | "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", 2894 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 2895 | "dev": true 2896 | }, 2897 | "path-dirname": { 2898 | "version": "1.0.2", 2899 | "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", 2900 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 2901 | "dev": true 2902 | }, 2903 | "path-is-absolute": { 2904 | "version": "1.0.1", 2905 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 2906 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2907 | }, 2908 | "path-is-inside": { 2909 | "version": "1.0.2", 2910 | "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", 2911 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2912 | "dev": true 2913 | }, 2914 | "path-key": { 2915 | "version": "2.0.1", 2916 | "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", 2917 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2918 | "dev": true 2919 | }, 2920 | "path-to-regexp": { 2921 | "version": "0.1.3", 2922 | "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.3.tgz", 2923 | "integrity": "sha1-IbmrgidCed4lsVbqCP0SylG4rss=" 2924 | }, 2925 | "performance-now": { 2926 | "version": "2.1.0", 2927 | "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", 2928 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2929 | }, 2930 | "pify": { 2931 | "version": "3.0.0", 2932 | "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", 2933 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2934 | "dev": true 2935 | }, 2936 | "posix-character-classes": { 2937 | "version": "0.1.1", 2938 | "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", 2939 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 2940 | "dev": true 2941 | }, 2942 | "prepend-http": { 2943 | "version": "1.0.4", 2944 | "resolved": "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", 2945 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 2946 | "dev": true 2947 | }, 2948 | "process-nextick-args": { 2949 | "version": "2.0.0", 2950 | "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", 2951 | "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" 2952 | }, 2953 | "protobufjs": { 2954 | "version": "5.0.3", 2955 | "resolved": "http://registry.npm.taobao.org/protobufjs/download/protobufjs-5.0.3.tgz", 2956 | "integrity": "sha1-5N/p+2fJCyYw0VhoJJvMSWFGehc=", 2957 | "requires": { 2958 | "ascli": "~1", 2959 | "bytebuffer": "~5", 2960 | "glob": "^7.0.5", 2961 | "yargs": "^3.10.0" 2962 | } 2963 | }, 2964 | "proxy-addr": { 2965 | "version": "1.0.10", 2966 | "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-1.0.10.tgz", 2967 | "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=", 2968 | "requires": { 2969 | "forwarded": "~0.1.0", 2970 | "ipaddr.js": "1.0.5" 2971 | } 2972 | }, 2973 | "pseudomap": { 2974 | "version": "1.0.2", 2975 | "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", 2976 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 2977 | "dev": true 2978 | }, 2979 | "psl": { 2980 | "version": "1.1.31", 2981 | "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz", 2982 | "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=" 2983 | }, 2984 | "pstree.remy": { 2985 | "version": "1.1.6", 2986 | "resolved": "http://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.6.tgz", 2987 | "integrity": "sha1-c6VarZ4tlYFJJxMfv03Bti0ln0c=", 2988 | "dev": true 2989 | }, 2990 | "punycode": { 2991 | "version": "2.1.1", 2992 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", 2993 | "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" 2994 | }, 2995 | "qs": { 2996 | "version": "6.6.0", 2997 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.6.0.tgz", 2998 | "integrity": "sha1-qZwPaajSa/fvAS+HHNq7Cu5EJMI=" 2999 | }, 3000 | "range-parser": { 3001 | "version": "1.0.3", 3002 | "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.0.3.tgz", 3003 | "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" 3004 | }, 3005 | "raw-body": { 3006 | "version": "1.3.4", 3007 | "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-1.3.4.tgz", 3008 | "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", 3009 | "requires": { 3010 | "bytes": "1.0.0", 3011 | "iconv-lite": "0.4.8" 3012 | } 3013 | }, 3014 | "rc": { 3015 | "version": "1.2.8", 3016 | "resolved": "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz", 3017 | "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", 3018 | "dev": true, 3019 | "requires": { 3020 | "deep-extend": "^0.6.0", 3021 | "ini": "~1.3.0", 3022 | "minimist": "^1.2.0", 3023 | "strip-json-comments": "~2.0.1" 3024 | } 3025 | }, 3026 | "readable-stream": { 3027 | "version": "2.3.6", 3028 | "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", 3029 | "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", 3030 | "requires": { 3031 | "core-util-is": "~1.0.0", 3032 | "inherits": "~2.0.3", 3033 | "isarray": "~1.0.0", 3034 | "process-nextick-args": "~2.0.0", 3035 | "safe-buffer": "~5.1.1", 3036 | "string_decoder": "~1.1.1", 3037 | "util-deprecate": "~1.0.1" 3038 | } 3039 | }, 3040 | "readdirp": { 3041 | "version": "2.2.1", 3042 | "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", 3043 | "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", 3044 | "dev": true, 3045 | "requires": { 3046 | "graceful-fs": "^4.1.11", 3047 | "micromatch": "^3.1.10", 3048 | "readable-stream": "^2.0.2" 3049 | } 3050 | }, 3051 | "regenerator-runtime": { 3052 | "version": "0.11.1", 3053 | "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", 3054 | "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" 3055 | }, 3056 | "regex-not": { 3057 | "version": "1.0.2", 3058 | "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", 3059 | "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", 3060 | "dev": true, 3061 | "requires": { 3062 | "extend-shallow": "^3.0.2", 3063 | "safe-regex": "^1.1.0" 3064 | } 3065 | }, 3066 | "registry-auth-token": { 3067 | "version": "3.3.2", 3068 | "resolved": "http://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.3.2.tgz", 3069 | "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", 3070 | "dev": true, 3071 | "requires": { 3072 | "rc": "^1.1.6", 3073 | "safe-buffer": "^5.0.1" 3074 | } 3075 | }, 3076 | "registry-url": { 3077 | "version": "3.1.0", 3078 | "resolved": "http://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz", 3079 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 3080 | "dev": true, 3081 | "requires": { 3082 | "rc": "^1.0.1" 3083 | } 3084 | }, 3085 | "remove-trailing-separator": { 3086 | "version": "1.1.0", 3087 | "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", 3088 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 3089 | "dev": true 3090 | }, 3091 | "repeat-element": { 3092 | "version": "1.1.3", 3093 | "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", 3094 | "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", 3095 | "dev": true 3096 | }, 3097 | "repeat-string": { 3098 | "version": "1.6.1", 3099 | "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", 3100 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 3101 | "dev": true 3102 | }, 3103 | "request": { 3104 | "version": "2.88.0", 3105 | "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", 3106 | "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", 3107 | "requires": { 3108 | "aws-sign2": "~0.7.0", 3109 | "aws4": "^1.8.0", 3110 | "caseless": "~0.12.0", 3111 | "combined-stream": "~1.0.6", 3112 | "extend": "~3.0.2", 3113 | "forever-agent": "~0.6.1", 3114 | "form-data": "~2.3.2", 3115 | "har-validator": "~5.1.0", 3116 | "http-signature": "~1.2.0", 3117 | "is-typedarray": "~1.0.0", 3118 | "isstream": "~0.1.2", 3119 | "json-stringify-safe": "~5.0.1", 3120 | "mime-types": "~2.1.19", 3121 | "oauth-sign": "~0.9.0", 3122 | "performance-now": "^2.1.0", 3123 | "qs": "~6.5.2", 3124 | "safe-buffer": "^5.1.2", 3125 | "tough-cookie": "~2.4.3", 3126 | "tunnel-agent": "^0.6.0", 3127 | "uuid": "^3.3.2" 3128 | }, 3129 | "dependencies": { 3130 | "qs": { 3131 | "version": "6.5.2", 3132 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", 3133 | "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" 3134 | } 3135 | } 3136 | }, 3137 | "resolve-url": { 3138 | "version": "0.2.1", 3139 | "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", 3140 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 3141 | "dev": true 3142 | }, 3143 | "ret": { 3144 | "version": "0.1.15", 3145 | "resolved": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", 3146 | "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", 3147 | "dev": true 3148 | }, 3149 | "safe-buffer": { 3150 | "version": "5.1.2", 3151 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 3152 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 3153 | }, 3154 | "safe-regex": { 3155 | "version": "1.1.0", 3156 | "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", 3157 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 3158 | "dev": true, 3159 | "requires": { 3160 | "ret": "~0.1.10" 3161 | } 3162 | }, 3163 | "safer-buffer": { 3164 | "version": "2.1.2", 3165 | "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", 3166 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 3167 | }, 3168 | "semver": { 3169 | "version": "5.6.0", 3170 | "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz", 3171 | "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=", 3172 | "dev": true 3173 | }, 3174 | "semver-diff": { 3175 | "version": "2.1.0", 3176 | "resolved": "http://registry.npm.taobao.org/semver-diff/download/semver-diff-2.1.0.tgz", 3177 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 3178 | "dev": true, 3179 | "requires": { 3180 | "semver": "^5.0.3" 3181 | } 3182 | }, 3183 | "send": { 3184 | "version": "0.12.2", 3185 | "resolved": "http://registry.npm.taobao.org/send/download/send-0.12.2.tgz", 3186 | "integrity": "sha1-umeF5Hq0GqA1i52kAasi/w9Y6rY=", 3187 | "requires": { 3188 | "debug": "~2.1.3", 3189 | "depd": "~1.0.0", 3190 | "destroy": "1.0.3", 3191 | "escape-html": "1.0.1", 3192 | "etag": "~1.5.1", 3193 | "fresh": "0.2.4", 3194 | "mime": "1.3.4", 3195 | "ms": "0.7.0", 3196 | "on-finished": "~2.2.0", 3197 | "range-parser": "~1.0.2" 3198 | }, 3199 | "dependencies": { 3200 | "debug": { 3201 | "version": "2.1.3", 3202 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.1.3.tgz", 3203 | "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", 3204 | "requires": { 3205 | "ms": "0.7.0" 3206 | } 3207 | }, 3208 | "mime": { 3209 | "version": "1.3.4", 3210 | "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz", 3211 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" 3212 | }, 3213 | "ms": { 3214 | "version": "0.7.0", 3215 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.0.tgz", 3216 | "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" 3217 | } 3218 | } 3219 | }, 3220 | "serve-static": { 3221 | "version": "1.9.3", 3222 | "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.9.3.tgz", 3223 | "integrity": "sha1-X42gcyOtOF/z3FQfGnkXsuQ261c=", 3224 | "requires": { 3225 | "escape-html": "1.0.1", 3226 | "parseurl": "~1.3.0", 3227 | "send": "0.12.3", 3228 | "utils-merge": "1.0.0" 3229 | }, 3230 | "dependencies": { 3231 | "debug": { 3232 | "version": "2.2.0", 3233 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.2.0.tgz", 3234 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 3235 | "requires": { 3236 | "ms": "0.7.1" 3237 | } 3238 | }, 3239 | "etag": { 3240 | "version": "1.6.0", 3241 | "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.6.0.tgz", 3242 | "integrity": "sha1-i8ssavElTEgd/IuZfJBu9ORCwgc=", 3243 | "requires": { 3244 | "crc": "3.2.1" 3245 | } 3246 | }, 3247 | "mime": { 3248 | "version": "1.3.4", 3249 | "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz", 3250 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" 3251 | }, 3252 | "ms": { 3253 | "version": "0.7.1", 3254 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.1.tgz", 3255 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 3256 | }, 3257 | "send": { 3258 | "version": "0.12.3", 3259 | "resolved": "http://registry.npm.taobao.org/send/download/send-0.12.3.tgz", 3260 | "integrity": "sha1-zRLcWP3iHk+RkCs5sv2gWnptm9w=", 3261 | "requires": { 3262 | "debug": "~2.2.0", 3263 | "depd": "~1.0.1", 3264 | "destroy": "1.0.3", 3265 | "escape-html": "1.0.1", 3266 | "etag": "~1.6.0", 3267 | "fresh": "0.2.4", 3268 | "mime": "1.3.4", 3269 | "ms": "0.7.1", 3270 | "on-finished": "~2.2.1", 3271 | "range-parser": "~1.0.2" 3272 | } 3273 | } 3274 | } 3275 | }, 3276 | "set-value": { 3277 | "version": "2.0.0", 3278 | "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz", 3279 | "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", 3280 | "dev": true, 3281 | "requires": { 3282 | "extend-shallow": "^2.0.1", 3283 | "is-extendable": "^0.1.1", 3284 | "is-plain-object": "^2.0.3", 3285 | "split-string": "^3.0.1" 3286 | }, 3287 | "dependencies": { 3288 | "extend-shallow": { 3289 | "version": "2.0.1", 3290 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 3291 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3292 | "dev": true, 3293 | "requires": { 3294 | "is-extendable": "^0.1.0" 3295 | } 3296 | } 3297 | } 3298 | }, 3299 | "setprototypeof": { 3300 | "version": "1.1.0", 3301 | "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", 3302 | "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" 3303 | }, 3304 | "shebang-command": { 3305 | "version": "1.2.0", 3306 | "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 3307 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3308 | "dev": true, 3309 | "requires": { 3310 | "shebang-regex": "^1.0.0" 3311 | } 3312 | }, 3313 | "shebang-regex": { 3314 | "version": "1.0.0", 3315 | "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 3316 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3317 | "dev": true 3318 | }, 3319 | "signal-exit": { 3320 | "version": "3.0.2", 3321 | "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 3322 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3323 | "dev": true 3324 | }, 3325 | "snapdragon": { 3326 | "version": "0.8.2", 3327 | "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", 3328 | "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", 3329 | "dev": true, 3330 | "requires": { 3331 | "base": "^0.11.1", 3332 | "debug": "^2.2.0", 3333 | "define-property": "^0.2.5", 3334 | "extend-shallow": "^2.0.1", 3335 | "map-cache": "^0.2.2", 3336 | "source-map": "^0.5.6", 3337 | "source-map-resolve": "^0.5.0", 3338 | "use": "^3.1.0" 3339 | }, 3340 | "dependencies": { 3341 | "debug": { 3342 | "version": "2.6.9", 3343 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 3344 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 3345 | "dev": true, 3346 | "requires": { 3347 | "ms": "2.0.0" 3348 | } 3349 | }, 3350 | "define-property": { 3351 | "version": "0.2.5", 3352 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", 3353 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3354 | "dev": true, 3355 | "requires": { 3356 | "is-descriptor": "^0.1.0" 3357 | } 3358 | }, 3359 | "extend-shallow": { 3360 | "version": "2.0.1", 3361 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 3362 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3363 | "dev": true, 3364 | "requires": { 3365 | "is-extendable": "^0.1.0" 3366 | } 3367 | }, 3368 | "ms": { 3369 | "version": "2.0.0", 3370 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 3371 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 3372 | "dev": true 3373 | } 3374 | } 3375 | }, 3376 | "snapdragon-node": { 3377 | "version": "2.1.1", 3378 | "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", 3379 | "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", 3380 | "dev": true, 3381 | "requires": { 3382 | "define-property": "^1.0.0", 3383 | "isobject": "^3.0.0", 3384 | "snapdragon-util": "^3.0.1" 3385 | }, 3386 | "dependencies": { 3387 | "define-property": { 3388 | "version": "1.0.0", 3389 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", 3390 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 3391 | "dev": true, 3392 | "requires": { 3393 | "is-descriptor": "^1.0.0" 3394 | } 3395 | }, 3396 | "is-accessor-descriptor": { 3397 | "version": "1.0.0", 3398 | "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", 3399 | "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", 3400 | "dev": true, 3401 | "requires": { 3402 | "kind-of": "^6.0.0" 3403 | } 3404 | }, 3405 | "is-data-descriptor": { 3406 | "version": "1.0.0", 3407 | "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", 3408 | "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", 3409 | "dev": true, 3410 | "requires": { 3411 | "kind-of": "^6.0.0" 3412 | } 3413 | }, 3414 | "is-descriptor": { 3415 | "version": "1.0.2", 3416 | "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", 3417 | "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", 3418 | "dev": true, 3419 | "requires": { 3420 | "is-accessor-descriptor": "^1.0.0", 3421 | "is-data-descriptor": "^1.0.0", 3422 | "kind-of": "^6.0.2" 3423 | } 3424 | } 3425 | } 3426 | }, 3427 | "snapdragon-util": { 3428 | "version": "3.0.1", 3429 | "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", 3430 | "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", 3431 | "dev": true, 3432 | "requires": { 3433 | "kind-of": "^3.2.0" 3434 | }, 3435 | "dependencies": { 3436 | "kind-of": { 3437 | "version": "3.2.2", 3438 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 3439 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3440 | "dev": true, 3441 | "requires": { 3442 | "is-buffer": "^1.1.5" 3443 | } 3444 | } 3445 | } 3446 | }, 3447 | "source-map": { 3448 | "version": "0.5.7", 3449 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", 3450 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 3451 | "dev": true 3452 | }, 3453 | "source-map-resolve": { 3454 | "version": "0.5.2", 3455 | "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", 3456 | "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", 3457 | "dev": true, 3458 | "requires": { 3459 | "atob": "^2.1.1", 3460 | "decode-uri-component": "^0.2.0", 3461 | "resolve-url": "^0.2.1", 3462 | "source-map-url": "^0.4.0", 3463 | "urix": "^0.1.0" 3464 | } 3465 | }, 3466 | "source-map-url": { 3467 | "version": "0.4.0", 3468 | "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", 3469 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 3470 | "dev": true 3471 | }, 3472 | "split-string": { 3473 | "version": "3.1.0", 3474 | "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", 3475 | "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", 3476 | "dev": true, 3477 | "requires": { 3478 | "extend-shallow": "^3.0.0" 3479 | } 3480 | }, 3481 | "sshpk": { 3482 | "version": "1.16.1", 3483 | "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", 3484 | "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", 3485 | "requires": { 3486 | "asn1": "~0.2.3", 3487 | "assert-plus": "^1.0.0", 3488 | "bcrypt-pbkdf": "^1.0.0", 3489 | "dashdash": "^1.12.0", 3490 | "ecc-jsbn": "~0.1.1", 3491 | "getpass": "^0.1.1", 3492 | "jsbn": "~0.1.0", 3493 | "safer-buffer": "^2.0.2", 3494 | "tweetnacl": "~0.14.0" 3495 | } 3496 | }, 3497 | "static-extend": { 3498 | "version": "0.1.2", 3499 | "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", 3500 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 3501 | "dev": true, 3502 | "requires": { 3503 | "define-property": "^0.2.5", 3504 | "object-copy": "^0.1.0" 3505 | }, 3506 | "dependencies": { 3507 | "define-property": { 3508 | "version": "0.2.5", 3509 | "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", 3510 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3511 | "dev": true, 3512 | "requires": { 3513 | "is-descriptor": "^0.1.0" 3514 | } 3515 | } 3516 | } 3517 | }, 3518 | "statuses": { 3519 | "version": "1.5.0", 3520 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", 3521 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 3522 | }, 3523 | "string-width": { 3524 | "version": "1.0.2", 3525 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", 3526 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3527 | "requires": { 3528 | "code-point-at": "^1.0.0", 3529 | "is-fullwidth-code-point": "^1.0.0", 3530 | "strip-ansi": "^3.0.0" 3531 | } 3532 | }, 3533 | "string_decoder": { 3534 | "version": "1.1.1", 3535 | "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", 3536 | "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", 3537 | "requires": { 3538 | "safe-buffer": "~5.1.0" 3539 | } 3540 | }, 3541 | "strip-ansi": { 3542 | "version": "3.0.1", 3543 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", 3544 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3545 | "requires": { 3546 | "ansi-regex": "^2.0.0" 3547 | } 3548 | }, 3549 | "strip-eof": { 3550 | "version": "1.0.0", 3551 | "resolved": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", 3552 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 3553 | "dev": true 3554 | }, 3555 | "strip-json-comments": { 3556 | "version": "2.0.1", 3557 | "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", 3558 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3559 | "dev": true 3560 | }, 3561 | "superagent": { 3562 | "version": "3.8.3", 3563 | "resolved": "http://registry.npm.taobao.org/superagent/download/superagent-3.8.3.tgz", 3564 | "integrity": "sha1-Rg6g29t9WxG8T3jeulZfhqF44Sg=", 3565 | "requires": { 3566 | "component-emitter": "^1.2.0", 3567 | "cookiejar": "^2.1.0", 3568 | "debug": "^3.1.0", 3569 | "extend": "^3.0.0", 3570 | "form-data": "^2.3.1", 3571 | "formidable": "^1.2.0", 3572 | "methods": "^1.1.1", 3573 | "mime": "^1.4.1", 3574 | "qs": "^6.5.1", 3575 | "readable-stream": "^2.3.5" 3576 | } 3577 | }, 3578 | "supports-color": { 3579 | "version": "5.5.0", 3580 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", 3581 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 3582 | "dev": true, 3583 | "requires": { 3584 | "has-flag": "^3.0.0" 3585 | } 3586 | }, 3587 | "term-size": { 3588 | "version": "1.2.0", 3589 | "resolved": "http://registry.npm.taobao.org/term-size/download/term-size-1.2.0.tgz", 3590 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 3591 | "dev": true, 3592 | "requires": { 3593 | "execa": "^0.7.0" 3594 | } 3595 | }, 3596 | "timed-out": { 3597 | "version": "4.0.1", 3598 | "resolved": "http://registry.npm.taobao.org/timed-out/download/timed-out-4.0.1.tgz", 3599 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 3600 | "dev": true 3601 | }, 3602 | "to-object-path": { 3603 | "version": "0.3.0", 3604 | "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", 3605 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 3606 | "dev": true, 3607 | "requires": { 3608 | "kind-of": "^3.0.2" 3609 | }, 3610 | "dependencies": { 3611 | "kind-of": { 3612 | "version": "3.2.2", 3613 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 3614 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3615 | "dev": true, 3616 | "requires": { 3617 | "is-buffer": "^1.1.5" 3618 | } 3619 | } 3620 | } 3621 | }, 3622 | "to-regex": { 3623 | "version": "3.0.2", 3624 | "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", 3625 | "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", 3626 | "dev": true, 3627 | "requires": { 3628 | "define-property": "^2.0.2", 3629 | "extend-shallow": "^3.0.2", 3630 | "regex-not": "^1.0.2", 3631 | "safe-regex": "^1.1.0" 3632 | } 3633 | }, 3634 | "to-regex-range": { 3635 | "version": "2.1.1", 3636 | "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", 3637 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3638 | "dev": true, 3639 | "requires": { 3640 | "is-number": "^3.0.0", 3641 | "repeat-string": "^1.6.1" 3642 | } 3643 | }, 3644 | "touch": { 3645 | "version": "3.1.0", 3646 | "resolved": "http://registry.npm.taobao.org/touch/download/touch-3.1.0.tgz", 3647 | "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", 3648 | "dev": true, 3649 | "requires": { 3650 | "nopt": "~1.0.10" 3651 | } 3652 | }, 3653 | "tough-cookie": { 3654 | "version": "2.4.3", 3655 | "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", 3656 | "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", 3657 | "requires": { 3658 | "psl": "^1.1.24", 3659 | "punycode": "^1.4.1" 3660 | }, 3661 | "dependencies": { 3662 | "punycode": { 3663 | "version": "1.4.1", 3664 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", 3665 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 3666 | } 3667 | } 3668 | }, 3669 | "tunnel-agent": { 3670 | "version": "0.6.0", 3671 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", 3672 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3673 | "requires": { 3674 | "safe-buffer": "^5.0.1" 3675 | } 3676 | }, 3677 | "tweetnacl": { 3678 | "version": "0.14.5", 3679 | "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", 3680 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 3681 | }, 3682 | "type-is": { 3683 | "version": "1.6.16", 3684 | "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz", 3685 | "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", 3686 | "requires": { 3687 | "media-typer": "0.3.0", 3688 | "mime-types": "~2.1.18" 3689 | } 3690 | }, 3691 | "undefsafe": { 3692 | "version": "2.0.2", 3693 | "resolved": "http://registry.npm.taobao.org/undefsafe/download/undefsafe-2.0.2.tgz", 3694 | "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", 3695 | "dev": true, 3696 | "requires": { 3697 | "debug": "^2.2.0" 3698 | }, 3699 | "dependencies": { 3700 | "debug": { 3701 | "version": "2.6.9", 3702 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 3703 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 3704 | "dev": true, 3705 | "requires": { 3706 | "ms": "2.0.0" 3707 | } 3708 | }, 3709 | "ms": { 3710 | "version": "2.0.0", 3711 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 3712 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 3713 | "dev": true 3714 | } 3715 | } 3716 | }, 3717 | "underscore": { 3718 | "version": "1.9.1", 3719 | "resolved": "http://registry.npm.taobao.org/underscore/download/underscore-1.9.1.tgz", 3720 | "integrity": "sha1-BtzjSg5op7q8KbNluOdLiSUgOWE=" 3721 | }, 3722 | "union-value": { 3723 | "version": "1.0.0", 3724 | "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", 3725 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 3726 | "dev": true, 3727 | "requires": { 3728 | "arr-union": "^3.1.0", 3729 | "get-value": "^2.0.6", 3730 | "is-extendable": "^0.1.1", 3731 | "set-value": "^0.4.3" 3732 | }, 3733 | "dependencies": { 3734 | "extend-shallow": { 3735 | "version": "2.0.1", 3736 | "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", 3737 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3738 | "dev": true, 3739 | "requires": { 3740 | "is-extendable": "^0.1.0" 3741 | } 3742 | }, 3743 | "set-value": { 3744 | "version": "0.4.3", 3745 | "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", 3746 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 3747 | "dev": true, 3748 | "requires": { 3749 | "extend-shallow": "^2.0.1", 3750 | "is-extendable": "^0.1.1", 3751 | "is-plain-object": "^2.0.1", 3752 | "to-object-path": "^0.3.0" 3753 | } 3754 | } 3755 | } 3756 | }, 3757 | "unique-string": { 3758 | "version": "1.0.0", 3759 | "resolved": "http://registry.npm.taobao.org/unique-string/download/unique-string-1.0.0.tgz", 3760 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 3761 | "dev": true, 3762 | "requires": { 3763 | "crypto-random-string": "^1.0.0" 3764 | } 3765 | }, 3766 | "unpipe": { 3767 | "version": "1.0.0", 3768 | "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", 3769 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3770 | }, 3771 | "unset-value": { 3772 | "version": "1.0.0", 3773 | "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", 3774 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3775 | "dev": true, 3776 | "requires": { 3777 | "has-value": "^0.3.1", 3778 | "isobject": "^3.0.0" 3779 | }, 3780 | "dependencies": { 3781 | "has-value": { 3782 | "version": "0.3.1", 3783 | "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", 3784 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3785 | "dev": true, 3786 | "requires": { 3787 | "get-value": "^2.0.3", 3788 | "has-values": "^0.1.4", 3789 | "isobject": "^2.0.0" 3790 | }, 3791 | "dependencies": { 3792 | "isobject": { 3793 | "version": "2.1.0", 3794 | "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", 3795 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3796 | "dev": true, 3797 | "requires": { 3798 | "isarray": "1.0.0" 3799 | } 3800 | } 3801 | } 3802 | }, 3803 | "has-values": { 3804 | "version": "0.1.4", 3805 | "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", 3806 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 3807 | "dev": true 3808 | } 3809 | } 3810 | }, 3811 | "unzip-response": { 3812 | "version": "2.0.1", 3813 | "resolved": "http://registry.npm.taobao.org/unzip-response/download/unzip-response-2.0.1.tgz", 3814 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", 3815 | "dev": true 3816 | }, 3817 | "upath": { 3818 | "version": "1.1.0", 3819 | "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz", 3820 | "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=", 3821 | "dev": true 3822 | }, 3823 | "update-notifier": { 3824 | "version": "2.5.0", 3825 | "resolved": "http://registry.npm.taobao.org/update-notifier/download/update-notifier-2.5.0.tgz", 3826 | "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=", 3827 | "dev": true, 3828 | "requires": { 3829 | "boxen": "^1.2.1", 3830 | "chalk": "^2.0.1", 3831 | "configstore": "^3.0.0", 3832 | "import-lazy": "^2.1.0", 3833 | "is-ci": "^1.0.10", 3834 | "is-installed-globally": "^0.1.0", 3835 | "is-npm": "^1.0.0", 3836 | "latest-version": "^3.0.0", 3837 | "semver-diff": "^2.0.0", 3838 | "xdg-basedir": "^3.0.0" 3839 | } 3840 | }, 3841 | "uri-js": { 3842 | "version": "4.2.2", 3843 | "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", 3844 | "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", 3845 | "requires": { 3846 | "punycode": "^2.1.0" 3847 | } 3848 | }, 3849 | "urix": { 3850 | "version": "0.1.0", 3851 | "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", 3852 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 3853 | "dev": true 3854 | }, 3855 | "url-parse-lax": { 3856 | "version": "1.0.0", 3857 | "resolved": "http://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz", 3858 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 3859 | "dev": true, 3860 | "requires": { 3861 | "prepend-http": "^1.0.1" 3862 | } 3863 | }, 3864 | "use": { 3865 | "version": "3.1.1", 3866 | "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz", 3867 | "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", 3868 | "dev": true 3869 | }, 3870 | "util-deprecate": { 3871 | "version": "1.0.2", 3872 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 3873 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3874 | }, 3875 | "utils-merge": { 3876 | "version": "1.0.0", 3877 | "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.0.tgz", 3878 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" 3879 | }, 3880 | "uuid": { 3881 | "version": "3.3.2", 3882 | "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", 3883 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" 3884 | }, 3885 | "vary": { 3886 | "version": "1.0.1", 3887 | "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.0.1.tgz", 3888 | "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" 3889 | }, 3890 | "verror": { 3891 | "version": "1.10.0", 3892 | "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", 3893 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3894 | "requires": { 3895 | "assert-plus": "^1.0.0", 3896 | "core-util-is": "1.0.2", 3897 | "extsprintf": "^1.2.0" 3898 | } 3899 | }, 3900 | "which": { 3901 | "version": "1.3.1", 3902 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", 3903 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 3904 | "dev": true, 3905 | "requires": { 3906 | "isexe": "^2.0.0" 3907 | } 3908 | }, 3909 | "widest-line": { 3910 | "version": "2.0.1", 3911 | "resolved": "http://registry.npm.taobao.org/widest-line/download/widest-line-2.0.1.tgz", 3912 | "integrity": "sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w=", 3913 | "dev": true, 3914 | "requires": { 3915 | "string-width": "^2.1.1" 3916 | }, 3917 | "dependencies": { 3918 | "ansi-regex": { 3919 | "version": "3.0.0", 3920 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 3921 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 3922 | "dev": true 3923 | }, 3924 | "is-fullwidth-code-point": { 3925 | "version": "2.0.0", 3926 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 3927 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 3928 | "dev": true 3929 | }, 3930 | "string-width": { 3931 | "version": "2.1.1", 3932 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 3933 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 3934 | "dev": true, 3935 | "requires": { 3936 | "is-fullwidth-code-point": "^2.0.0", 3937 | "strip-ansi": "^4.0.0" 3938 | } 3939 | }, 3940 | "strip-ansi": { 3941 | "version": "4.0.0", 3942 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 3943 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3944 | "dev": true, 3945 | "requires": { 3946 | "ansi-regex": "^3.0.0" 3947 | } 3948 | } 3949 | } 3950 | }, 3951 | "window-size": { 3952 | "version": "0.1.4", 3953 | "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.4.tgz", 3954 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 3955 | }, 3956 | "wrap-ansi": { 3957 | "version": "2.1.0", 3958 | "resolved": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", 3959 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 3960 | "requires": { 3961 | "string-width": "^1.0.1", 3962 | "strip-ansi": "^3.0.1" 3963 | } 3964 | }, 3965 | "wrappy": { 3966 | "version": "1.0.2", 3967 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 3968 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3969 | }, 3970 | "write-file-atomic": { 3971 | "version": "2.4.2", 3972 | "resolved": "http://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-2.4.2.tgz", 3973 | "integrity": "sha1-pxgXBt+6F4VdIhFAqcBuFfzdh7k=", 3974 | "dev": true, 3975 | "requires": { 3976 | "graceful-fs": "^4.1.11", 3977 | "imurmurhash": "^0.1.4", 3978 | "signal-exit": "^3.0.2" 3979 | } 3980 | }, 3981 | "ws": { 3982 | "version": "5.2.2", 3983 | "resolved": "http://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz", 3984 | "integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=", 3985 | "requires": { 3986 | "async-limiter": "~1.0.0" 3987 | } 3988 | }, 3989 | "xdg-basedir": { 3990 | "version": "3.0.0", 3991 | "resolved": "http://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-3.0.0.tgz", 3992 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 3993 | "dev": true 3994 | }, 3995 | "y18n": { 3996 | "version": "3.2.1", 3997 | "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", 3998 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 3999 | }, 4000 | "yallist": { 4001 | "version": "2.1.2", 4002 | "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", 4003 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 4004 | "dev": true 4005 | }, 4006 | "yargs": { 4007 | "version": "3.32.0", 4008 | "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz", 4009 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 4010 | "requires": { 4011 | "camelcase": "^2.0.1", 4012 | "cliui": "^3.0.3", 4013 | "decamelize": "^1.1.1", 4014 | "os-locale": "^1.4.0", 4015 | "string-width": "^1.0.1", 4016 | "window-size": "^0.1.4", 4017 | "y18n": "^3.2.0" 4018 | } 4019 | } 4020 | } 4021 | } 4022 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Valine-Admin", 3 | "version": "1.1.0", 4 | "private": true, 5 | "description": "A sample Node.js app using Express", 6 | "main": "server.js", 7 | "scripts": { 8 | "start": "node server.js", 9 | "dev": "nodemon server.js -- " 10 | }, 11 | "dependencies": { 12 | "akismet-api": "^3.0.0", 13 | "body-parser": "1.12.3", 14 | "connect-timeout": "^1.7.0", 15 | "cookie-parser": "^1.3.5", 16 | "ejs": "2.5.5", 17 | "express": "4.12.3", 18 | "leancloud-storage": "^3.0.0", 19 | "leanengine": "^3.0.0", 20 | "nodemailer": "^4.0.1", 21 | "request": "^2.88.0" 22 | }, 23 | "devDependencies": { 24 | "nodemon": "^1.11.0" 25 | }, 26 | "engines": { 27 | "node": "11.x" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/images/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DesertsP/Valine-Admin/8f9bf3ccc92631043e1859312b6f107b3050b089/public/images/settings.png -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Droid Sans,Helvetica Neue,sans-serif; 3 | font-size: 1rem; 4 | } 5 | 6 | a { 7 | text-decoration: none; 8 | color: #3eb0ef; 9 | } 10 | 11 | .footer { 12 | font-size: 0.8rem; 13 | } 14 | 15 | .title { 16 | font-weight: 200; 17 | font-size: 1.5rem; 18 | } 19 | 20 | ul { 21 | list-style: none; 22 | } 23 | 24 | li { 25 | list-style: none; 26 | } 27 | 28 | .content { 29 | padding: 0; 30 | } 31 | 32 | .header{ 33 | display: flex; 34 | -ms-flex-direction: row; 35 | flex-direction: row; 36 | align-items: center; 37 | justify-content: space-between; 38 | } 39 | 40 | @media screen and (max-width:768px) { 41 | .comment-main { 42 | padding: 1rem; 43 | } 44 | } 45 | 46 | .comment-main{ 47 | padding: 1rem 5rem; 48 | } 49 | 50 | .vhead { 51 | padding-bottom: 0.5rem; 52 | } 53 | 54 | .vhead a , .vhead #nick { 55 | font-weight: bolder; 56 | color: #333; 57 | } 58 | 59 | .spacer { 60 | color: #ccc; 61 | margin-left: 0.3rem; 62 | margin-right: 0.3rem; 63 | } 64 | 65 | .vtime { 66 | color: #a9a4a4; 67 | display: inline-block; 68 | padding: 0 5px; 69 | } 70 | 71 | .vcomment { 72 | line-height: 1.8; 73 | word-wrap: break-word; 74 | } 75 | 76 | .vcard { 77 | padding: 2rem 0 2rem 0; 78 | border-top: 1px solid #dedede; 79 | } 80 | 81 | .check { 82 | padding-top: 1rem; 83 | color: #33b1ff; 84 | } 85 | 86 | .sign-in-wrap { 87 | display: flex; 88 | -ms-flex-direction: column; 89 | flex-direction: column; 90 | width: 100%; 91 | color: #738a94; 92 | font-weight: 100; 93 | text-align: center; 94 | align-items: center; 95 | margin-top: 4rem; 96 | } 97 | 98 | .gh-signup { 99 | width: 600px !important; 100 | } 101 | 102 | .gh-signin { 103 | display: flex; 104 | -ms-flex-direction: column; 105 | flex-direction: column; 106 | padding: 1rem 2rem; 107 | width: 320px; 108 | border: 1px solid #dae1e3; 109 | background: #f8fbfd; 110 | border-radius: 5px; 111 | text-align: left; 112 | } 113 | 114 | .gh-signin .form-group { 115 | margin-bottom: 1.5rem; 116 | position: relative; 117 | width: 100%; 118 | max-width: 700px; 119 | -webkit-user-select: text; 120 | user-select: text; 121 | } 122 | 123 | .sign-in-wrap input { 124 | padding: 10px; 125 | margin: 1rem 0; 126 | border: 1px solid #dae1e3; 127 | font-size: 1rem; 128 | line-height: 1.5em; 129 | font-weight: 100; 130 | display: block; 131 | user-select: text; 132 | border-radius: 4px; 133 | transition: border-color .15s linear; 134 | -webkit-appearance: none; 135 | color: #4b5b62; 136 | -webkit-user-select: text; 137 | } 138 | 139 | .sign-in-wrap input:focus { 140 | border-color: #c4c8cb; 141 | outline: 0 142 | } 143 | 144 | .sign-in-wrap .login-button { 145 | padding: 8px 10px; 146 | cursor: pointer; 147 | background: #33b1ff; 148 | border: .1rem solid #33b1ff; 149 | border-radius: .2rem; 150 | color: #fff; 151 | } 152 | 153 | .red { 154 | color: #ee1000; 155 | } 156 | 157 | .blue{ 158 | padding-left: 9px; 159 | color: #33b1ff; 160 | } 161 | -------------------------------------------------------------------------------- /routes/comments.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const router = require('express').Router(); 3 | const AV = require('leanengine'); 4 | const mail = require('../utilities/send-mail'); 5 | const spam = require('../utilities/check-spam'); 6 | 7 | const Comment = AV.Object.extend('Comment'); 8 | 9 | // Comment 列表 10 | router.get('/', function (req, res, next) { 11 | if (req.currentUser) { 12 | let query = new AV.Query(Comment); 13 | query.descending('createdAt'); 14 | query.limit(50); 15 | query.find().then(function (results) { 16 | res.render('comments', { 17 | title: process.env.SITE_NAME + '上的评论', 18 | comment_list: results 19 | }); 20 | }, function (err) { 21 | if (err.code === 101) { 22 | res.render('comments', { 23 | title: process.env.SITE_NAME + '上的评论', 24 | comment_list: [] 25 | }); 26 | } else { 27 | next(err); 28 | } 29 | }).catch(next); 30 | } else { 31 | res.redirect('/'); 32 | } 33 | }); 34 | 35 | router.get('/resend-email', function (req, res, next) { 36 | if (req.currentUser) { 37 | let query = new AV.Query(Comment); 38 | query.get(req.query.id).then(function (object) { 39 | query.get(object.get('rid')).then(function (parent) { 40 | mail.send(object, parent); 41 | res.redirect('/comments') 42 | }, function (err) { 43 | } 44 | ).catch(next); 45 | }, function (err) { 46 | }).catch(next); 47 | } else { 48 | res.redirect('/'); 49 | } 50 | }); 51 | 52 | router.get('/delete', function (req, res, next) { 53 | if (req.currentUser) { 54 | let query = new AV.Query(Comment); 55 | query.get(req.query.id).then(function (object) { 56 | object.destroy(); 57 | res.redirect('/comments') 58 | }, function (err) { 59 | }).catch(next); 60 | } else { 61 | res.redirect('/'); 62 | } 63 | }); 64 | 65 | router.get('/not-spam', function (req, res, next) { 66 | if (req.currentUser) { 67 | let query = new AV.Query(Comment); 68 | query.get(req.query.id).then(function (object) { 69 | object.set('isSpam', false); 70 | object.set('ACL', {"*":{"read":true}} ); 71 | object.save(); 72 | spam.submitHam(object); 73 | res.redirect('/comments') 74 | }, function (err) { 75 | }).catch(next); 76 | } else { 77 | res.redirect('/'); 78 | } 79 | }); 80 | router.get('/mark-spam', function (req, res, next) { 81 | if (req.currentUser) { 82 | let query = new AV.Query(Comment); 83 | query.get(req.query.id).then(function (object) { 84 | object.set('isSpam', true); 85 | object.set('ACL', {"*":{"read":false}} ); 86 | object.save(); 87 | spam.submitSpam(object); 88 | res.redirect('/comments') 89 | }, function (err) { 90 | }).catch(next); 91 | } else { 92 | res.redirect('/'); 93 | } 94 | }); 95 | 96 | module.exports = router; 97 | -------------------------------------------------------------------------------- /routes/sign-up.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const router = require('express').Router(); 3 | const AV = require('leanengine'); 4 | const User = AV.Object.extend('_User'); 5 | 6 | // Comment 列表 7 | router.get('/', function (req, res, next) { 8 | if (req.currentUser) { 9 | res.redirect('/comments'); 10 | } else { 11 | let adminMail = process.env.BLOGGER_EMAIL || process.env.SMTP_USER; 12 | let q = new AV.Query(User); 13 | q.equalTo('email', adminMail); 14 | q.find().then(function (results) { 15 | if (results.length > 0) { 16 | res.redirect('/'); 17 | } 18 | else { 19 | res.render('sign-up', { 20 | email: adminMail 21 | }); 22 | } 23 | }); 24 | } 25 | }); 26 | 27 | router.post('/', function (req, res, next) { 28 | let adminMail = process.env.BLOGGER_EMAIL || process.env.SMTP_USER; 29 | let q = new AV.Query(User); 30 | q.equalTo('email', adminMail); 31 | q.find().then(function (results) { 32 | if (results.length > 0) { 33 | res.redirect('/'); 34 | } 35 | else { 36 | let user = new AV.User(); 37 | user.setUsername(req.body.username); 38 | user.setPassword(req.body.password); 39 | user.setEmail(req.body.email); 40 | user.signUp().then(function (loginedUser) { 41 | }, (function (error) { 42 | })); 43 | res.redirect('/'); 44 | } 45 | }); 46 | }); 47 | 48 | module.exports = router; 49 | -------------------------------------------------------------------------------- /server-cluster.js: -------------------------------------------------------------------------------- 1 | var cluster = require('cluster'); 2 | 3 | // 进程数量建议设置为可用的 CPU 数量 4 | var workers = process.env.LEANCLOUD_AVAILABLE_CPUS || 1; 5 | 6 | if (cluster.isMaster) { 7 | for (var i = 0; i < workers; i++) { 8 | cluster.fork(); 9 | } 10 | 11 | cluster.on('exit', (worker, code, signal) => { 12 | console.log('worker %s died, restarting...', worker.process.pid); 13 | cluster.fork(); 14 | }); 15 | } else { 16 | require('./server.js'); 17 | } 18 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var AV = require('leanengine'); 4 | 5 | AV.init({ 6 | appId: process.env.LEANCLOUD_APP_ID, 7 | appKey: process.env.LEANCLOUD_APP_KEY, 8 | masterKey: process.env.LEANCLOUD_APP_MASTER_KEY 9 | }); 10 | 11 | // 如果不希望使用 masterKey 权限,可以将下面一行删除 12 | AV.Cloud.useMasterKey(); 13 | 14 | var app = require('./app'); 15 | 16 | // 端口一定要从环境变量 `LEANCLOUD_APP_PORT` 中获取。 17 | // LeanEngine 运行时会分配端口并赋值到该变量。 18 | var PORT = parseInt(process.env.LEANCLOUD_APP_PORT || process.env.PORT || 3000); 19 | 20 | app.listen(PORT, function (err) { 21 | console.log('Node app is running on port:', PORT); 22 | 23 | // 注册全局未捕获异常处理器 24 | process.on('uncaughtException', function(err) { 25 | console.error('Caught exception:', err.stack); 26 | }); 27 | process.on('unhandledRejection', function(reason, p) { 28 | console.error('Unhandled Rejection at: Promise ', p, ' reason: ', reason.stack); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /utilities/check-spam.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const AV = require('leanengine'); 3 | const akismet = require('akismet-api'); 4 | const akismetClient = akismet.client({ 5 | key : process.env.AKISMET_KEY, 6 | blog : process.env.SITE_URL 7 | }); 8 | 9 | exports.checkSpam = (comment, ip)=> { 10 | if (process.env.AKISMET_KEY === 'MANUAL_REVIEW') { 11 | console.log('已使用人工审核模式,评论审核后才会发表~'); 12 | comment.setACL(new AV.ACL({"*":{"read":false}})); 13 | comment.set('isSpam', true); 14 | comment.save(); 15 | return; 16 | } 17 | akismetClient.verifyKey(function(err, valid) { 18 | if (err) console.log('Akismet key 异常:', err.message); 19 | if (valid) { 20 | // TODO(1) 这里有缺陷 21 | comment.set('ip', ip); 22 | akismetClient.checkSpam({ 23 | user_ip : ip, 24 | user_agent : comment.get('ua'), 25 | referrer : process.env.SITE_URL + comment.get('url'), 26 | permalink : process.env.SITE_URL + comment.get('url'), 27 | comment_type : 'comment', 28 | comment_author : comment.get('nick'), 29 | comment_author_email : comment.get('mail'), 30 | comment_author_url : comment.get('link'), 31 | comment_content : comment.get('comment'), 32 | // is_test : true // Default value is false 33 | }, function(err, spam) { 34 | if (err) console.log (`垃圾评论检测出错!${err}`); 35 | if (spam) { 36 | console.log('逮到一只垃圾评论,烧死它!用文火~'); 37 | comment.set('isSpam', true); 38 | comment.setACL(new AV.ACL({"*":{"read":false}})); 39 | comment.save(); 40 | // comment.destroy(); 41 | } else { 42 | comment.set('isSpam', false); 43 | comment.setACL(new AV.ACL({"*":{"read":true}})); 44 | comment.save(); 45 | console.log('垃圾评论检测完成,放行~'); 46 | } 47 | }); 48 | } 49 | else console.log('未开启垃圾评论过滤或Akismet key 异常!'); 50 | }); 51 | }; 52 | exports.submitSpam = (comment)=> { 53 | if (process.env.AKISMET_KEY === 'MANUAL_REVIEW') { 54 | return; 55 | } 56 | akismetClient.verifyKey(function(err, valid) { 57 | if (err) console.log('Akismet key 异常:', err.message); 58 | if (valid) { 59 | let ipAddr = comment.get('ip'); 60 | akismetClient.submitSpam({ 61 | user_ip : ipAddr, 62 | user_agent : comment.get('ua'), 63 | referrer : process.env.SITE_URL + comment.get('url'), 64 | permalink : process.env.SITE_URL + comment.get('url'), 65 | comment_type : 'comment', 66 | comment_author : comment.get('nick'), 67 | comment_author_email : comment.get('mail'), 68 | comment_author_url : comment.get('link'), 69 | comment_content : comment.get('comment'), 70 | // is_test : true // Default value is false 71 | }, function(err) { 72 | if (!err) { 73 | console.log('垃圾评论已经提交!'); 74 | } 75 | }); 76 | } 77 | else console.log('未开启垃圾评论过滤或Akismet key 异常!'); 78 | }); 79 | }; 80 | exports.submitHam = (comment)=> { 81 | if (process.env.AKISMET_KEY === 'MANUAL_REVIEW') { 82 | return; 83 | } 84 | akismetClient.verifyKey(function(err, valid) { 85 | if (err) console.log('Akismet key 异常:', err.message); 86 | if (valid) { 87 | let ipAddr = comment.get('ip'); 88 | akismetClient.submitHam({ 89 | user_ip : ipAddr, 90 | user_agent : comment.get('ua'), 91 | referrer : process.env.SITE_URL + comment.get('url'), 92 | permalink : process.env.SITE_URL + comment.get('url'), 93 | comment_type : 'comment', 94 | comment_author : comment.get('nick'), 95 | comment_author_email : comment.get('mail'), 96 | comment_author_url : comment.get('link'), 97 | comment_content : comment.get('comment'), 98 | // is_test : true // Default value is false 99 | }, function(err) { 100 | if (!err) { 101 | console.log('评论已经标记为非垃圾!'); 102 | } 103 | }); 104 | } 105 | else console.log('未开启垃圾评论过滤或Akismet key 异常!'); 106 | }); 107 | }; 108 | -------------------------------------------------------------------------------- /utilities/send-mail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const nodemailer = require('nodemailer'); 3 | 4 | let config = { 5 | auth: { 6 | user: process.env.SMTP_USER, 7 | pass: process.env.SMTP_PASS 8 | } 9 | } 10 | 11 | if (process.env.SMTP_SERVICE != null) { 12 | config.service = process.env.SMTP_SERVICE; 13 | } else { 14 | config.host = process.env.SMTP_HOST; 15 | config.port = parseInt(process.env.SMTP_PORT); 16 | config.secure = process.env.SMTP_SECURE === "false" ? false : true; 17 | } 18 | 19 | const transporter = nodemailer.createTransport(config); 20 | 21 | transporter.verify(function(error, success) { 22 | if (error) { 23 | console.log('SMTP邮箱配置异常:', error); 24 | } 25 | if (success) { 26 | console.log("SMTP邮箱配置正常!"); 27 | } 28 | }); 29 | 30 | exports.notice = (comment) => { 31 | let SITE_NAME = process.env.SITE_NAME; 32 | let NICK = comment.get('nick'); 33 | let COMMENT = comment.get('comment'); 34 | let POST_URL = process.env.SITE_URL + comment.get('url') + '#' + comment.get('objectId'); 35 | let SITE_URL = process.env.SITE_URL; 36 | 37 | let _template = process.env.MAIL_TEMPLATE_ADMIN || '

您在${SITE_NAME}上的文章有了新的评论

${NICK}回复说:

${COMMENT}

您可以点击查看回复的完整內容

'; 38 | let _subject = process.env.MAIL_SUBJECT_ADMIN || '${SITE_NAME}上有新评论了'; 39 | let emailSubject = eval('`' + _subject + '`'); 40 | let emailContent = eval('`' + _template + '`'); 41 | 42 | if (comment.get('isSpam')) { 43 | emailSubject = '[SPAM]' + emailSubject; 44 | } 45 | 46 | let mailOptions = { 47 | from: '"' + process.env.SENDER_NAME + '" <' + process.env.SENDER_EMAIL + '>', 48 | to: process.env.BLOGGER_EMAIL || process.env.SENDER_EMAIL, 49 | subject: emailSubject, 50 | html: emailContent 51 | }; 52 | 53 | transporter.sendMail(mailOptions, (error, info) => { 54 | if (error) { 55 | return console.log(error); 56 | } 57 | console.log('博主通知邮件成功发送: %s', info.response); 58 | comment.set('isNotified', true); 59 | comment.save(); 60 | }); 61 | } 62 | 63 | exports.send = (currentComment, parentComment)=> { 64 | let PARENT_NICK = parentComment.get('nick'); 65 | let SITE_NAME = process.env.SITE_NAME; 66 | let NICK = currentComment.get('nick'); 67 | let COMMENT = currentComment.get('comment'); 68 | let PARENT_COMMENT = parentComment.get('comment'); 69 | let POST_URL = process.env.SITE_URL + currentComment.get('url') + '#' + currentComment.get('objectId'); 70 | let SITE_URL = process.env.SITE_URL; 71 | 72 | let _subject = process.env.MAIL_SUBJECT || '${PARENT_NICK},您在『${SITE_NAME}』上的评论收到了回复'; 73 | let _template = process.env.MAIL_TEMPLATE || '

您在 ${SITE_NAME}上的评论有了新的回复

${PARENT_NICK} 同学,您曾发表评论:
${PARENT_COMMENT}

${NICK}回复说:

${COMMENT}

您可以点击查看回复的完整內容,欢迎再次光临${SITE_NAME}

'; 74 | let emailSubject = eval('`' + _subject + '`'); 75 | let emailContent = eval('`' + _template + '`'); 76 | 77 | let mailOptions = { 78 | from: '"' + process.env.SENDER_NAME + '" <' + process.env.SENDER_EMAIL + '>', // sender address 79 | to: parentComment.get('mail'), 80 | subject: emailSubject, 81 | html: emailContent 82 | }; 83 | 84 | transporter.sendMail(mailOptions, (error, info) => { 85 | if (error) { 86 | return console.log(error); 87 | } 88 | console.log('AT通知邮件成功发送: %s', info.response); 89 | currentComment.set('isNotified', true); 90 | currentComment.save(); 91 | }); 92 | }; 93 | -------------------------------------------------------------------------------- /views/comments.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= title %> 5 | 6 | 7 | 8 | 9 |
10 |
11 |
<%= title %>
12 | 13 | 14 |
15 | 16 | 63 |
64 | 65 | 66 | -------------------------------------------------------------------------------- /views/error.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Error 5 | 6 | 7 | 8 | 9 |

<%= message %>

10 |

<%= error.status %>

11 |
<%= error.stack %>
12 | 13 | 14 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | LeanCloud评论管理 5 | 6 | 7 | 8 | 9 |
10 |

LeanCloud评论管理

11 |
12 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /views/sign-up.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | LeanCloud评论管理 5 | 6 | 7 | 8 | 9 | 10 |
11 |

管理员设置

12 |

13 | 还差最后一步,请设置并确认管理员信息。 14 |
完成后,你可以使用设置的用户名/邮箱登录后台管理。 15 |
首次安装 Valine Admin 请务必填写这些信息。该页面仅在初次安装后出现,可确保您的数据安全。 16 |
17 | 注意:强制使用环境变量中设置的博主邮箱作为管理员邮箱。 18 |

19 |
20 |
21 | 23 | 25 | 26 | 27 |
28 | 29 |
30 | 31 | 32 | --------------------------------------------------------------------------------