Authored by 毕凯

Merge branch 'feature/upload' into 'master'

活动压缩包上传



See merge request !16
@@ -10,4 +10,6 @@ packages/ @@ -10,4 +10,6 @@ packages/
10 10
11 .idea/ 11 .idea/
12 12
13 -*.log  
  13 +*.log
  14 +
  15 +/uploads
  1 +'use strict';
  2 +
  3 +const FileModel = require('../models/file');
  4 +const _ = require('lodash');
  5 +const shelljs = require('shelljs');
  6 +const decompress = require('decompress');
  7 +const decompressUnzip = require('decompress-unzip');
  8 +const moment = require('moment');
  9 +const path = require('path');
  10 +const fs = require('fs');
  11 +const rd = require('rd');
  12 +const ws = require('../../lib/ws');
  13 +const CDNCONFIG = require('../../config/cdn_config');
  14 +const qn = require('../../lib/qiniu')(CDNCONFIG.feature); // 活动上传
  15 +
  16 +const FILE_SAVE_ROOT_PATH = './uploads'; // 上传到本地服务器的根目录
  17 +const SUPER_FILE_CHECK_PASS = 'yohowebtech.superfile'; // 存在此文件,直接上传到七牛
  18 +const BROADCAST_PATH = '/upload'; // ws 键
  19 +
  20 +class FileApi {
  21 + /**
  22 + * 上传到服务器的文件处理
  23 + * @param {文件} file
  24 + * @param {路径} actPath
  25 + * @param {用户} user
  26 + */
  27 + async upload(file, actPath, user) {
  28 + let fileName = _.get(file, 'name');
  29 + let fileNameWithoutType = _.split(fileName, '.')[0];
  30 + let fileSavePath = path.join(FILE_SAVE_ROOT_PATH, fileName); // 文件保存到服务器的路径
  31 +
  32 + await new Promise((resolve, reject) => {
  33 + let readable = fs.createReadStream(file.path);
  34 + let writable = fs.createWriteStream(fileSavePath);
  35 +
  36 + readable.pipe(writable);
  37 + readable.on('end', result => {
  38 + resolve(result);
  39 + });
  40 + });
  41 +
  42 + ws.broadcast(BROADCAST_PATH, {
  43 + state: '压缩包已经上传到服务器,开始解压...'
  44 + });
  45 +
  46 + let fileDistPath = path.join(FILE_SAVE_ROOT_PATH, actPath); // 文件解压的路径
  47 +
  48 + shelljs.mkdir('-p', fileDistPath);
  49 +
  50 + // 解压
  51 + await decompress(path.resolve(fileSavePath), path.resolve(fileDistPath), {
  52 + plugins: [
  53 + decompressUnzip()
  54 + ]
  55 + });
  56 +
  57 + ws.broadcast(BROADCAST_PATH, {
  58 + state: '压缩包已经解压成功,开始校验文件...'
  59 + });
  60 +
  61 + let fileList = rd.readSync(fileDistPath); // 读取待上传的文件列表
  62 + let testRes = this._testFiles(fileList); // 文件校验
  63 +
  64 + if (testRes) {
  65 + ws.broadcast(BROADCAST_PATH, {
  66 + state: '校验文件通过,开始将文件上传到七牛...'
  67 + });
  68 +
  69 + let fileModel = new FileModel();
  70 + let insertRes = await fileModel.insert({ // 上传记录写库
  71 + date: moment().format('YYYY-MM-DD HH:mm'),
  72 + fileName: fileName,
  73 + actPath: actPath,
  74 + username: user.username,
  75 + user_id: user._id
  76 + });
  77 +
  78 + await this._uploadToQiniu(fileList, fileDistPath);
  79 +
  80 + ws.broadcast(BROADCAST_PATH, {
  81 + state: '文件上传到七牛处理结束!'
  82 + });
  83 + } else {
  84 + ws.broadcast(BROADCAST_PATH, {
  85 + state: '校验文件失败,非法上传!'
  86 + });
  87 + }
  88 +
  89 + return true;
  90 + }
  91 +
  92 + /**
  93 + * 上传到七牛
  94 + * @param {待上传的文件列表} fileList
  95 + * @param {待上传的文件夹路径} fileDistPath
  96 + */
  97 + async _uploadToQiniu(fileList, fileDistPath) {
  98 + _.remove(fileList, perFilePath => {
  99 + return !perFilePath || /__MACOSX/.test(perFilePath) || /.DS_Store/.test(perFilePath) || !fs.lstatSync(perFilePath).isFile();
  100 + });
  101 +
  102 + let fileListPromises = _.map(fileList, filepath => {
  103 + let fileKey = path.relative(FILE_SAVE_ROOT_PATH, filepath);
  104 +
  105 + return new Promise((resolve, reject) => {
  106 + qn.uploadFile(filepath, {key:fileKey}, (err, result) => {
  107 + if (err) {
  108 + ws.broadcast(BROADCAST_PATH, {
  109 + state: `${fileKey} 上传到七牛过程中出现错误`
  110 + });
  111 + reject(err);
  112 + } else {
  113 + if (result && result.url) {
  114 + ws.broadcast(BROADCAST_PATH, {
  115 + state: `${fileKey} 上传到七牛成功`
  116 + });
  117 + } else {
  118 + ws.broadcast(BROADCAST_PATH, {
  119 + state: `${fileKey} 上传到七牛失败`
  120 + });
  121 + }
  122 + resolve(result);
  123 + }
  124 + });
  125 + });
  126 + });
  127 +
  128 + return Promise.all(fileListPromises);
  129 + }
  130 +
  131 + /**
  132 + * 测试是否是可以上传的文件包
  133 + * @param {待上传的文件列表} fileDistPath
  134 + */
  135 + _testFiles(fileList) {
  136 + let isSuperFile = false;
  137 + let isExistedHyperesources = false;
  138 + let isExistedHypeGenerated = false;
  139 +
  140 + _.forEach(fileList, file => {
  141 + if (file.indexOf(SUPER_FILE_CHECK_PASS) > 0) {
  142 + isSuperFile = true;
  143 + return false;
  144 + }
  145 +
  146 + if (/.hyperesources/.test(file)) {
  147 + isExistedHyperesources = true;
  148 + }
  149 +
  150 + if (/_hype_generated_script/.test(file)) {
  151 + isExistedHypeGenerated = true;
  152 + }
  153 +
  154 + if (isExistedHyperesources && isExistedHypeGenerated) {
  155 + return false;
  156 + }
  157 + });
  158 +
  159 + return isSuperFile || (isExistedHyperesources && isExistedHypeGenerated);
  160 + }
  161 +
  162 + /**
  163 + * 获取上传记录
  164 + */
  165 + async getAllLogs(params) {
  166 + let page = _.parseInt(params.page);
  167 + let limit = 10;
  168 + let skip = page > 0? limit * (page - 1) : 0;
  169 +
  170 + let result = await new FileModel().cfind({}).sort({
  171 + date: -1
  172 + }).skip(skip).limit(limit).exec();
  173 +
  174 + _.forEach(result, perLog => {
  175 + perLog.link = _.get(CDNCONFIG, 'feature.origin') + perLog.actPath + '/index.html';
  176 + });
  177 +
  178 + return result;
  179 + }
  180 +
  181 +}
  182 +
  183 +module.exports = FileApi;
  1 +'use strict';
  2 +
  3 +const Model = require('./model');
  4 +
  5 +class FileModel extends Model {
  6 + constructor() {
  7 + super('files');
  8 + }
  9 +}
  10 +
  11 +module.exports = FileModel;
  1 +'use strict';
  2 +
  3 +const _ = require('lodash');
  4 +const moment = require('moment');
  5 +const Router = require('koa-router');
  6 +const router = new Router();
  7 +const FileApi = require('../../ci/file');
  8 +const CDNCONFIG = require('../../../config/cdn_config');
  9 +const qn = require('../../../lib/qiniu')(CDNCONFIG.feature);
  10 +
  11 +/**
  12 + * 处理列表数据
  13 + */
  14 +const _handleListItems = items => {
  15 + _.forEach(items, perFile => {
  16 + perFile.fsizekb = (perFile.fsize / 1024).toFixed(2) + 'kb';
  17 +
  18 + let dateTime = _.parseInt(perFile.putTime.toString().substring(0, 13));
  19 +
  20 + perFile.putTimeFormat = moment(dateTime).format('YYYY-MM-DD HH:mm');
  21 + perFile.link = _.get(CDNCONFIG, 'feature.origin') + '/' + perFile.key;
  22 + });
  23 +
  24 + return items;
  25 +};
  26 +
  27 +/**
  28 + * 校验是否是允许上传的文件包
  29 + */
  30 +const _verifyFiles = filesList => {
  31 + return true;
  32 +};
  33 +
  34 +const file = {
  35 + /**
  36 + * 文件管理页面
  37 + */
  38 + page: async(ctx) => {
  39 + await ctx.render('/action/file_page', {domain: _.get(CDNCONFIG, 'feature.origin')});
  40 + },
  41 +
  42 + /**
  43 + * 列出上传记录
  44 + */
  45 + listLogs: async(ctx) => {
  46 + let fileApi = new FileApi();
  47 + let result = await fileApi.getAllLogs({
  48 + page: ctx.query.page
  49 + });
  50 +
  51 + ctx.body = {
  52 + code: 200,
  53 + message: '',
  54 + data: result
  55 + }
  56 + },
  57 +
  58 + /**
  59 + * 列出包内的文件
  60 + */
  61 + listFiles: async(ctx) => {
  62 + let params = {
  63 + prefix: ctx.query.actPath,
  64 + limit: 20
  65 + };
  66 +
  67 + if (ctx.query.marker) {
  68 + params.marker = ctx.query.marker;
  69 + }
  70 +
  71 + let result = await qn.listAsync(params);
  72 + let finalResult = {
  73 + items: _handleListItems(result.items)
  74 + };
  75 +
  76 + if (result.marker) {
  77 + finalResult.marker = result.marker;
  78 + }
  79 +
  80 + ctx.body = {
  81 + code: 200,
  82 + message: '',
  83 + data: finalResult
  84 + };
  85 + },
  86 +
  87 + /**
  88 + * 上传处理
  89 + */
  90 + upload: async(ctx, next) => {
  91 + if ('POST' !== ctx.method) return await next();
  92 +
  93 + let file = _.get(ctx, 'request.body._files.file');
  94 + let user = ctx.session.user;
  95 +
  96 + if (!file) {
  97 + return ctx.body = {
  98 + code: 400,
  99 + message: '没有接收到上传的文件包'
  100 + };
  101 + }
  102 +
  103 + let actPath = _.get(ctx, 'request.body.actPath');
  104 +
  105 + if (!actPath) {
  106 + return ctx.body = {
  107 + code: 400,
  108 + message: '请指定路径'
  109 + };
  110 + }
  111 +
  112 + await new FileApi().upload(file, actPath, user);
  113 +
  114 + return ctx.body = {
  115 + code: 200,
  116 + message: '处理完毕',
  117 + data: {}
  118 + };
  119 + }
  120 +}
  121 +
  122 +router.get('/page', file.page);
  123 +router.get('/listlogs', file.listLogs);
  124 +router.get('/listfiles', file.listFiles);
  125 +router.post('/upload', file.upload);
  126 +
  127 +module.exports = router;
