Authored by 周奇琪

Merge branch 'feature/report' into 'master'

Feature/report



See merge request !9
@@ -4,6 +4,7 @@ const Router = require('koa-router'); @@ -4,6 +4,7 @@ const Router = require('koa-router');
4 const SqlBuilder = require('../utils/sql-builder'); 4 const SqlBuilder = require('../utils/sql-builder');
5 const request = require('superagent'); 5 const request = require('superagent');
6 const _ = require('lodash'); 6 const _ = require('lodash');
  7 +const alasql = require('alasql');
7 const config = require('../../../config/config'); 8 const config = require('../../../config/config');
8 9
9 const endpoint = (server) => `http://${server.host}:${server.port}`; 10 const endpoint = (server) => `http://${server.host}:${server.port}`;
@@ -11,7 +12,7 @@ const endpoint = (server) => `http://${server.host}:${server.port}`; @@ -11,7 +12,7 @@ const endpoint = (server) => `http://${server.host}:${server.port}`;
11 const r = new Router; 12 const r = new Router;
12 13
13 const TABLE = { 14 const TABLE = {
14 - DURATION: 'web-duration', 15 + DURATION: 'web-client-duration',
15 REPORT: 'error-report' 16 REPORT: 'error-report'
16 }; 17 };
17 18
@@ -38,13 +39,10 @@ async function exec(server, sql) { @@ -38,13 +39,10 @@ async function exec(server, sql) {
38 q: sql, 39 q: sql,
39 db: DB_NAME 40 db: DB_NAME
40 }).then(({body: result}) => { 41 }).then(({body: result}) => {
41 - const series = _.get(result, 'results[0].series[0]', {});  
42 - const col = _.get(series, 'columns', []);  
43 - const values = _.get(series, "values", []);  
44 -  
45 - return values.map(v => {  
46 - return _.zipObject(col, v);  
47 - }) 42 + return result;
  43 + }).catch((err) => {
  44 + console.log(err);
  45 + return {};
48 }); 46 });
49 } 47 }
50 48
@@ -54,44 +52,146 @@ const APP = { @@ -54,44 +52,146 @@ const APP = {
54 h5: {field: 'app', op: '=', value: APP_NAME.h5} 52 h5: {field: 'app', op: '=', value: APP_NAME.h5}
55 }; 53 };
56 54
57 -const DURATION = {  
58 - 0: {field: '', op: '', value: ''},  
59 - 1: {field: 'duration', op: '<=', value: 100},  
60 - 2: {field: '', op: '', value: '"duration">100 and "duration"<=200'},  
61 - 3: {field: 'duration', op: '>', value: 200},  
62 -};  
63 -  
64 const SERVER = { 55 const SERVER = {
65 aws: endpoint(config.apm.aws), 56 aws: endpoint(config.apm.aws),
66 qcloud: endpoint(config.apm.qcloud) 57 qcloud: endpoint(config.apm.qcloud)
67 }; 58 };
68 59
  60 +
  61 +function handleZip(items) {
  62 + const col = _.get(items, 'columns', []);
  63 + const values = _.get(items, "values", []);
  64 +
  65 + return values.map((v) => {
  66 + return _.zipObject(col, v)
  67 + });
  68 +}
  69 +
  70 +function handleRows(rows) {
  71 + let result = alasql('SELECT route, AVG(duration) as mean FROM ? GROUP BY route,type', [rows]);
  72 + result = alasql('SELECT route, SUM(mean) as mean FROM ? GROUP BY route', [result]);
  73 + return result;
  74 +}
  75 +
  76 +function handleCount(rows) {
  77 + let result = alasql('SELECT route, COUNT(route) as times FROM ? GROUP BY route', [rows]);
  78 + return result;
  79 +}
  80 +
69 const profile_service = { 81 const profile_service = {
70 - async time(server, start, end, app, duration) { 82 + async mean(server, start, end, app, lastTime) {
  83 + const model = profile_sql.duration()
  84 + .select('*')
  85 + .where(APP[app]);
  86 +
  87 + if (lastTime) {
  88 + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`))
  89 + }
  90 +
  91 + if (start && end) {
  92 + model.where('time', '>=', start)
  93 + .where('time', '<', end);
  94 + }
  95 +
  96 + let rows = await exec(SERVER[server],model.toSql())
  97 + .then(result => _.get(result, 'results[0].series[0]', []))
  98 + .then(handleZip);
  99 +
  100 + rows = handleRows(rows);
  101 +
  102 + return {code: 200, data: rows}
  103 + },
  104 + async count(server, start, end, app, lastTime) {
71 const model = profile_sql.duration() 105 const model = profile_sql.duration()
72 .select('*') 106 .select('*')
73 - .where(DURATION[duration])  
74 - .where(APP[app])  
75 - .where('time', '>=', start) 107 + .where(APP[app]);
  108 +
  109 + if (lastTime) {
  110 + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`))
  111 + }
  112 +
  113 + if (start && end) {
  114 + model.where('time', '>=', start)
76 .where('time', '<', end); 115 .where('time', '<', end);
  116 + }
  117 +
  118 + let rows = await exec(SERVER[server],model.toSql())
  119 + .then(result => _.get(result, 'results[0].series[0]', []))
  120 + .then(handleZip);
  121 +
  122 + rows = handleCount(rows);
77 123
78 - const rows = await exec(SERVER[server],model.toSql());  
79 return {code: 200, data: rows} 124 return {code: 200, data: rows}
80 }, 125 },
  126 + async time(server, start, end, app, lastTime) {
  127 + const model = profile_sql.duration()
  128 + .select('*')
  129 + .where(APP[app]);
81 130
82 - async error(server, start, end, app) { 131 + if (lastTime) {
  132 + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`))
  133 + }
  134 +
  135 + if (start && end) {
  136 + model.where('time', '>=', start)
  137 + .where('time', '<', end);
  138 + }
  139 +
  140 + const rows = await exec(SERVER[server], model.toSql())
  141 + .then(result => _.get(result, 'results[0].series[0]', []))
  142 + .then(handleZip);
  143 +
  144 + return {cde: 200, data: rows};
  145 + },
  146 + async error(server, start, end, app, lastTime) {
83 const model = profile_sql.error() 147 const model = profile_sql.error()
84 .select('*') 148 .select('*')
85 - .where(APP[app])  
86 - .where('time', '>=', start) 149 + .where(APP[app]);
  150 +
  151 + if (lastTime) {
  152 + model.where('time', '>=', SqlBuilder.raw(`now() - ${lastTime}`))
  153 + }
  154 +
  155 + if (start && end) {
  156 + model.where('time', '>=', start)
87 .where('time', '<', end); 157 .where('time', '<', end);
  158 + }
  159 +
  160 + const rows = await exec(SERVER[server], model.toSql())
  161 + .then(result => _.get(result, 'results[0].series[0]', []))
  162 + .then(handleZip);
88 163
89 - const rows = await exec(SERVER[server], model.toSql());  
90 return {cde: 200, data: rows}; 164 return {cde: 200, data: rows};
91 } 165 }
92 }; 166 };
93 167
94 const profile_controller = { 168 const profile_controller = {
  169 + async mean_report_index(ctx) {
  170 + await ctx.render('action/profile_mean');
  171 + },
  172 + async mean_report_json(ctx) {
  173 + const start = ctx.query.start;
  174 + const end = ctx.query.end;
  175 + const app = ctx.query.app;
  176 + const server = ctx.query.server || 'aws';
  177 + const lastTime = ctx.query.lastTime;
  178 +
  179 + const result = await profile_service.time(server, start, end, app, lastTime);
  180 + ctx.body = result;
  181 + },
  182 + async count_report_index(ctx) {
  183 + await ctx.render('action/profile_count');
  184 + },
  185 + async count_report_json(ctx) {
  186 + const start = ctx.query.start;
  187 + const end = ctx.query.end;
  188 + const app = ctx.query.app;
  189 + const server = ctx.query.server || 'aws';
  190 + const lastTime = ctx.query.lastTime;
  191 +
  192 + const result = await profile_service.count(server, start, end, app, lastTime);
  193 + ctx.body = result;
  194 + },
95 async time_report_index(ctx) { 195 async time_report_index(ctx) {
96 await ctx.render('action/profile_time'); 196 await ctx.render('action/profile_time');
97 }, 197 },
@@ -99,10 +199,10 @@ const profile_controller = { @@ -99,10 +199,10 @@ const profile_controller = {
99 const start = ctx.query.start; 199 const start = ctx.query.start;
100 const end = ctx.query.end; 200 const end = ctx.query.end;
101 const app = ctx.query.app; 201 const app = ctx.query.app;
102 - const duration = ctx.query.duration;  
103 const server = ctx.query.server || 'aws'; 202 const server = ctx.query.server || 'aws';
  203 + const lastTime = ctx.query.lastTime;
104 204
105 - const result = await profile_service.time(server, start, end, app, duration); 205 + const result = await profile_service.time(server, start, end, app, lastTime);
106 ctx.body = result; 206 ctx.body = result;
107 }, 207 },
108 async error_report_index(ctx) { 208 async error_report_index(ctx) {
@@ -113,15 +213,23 @@ const profile_controller = { @@ -113,15 +213,23 @@ const profile_controller = {
113 const end = ctx.query.end; 213 const end = ctx.query.end;
114 const app = ctx.query.app; 214 const app = ctx.query.app;
115 const server = ctx.query.server || 'aws'; 215 const server = ctx.query.server || 'aws';
  216 + const lastTime = ctx.query.lastTime;
116 217
117 - const result = await profile_service.error(server, start, end, app); 218 + const result = await profile_service.error(server, start, end, app, lastTime);
118 ctx.body = result; 219 ctx.body = result;
119 } 220 }
120 221
121 }; 222 };
122 223
  224 +r.get('/mean', profile_controller.mean_report_index);
  225 +r.get('/mean.json', profile_controller.mean_report_json);
  226 +
  227 +r.get('/count', profile_controller.count_report_index);
  228 +r.get('/count.json', profile_controller.count_report_json);
  229 +
123 r.get('/time', profile_controller.time_report_index); 230 r.get('/time', profile_controller.time_report_index);
124 r.get('/time.json', profile_controller.time_report_json); 231 r.get('/time.json', profile_controller.time_report_json);
  232 +
125 r.get('/error', profile_controller.error_report_index); 233 r.get('/error', profile_controller.error_report_index);
126 r.get('/error.json', profile_controller.error_report_json); 234 r.get('/error.json', profile_controller.error_report_json);
127 235
@@ -9,6 +9,7 @@ class SqlBuilder { @@ -9,6 +9,7 @@ class SqlBuilder {
9 this._limit = null; 9 this._limit = null;
10 this._offset = null; 10 this._offset = null;
11 this._orderBy = null; 11 this._orderBy = null;
  12 + this._groupBy = null;
12 } 13 }
13 14
14 static of(table) { 15 static of(table) {
@@ -43,6 +44,10 @@ class SqlBuilder { @@ -43,6 +44,10 @@ class SqlBuilder {
43 } 44 }
44 } 45 }
45 46
  47 + timeWhere(value) {
  48 +
  49 + }
  50 +
46 orWhere(field, op, value) { 51 orWhere(field, op, value) {
47 this._orWhere.push({field, op, value}); 52 this._orWhere.push({field, op, value});
48 return this; 53 return this;
@@ -73,6 +78,19 @@ class SqlBuilder { @@ -73,6 +78,19 @@ class SqlBuilder {
73 return this.toString(); 78 return this.toString();
74 } 79 }
75 80
  81 + groupBy(field) {
  82 + this._groupBy = field;
  83 + return this;
  84 + }
  85 +
  86 + static raw(str) {
  87 + return {
  88 + toString() {
  89 + return str;
  90 + }
  91 + }
  92 + }
  93 +
76 toString() { 94 toString() {
77 let sql = `SELECT ${this._select.join(',')} FROM "${this._from}" `; 95 let sql = `SELECT ${this._select.join(',')} FROM "${this._from}" `;
78 96
@@ -93,12 +111,16 @@ class SqlBuilder { @@ -93,12 +111,16 @@ class SqlBuilder {
93 sql += `AND (${orWhere}) `; 111 sql += `AND (${orWhere}) `;
94 } else { 112 } else {
95 if (orWhere) { 113 if (orWhere) {
96 - sql += `WHERE ${orWhere}` 114 + sql += `WHERE ${orWhere}`;
97 } 115 }
98 } 116 }
99 117
100 if (this._orderBy) { 118 if (this._orderBy) {
101 - sql += `ORDER BY time ${this._orderBy.order} ` 119 + sql += `ORDER BY time ${this._orderBy.order} `;
  120 + }
  121 +
  122 + if (this._groupBy) {
  123 + sql += `GROUP BY ` + this._groupBy.map(f => `"${f}"`).join(',')
102 } 124 }
103 125
104 if (!_.isNil(this._limit)) { 126 if (!_.isNil(this._limit)) {
  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><a href="">性能监控</a></li>
  10 + <li>调用次数统计</li>
  11 + </ul>
  12 + <h4>调用次数统计</h4>
  13 + </div>
  14 + </div>
  15 + <!-- media -->
  16 +</div>
  17 +<!-- pageheader -->
  18 +
  19 +<div class="contentpanel page-servers">
  20 + <div class="panel panel-primary-head">
  21 + <div class="panel-heading" style="overflow: hidden">
  22 +
  23 + <div class="pull-left">
  24 + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;">
  25 + <option value="aws" selected>aws</option>
  26 + <option value="qcloud">qcloud</option>
  27 + </select>
  28 + </div>
  29 +
  30 + <div id="reportrange" class="pull-left"
  31 + style="display: inline-block; background: #fff; cursor: pointer; padding: 9px 10px; border: 1px solid #ccc; width: 250px; color: black; margin-left: 20px;">
  32 + <i class="glyphicon glyphicon-calendar fa fa-calendar"></i>&nbsp;
  33 + <span></span> <b class="caret"></b>
  34 + </div>
  35 +
  36 + <div class="pull-left">
  37 + <select id="selectedApp" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;">
  38 + <option value="default">全部</option>
  39 + <option value="pc">PC</option>
  40 + <option value="h5">H5</option>
  41 + </select>
  42 + </div>
  43 +
  44 + <div class="pull-left">
  45 + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button>
  46 + </div>
  47 + </div>
  48 + <!-- panel-heading -->
  49 +
  50 + <table id="table-servers" class="table table-striped table-bordered">
  51 + <thead class="">
  52 + <tr>
  53 + <td >接口名称</td>
  54 + <td >次数</td>
  55 + </thead>
  56 +
  57 + <tbody>
  58 + </tbody>
  59 + </table>
  60 + </div>
  61 + <!-- panel -->
  62 +</div>
  63 +
  64 +
  65 +<script>
  66 + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime;
  67 + var data_end_point = '/profile/count.json';
  68 + var dataTable = null;
  69 +
  70 + function ajaxUrl() {
  71 + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`;
  72 +
  73 + if (selectedEndTime && selectedEndTime) {
  74 + url += `&start=${selectedStarTime}&end=${selectedEndTime}`;
  75 + }
  76 +
  77 + if (lastTime) {
  78 + url += `&lastTime=${lastTime}`
  79 + }
  80 +
  81 + return url
  82 + }
  83 +
  84 + $(function() {
  85 + init();
  86 + initTable();
  87 + initDatePicker();
  88 + initSelect();
  89 + });
  90 +
  91 + function init() {
  92 + selectedServer = 'aws';
  93 + selectedApp = 'default';
  94 + }
  95 +
  96 + function initTable() {
  97 + dataTable = $("#table-servers").DataTable({
  98 + pageLength: 20,
  99 + retrieve: true,
  100 + searching: true,
  101 + dataSrc: 'data',
  102 + pageLength: 25,
  103 + columns: [
  104 + {data: 'route'},
  105 + {data: 'times'}
  106 + ],
  107 + data: [{
  108 + route: '',
  109 + times: ''
  110 + }],
  111 + order: [[ 1, "desc" ]]
  112 + });
  113 + }
  114 +
  115 + const TIME = {
  116 + '最近1分钟': '1m',
  117 + '最近30分钟': '30m',
  118 + '最近1小时': '1h',
  119 + '最近3小时': '3h',
  120 + '最近6小时': '6h',
  121 + '最近12小时': '12h'
  122 + };
  123 +
  124 + function initDatePicker() {
  125 + var start = selectedStarTime;
  126 + var end = selectedEndTime;
  127 + var first = '最近1分钟';
  128 +
  129 + $('#reportrange span').html(first);
  130 +
  131 + lastTime = TIME[first];
  132 +
  133 + function cb(start, end, label) {
  134 + if (label && label !== '自定义日期') {
  135 + $('#reportrange span').html(label);
  136 + lastTime = TIME[label];
  137 + } else if (label && label === '自定义日期'){
  138 + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD'));
  139 + selectedStarTime = start.format('YYYY-MM-DD');
  140 + selectedEndTime = end.format('YYYY-MM-DD');
  141 + lastTime = null
  142 + }
  143 + }
  144 +
  145 + $('#reportrange').daterangepicker({
  146 + startDate: start,
  147 + endDate: end,
  148 + timePicker: true,
  149 + timePicker24Hour: true,
  150 + dateLimit: {
  151 + days: 7
  152 + },
  153 + ranges: {
  154 + '最近1分钟': [moment().subtract(1, 'minutes'), moment()],
  155 + '最近30分钟': [moment().subtract(30, 'minutes'), moment()],
  156 + '最近1小时': [moment().subtract(1, 'hours'), moment()],
  157 + '最近3小时': [moment().subtract(3, 'hours'), moment()],
  158 + '最近6小时': [moment().subtract(6, 'hours'), moment()],
  159 + '最近12小时': [moment().subtract(12, 'hours'), moment()]
  160 + },
  161 + locale: {
  162 + format: "YYYY-MM-DD",
  163 + applyLabel: '确定',
  164 + cancelLabel: '取消',
  165 + weekLabel: 'W',
  166 + customRangeLabel: '自定义日期',
  167 + daysOfWeek: '一_二_三_四_五_六_日'.split('_'),
  168 + monthNames: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
  169 + firstDay: 1
  170 + },
  171 + }, cb);
  172 +
  173 + cb(start, end);
  174 + }
  175 +
  176 + function initSelect() {
  177 + $('#selectedServer').change(function() {
  178 + selectedServer = $('#selectedServer').val();
  179 + });
  180 +
  181 + $('#selectedApp').change(function() {
  182 + selectedApp = $('#selectedApp').val();
  183 + });
  184 +
  185 + $('#search').on('click', () => {
  186 + _handleChanged();
  187 + })
  188 + }
  189 +
  190 + function _handleChanged() {
  191 + dataTable && dataTable.ajax.url(ajaxUrl()).load();
  192 + }
  193 +
  194 +</script>
@@ -21,7 +21,8 @@ @@ -21,7 +21,8 @@
21 <div class="panel-heading" style="overflow: hidden"> 21 <div class="panel-heading" style="overflow: hidden">
22 22
23 <div class="pull-left"> 23 <div class="pull-left">
24 - <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> 24 + <select id="selectedServer" class="selectpicker show-menu-arrow form-control"
  25 + style="margin-left: 10px;">
25 <option value="aws" selected>aws</option> 26 <option value="aws" selected>aws</option>
26 <option value="qcloud">qcloud</option> 27 <option value="qcloud">qcloud</option>
27 </select> 28 </select>
@@ -40,6 +41,10 @@ @@ -40,6 +41,10 @@
40 <option value="h5">H5</option> 41 <option value="h5">H5</option>
41 </select> 42 </select>
42 </div> 43 </div>
  44 +
  45 + <div class="pull-left">
  46 + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button>
  47 + </div>
43 </div> 48 </div>
44 <!-- panel-heading --> 49 <!-- panel-heading -->
45 50
@@ -70,22 +75,22 @@ @@ -70,22 +75,22 @@
70 75
71 76
72 <script> 77 <script>
73 - var selectedServer, selectedStarTime, selectedEndTime, selectedApp; 78 + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime;
74 var data_end_point = '/profile/error.json'; 79 var data_end_point = '/profile/error.json';
75 var dataTable = null; 80 var dataTable = null;
76 - var handleChanged = skipOnce(_handleChanged);  
77 81
78 function ajaxUrl() { 82 function ajaxUrl() {
79 - return `${data_end_point}?start=${selectedStarTime.format('YYYY-MM-DD')}&end=${selectedEndTime.format('YYYY-MM-DD')}&app=${selectedApp}&server=${selectedServer}`  
80 - } 83 + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`;
81 84
82 - function skipOnce(fn) {  
83 - var count = 0; 85 + if (selectedEndTime && selectedEndTime) {
  86 + url += `&start=${selectedStarTime}&end=${selectedEndTime}`;
  87 + }
84 88
85 - return function() {  
86 - if (count++ >= 1) fn.apply(null, arguments);  
87 - return null 89 + if (lastTime) {
  90 + url += `&lastTime=${lastTime}`
88 } 91 }
  92 +
  93 + return url
89 } 94 }
90 95
91 $(function() { 96 $(function() {
@@ -97,8 +102,6 @@ @@ -97,8 +102,6 @@
97 102
98 function init() { 103 function init() {
99 selectedServer = 'aws'; 104 selectedServer = 'aws';
100 - selectedStarTime = moment();  
101 - selectedEndTime = moment().add(1, 'days');  
102 selectedApp = 'default'; 105 selectedApp = 'default';
103 } 106 }
104 107
@@ -113,61 +116,91 @@ @@ -113,61 +116,91 @@
113 pageLength: 25, 116 pageLength: 25,
114 deferLoading: 0, 117 deferLoading: 0,
115 columns: [ 118 columns: [
116 - { data: 'time' },  
117 - { data: 'app' },  
118 - { data: 'type' },  
119 - { data: 'reqID' },  
120 - { data: 'uid' },  
121 - { data: 'udid' },  
122 - { data: 'code' },  
123 - { data: 'message' },  
124 - { data: 'script' },  
125 - { data: 'line' },  
126 - { data: 'column' },  
127 - { data: 'stack' } 119 + {data: 'time'},
  120 + {data: 'app'},
  121 + {data: 'type'},
  122 + {data: 'reqID'},
  123 + {data: 'uid'},
  124 + {data: 'udid'},
  125 + {data: 'code'},
  126 + {data: 'message'},
  127 + {data: 'script'},
  128 + {data: 'line'},
  129 + {data: 'column'},
  130 + {data: 'stack'}
128 ], 131 ],
  132 + data: [{
  133 + time: "",
  134 + app: "",
  135 + type: "",
  136 + reqID: "",
  137 + uid: "",
  138 + udid: "",
  139 + code: "",
  140 + message: "",
  141 + script: "",
  142 + line: "",
  143 + column: "",
  144 + stack: ""
  145 + }],
129 columnDefs: [ 146 columnDefs: [
130 { 147 {
131 - render: function ( data, type, row ) { 148 + render: function(data, type, row) {
132 return moment(data).format('YYYY/MM/DD HH:MM:ss'); 149 return moment(data).format('YYYY/MM/DD HH:MM:ss');
133 }, 150 },
134 targets: 0 151 targets: 0
135 } 152 }
136 ], 153 ],
137 - order: [[ 0, "desc" ]] 154 + order: [[0, "desc"]]
138 }); 155 });
139 } 156 }
140 157
  158 + const TIME = {
  159 + '最近1分钟': '1m',
  160 + '最近30分钟': '30m',
  161 + '最近1小时': '1h',
  162 + '最近3小时': '3h',
  163 + '最近6小时': '6h',
  164 + '最近12小时': '12h'
  165 + };
  166 +
141 function initDatePicker() { 167 function initDatePicker() {
142 var start = selectedStarTime; 168 var start = selectedStarTime;
143 var end = selectedEndTime; 169 var end = selectedEndTime;
  170 + var first = '最近1分钟';
144 171
  172 + $('#reportrange span').html(first);
145 173
146 - $('#reportrange span').html('今天'); 174 + lastTime = TIME[first];
147 175
148 function cb(start, end, label) { 176 function cb(start, end, label) {
149 - if (label !== '自定义日期') { 177 + if (label && label !== '自定义日期') {
150 $('#reportrange span').html(label); 178 $('#reportrange span').html(label);
151 - } else {  
152 - $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')) 179 + lastTime = TIME[label];
  180 + } else if (label && label === '自定义日期'){
  181 + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD'));
  182 + selectedStarTime = start.format('YYYY-MM-DD');
  183 + selectedEndTime = end.format('YYYY-MM-DD');
  184 + lastTime = null
153 } 185 }
154 186
155 - selectedStarTime = start;  
156 - selectedEndTime = end;  
157 -  
158 - handleChanged();  
159 } 187 }
160 188
161 $('#reportrange').daterangepicker({ 189 $('#reportrange').daterangepicker({
162 startDate: start, 190 startDate: start,
163 endDate: end, 191 endDate: end,
  192 + timePicker: true,
  193 + timePicker24Hour: true,
  194 + dateLimit: {
  195 + days: 7
  196 + },
164 ranges: { 197 ranges: {
165 - '今天': [moment(), moment().add(1, 'days')],  
166 - '昨天': [moment().subtract(1, 'days'), moment()],  
167 - '最近 7 天': [moment().subtract(6, 'days'), moment().add(1, 'days')],  
168 - '最近 30 天': [moment().subtract(29, 'days'), moment().add(1, 'days')],  
169 - '本月': [moment().startOf('month'), moment().endOf('month')],  
170 - '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] 198 + '最近1分钟': [moment().subtract(1, 'minutes'), moment()],
  199 + '最近30分钟': [moment().subtract(30, 'minutes'), moment()],
  200 + '最近1小时': [moment().subtract(1, 'hours'), moment()],
  201 + '最近3小时': [moment().subtract(3, 'hours'), moment()],
  202 + '最近6小时': [moment().subtract(6, 'hours'), moment()],
  203 + '最近12小时': [moment().subtract(12, 'hours'), moment()]
171 }, 204 },
172 locale: { 205 locale: {
173 format: "YYYY-MM-DD", 206 format: "YYYY-MM-DD",
@@ -186,14 +219,16 @@ @@ -186,14 +219,16 @@
186 219
187 function initSelect() { 220 function initSelect() {
188 $('#selectedServer').change(function() { 221 $('#selectedServer').change(function() {
189 - selectedApp = $('#selectedServer').val();  
190 - handleChanged(); 222 + selectedServer = $('#selectedServer').val();
191 }); 223 });
192 224
193 $('#selectedApp').change(function() { 225 $('#selectedApp').change(function() {
194 selectedApp = $('#selectedApp').val(); 226 selectedApp = $('#selectedApp').val();
195 - handleChanged();  
196 }); 227 });
  228 +
  229 + $('#search').on('click', function() {
  230 + _handleChanged();
  231 + })
197 } 232 }
198 233
199 function _handleChanged() { 234 function _handleChanged() {
  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><a href="">性能监控</a></li>
  10 + <li>调用时间统计</li>
  11 + </ul>
  12 + <h4>调用时间统计</h4>
  13 + </div>
  14 + </div>
  15 + <!-- media -->
  16 +</div>
  17 +<!-- pageheader -->
  18 +
  19 +<div class="contentpanel page-servers">
  20 + <div class="panel panel-primary-head">
  21 + <div class="panel-heading" style="overflow: hidden">
  22 +
  23 + <div class="pull-left">
  24 + <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;">
  25 + <option value="aws" selected>aws</option>
  26 + <option value="qcloud">qcloud</option>
  27 + </select>
  28 + </div>
  29 +
  30 + <div id="reportrange" class="pull-left"
  31 + style="display: inline-block; background: #fff; cursor: pointer; padding: 9px 10px; border: 1px solid #ccc; width: 250px; color: black; margin-left: 20px;">
  32 + <i class="glyphicon glyphicon-calendar fa fa-calendar"></i>&nbsp;
  33 + <span></span> <b class="caret"></b>
  34 + </div>
  35 +
  36 + <div class="pull-left">
  37 + <select id="selectedApp" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;">
  38 + <option value="default">全部</option>
  39 + <option value="pc">PC</option>
  40 + <option value="h5">H5</option>
  41 + </select>
  42 + </div>
  43 +
  44 + <div class="pull-left">
  45 + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button>
  46 + </div>
  47 + </div>
  48 + <!-- panel-heading -->
  49 +
  50 + <table id="table-servers" class="table table-striped table-bordered">
  51 + <thead class="">
  52 + <tr>
  53 + <td >接口名称</td>
  54 + <td >耗时</td>
  55 + </thead>
  56 +
  57 + <tbody>
  58 + </tbody>
  59 + </table>
  60 + </div>
  61 + <!-- panel -->
  62 +</div>
  63 +
  64 +
  65 +<script>
  66 + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime;
  67 + var data_end_point = '/profile/mean.json';
  68 + var dataTable = null;
  69 +
  70 + function ajaxUrl() {
  71 + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`;
  72 +
  73 + if (selectedEndTime && selectedEndTime) {
  74 + url += `&start=${selectedStarTime}&end=${selectedEndTime}`;
  75 + }
  76 +
  77 + if (lastTime) {
  78 + url += `&lastTime=${lastTime}`
  79 + }
  80 +
  81 + return url
  82 + }
  83 +
  84 + $(function() {
  85 + init();
  86 + initTable();
  87 + initDatePicker();
  88 + initSelect();
  89 + });
  90 +
  91 + function init() {
  92 + selectedServer = 'aws';
  93 + selectedApp = 'default';
  94 + }
  95 +
  96 + function initTable() {
  97 + dataTable = $("#table-servers").DataTable({
  98 + pageLength: 20,
  99 + retrieve: true,
  100 + searching: true,
  101 + dataSrc: 'data',
  102 + pageLength: 25,
  103 + columns: [
  104 + {data: 'route'},
  105 + {data: 'mean'}
  106 + ],
  107 + data: [{
  108 + route: '',
  109 + mean: ''
  110 + }],
  111 + order: [[ 1, "desc" ]]
  112 + });
  113 + }
  114 +
  115 + const TIME = {
  116 + '最近1分钟': '1m',
  117 + '最近30分钟': '30m',
  118 + '最近1小时': '1h',
  119 + '最近3小时': '3h',
  120 + '最近6小时': '6h',
  121 + '最近12小时': '12h'
  122 + };
  123 +
  124 + function initDatePicker() {
  125 + var start = selectedStarTime;
  126 + var end = selectedEndTime;
  127 + var first = '最近1分钟';
  128 +
  129 + $('#reportrange span').html(first);
  130 +
  131 + lastTime = TIME[first];
  132 +
  133 + function cb(start, end, label) {
  134 + if (label && label !== '自定义日期') {
  135 + $('#reportrange span').html(label);
  136 + lastTime = TIME[label];
  137 + } else if (label && label === '自定义日期'){
  138 + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD'));
  139 + selectedStarTime = start.format('YYYY-MM-DD');
  140 + selectedEndTime = end.format('YYYY-MM-DD');
  141 + lastTime = null
  142 + }
  143 +
  144 + }
  145 +
  146 + $('#reportrange').daterangepicker({
  147 + startDate: start,
  148 + endDate: end,
  149 + timePicker: true,
  150 + timePicker24Hour: true,
  151 + dateLimit: {
  152 + days: 7
  153 + },
  154 + ranges: {
  155 + '最近1分钟': [moment().subtract(1, 'minutes'), moment()],
  156 + '最近30分钟': [moment().subtract(30, 'minutes'), moment()],
  157 + '最近1小时': [moment().subtract(1, 'hours'), moment()],
  158 + '最近3小时': [moment().subtract(3, 'hours'), moment()],
  159 + '最近6小时': [moment().subtract(6, 'hours'), moment()],
  160 + '最近12小时': [moment().subtract(12, 'hours'), moment()]
  161 + },
  162 + locale: {
  163 + format: "YYYY-MM-DD",
  164 + applyLabel: '确定',
  165 + cancelLabel: '取消',
  166 + weekLabel: 'W',
  167 + customRangeLabel: '自定义日期',
  168 + daysOfWeek: '一_二_三_四_五_六_日'.split('_'),
  169 + monthNames: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
  170 + firstDay: 1
  171 + },
  172 + }, cb);
  173 +
  174 + cb(start, end);
  175 + }
  176 +
  177 + function initSelect() {
  178 + $('#selectedServer').change(function() {
  179 + selectedServer = $('#selectedServer').val();
  180 + });
  181 +
  182 + $('#selectedApp').change(function() {
  183 + selectedApp = $('#selectedApp').val();
  184 + });
  185 +
  186 + $('#search').on('click', () => {
  187 + _handleChanged();
  188 + })
  189 + }
  190 +
  191 + function _handleChanged() {
  192 + dataTable && dataTable.ajax.url(ajaxUrl()).load();
  193 + }
  194 +
  195 +</script>
@@ -21,7 +21,8 @@ @@ -21,7 +21,8 @@
21 <div class="panel-heading" style="overflow: hidden"> 21 <div class="panel-heading" style="overflow: hidden">
22 22
23 <div class="pull-left"> 23 <div class="pull-left">
24 - <select id="selectedServer" class="selectpicker show-menu-arrow form-control" style="margin-left: 10px;"> 24 + <select id="selectedServer" class="selectpicker show-menu-arrow form-control"
  25 + style="margin-left: 10px;">
25 <option value="aws" selected>aws</option> 26 <option value="aws" selected>aws</option>
26 <option value="qcloud">qcloud</option> 27 <option value="qcloud">qcloud</option>
27 </select> 28 </select>
@@ -42,12 +43,7 @@ @@ -42,12 +43,7 @@
42 </div> 43 </div>
43 44
44 <div class="pull-left"> 45 <div class="pull-left">
45 - <select id="selectedDuration" class="selectpicker show-menu-arrow form-control" style="margin-left: 20px;">  
46 - <option value="0">全部</option>  
47 - <option value="1">小于100</option>  
48 - <option value="2">大于100小于200</option>  
49 - <option value="3">大于200</option>  
50 - </select> 46 + <button id="search" class="btn btn-info" style="margin-left: 20px;">查询</button>
51 </div> 47 </div>
52 </div> 48 </div>
53 <!-- panel-heading --> 49 <!-- panel-heading -->
@@ -63,7 +59,8 @@ @@ -63,7 +59,8 @@
63 <td>耗时</td> 59 <td>耗时</td>
64 <th>请求ID</th> 60 <th>请求ID</th>
65 <td>用户ID</td> 61 <td>用户ID</td>
66 - <td>访客ID</td></tr> 62 + <td>访客ID</td>
  63 + </tr>
67 </thead> 64 </thead>
68 65
69 <tbody> 66 <tbody>
@@ -75,24 +72,23 @@ @@ -75,24 +72,23 @@
75 72
76 73
77 <script> 74 <script>
78 - var selectedServer, selectedStarTime, selectedEndTime, selectedApp, selectedDuration; 75 + var selectedServer, selectedStarTime, selectedEndTime, selectedApp, lastTime;
79 var data_end_point = '/profile/time.json'; 76 var data_end_point = '/profile/time.json';
80 var dataTable = null; 77 var dataTable = null;
81 - var handleChanged = skipOnce(_handleChanged);  
82 78
83 function ajaxUrl() { 79 function ajaxUrl() {
84 - return `${data_end_point}?start=${selectedStarTime.format('YYYY-MM-DD')}&end=${selectedEndTime.format('YYYY-MM-DD')}&app=${selectedApp}&duration=${selectedDuration}&server=${selectedServer}`  
85 - }  
86 -  
87 - function skipOnce(fn) {  
88 - var count = 0; 80 + let url = `${data_end_point}?app=${selectedApp}&server=${selectedServer}`;
89 81
90 - return function() {  
91 - if (count++ >= 1) fn.apply(null, arguments);  
92 - return null 82 + if (selectedEndTime && selectedEndTime) {
  83 + url += `&start=${selectedStarTime}&end=${selectedEndTime}`;
93 } 84 }
  85 +
  86 + if (lastTime) {
  87 + url += `&lastTime=${lastTime}`
94 } 88 }
95 89
  90 + return url
  91 + }
96 92
97 $(function() { 93 $(function() {
98 init(); 94 init();
@@ -106,7 +102,6 @@ @@ -106,7 +102,6 @@
106 selectedStarTime = moment(); 102 selectedStarTime = moment();
107 selectedEndTime = moment().add(1, 'days'); 103 selectedEndTime = moment().add(1, 'days');
108 selectedApp = 'default'; 104 selectedApp = 'default';
109 - selectedDuration = 0;  
110 } 105 }
111 106
112 function initTable() { 107 function initTable() {
@@ -115,7 +110,6 @@ @@ -115,7 +110,6 @@
115 retrieve: true, 110 retrieve: true,
116 responsive: true, 111 responsive: true,
117 searching: true, 112 searching: true,
118 - ajax: ajaxUrl(),  
119 dataSrc: 'data', 113 dataSrc: 'data',
120 pageLength: 25, 114 pageLength: 25,
121 deferLoading: 0, 115 deferLoading: 0,
@@ -130,48 +124,75 @@ @@ -130,48 +124,75 @@
130 {data: "uid"}, 124 {data: "uid"},
131 {data: "udid"} 125 {data: "udid"}
132 ], 126 ],
  127 + data: [{
  128 + time: "",
  129 + app: "",
  130 + type: "",
  131 + api: "",
  132 + route: "",
  133 + duration: "",
  134 + reqID: "",
  135 + uid: "",
  136 + udid: ""
  137 + }],
133 columnDefs: [ 138 columnDefs: [
134 { 139 {
135 - render: function ( data, type, row ) { 140 + render: function(data, type, row) {
136 return moment(data).format('YYYY/MM/DD HH:MM:ss'); 141 return moment(data).format('YYYY/MM/DD HH:MM:ss');
137 }, 142 },
138 targets: 0 143 targets: 0
139 } 144 }
140 ], 145 ],
141 - order: [[ 0, "desc" ]] 146 + order: [[0, "desc"]]
142 }); 147 });
143 } 148 }
144 149
  150 + const TIME = {
  151 + '最近1分钟': '1m',
  152 + '最近30分钟': '30m',
  153 + '最近1小时': '1h',
  154 + '最近3小时': '3h',
  155 + '最近6小时': '6h',
  156 + '最近12小时': '12h'
  157 + };
  158 +