@@ -25,6 +25,7 @@ const profile = require('./actions/profile'); @@ -25,6 +25,7 @@ const profile = require('./actions/profile');
25 const checkcode = require('./actions/checkcode').router; 25 const checkcode = require('./actions/checkcode').router;
26 const noAuth = new Router(); 26 const noAuth = new Router();
27 const base = new Router(); 27 const base = new Router();
  28 +const file = require('./actions/file');
28 29
29 module.exports = function(app) { 30 module.exports = function(app) {
30 31
@@ -66,6 +67,7 @@ module.exports = function(app) { @@ -66,6 +67,7 @@ module.exports = function(app) {
66 67
67 base.use('/abuse_protection', abuseProtection.routes(), degrade.allowedMethods()); 68 base.use('/abuse_protection', abuseProtection.routes(), degrade.allowedMethods());
68 base.use('/seo', seo.routes(), seo.allowedMethods()); 69 base.use('/seo', seo.routes(), seo.allowedMethods());
  70 + base.use('/files', file.routes(), file.allowedMethods());
69 71
70 base.use('', index.routes(), index.allowedMethods()); 72 base.use('', index.routes(), index.allowedMethods());
71 73
  1 +<div class="pageheader">
  2 + <div class="media">
  3 + <div class="pageicon pull-left">
  4 + <i class="fa fa-th-list"></i>
  5 + </div>
  6 + <div class="media-body">
  7 + <ul class="breadcrumb">
  8 + <li><a href=""><i class="glyphicon glyphicon-home"></i></a></li>
  9 + <li>静态资源</li>
  10 + </ul>
  11 + <h4>活动上传</h4>
  12 + </div>
  13 + </div>
  14 + <!-- media -->
  15 +</div>
  16 +<!-- pageheader -->
  17 +<div class="contentpanel">
  18 + <div class="row">
  19 + <div class="col-sm-12">
  20 + <div class="form-horizontal">
  21 + <div class="form-group col-sm-12">
  22 + <label class="control-label col-sm-1">上传地址:</label>
  23 + <div class="col-sm-6">
  24 + <div class="input-group">
  25 + <span class="input-group-addon">{{domain}}</span>
  26 + <input id="actPath" type="text" class="form-control col-sm-10" placeholder="请输入上传地址">
  27 + <span class="input-group-addon">/index.html</span>
  28 + </div>
  29 + </div>
  30 + </div>
  31 + <div class="form-group col-sm-12">
  32 + <label class="control-label col-sm-1">上传文件:</label>
  33 + <div class="col-sm-3">
  34 + <input type="file" accept="application/x-zip-compressed" name="file" id="fileInput" class="btn btn-default btn-block">
  35 + <p class="form-control-static">注:仅支持zip格式</p>
  36 + <button id="upload" class="btn btn-primary btn-block">上传</button>
  37 + </div>
  38 + </div>
  39 + <div class="form-group col-sm-12">
  40 + <label class="control-label col-sm-1">上传日志:</label>
  41 + <div class="col-sm-8">
  42 + <div class="logs panel-body yoho-log-dark" style="height: 150px; overflow-y: scroll; color: #fff;"></div>
  43 + </div>
  44 + </div>
  45 + <div class="form-group col-sm-12">
  46 + <label class="control-label col-sm-1">上传记录:</label>
  47 + <div class="col-sm-11">
  48 + <table id="upload-list" style="word-break: break-all;" class="table table-bordered table-hover">
  49 + <tr class="title">
  50 + <th style="text-align:center;">活动地址</th>
  51 + <th style="text-align:center;">文件名称</th>
  52 + <th style="text-align:center;">上传时间</th>
  53 + <th style="text-align:center;">上传用户</th>
  54 + <th style="text-align:center;">操作</th>
  55 + </tr>
  56 + </table>
  57 + </div>
  58 + </div>
  59 + <div class="form-group col-sm-12">
  60 + <div class="col-sm-11 col-sm-offset-1" style="text-align: center;">
  61 + <a class="btn btn-primary more-list">加载更多记录</a>
  62 + </div>
  63 + </div>
  64 + </div>
  65 + </div>
  66 + </div>
  67 +</div>
  68 +
  69 +<script>
  70 + let $uploadList = $('#upload-list tbody');
  71 + let marker = '';
  72 + let page = 1;
  73 +
  74 + $('#upload').on('click', function() {
  75 + var formData = new FormData();
  76 + var file = $('#fileInput').prop('files')[0];
  77 + var actPath = $('#actPath').val();
  78 +
  79 + if (!$('#actPath').val()) {
  80 + $('.logs').prepend('<p>state: 请输入上传地址!</p>');
  81 + return false;
  82 + }
  83 + actPath = `/${actPath}`;
  84 + formData.append('file', file);
  85 + formData.append('actPath', actPath);
  86 + $.ajax({
  87 + type: 'POST',
  88 + url: '/files/upload',
  89 + cache: false,
  90 + data: formData,
  91 + dataType: 'json',
  92 + processData: false,
  93 + contentType: false,
  94 + success: function(result) {
  95 + if (result) {
  96 + if (result.code === 200) {
  97 + $('.logs').prepend('<p>state: 上传完成!</p>');
  98 + $('#upload-list tr[class!=title]').remove();
  99 + page = 1;
  100 + getList();
  101 + } else if (result.code === 400) {
  102 + $('.logs').prepend('<p>state: 请选择上传文件!</p>');
  103 + }
  104 + } else {
  105 + $('.logs').prepend('<p>state: 请稍后再试!</p>');
  106 + }
  107 + }
  108 + });
  109 + });
  110 +
  111 + // 上传记录列表
  112 + function getList(){
  113 + $.ajax({
  114 + type: 'GET',
  115 + url: '/files/listlogs',
  116 + cache: false,
  117 + dataType: 'json',
  118 + data: {
  119 + page: page++
  120 + },
  121 + success: function(result) {
  122 + if (result && result.data && result.data.length > 0) {
  123 + let $uploadList = $('#upload-list > tbody');
  124 +
  125 + result.data.forEach(function(item){
  126 + $uploadList.append(`
  127 + <tr>
  128 + <td><a href="${item.link}">${item.actPath}</a></td>
  129 + <td style="text-align:center;">${item.fileName}</td>
  130 + <td style="text-align:center;">${item.date}</td>
  131 + <td style="text-align:center;">${item.username}</td>
  132 + <td style="text-align: center;">
  133 + <a class="detail-btn btn btn-warning btn-block" data-path="${item.actPath}">展开详情</a>
  134 + <a class="get-more btn btn-success btn-block hide" data-path="${item.actPath}">加载更多</a>
  135 + </td>
  136 + </tr>
  137 + <tr class="detail-c hide">
  138 + <td colspan=5>
  139 + <table class="table table-bordered detail-table">
  140 + <tr>
  141 + <th style="text-align: center">文件路径</th>
  142 + <th style="text-align: center">文件大小</th>
  143 + <th style="text-align: center">文件格式</th>
  144 + <th style="text-align: center">上传时间</th>
  145 + </tr>
  146 + </table>
  147 + </td>
  148 + </tr>
  149 + `);
  150 + });
  151 + } else {
  152 + $('.more-list').hide();
  153 + }
  154 + }
  155 + });
  156 + };
  157 +
  158 + // 上传记录详情
  159 + function getDetail(e, marker) {
  160 + let $this = $(e.currentTarget);
  161 + let path = $this.data('path');
  162 + let $uploadDetail = $this.parents('tr');
  163 + let detail = '';
  164 +
  165 + $.ajax({
  166 + type: 'GET',
  167 + url: '/files/listfiles',
  168 + cache: false,
  169 + dataType: 'json',
  170 + data: {
  171 + actPath: `${path}`,
  172 + marker: marker
  173 + },
  174 + success: (result) => {
  175 + if (result && result.data &&result.data.items) {
  176 + if ($this.parents('td').find('.get-more').attr('data-marker') === result.data.marker) {
  177 + $this.parents('td').find('.get-more').remove();
  178 + return false;
  179 + }
  180 + $this.parents('td').find('.get-more').attr('data-marker', result.data.marker);
  181 + result.data.items.forEach(function(item){
  182 + detail += `<tr class="detail-list">
  183 + <td><a href="${item.link}">${item.key}</a></td>
  184 + <td style="text-align:center;">${item.fsizekb}</td>
  185 + <td style="text-align:center;">${item.mimeType}</td>
  186 + <td style="text-align:center;">${item.putTimeFormat}</td>
  187 + </tr>`;
  188 + });
  189 + $uploadDetail.next('.detail-c').find('.detail-table tbody').append(detail);
  190 + $this.parents('td').find('.get-more').removeClass('hide');
  191 + }
  192 + }
  193 + });
  194 + }
  195 +
  196 + // 加载更多列表
  197 + $('.more-list').on('click', function() {
  198 + getList();
  199 + })
  200 +
  201 + // 上传记录详情,插入tr
  202 + $uploadList.on('click', '.detail-btn', function(e) {
  203 + let $this = $(e.currentTarget);
  204 + let $detailC = $this.parents('tr').next('.detail-c');
  205 + let $detailList = $this.parents('tr').next('.detail-c').find('.detail-list');
  206 +
  207 + if ($detailC.is(':hidden')) {
  208 + $('.detail-c').addClass('hide');
  209 + $detailC.removeClass('hide');
  210 + $('.detail-btn').text('展开详情');
  211 + $this.text('关闭详情');
  212 + if ($detailList.length <= 0) {
  213 + getDetail(e, marker);
  214 + } else if ($detailC.find('.detail-list').length > 0) {
  215 + $this.siblings('.get-more').removeClass('hide');
  216 + }
  217 + } else {
  218 + $detailC.addClass('hide');
  219 + $this.text('展开详情');
  220 + $this.siblings('.get-more').addClass('hide');
  221 + }
  222 + });
  223 +
  224 + // 加载更多
  225 + $uploadList.on('click', '.get-more', function(e) {
  226 + let $this = $(e.currentTarget);
  227 + let marker = $this.data('marker');
  228 +
  229 + getDetail(e, marker);
  230 + })
  231 +
  232 + // 打印日志
  233 + $(() => {
  234 + var ws = io();
  235 + ws.on('connect', function() {
  236 + ws.on('/upload', function(data) {
  237 + $('.logs').prepend(`<p>state: ${data.state}</p>`);
  238 + });
  239 + });
  240 +
  241 + getList();
  242 + });
  243 +</script>
  244 +
@@ -61,9 +61,10 @@ @@ -61,9 +61,10 @@
61 </li> 61 </li>
62 </ul> 62 </ul>
63 </li> 63 </li>
64 - <li class="parent"><a><i class="fa fa-list"></i> <span>静态资源</span> 64 + <li class="parent"><a><i class="fa fa-list"></i> <span>静态资源</span></a>
65 <ul class="children"> 65 <ul class="children">
66 <li><a href="/check/list">代码检查</a></li> 66 <li><a href="/check/list">代码检查</a></li>
  67 + <li><a href="/files/page">活动上传</a></li>
67 </ul> 68 </ul>
68 </li> 69 </li>
69 70
  1 +/**
  2 + * CDN 配置
  3 + */
  4 +
  5 +const CDNCONFIG = {
  6 + feature: {
  7 + origin: 'https://feature.yoho.cn',
  8 + bucket: 'yohogirlzine'
  9 + }
  10 +}
  11 +
  12 +module.exports = CDNCONFIG;
@@ -17,8 +17,17 @@ const config = { @@ -17,8 +17,17 @@ const config = {
17 bucket: 'yohocdn' 17 bucket: 'yohocdn'
18 }; 18 };
19 19
  20 +const _default = (params) => {
  21 + let finalConfig = config;
20 22
21 -const _default = Promise.promisifyAll(qn.create(config)); 23 + if (params) {
  24 + _.assign(finalConfig, params);
  25 + }
  26 +
  27 + return Promise.promisifyAll(
  28 + qn.create(finalConfig)
  29 + );
  30 +}
22 31
23 _default.key = function(key) { 32 _default.key = function(key) {
24 let _conifg = _.clone(config); 33 let _conifg = _.clone(config);
@@ -28,6 +28,8 @@ @@ -28,6 +28,8 @@
28 "bluebird": "^3.5.0", 28 "bluebird": "^3.5.0",
29 "co": "^4.6.0", 29 "co": "^4.6.0",
30 "co-body": "^4.2.0", 30 "co-body": "^4.2.0",
  31 + "decompress": "^4.2.0",
  32 + "decompress-unzip": "^4.0.1",
31 "formidable": "^1.0.17", 33 "formidable": "^1.0.17",
32 "fs-promise": "^0.5.0", 34 "fs-promise": "^0.5.0",
33 "fstream": "^1.0.9", 35 "fstream": "^1.0.9",
@@ -56,10 +58,12 @@ @@ -56,10 +58,12 @@
56 "node-zookeeper-client": "^0.2.2", 58 "node-zookeeper-client": "^0.2.2",
57 "nodemailer": "^3.1.8", 59 "nodemailer": "^3.1.8",
58 "npm": "^3.10.9", 60 "npm": "^3.10.9",
  61 + "path": "^0.12.7",
59 "promise-mysql": "^3.0.1", 62 "promise-mysql": "^3.0.1",
60 "qcloudapi-sdk": "^0.1.5", 63 "qcloudapi-sdk": "^0.1.5",
61 "qn": "^1.3.0", 64 "qn": "^1.3.0",
62 "qs": "^6.2.0", 65 "qs": "^6.2.0",
  66 + "rd": "^1.1.2",
63 "redis": "^2.7.1", 67 "redis": "^2.7.1",
64 "request-promise": "^4.1.1", 68 "request-promise": "^4.1.1",
65 "shelljs": "^0.7.0", 69 "shelljs": "^0.7.0",
@@ -224,6 +224,10 @@ base64-arraybuffer@0.1.5: @@ -224,6 +224,10 @@ base64-arraybuffer@0.1.5:
224 version "0.1.5" 224 version "0.1.5"
225 resolved "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 225 resolved "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
226 226
  227 +base64-js@0.0.8:
  228 + version "0.0.8"
  229 + resolved "http://npm.yoho.cn/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
  230 +
227 base64id@0.1.0: 231 base64id@0.1.0:
228 version "0.1.0" 232 version "0.1.0"
229 resolved "http://registry.npm.taobao.org/base64id/download/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" 233 resolved "http://registry.npm.taobao.org/base64id/download/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f"
@@ -258,6 +262,12 @@ binary-search-tree@0.2.5: @@ -258,6 +262,12 @@ binary-search-tree@0.2.5:
258 dependencies: 262 dependencies:
259 underscore "~1.4.4" 263 underscore "~1.4.4"
260 264
  265 +bl@^1.0.0:
  266 + version "1.2.1"
  267 + resolved "http://npm.yoho.cn/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
  268 + dependencies:
  269 + readable-stream "^2.0.5"
  270 +
261 bl@~1.1.2: 271 bl@~1.1.2:
262 version "1.1.2" 272 version "1.1.2"
263 resolved "http://registry.npm.taobao.org/bl/download/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 273 resolved "http://registry.npm.taobao.org/bl/download/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398"
@@ -338,6 +348,10 @@ buffer-concat@~0.0.1: @@ -338,6 +348,10 @@ buffer-concat@~0.0.1:
338 version "0.0.1" 348 version "0.0.1"
339 resolved "http://registry.npm.taobao.org/buffer-concat/download/buffer-concat-0.0.1.tgz#43e1e3c77f3d22fb55bea6890a92d03778c4c10a" 349 resolved "http://registry.npm.taobao.org/buffer-concat/download/buffer-concat-0.0.1.tgz#43e1e3c77f3d22fb55bea6890a92d03778c4c10a"
340 350
  351 +buffer-crc32@~0.2.3:
  352 + version "0.2.13"
  353 + resolved "http://npm.yoho.cn/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
  354 +
341 buffer-shims@^1.0.0: 355 buffer-shims@^1.0.0:
342 version "1.0.0" 356 version "1.0.0"
343 resolved "http://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 357 resolved "http://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
@@ -346,6 +360,14 @@ buffer-type@^0.0.2: @@ -346,6 +360,14 @@ buffer-type@^0.0.2:
346 version "0.0.2" 360 version "0.0.2"
347 resolved "http://registry.npm.taobao.org/buffer-type/download/buffer-type-0.0.2.tgz#8a0bbcbe786049af8b436a636b9b50525fe26ca3" 361 resolved "http://registry.npm.taobao.org/buffer-type/download/buffer-type-0.0.2.tgz#8a0bbcbe786049af8b436a636b9b50525fe26ca3"
348 362
  363 +buffer@^3.0.1:
  364 + version "3.6.0"
  365 + resolved "http://npm.yoho.cn/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
  366 + dependencies:
  367 + base64-js "0.0.8"
  368 + ieee754 "^1.1.4"
  369 + isarray "^1.0.0"
  370 +
349 builtin-modules@^1.0.0: 371 builtin-modules@^1.0.0:
350 version "1.1.1" 372 version "1.1.1"
351 resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 373 resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@@ -525,6 +547,19 @@ commander@, commander@^2.9.0: @@ -525,6 +547,19 @@ commander@, commander@^2.9.0:
525 dependencies: 547 dependencies:
526 graceful-readlink ">= 1.0.0" 548 graceful-readlink ">= 1.0.0"
527 549
  550 +<<<<<<< HEAD
  551 +commander@~2.11.0:
  552 + version "2.11.0"
  553 + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
  554 +
  555 +commander@~2.8.1:
  556 + version "2.8.1"
  557 + resolved "http://npm.yoho.cn/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
  558 + dependencies:
  559 + graceful-readlink ">= 1.0.0"
  560 +
  561 +=======
  562 +>>>>>>> master
528 component-bind@1.0.0: 563 component-bind@1.0.0:
529 version "1.0.0" 564 version "1.0.0"
530 resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 565 resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
@@ -707,6 +742,54 @@ decamelize@^1.0.0: @@ -707,6 +742,54 @@ decamelize@^1.0.0:
707 version "1.2.0" 742 version "1.2.0"
708 resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 743 resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
709 744
  745 +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
  746 + version "4.1.1"
  747 + resolved "http://npm.yoho.cn/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
  748 + dependencies:
  749 + file-type "^5.2.0"
  750 + is-stream "^1.1.0"
  751 + tar-stream "^1.5.2"
  752 +
  753 +decompress-tarbz2@^4.0.0:
  754 + version "4.1.1"
  755 + resolved "http://npm.yoho.cn/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
  756 + dependencies:
  757 + decompress-tar "^4.1.0"
  758 + file-type "^6.1.0"
  759 + is-stream "^1.1.0"
  760 + seek-bzip "^1.0.5"
  761 + unbzip2-stream "^1.0.9"
  762 +
  763 +decompress-targz@^4.0.0:
  764 + version "4.1.1"
  765 + resolved "http://npm.yoho.cn/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
  766 + dependencies:
  767 + decompress-tar "^4.1.1"
  768 + file-type "^5.2.0"
  769 + is-stream "^1.1.0"
  770 +
  771 +decompress-unzip@^4.0.1:
  772 + version "4.0.1"
  773 + resolved "http://npm.yoho.cn/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
  774 + dependencies:
  775 + file-type "^3.8.0"
  776 + get-stream "^2.2.0"
  777 + pify "^2.3.0"
  778 + yauzl "^2.4.2"
  779 +
  780 +decompress@^4.2.0:
  781 + version "4.2.0"
  782 + resolved "http://npm.yoho.cn/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
  783 + dependencies:
  784 + decompress-tar "^4.0.0"
  785 + decompress-tarbz2 "^4.0.0"
  786 + decompress-targz "^4.0.0"
  787 + decompress-unzip "^4.0.1"
  788 + graceful-fs "^4.1.10"
  789 + make-dir "^1.0.0"
  790 + pify "^2.3.0"
  791 + strip-dirs "^2.0.0"
  792 +
710 deep-equal@^1.0.0, deep-equal@~1.0.0, deep-equal@~1.0.1: 793 deep-equal@^1.0.0, deep-equal@~1.0.0, deep-equal@~1.0.1:
711 version "1.0.1" 794 version "1.0.1"
712 resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 795 resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
@@ -807,6 +890,12 @@ ee-first@1.1.1: @@ -807,6 +890,12 @@ ee-first@1.1.1:
807 version "1.1.1" 890 version "1.1.1"
808 resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 891 resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
809 892
  893 +end-of-stream@^1.0.0:
  894 + version "1.4.0"
  895 + resolved "http://npm.yoho.cn/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
  896 + dependencies:
  897 + once "^1.4.0"
  898 +
810 engine.io-client@1.7.2: 899 engine.io-client@1.7.2:
811 version "1.7.2" 900 version "1.7.2"
812 resolved "http://registry.npm.taobao.org/engine.io-client/download/engine.io-client-1.7.2.tgz#12f01d3d9d676908a86339cee067ff799a585c3d" 901 resolved "http://registry.npm.taobao.org/engine.io-client/download/engine.io-client-1.7.2.tgz#12f01d3d9d676908a86339cee067ff799a585c3d"
@@ -1030,6 +1119,24 @@ fast-deep-equal@^1.0.0: @@ -1030,6 +1119,24 @@ fast-deep-equal@^1.0.0:
1030 version "1.0.0" 1119 version "1.0.0"
1031 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 1120 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
1032 1121
  1122 +fd-slicer@~1.0.1:
  1123 + version "1.0.1"
  1124 + resolved "http://npm.yoho.cn/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
  1125 + dependencies:
  1126 + pend "~1.2.0"
  1127 +
  1128 +file-type@^3.8.0:
  1129 + version "3.9.0"
  1130 + resolved "http://npm.yoho.cn/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
  1131 +
  1132 +file-type@^5.2.0:
  1133 + version "5.2.0"
  1134 + resolved "http://npm.yoho.cn/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
  1135 +
  1136 +file-type@^6.1.0:
  1137 + version "6.2.0"
  1138 + resolved "http://npm.yoho.cn/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
  1139 +
1033 filename-regex@^2.0.0: 1140 filename-regex@^2.0.0:
1034 version "2.0.1" 1141 version "2.0.1"
1035 resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 1142 resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@@ -1242,6 +1349,20 @@ generate-object-property@^1.1.0: @@ -1242,6 +1349,20 @@ generate-object-property@^1.1.0:
1242 dependencies: 1349 dependencies:
1243 is-property "^1.0.0" 1350 is-property "^1.0.0"
1244 1351
  1352 +<<<<<<< HEAD
  1353 +get-caller-file@^1.0.1:
  1354 + version "1.0.2"
  1355 + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
  1356 +
  1357 +get-stream@^2.2.0:
  1358 + version "2.3.1"
  1359 + resolved "http://npm.yoho.cn/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
  1360 + dependencies:
  1361 + object-assign "^4.0.1"
  1362 + pinkie-promise "^2.0.0"
  1363 +
  1364 +=======
  1365 +>>>>>>> master
1245 get-stream@^3.0.0: 1366 get-stream@^3.0.0:
1246 version "3.0.0" 1367 version "3.0.0"
1247 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 1368 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -1313,7 +1434,7 @@ got@^6.7.1: @@ -1313,7 +1434,7 @@ got@^6.7.1:
1313 unzip-response "^2.0.1" 1434 unzip-response "^2.0.1"
1314 url-parse-lax "^1.0.0" 1435 url-parse-lax "^1.0.0"
1315 1436
1316 -graceful-fs@^4.1.11: 1437 +graceful-fs@^4.1.10, graceful-fs@^4.1.11:
1317 version "4.1.11" 1438 version "4.1.11"
1318 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1439 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1319 1440
@@ -1491,6 +1612,10 @@ iconv-lite@0.4.13, iconv-lite@^0.4.13: @@ -1491,6 +1612,10 @@ iconv-lite@0.4.13, iconv-lite@^0.4.13:
1491 version "0.4.13" 1612 version "0.4.13"
1492 resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" 1613 resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
1493 1614
  1615 +ieee754@^1.1.4:
  1616 + version "1.1.8"
  1617 + resolved "http://npm.yoho.cn/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
  1618 +
1494 iferr@^0.1.5, iferr@~0.1.5: 1619 iferr@^0.1.5, iferr@~0.1.5:
1495 version "0.1.5" 1620 version "0.1.5"
1496 resolved "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 1621 resolved "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
@@ -1658,6 +1783,10 @@ is-nan@^1.2.1: @@ -1658,6 +1783,10 @@ is-nan@^1.2.1:
1658 dependencies: 1783 dependencies:
1659 define-properties "^1.1.1" 1784 define-properties "^1.1.1"
1660 1785
  1786 +is-natural-number@^4.0.1:
  1787 + version "4.0.1"
  1788 + resolved "http://npm.yoho.cn/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
  1789 +
1661 is-npm@^1.0.0: 1790 is-npm@^1.0.0:
1662 version "1.0.0" 1791 version "1.0.0"
1663 resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1792 resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
@@ -1720,7 +1849,7 @@ isarray@0.0.1: @@ -1720,7 +1849,7 @@ isarray@0.0.1:
1720 version "0.0.1" 1849 version "0.0.1"
1721 resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1850 resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
1722 1851
1723 -isarray@1.0.0, isarray@~1.0.0: 1852 +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
1724 version "1.0.0" 1853 version "1.0.0"
1725 resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1854 resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1726 1855
@@ -2634,7 +2763,7 @@ on-finished@^2.1.0: @@ -2634,7 +2763,7 @@ on-finished@^2.1.0:
2634 dependencies: 2763 dependencies:
2635 ee-first "1.1.1" 2764 ee-first "1.1.1"
2636 2765
2637 -once@^1.3.0, once@^1.3.3, once@~1.4.0: 2766 +once@^1.3.0, once@^1.3.3, once@^1.4.0, once@~1.4.0:
2638 version "1.4.0" 2767 version "1.4.0"
2639 resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2768 resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
2640 dependencies: 2769 dependencies:
@@ -2774,12 +2903,34 @@ path-to-regexp@^1.1.1: @@ -2774,12 +2903,34 @@ path-to-regexp@^1.1.1:
2774 dependencies: 2903 dependencies:
2775 isarray "0.0.1" 2904 isarray "0.0.1"
2776 2905
  2906 +<<<<<<< HEAD
  2907 +path-type@^1.0.0:
  2908 + version "1.1.0"
  2909 + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
  2910 + dependencies:
  2911 + graceful-fs "^4.1.2"
  2912 + pify "^2.0.0"
  2913 + pinkie-promise "^2.0.0"
  2914 +
  2915 +path@^0.12.7:
  2916 + version "0.12.7"
  2917 + resolved "http://npm.yoho.cn/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
  2918 + dependencies:
  2919 + process "^0.11.1"
  2920 + util "^0.10.3"
  2921 +
  2922 +=======
  2923 +>>>>>>> master
2777 pause-stream@0.0.11, pause-stream@~0.0.11: 2924 pause-stream@0.0.11, pause-stream@~0.0.11:
2778 version "0.0.11" 2925 version "0.0.11"
2779 resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 2926 resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
2780 dependencies: 2927 dependencies:
2781 through "~2.3" 2928 through "~2.3"
2782 2929
  2930 +pend@~1.2.0:
  2931 + version "1.2.0"
  2932 + resolved "http://npm.yoho.cn/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
  2933 +
2783 performance-now@^0.2.0: 2934 performance-now@^0.2.0:
2784 version "0.2.0" 2935 version "0.2.0"
2785 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 2936 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
@@ -2822,6 +2973,10 @@ process-nextick-args@~1.0.6: @@ -2822,6 +2973,10 @@ process-nextick-args@~1.0.6:
2822 version "1.0.7" 2973 version "1.0.7"
2823 resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2974 resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
2824 2975
  2976 +process@^0.11.1:
  2977 + version "0.11.10"
  2978 + resolved "http://npm.yoho.cn/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
  2979 +
2825 promise-mysql@^3.0.1: 2980 promise-mysql@^3.0.1:
2826 version "3.0.2" 2981 version "3.0.2"
2827 resolved "https://registry.yarnpkg.com/promise-mysql/-/promise-mysql-3.0.2.tgz#356e22511c2fa5193c6a4ef187ccec8e4eab7161" 2982 resolved "https://registry.yarnpkg.com/promise-mysql/-/promise-mysql-3.0.2.tgz#356e22511c2fa5193c6a4ef187ccec8e4eab7161"
@@ -2916,6 +3071,12 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: @@ -2916,6 +3071,12 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
2916 minimist "^1.2.0" 3071 minimist "^1.2.0"
2917 strip-json-comments "~2.0.1" 3072 strip-json-comments "~2.0.1"
2918 3073
  3074 +rd@^1.1.2:
  3075 + version "1.1.2"
  3076 + resolved "http://npm.yoho.cn/rd/-/rd-1.1.2.tgz#86297e2025608ee5576c1b451e6997e679ef6b1d"
  3077 + dependencies:
  3078 + "@types/node" "^8.0.20"
  3079 +
2919 read-cmd-shim@~1.0.1: 3080 read-cmd-shim@~1.0.1:
2920 version "1.0.1" 3081 version "1.0.1"
2921 resolved "http://registry.npm.taobao.org/read-cmd-shim/download/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" 3082 resolved "http://registry.npm.taobao.org/read-cmd-shim/download/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
@@ -2973,7 +3134,7 @@ read@1, read@~1.0.1, read@~1.0.7: @@ -2973,7 +3134,7 @@ read@1, read@~1.0.1, read@~1.0.7:
2973 string_decoder "~0.10.x" 3134 string_decoder "~0.10.x"
2974 util-deprecate "~1.0.1" 3135 util-deprecate "~1.0.1"
2975 3136
2976 -readable-stream@2, readable-stream@2.3.3, readable-stream@^2.0.5, readable-stream@^2.1.4: 3137 +readable-stream@2, readable-stream@2.3.3, readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.1.4:
2977 version "2.3.3" 3138 version "2.3.3"
2978 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 3139 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
2979 dependencies: 3140 dependencies:
@@ -3276,6 +3437,12 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s @@ -3276,6 +3437,12 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s
3276 version "5.1.1" 3437 version "5.1.1"
3277 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 3438 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
3278 3439
  3440 +seek-bzip@^1.0.5:
  3441 + version "1.0.5"
  3442 + resolved "http://npm.yoho.cn/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
  3443 + dependencies:
  3444 + commander "~2.8.1"
  3445 +
3279 semver-diff@^2.0.0: 3446 semver-diff@^2.0.0:
3280 version "2.1.0" 3447 version "2.1.0"
3281 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 3448 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -3577,6 +3744,21 @@ strip-ansi@^4.0.0: @@ -3577,6 +3744,21 @@ strip-ansi@^4.0.0:
3577 dependencies: 3744 dependencies:
3578 ansi-regex "^3.0.0" 3745 ansi-regex "^3.0.0"
3579 3746
  3747 +<<<<<<< HEAD
  3748 +strip-bom@^2.0.0:
  3749 + version "2.0.0"
  3750 + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
  3751 + dependencies:
  3752 + is-utf8 "^0.2.0"
  3753 +
  3754 +strip-dirs@^2.0.0:
  3755 + version "2.0.0"
  3756 + resolved "http://npm.yoho.cn/strip-dirs/-/strip-dirs-2.0.0.tgz#610cdb2928200da0004f41dcb90fc95cd919a0b6"
  3757 + dependencies:
  3758 + is-natural-number "^4.0.1"
  3759 +
  3760 +=======
  3761 +>>>>>>> master
3580 strip-eof@^1.0.0: 3762 strip-eof@^1.0.0:
3581 version "1.0.0" 3763 version "1.0.0"
3582 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 3764 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -3641,6 +3823,15 @@ tar-pack@^3.4.0: @@ -3641,6 +3823,15 @@ tar-pack@^3.4.0:
3641 tar "^2.2.1" 3823 tar "^2.2.1"
3642 uid-number "^0.0.6" 3824 uid-number "^0.0.6"
3643 3825
  3826 +tar-stream@^1.5.2:
  3827 + version "1.5.4"
  3828 + resolved "http://npm.yoho.cn/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
  3829 + dependencies:
  3830 + bl "^1.0.0"
  3831 + end-of-stream "^1.0.0"
  3832 + readable-stream "^2.0.0"
  3833 + xtend "^4.0.0"
  3834 +
3644 tar@^2.0.0, tar@^2.2.1, tar@~2.2.1: 3835 tar@^2.0.0, tar@^2.2.1, tar@~2.2.1:
3645 version "2.2.1" 3836 version "2.2.1"
3646 resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 3837 resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
@@ -3678,7 +3869,7 @@ through2@^0.6.2, through2@^0.6.5: @@ -3678,7 +3869,7 @@ through2@^0.6.2, through2@^0.6.5:
3678 readable-stream ">=1.0.33-1 <1.1.0-0" 3869 readable-stream ">=1.0.33-1 <1.1.0-0"
3679 xtend ">=4.0.0 <4.1.0-0" 3870 xtend ">=4.0.0 <4.1.0-0"
3680 3871
3681 -through@2, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: 3872 +through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8:
3682 version "2.3.8" 3873 version "2.3.8"
3683 resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 3874 resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
3684 3875
@@ -3758,6 +3949,13 @@ umask@~1.1.0: @@ -3758,6 +3949,13 @@ umask@~1.1.0:
3758 version "1.1.0" 3949 version "1.1.0"
3759 resolved "http://registry.npm.taobao.org/umask/download/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" 3950 resolved "http://registry.npm.taobao.org/umask/download/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
3760 3951
  3952 +unbzip2-stream@^1.0.9:
  3953 + version "1.2.5"
  3954 + resolved "http://npm.yoho.cn/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47"
  3955 + dependencies:
  3956 + buffer "^3.0.1"
  3957 + through "^2.3.6"
  3958 +
3761 undefsafe@0.0.3: 3959 undefsafe@0.0.3:
3762 version "0.0.3" 3960 version "0.0.3"
3763 resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" 3961 resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f"
@@ -3848,6 +4046,12 @@ util-extend@^1.0.1: @@ -3848,6 +4046,12 @@ util-extend@^1.0.1:
3848 version "1.0.3" 4046 version "1.0.3"
3849 resolved "http://registry.npm.taobao.org/util-extend/download/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" 4047 resolved "http://registry.npm.taobao.org/util-extend/download/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
3850 4048
  4049 +util@^0.10.3:
  4050 + version "0.10.3"
  4051 + resolved "http://npm.yoho.cn/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
  4052 + dependencies:
  4053 + inherits "2.0.1"
  4054 +
3851 utility@0.1.11: 4055 utility@0.1.11:
3852 version "0.1.11" 4056 version "0.1.11"
3853 resolved "http://registry.npm.taobao.org/utility/download/utility-0.1.11.tgz#fde60cf9b4e4751947a0cf5d104ce29367226715" 4057 resolved "http://registry.npm.taobao.org/utility/download/utility-0.1.11.tgz#fde60cf9b4e4751947a0cf5d104ce29367226715"
@@ -4008,6 +4212,13 @@ yargs@~3.10.0: @@ -4008,6 +4212,13 @@ yargs@~3.10.0:
4008 decamelize "^1.0.0" 4212 decamelize "^1.0.0"
4009 window-size "0.1.0" 4213 window-size "0.1.0"
4010 4214
  4215 +yauzl@^2.4.2:
  4216 + version "2.8.0"
  4217 + resolved "http://npm.yoho.cn/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2"
  4218 + dependencies:
  4219 + buffer-crc32 "~0.2.3"
  4220 + fd-slicer "~1.0.1"
  4221 +
4011 yeast@0.1.2: 4222 yeast@0.1.2:
4012 version "0.1.2" 4223 version "0.1.2"
4013 resolved "http://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 4224 resolved "http://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"