145 function initDatePicker() { 159 function initDatePicker() {
146 var start = selectedStarTime; 160 var start = selectedStarTime;
147 var end = selectedEndTime; 161 var end = selectedEndTime;
  162 + var first = '最近1分钟';
148 163
  164 + $('#reportrange span').html(first);
149 165
150 - $('#reportrange span').html('今天'); 166 + lastTime = TIME[first];
151 167
152 function cb(start, end, label) { 168 function cb(start, end, label) {
153 - if (label !== '自定义日期') { 169 + if (label && label !== '自定义日期') {
154 $('#reportrange span').html(label); 170 $('#reportrange span').html(label);
155 - } else {  
156 - $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD')) 171 + lastTime = TIME[label];
  172 + } else if (label && label === '自定义日期') {
  173 + $('#reportrange span').html(start.format('YYYY-MM-DD') + ' 至 ' + end.format('YYYY-MM-DD'));
  174 + selectedStarTime = start.format('YYYY-MM-DD');
  175 + selectedEndTime = end.format('YYYY-MM-DD');
  176 + lastTime = null
157 } 177 }
158 178
159 - selectedStarTime = start;  
160 - selectedEndTime = end;  
161 -  
162 - handleChanged();  
163 } 179 }
164 180
165 $('#reportrange').daterangepicker({ 181 $('#reportrange').daterangepicker({
166 startDate: start, 182 startDate: start,
167 endDate: end, 183 endDate: end,
  184 + timePicker: true,
  185 + timePicker24Hour: true,
  186 + dateLimit: {
  187 + days: 7
  188 + },
168 ranges: { 189 ranges: {
169 - '今天': [moment(), moment().add(1, 'days')],  
170 - '昨天': [moment().subtract(1, 'days'), moment()],  
171 - '最近 7 天': [moment().subtract(6, 'days'), moment().add(1, 'days')],  
172 - '最近 30 天': [moment().subtract(29, 'days'), moment().add(1, 'days')],  
173 - '本月': [moment().startOf('month'), moment().endOf('month')],  
174 - '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] 190 + '最近1分钟': [moment().subtract(1, 'minutes'), moment()],
  191 + '最近30分钟': [moment().subtract(30, 'minutes'), moment()],
  192 + '最近1小时': [moment().subtract(1, 'hours'), moment()],
  193 + '最近3小时': [moment().subtract(3, 'hours'), moment()],
  194 + '最近6小时': [moment().subtract(6, 'hours'), moment()],
  195 + '最近12小时': [moment().subtract(12, 'hours'), moment()]
175 }, 196 },
176 locale: { 197 locale: {
177 format: "YYYY-MM-DD", 198 format: "YYYY-MM-DD",
@@ -191,18 +212,15 @@ @@ -191,18 +212,15 @@
191 function initSelect() { 212 function initSelect() {
192 $('#selectedServer').change(function() { 213 $('#selectedServer').change(function() {
193 selectedServer = $('#selectedServer').val(); 214 selectedServer = $('#selectedServer').val();
194 - handleChanged();  
195 }); 215 });
196 216
197 $('#selectedApp').change(function() { 217 $('#selectedApp').change(function() {
198 selectedApp = $('#selectedApp').val(); 218 selectedApp = $('#selectedApp').val();
199 - handleChanged();  
200 }); 219 });
201 220
202 - $('#selectedDuration').change(function() {  
203 - selectedDuration = $('#selectedDuration').val();  
204 - handleChanged();  
205 - }); 221 + $('#search').on('click', () => {
  222 + _handleChanged();
  223 + })
206 } 224 }
207 225
208 function _handleChanged() { 226 function _handleChanged() {
@@ -75,10 +75,12 @@ @@ -75,10 +75,12 @@
75 </ul> 75 </ul>
76 </li> 76 </li>
77 77
78 - <li class="parent"><a><i class="fa fa-list"></i> <span>性能分析</span></a> 78 + <li class="parent"><a><i class="fa fa-list"></i> <span>性能统计</span></a>
79 <ul class="children"> 79 <ul class="children">
80 - <li><a href="/profile/time"> <span>耗时</span></a></li>  
81 - <li><a href="/profile/error"> <span>错误</span></a></li> 80 + <li><a href="/profile/mean"> <span>调用时间统计</span></a></li>
  81 + <li><a href="/profile/count"> <span>调用次数统计</span></a></li>
  82 + <li><a href="/profile/time"> <span>调用时间统计</span></a></li>
  83 + <li><a href="/profile/error"> <span>错误信息统计</span></a></li>
82 </ul> 84 </ul>
83 </li> 85 </li>
84 {{/if}} 86 {{/if}}
@@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
25 "author": "jiangfeng <jeff.jiang@yoho.cn>", 25 "author": "jiangfeng <jeff.jiang@yoho.cn>",
26 "license": "ISC", 26 "license": "ISC",
27 "dependencies": { 27 "dependencies": {
  28 + "alasql": "^0.4.3",
28 "bluebird": "^3.5.0", 29 "bluebird": "^3.5.0",
29 "co": "^4.6.0", 30 "co": "^4.6.0",
30 "co-body": "^4.2.0", 31 "co-body": "^4.2.0",
@@ -29,6 +29,13 @@ adler-32@: @@ -29,6 +29,13 @@ adler-32@:
29 exit-on-epipe "" 29 exit-on-epipe ""
30 printj "" 30 printj ""
31 31
  32 +adler-32@~1.1.0:
  33 + version "1.1.0"
  34 + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.1.0.tgz#03551a5c7f0edfbd4fc8fa12a6814978eab651c3"
  35 + dependencies:
  36 + exit-on-epipe "~1.0.1"
  37 + printj "~1.1.0"
  38 +
32 after@0.8.1: 39 after@0.8.1:
33 version "0.8.1" 40 version "0.8.1"
34 resolved "http://registry.npm.taobao.org/after/download/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" 41 resolved "http://registry.npm.taobao.org/after/download/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627"
@@ -53,6 +60,17 @@ ajv@^5.1.0: @@ -53,6 +60,17 @@ ajv@^5.1.0:
53 json-schema-traverse "^0.3.0" 60 json-schema-traverse "^0.3.0"
54 json-stable-stringify "^1.0.1" 61 json-stable-stringify "^1.0.1"
55 62
  63 +alasql@^0.4.3:
  64 + version "0.4.3"
  65 + resolved "https://registry.yarnpkg.com/alasql/-/alasql-0.4.3.tgz#46f2c3552be7b5c3ff1c01e5e5ae3706bbe075cb"
  66 + dependencies:
  67 + dom-storage "^2.0.1"
  68 + es6-promise "^4.0.5"
  69 + lodash "^4.17.4"
  70 + request "2.79.0"
  71 + xlsx "^0.11.5"
  72 + yargs "^5.0.0"
  73 +
56 align-text@^0.1.1, align-text@^0.1.3: 74 align-text@^0.1.1, align-text@^0.1.3:
57 version "0.1.4" 75 version "0.1.4"
58 resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 76 resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -362,6 +380,10 @@ camelcase@^1.0.2: @@ -362,6 +380,10 @@ camelcase@^1.0.2:
362 version "1.2.1" 380 version "1.2.1"
363 resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 381 resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
364 382
  383 +camelcase@^3.0.0:
  384 + version "3.0.0"
  385 + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
  386 +
365 camelcase@^4.0.0: 387 camelcase@^4.0.0:
366 version "4.1.0" 388 version "4.1.0"
367 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 389 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
@@ -391,6 +413,13 @@ cfb@>=0.10.0: @@ -391,6 +413,13 @@ cfb@>=0.10.0:
391 dependencies: 413 dependencies:
392 commander "" 414 commander ""
393 415
  416 +cfb@~0.13.1:
  417 + version "0.13.1"
  418 + resolved "https://registry.yarnpkg.com/cfb/-/cfb-0.13.1.tgz#6506e0ab9b6846be7ef25c758932fe16f64c9c71"
  419 + dependencies:
  420 + commander "~2.11.0"
  421 + printj "~1.1.0"
  422 +
394 chalk@^1.0.0, chalk@^1.1.1: 423 chalk@^1.0.0, chalk@^1.1.1:
395 version "1.1.3" 424 version "1.1.3"
396 resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 425 resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -444,6 +473,14 @@ cliui@^2.1.0: @@ -444,6 +473,14 @@ cliui@^2.1.0:
444 right-align "^0.1.1" 473 right-align "^0.1.1"
445 wordwrap "0.0.2" 474 wordwrap "0.0.2"
446 475
  476 +cliui@^3.2.0:
  477 + version "3.2.0"
  478 + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
  479 + dependencies:
  480 + string-width "^1.0.1"
  481 + strip-ansi "^3.0.1"
  482 + wrap-ansi "^2.0.0"
  483 +
447 clone@^1.0.2: 484 clone@^1.0.2:
448 version "1.0.2" 485 version "1.0.2"
449 resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 486 resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
@@ -472,6 +509,14 @@ code-point-at@^1.0.0: @@ -472,6 +509,14 @@ code-point-at@^1.0.0:
472 version "1.1.0" 509 version "1.1.0"
473 resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 510 resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
474 511
  512 +codepage@~1.11.0:
  513 + version "1.11.0"
  514 + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.11.0.tgz#1076095b9f03b5ca04f43873fa1a627742285de2"
  515 + dependencies:
  516 + commander "~2.11.0"
  517 + exit-on-epipe "~1.0.1"
  518 + voc "~1.0.0"
  519 +
475 codepage@~1.3.6: 520 codepage@~1.3.6:
476 version "1.3.8" 521 version "1.3.8"
477 resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.3.8.tgz#4f2e5d7c0975de28f88498058dcb5afcab6a5f71" 522 resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.3.8.tgz#4f2e5d7c0975de28f88498058dcb5afcab6a5f71"
@@ -513,6 +558,10 @@ commander@, commander@^2.9.0: @@ -513,6 +558,10 @@ commander@, commander@^2.9.0:
513 dependencies: 558 dependencies:
514 graceful-readlink ">= 1.0.0" 559 graceful-readlink ">= 1.0.0"
515 560
  561 +commander@~2.11.0:
  562 + version "2.11.0"
  563 + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
  564 +
516 component-bind@1.0.0: 565 component-bind@1.0.0:
517 version "1.0.0" 566 version "1.0.0"
518 resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 567 resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
@@ -606,6 +655,13 @@ crc-32@: @@ -606,6 +655,13 @@ crc-32@:
606 exit-on-epipe "" 655 exit-on-epipe ""
607 printj "" 656 printj ""
608 657
  658 +crc-32@~1.1.1:
  659 + version "1.1.1"
  660 + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.1.1.tgz#5d739d5e4c6e352ad8304d73223d483fe55adb8d"
  661 + dependencies:
  662 + exit-on-epipe "~1.0.1"
  663 + printj "~1.1.0"
  664 +
609 create-error-class@^3.0.0: 665 create-error-class@^3.0.0:
610 version "3.0.2" 666 version "3.0.2"
611 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 667 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@@ -691,7 +747,7 @@ debuglog@^1.0.1: @@ -691,7 +747,7 @@ debuglog@^1.0.1:
691 version "1.0.1" 747 version "1.0.1"
692 resolved "http://registry.npm.taobao.org/debuglog/download/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" 748 resolved "http://registry.npm.taobao.org/debuglog/download/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
693 749
694 -decamelize@^1.0.0: 750 +decamelize@^1.0.0, decamelize@^1.1.1:
695 version "1.2.0" 751 version "1.2.0"
696 resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 752 resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
697 753
@@ -755,6 +811,10 @@ digest-header@^0.0.1: @@ -755,6 +811,10 @@ digest-header@^0.0.1:
755 dependencies: 811 dependencies:
756 utility "0.1.11" 812 utility "0.1.11"
757 813
  814 +dom-storage@^2.0.1:
  815 + version "2.0.2"
  816 + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.0.2.tgz#ed17cbf68abd10e0aef8182713e297c5e4b500b0"
  817 +
758 dot-prop@^4.1.0: 818 dot-prop@^4.1.0:
759 version "4.2.0" 819 version "4.2.0"
760 resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 820 resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
@@ -829,6 +889,12 @@ engine.io@1.7.2: @@ -829,6 +889,12 @@ engine.io@1.7.2:
829 engine.io-parser "1.3.1" 889 engine.io-parser "1.3.1"
830 ws "1.1.1" 890 ws "1.1.1"
831 891
  892 +error-ex@^1.2.0:
  893 + version "1.3.1"
  894 + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
  895 + dependencies:
  896 + is-arrayish "^0.2.1"
  897 +
832 error-inject@~1.0.0: 898 error-inject@~1.0.0:
833 version "1.0.0" 899 version "1.0.0"
834 resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 900 resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
@@ -878,6 +944,10 @@ es6-promise@^3.3.1: @@ -878,6 +944,10 @@ es6-promise@^3.3.1:
878 version "3.3.1" 944 version "3.3.1"
879 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 945 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
880 946
  947 +es6-promise@^4.0.5:
  948 + version "4.1.1"
  949 + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a"
  950 +
881 es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1: 951 es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1:
882 version "3.1.0" 952 version "3.1.0"
883 resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 953 resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa"
@@ -933,6 +1003,10 @@ exit-on-epipe@: @@ -933,6 +1003,10 @@ exit-on-epipe@:
933 version "0.1.0" 1003 version "0.1.0"
934 resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-0.1.0.tgz#aa2f0155b78b34fe60dd2b462e84637ba5ed0697" 1004 resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-0.1.0.tgz#aa2f0155b78b34fe60dd2b462e84637ba5ed0697"
935 1005
  1006 +exit-on-epipe@~1.0.1:
  1007 + version "1.0.1"
  1008 + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
  1009 +
936 expand-brackets@^0.1.4: 1010 expand-brackets@^0.1.4:
937 version "0.1.5" 1011 version "0.1.5"
938 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1012 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -994,6 +1068,13 @@ fill-range@^2.1.0: @@ -994,6 +1068,13 @@ fill-range@^2.1.0:
994 repeat-element "^1.1.2" 1068 repeat-element "^1.1.2"
995 repeat-string "^1.5.2" 1069 repeat-string "^1.5.2"
996 1070
  1071 +find-up@^1.0.0:
  1072 + version "1.1.2"
  1073 + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
  1074 + dependencies:
  1075 + path-exists "^2.0.0"
  1076 + pinkie-promise "^2.0.0"
  1077 +
997 for-each@~0.3.2: 1078 for-each@~0.3.2:
998 version "0.3.2" 1079 version "0.3.2"
999 resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" 1080 resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4"
@@ -1063,6 +1144,12 @@ frac@0.3.1: @@ -1063,6 +1144,12 @@ frac@0.3.1:
1063 version "0.3.1" 1144 version "0.3.1"
1064 resolved "http://registry.npm.taobao.org/frac/download/frac-0.3.1.tgz#577677b7fdcbe6faf7c461f1801d34137cda4354" 1145 resolved "http://registry.npm.taobao.org/frac/download/frac-0.3.1.tgz#577677b7fdcbe6faf7c461f1801d34137cda4354"
1065 1146
  1147 +frac@~1.1.0:
  1148 + version "1.1.0"
  1149 + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.0.tgz#dc437e9c6a646b60b127d82ac4902464445cc1e3"
  1150 + dependencies:
  1151 + voc "~1.0.0"
  1152 +
1066 fresh@^0.3.0: 1153 fresh@^0.3.0:
1067 version "0.3.0" 1154 version "0.3.0"
1068 resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" 1155 resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
@@ -1192,6 +1279,10 @@ generate-object-property@^1.1.0: @@ -1192,6 +1279,10 @@ generate-object-property@^1.1.0:
1192 dependencies: 1279 dependencies:
1193 is-property "^1.0.0" 1280 is-property "^1.0.0"
1194 1281
  1282 +get-caller-file@^1.0.1:
  1283 + version "1.0.2"
  1284 + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
  1285 +
1195 get-stream@^3.0.0: 1286 get-stream@^3.0.0:
1196 version "3.0.0" 1287 version "3.0.0"
1197 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 1288 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -1523,6 +1614,14 @@ interpret@^1.0.0: @@ -1523,6 +1614,14 @@ interpret@^1.0.0:
1523 version "1.0.1" 1614 version "1.0.1"
1524 resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 1615 resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c"
1525 1616
  1617 +invert-kv@^1.0.0:
  1618 + version "1.0.0"
  1619 + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
  1620 +
  1621 +is-arrayish@^0.2.1:
  1622 + version "0.2.1"
  1623 + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
  1624 +
1526 is-binary-path@^1.0.0: 1625 is-binary-path@^1.0.0:
1527 version "1.0.1" 1626 version "1.0.1"
1528 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1627 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@@ -1666,6 +1765,10 @@ is-typedarray@~1.0.0: @@ -1666,6 +1765,10 @@ is-typedarray@~1.0.0:
1666 version "1.0.0" 1765 version "1.0.0"
1667 resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1766 resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1668 1767
  1768 +is-utf8@^0.2.0:
  1769 + version "0.2.1"
  1770 + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
  1771 +
1669 isarray@0.0.1: 1772 isarray@0.0.1:
1670 version "0.0.1" 1773 version "0.0.1"
1671 resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1774 resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -1913,6 +2016,12 @@ lazy-cache@^1.0.3: @@ -1913,6 +2016,12 @@ lazy-cache@^1.0.3:
1913 version "1.0.4" 2016 version "1.0.4"
1914 resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 2017 resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
1915 2018
  2019 +lcid@^1.0.0:
  2020 + version "1.0.0"
  2021 + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
  2022 + dependencies:
  2023 + invert-kv "^1.0.0"
  2024 +
1916 lie@3.0.2: 2025 lie@3.0.2:
1917 version "3.0.2" 2026 version "3.0.2"
1918 resolved "http://registry.npm.taobao.org/lie/download/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea" 2027 resolved "http://registry.npm.taobao.org/lie/download/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea"
@@ -1922,6 +2031,16 @@ lie@3.0.2: @@ -1922,6 +2031,16 @@ lie@3.0.2:
1922 inline-process-browser "^1.0.0" 2031 inline-process-browser "^1.0.0"
1923 unreachable-branch-transform "^0.3.0" 2032 unreachable-branch-transform "^0.3.0"
1924 2033
  2034 +load-json-file@^1.0.0:
  2035 + version "1.1.0"
  2036 + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
  2037 + dependencies:
  2038 + graceful-fs "^4.1.2"
  2039 + parse-json "^2.2.0"
  2040 + pify "^2.0.0"
  2041 + pinkie-promise "^2.0.0"
  2042 + strip-bom "^2.0.0"
  2043 +
1925 localforage@^1.3.0: 2044 localforage@^1.3.0:
1926 version "1.4.3" 2045 version "1.4.3"
1927 resolved "http://registry.npm.taobao.org/localforage/download/localforage-1.4.3.tgz#a212543c39c7c76424edd12bf474c489aaca494c" 2046 resolved "http://registry.npm.taobao.org/localforage/download/localforage-1.4.3.tgz#a212543c39c7c76424edd12bf474c489aaca494c"
@@ -1986,6 +2105,10 @@ lodash.assign@^3.0.0: @@ -1986,6 +2105,10 @@ lodash.assign@^3.0.0:
1986 lodash._createassigner "^3.0.0" 2105 lodash._createassigner "^3.0.0"
1987 lodash.keys "^3.0.0" 2106 lodash.keys "^3.0.0"
1988 2107
  2108 +lodash.assign@^4.1.0, lodash.assign@^4.2.0:
  2109 + version "4.2.0"
  2110 + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
  2111 +
1989 lodash.clonedeep@~4.5.0: 2112 lodash.clonedeep@~4.5.0:
1990 version "4.5.0" 2113 version "4.5.0"
1991 resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 2114 resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
@@ -2029,7 +2152,7 @@ lodash.without@~4.4.0: @@ -2029,7 +2152,7 @@ lodash.without@~4.4.0:
2029 version "4.4.0" 2152 version "4.4.0"
2030 resolved "http://registry.npm.taobao.org/lodash.without/download/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" 2153 resolved "http://registry.npm.taobao.org/lodash.without/download/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
2031 2154
2032 -lodash@^4.11.1: 2155 +lodash@^4.11.1, lodash@^4.17.4:
2033 version "4.17.4" 2156 version "4.17.4"
2034 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 2157 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
2035 2158
@@ -2351,6 +2474,15 @@ normalize-package-data@^2.0.0, "normalize-package-data@~1.0.1 || ^2.0.0", normal @@ -2351,6 +2474,15 @@ normalize-package-data@^2.0.0, "normalize-package-data@~1.0.1 || ^2.0.0", normal
2351 semver "2 || 3 || 4 || 5" 2474 semver "2 || 3 || 4 || 5"
2352 validate-npm-package-license "^3.0.1" 2475 validate-npm-package-license "^3.0.1"
2353 2476
  2477 +normalize-package-data@^2.3.2:
  2478 + version "2.4.0"
  2479 + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
  2480 + dependencies:
  2481 + hosted-git-info "^2.1.4"
  2482 + is-builtin-module "^1.0.0"
  2483 + semver "2 || 3 || 4 || 5"
  2484 + validate-npm-package-license "^3.0.1"
  2485 +
2354 normalize-path@^2.0.0, normalize-path@^2.0.1: 2486 normalize-path@^2.0.0, normalize-path@^2.0.1:
2355 version "2.1.1" 2487 version "2.1.1"
2356 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 2488 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -2573,6 +2705,12 @@ os-homedir@^1.0.0: @@ -2573,6 +2705,12 @@ os-homedir@^1.0.0:
2573 version "1.0.2" 2705 version "1.0.2"
2574 resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2706 resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
2575 2707
  2708 +os-locale@^1.4.0:
  2709 + version "1.4.0"
  2710 + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
  2711 + dependencies:
  2712 + lcid "^1.0.0"
  2713 +
2576 os-name@~1.0.3: 2714 os-name@~1.0.3:
2577 version "1.0.3" 2715 version "1.0.3"
2578 resolved "http://registry.npm.taobao.org/os-name/download/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" 2716 resolved "http://registry.npm.taobao.org/os-name/download/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf"
@@ -2630,6 +2768,12 @@ parse-glob@^3.0.4: @@ -2630,6 +2768,12 @@ parse-glob@^3.0.4:
2630 is-extglob "^1.0.0" 2768 is-extglob "^1.0.0"
2631 is-glob "^2.0.0" 2769 is-glob "^2.0.0"
2632 2770
  2771 +parse-json@^2.2.0:
  2772 + version "2.2.0"
  2773 + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
  2774 + dependencies:
  2775 + error-ex "^1.2.0"
  2776 +
2633 parsejson@0.0.1: 2777 parsejson@0.0.1:
2634 version "0.0.1" 2778 version "0.0.1"
2635 resolved "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" 2779 resolved "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc"
@@ -2658,6 +2802,12 @@ path-array@^1.0.0: @@ -2658,6 +2802,12 @@ path-array@^1.0.0:
2658 dependencies: 2802 dependencies:
2659 array-index "^1.0.0" 2803 array-index "^1.0.0"
2660 2804
  2805 +path-exists@^2.0.0:
  2806 + version "2.1.0"
  2807 + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
  2808 + dependencies:
  2809 + pinkie-promise "^2.0.0"
  2810 +
2661 path-is-absolute@1.0.0: 2811 path-is-absolute@1.0.0:
2662 version "1.0.0" 2812 version "1.0.0"
2663 resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.0.tgz#263dada66ab3f2fb10bf7f9d24dd8f3e570ef912" 2813 resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.0.tgz#263dada66ab3f2fb10bf7f9d24dd8f3e570ef912"
@@ -2684,6 +2834,14 @@ path-to-regexp@^1.1.1: @@ -2684,6 +2834,14 @@ path-to-regexp@^1.1.1:
2684 dependencies: 2834 dependencies:
2685 isarray "0.0.1" 2835 isarray "0.0.1"
2686 2836
  2837 +path-type@^1.0.0:
  2838 + version "1.1.0"
  2839 + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
  2840 + dependencies:
  2841 + graceful-fs "^4.1.2"
  2842 + pify "^2.0.0"
  2843 + pinkie-promise "^2.0.0"
  2844 +
2687 pause-stream@0.0.11, pause-stream@~0.0.11: 2845 pause-stream@0.0.11, pause-stream@~0.0.11:
2688 version "0.0.11" 2846 version "0.0.11"
2689 resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 2847 resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
@@ -2698,7 +2856,7 @@ performance-now@^2.1.0: @@ -2698,7 +2856,7 @@ performance-now@^2.1.0:
2698 version "2.1.0" 2856 version "2.1.0"
2699 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 2857 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
2700 2858
2701 -pify@^2.3.0: 2859 +pify@^2.0.0, pify@^2.3.0:
2702 version "2.3.0" 2860 version "2.3.0"
2703 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2861 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
2704 2862
@@ -2724,6 +2882,10 @@ printj@: @@ -2724,6 +2882,10 @@ printj@:
2724 version "0.1.1" 2882 version "0.1.1"
2725 resolved "http://registry.npm.taobao.org/printj/download/printj-0.1.1.tgz#9d07ef9db9234da8659579e468bd46a7510489b0" 2883 resolved "http://registry.npm.taobao.org/printj/download/printj-0.1.1.tgz#9d07ef9db9234da8659579e468bd46a7510489b0"
2726 2884
  2885 +printj@~1.1.0:
  2886 + version "1.1.0"
  2887 + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.0.tgz#85487b5e8f96763b0b4a253613bef9dd9b387e3c"
  2888 +
2727 private@~0.1.5: 2889 private@~0.1.5:
2728 version "0.1.6" 2890 version "0.1.6"
2729 resolved "http://registry.npm.taobao.org/private/download/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" 2891 resolved "http://registry.npm.taobao.org/private/download/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1"
@@ -2865,6 +3027,21 @@ read-package-tree@~5.1.5: @@ -2865,6 +3027,21 @@ read-package-tree@~5.1.5:
2865 read-package-json "^2.0.0" 3027 read-package-json "^2.0.0"
2866 readdir-scoped-modules "^1.0.0" 3028 readdir-scoped-modules "^1.0.0"
2867 3029
  3030 +read-pkg-up@^1.0.1:
  3031 + version "1.0.1"
  3032 + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
  3033 + dependencies:
  3034 + find-up "^1.0.0"
  3035 + read-pkg "^1.0.0"
  3036 +
  3037 +read-pkg@^1.0.0:
  3038 + version "1.1.0"
  3039 + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
  3040 + dependencies:
  3041 + load-json-file "^1.0.0"
  3042 + normalize-package-data "^2.3.2"
  3043 + path-type "^1.0.0"
  3044 +
2868 read@1, read@~1.0.1, read@~1.0.7: 3045 read@1, read@~1.0.1, read@~1.0.7:
2869 version "1.0.7" 3046 version "1.0.7"
2870 resolved "http://registry.npm.taobao.org/read/download/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 3047 resolved "http://registry.npm.taobao.org/read/download/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
@@ -3053,6 +3230,31 @@ request@2, request@^2.74.0: @@ -3053,6 +3230,31 @@ request@2, request@^2.74.0:
3053 tough-cookie "~2.3.0" 3230 tough-cookie "~2.3.0"
3054 tunnel-agent "~0.4.1" 3231 tunnel-agent "~0.4.1"
3055 3232
  3233 +request@2.79.0:
  3234 + version "2.79.0"
  3235 + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
  3236 + dependencies:
  3237 + aws-sign2 "~0.6.0"
  3238 + aws4 "^1.2.1"
  3239 + caseless "~0.11.0"
  3240 + combined-stream "~1.0.5"
  3241 + extend "~3.0.0"
  3242 + forever-agent "~0.6.1"
  3243 + form-data "~2.1.1"
  3244 + har-validator "~2.0.6"
  3245 + hawk "~3.1.3"
  3246 + http-signature "~1.1.0"
  3247 + is-typedarray "~1.0.0"
  3248 + isstream "~0.1.2"
  3249 + json-stringify-safe "~5.0.1"
  3250 + mime-types "~2.1.7"
  3251 + oauth-sign "~0.8.1"
  3252 + qs "~6.3.0"
  3253 + stringstream "~0.0.4"
  3254 + tough-cookie "~2.3.0"
  3255 + tunnel-agent "~0.4.1"
  3256 + uuid "^3.0.0"
  3257 +
3056 request@2.x: 3258 request@2.x:
3057 version "2.82.0" 3259 version "2.82.0"
3058 resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea" 3260 resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea"
@@ -3133,6 +3335,14 @@ request@~2.75.0: @@ -3133,6 +3335,14 @@ request@~2.75.0:
3133 tough-cookie "~2.3.0" 3335 tough-cookie "~2.3.0"
3134 tunnel-agent "~0.4.1" 3336 tunnel-agent "~0.4.1"
3135 3337
  3338 +require-directory@^2.1.1:
  3339 + version "2.1.1"
  3340 + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
  3341 +
  3342 +require-main-filename@^1.0.1:
  3343 + version "1.0.1"
  3344 + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
  3345 +
3136 resolve-path@^1.3.1: 3346 resolve-path@^1.3.1:
3137 version "1.3.2" 3347 version "1.3.2"
3138 resolved "http://registry.npm.taobao.org/resolve-path/download/resolve-path-1.3.2.tgz#c20924408aff77466e819da548d7ce40a81d561f" 3348 resolved "http://registry.npm.taobao.org/resolve-path/download/resolve-path-1.3.2.tgz#c20924408aff77466e819da548d7ce40a81d561f"
@@ -3200,7 +3410,7 @@ semver@^5.0.3, semver@^5.3.0: @@ -3200,7 +3410,7 @@ semver@^5.0.3, semver@^5.3.0:
3200 version "5.4.1" 3410 version "5.4.1"
3201 resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 3411 resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
3202 3412
3203 -set-blocking@~2.0.0: 3413 +set-blocking@^2.0.0, set-blocking@~2.0.0:
3204 version "2.0.0" 3414 version "2.0.0"
3205 resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 3415 resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
3206 3416
@@ -3366,6 +3576,12 @@ sqlstring@2.2.0: @@ -3366,6 +3576,12 @@ sqlstring@2.2.0:
3366 version "2.2.0" 3576 version "2.2.0"
3367 resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.2.0.tgz#c3135c4ea8abcd7e7ee741a4966a891d86a4f191" 3577 resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.2.0.tgz#c3135c4ea8abcd7e7ee741a4966a891d86a4f191"
3368 3578
  3579 +ssf@~0.10.1:
  3580 + version "0.10.1"
  3581 + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.10.1.tgz#f23d82b63792ef56089089c1cd0c848e911cdba6"
  3582 + dependencies:
  3583 + frac "~1.1.0"
  3584 +
3369 ssf@~0.8.1: 3585 ssf@~0.8.1:
3370 version "0.8.2" 3586 version "0.8.2"
3371 resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.8.2.tgz#b9d4dc6a1c1bcf76f8abfa96d7d7656fb2abecd6" 3587 resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.8.2.tgz#b9d4dc6a1c1bcf76f8abfa96d7d7656fb2abecd6"
@@ -3428,7 +3644,7 @@ streamsearch@~0.1.2: @@ -3428,7 +3644,7 @@ streamsearch@~0.1.2:
3428 version "0.1.2" 3644 version "0.1.2"
3429 resolved "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 3645 resolved "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
3430 3646
3431 -string-width@^1.0.1: 3647 +string-width@^1.0.1, string-width@^1.0.2:
3432 version "1.0.2" 3648 version "1.0.2"
3433 resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 3649 resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
3434 dependencies: 3650 dependencies:
@@ -3477,6 +3693,12 @@ strip-ansi@^4.0.0: @@ -3477,6 +3693,12 @@ strip-ansi@^4.0.0:
3477 dependencies: 3693 dependencies:
3478 ansi-regex "^3.0.0" 3694 ansi-regex "^3.0.0"
3479 3695
  3696 +strip-bom@^2.0.0:
  3697 + version "2.0.0"
  3698 + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
  3699 + dependencies:
  3700 + is-utf8 "^0.2.0"
  3701 +
3480 strip-eof@^1.0.0: 3702 strip-eof@^1.0.0:
3481 version "1.0.0" 3703 version "1.0.0"
3482 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 3704 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -3784,12 +4006,20 @@ voc@: @@ -3784,12 +4006,20 @@ voc@:
3784 version "0.5.0" 4006 version "0.5.0"
3785 resolved "http://registry.npm.taobao.org/voc/download/voc-0.5.0.tgz#be6ca7c76e4a57d930cc80f6b31fbd80ca86045c" 4007 resolved "http://registry.npm.taobao.org/voc/download/voc-0.5.0.tgz#be6ca7c76e4a57d930cc80f6b31fbd80ca86045c"
3786 4008
  4009 +voc@~1.0.0:
  4010 + version "1.0.0"
  4011 + resolved "https://registry.yarnpkg.com/voc/-/voc-1.0.0.tgz#5465c0ce11d0881f7d8e36d8ca587043f33a25ae"
  4012 +
3787 wcwidth@^1.0.0: 4013 wcwidth@^1.0.0:
3788 version "1.0.1" 4014 version "1.0.1"
3789 resolved "http://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 4015 resolved "http://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
3790 dependencies: 4016 dependencies:
3791 defaults "^1.0.3" 4017 defaults "^1.0.3"
3792 4018
  4019 +which-module@^1.0.0:
  4020 + version "1.0.0"
  4021 + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
  4022 +
3793 which@1, which@~1.2.11: 4023 which@1, which@~1.2.11:
3794 version "1.2.11" 4024 version "1.2.11"
3795 resolved "http://registry.npm.taobao.org/which/download/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" 4025 resolved "http://registry.npm.taobao.org/which/download/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b"
@@ -3824,6 +4054,10 @@ window-size@0.1.0: @@ -3824,6 +4054,10 @@ window-size@0.1.0:
3824 version "0.1.0" 4054 version "0.1.0"
3825 resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 4055 resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
3826 4056
  4057 +window-size@^0.2.0:
  4058 + version "0.2.0"
  4059 + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
  4060 +
3827 wordwrap@0.0.2: 4061 wordwrap@0.0.2:
3828 version "0.0.2" 4062 version "0.0.2"
3829 resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 4063 resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@@ -3832,6 +4066,13 @@ wordwrap@~0.0.2: @@ -3832,6 +4066,13 @@ wordwrap@~0.0.2:
3832 version "0.0.3" 4066 version "0.0.3"
3833 resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 4067 resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
3834 4068
  4069 +wrap-ansi@^2.0.0:
  4070 + version "2.1.0"
  4071 + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
  4072 + dependencies:
  4073 + string-width "^1.0.1"
  4074 + strip-ansi "^3.0.1"
  4075 +
3835 wrappy@1, wrappy@~1.0.2: 4076 wrappy@1, wrappy@~1.0.2:
3836 version "1.0.2" 4077 version "1.0.2"
3837 resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 4078 resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -3867,6 +4108,18 @@ xdg-basedir@^3.0.0: @@ -3867,6 +4108,18 @@ xdg-basedir@^3.0.0:
3867 version "3.0.0" 4108 version "3.0.0"
3868 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 4109 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
3869 4110
  4111 +xlsx@^0.11.5:
  4112 + version "0.11.5"
  4113 + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.11.5.tgz#8c66cd97140be072e3dd320d12baa099689ceb74"
  4114 + dependencies:
  4115 + adler-32 "~1.1.0"
  4116 + cfb "~0.13.1"
  4117 + codepage "~1.11.0"
  4118 + commander "~2.11.0"
  4119 + crc-32 "~1.1.1"
  4120 + exit-on-epipe "~1.0.1"
  4121 + ssf "~0.10.1"
  4122 +
3870 xlsx@^0.8.0: 4123 xlsx@^0.8.0:
3871 version "0.8.0" 4124 version "0.8.0"
3872 resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.8.0.tgz#253ca61c9e1e14aa4b905dece4ce4757ace99d26" 4125 resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.8.0.tgz#253ca61c9e1e14aa4b905dece4ce4757ace99d26"
@@ -3887,10 +4140,40 @@ xmlhttprequest-ssl@1.5.1: @@ -3887,10 +4140,40 @@ xmlhttprequest-ssl@1.5.1:
3887 version "4.0.1" 4140 version "4.0.1"
3888 resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 4141 resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
3889 4142
  4143 +y18n@^3.2.1:
  4144 + version "3.2.1"
  4145 + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
  4146 +
3890 yallist@^2.1.2: 4147 yallist@^2.1.2:
3891 version "2.1.2" 4148 version "2.1.2"
3892 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 4149 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
3893 4150
  4151 +yargs-parser@^3.2.0:
  4152 + version "3.2.0"
  4153 + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f"
  4154 + dependencies:
  4155 + camelcase "^3.0.0"
  4156 + lodash.assign "^4.1.0"
  4157 +
  4158 +yargs@^5.0.0:
  4159 + version "5.0.0"
  4160 + resolved "https://registry.yarnpkg.com/yargs/-/yargs-5.0.0.tgz#3355144977d05757dbb86d6e38ec056123b3a66e"
  4161 + dependencies:
  4162 + cliui "^3.2.0"
  4163 + decamelize "^1.1.1"
  4164 + get-caller-file "^1.0.1"
  4165 + lodash.assign "^4.2.0"
  4166 + os-locale "^1.4.0"
  4167 + read-pkg-up "^1.0.1"
  4168 + require-directory "^2.1.1"
  4169 + require-main-filename "^1.0.1"
  4170 + set-blocking "^2.0.0"
  4171 + string-width "^1.0.2"
  4172 + which-module "^1.0.0"
  4173 + window-size "^0.2.0"
  4174 + y18n "^3.2.1"
  4175 + yargs-parser "^3.2.0"
  4176 +
3894 yargs@~3.10.0: 4177 yargs@~3.10.0:
3895 version "3.10.0" 4178 version "3.10.0"
3896 resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 4179 resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"