Authored by 陈峰

Merge branch 'release/9.19' into 'master'

Release/9.19



See merge request !380
1 proxy: d:\soft\traefik\traefik.exe -c d:\soft\traefik\conf.toml 1 proxy: d:\soft\traefik\traefik.exe -c d:\soft\traefik\conf.toml
2 -mem: d:\soft\memcached\memcached.exe -vv 2 +redis: d:\soft\redis\redis-server.exe d:\soft\redis\redis.windows.conf
@@ -141,10 +141,15 @@ app.use((req, res, next) => { @@ -141,10 +141,15 @@ app.use((req, res, next) => {
141 141
142 const logger = global.yoho.logger; 142 const logger = global.yoho.logger;
143 143
  144 +function isOpenApmRisk(req) {
  145 + return _.get(req.app.locals, 'pc.open.apmrisk', false);
  146 +}
  147 +
144 // dispatcher 148 // dispatcher
145 try { 149 try {
146 const setYohoData = require('./doraemon/middleware/set-yoho-data'); 150 const setYohoData = require('./doraemon/middleware/set-yoho-data');
147 const riskManagement = require('./doraemon/middleware/risk-management'); 151 const riskManagement = require('./doraemon/middleware/risk-management');
  152 + const riskManagementApm = require('./doraemon/middleware/risk-management2');
148 const htaccess = require('./doraemon/middleware/htaccess'); 153 const htaccess = require('./doraemon/middleware/htaccess');
149 const subDomain = require('./doraemon/middleware/sub-domain'); 154 const subDomain = require('./doraemon/middleware/sub-domain');
150 const mobileRefer = require('./doraemon/middleware/mobile-refer'); 155 const mobileRefer = require('./doraemon/middleware/mobile-refer');
@@ -158,10 +163,11 @@ try { @@ -158,10 +163,11 @@ try {
158 const devtool = require('./doraemon/middleware/devtools'); 163 const devtool = require('./doraemon/middleware/devtools');
159 const routeEncode = require('./doraemon/middleware/route-encode'); 164 const routeEncode = require('./doraemon/middleware/route-encode');
160 const footerData = require('./doraemon/middleware/footerData'); 165 const footerData = require('./doraemon/middleware/footerData');
  166 + const ifElseMd = require('./doraemon/middleware/ifElseMd');
161 167
162 // YOHO 前置中间件 168 // YOHO 前置中间件
163 app.use(setYohoData()); 169 app.use(setYohoData());
164 - app.use(riskManagement()); 170 + app.use(ifElseMd(isOpenApmRisk, riskManagementApm(), riskManagement()));
165 app.use(seo()); 171 app.use(seo());
166 app.use(htaccess()); 172 app.use(htaccess());
167 app.use(subDomain()); 173 app.use(subDomain());
@@ -171,7 +177,10 @@ try { @@ -171,7 +177,10 @@ try {
171 177
172 // 请求限制中间件 178 // 请求限制中间件
173 if (!app.locals.devEnv) { 179 if (!app.locals.devEnv) {
174 - app.use(require('./doraemon/middleware/limiter')); 180 + const limiter = require('./doraemon/middleware/limiter');
  181 + const limiterApm = require('./doraemon/middleware/limiter/index2');
  182 +
  183 + app.use(ifElseMd(isOpenApmRisk, limiterApm, limiter));
175 } 184 }
176 185
177 app.use(setPageInfo()); 186 app.use(setPageInfo());
@@ -187,7 +196,7 @@ try { @@ -187,7 +196,7 @@ try {
187 require('./dispatch')(app); 196 require('./dispatch')(app);
188 197
189 app.use('/crm/common/ok.jsp', (req, res) => { 198 app.use('/crm/common/ok.jsp', (req, res) => {
190 - res.status(204).end(); 199 + res.status(200).end();
191 }); 200 });
192 201
193 app.all('*', errorHandler.notFound()); // 404 202 app.all('*', errorHandler.notFound()); // 404
@@ -10,6 +10,12 @@ const humanExpire = 3600; @@ -10,6 +10,12 @@ const humanExpire = 3600;
10 10
11 const PAGE = 'PC'; 11 const PAGE = 'PC';
12 12
  13 +const limitKey = 'limit2';
  14 +
  15 +
  16 +/**
  17 + * note: 这里要注意,新的计数是指APM处理的情况
  18 + */
13 module.exports = class extends global.yoho.BaseModel { 19 module.exports = class extends global.yoho.BaseModel {
14 constructor(ctx) { 20 constructor(ctx) {
15 super(ctx); 21 super(ctx);
@@ -24,18 +30,36 @@ module.exports = class extends global.yoho.BaseModel { @@ -24,18 +30,36 @@ module.exports = class extends global.yoho.BaseModel {
24 pid && operations.push(cache.delAsync(`${pid}:${remoteIp}`)); 30 pid && operations.push(cache.delAsync(`${pid}:${remoteIp}`));
25 } 31 }
26 32
27 - operations.push(cache.delAsync(`${config.app}:limiter:${remoteIp}`)); 33 + const isOpenApmrisk = _.get(this.ctx.req.app.locals, 'pc.open.apmrisk', false);
  34 +
  35 + // 新的计数
  36 + if (isOpenApmrisk) {
  37 + operations.push(cache.delAsync(`${config.app}:${limitKey}:${remoteIp}`));
  38 +
  39 + // 验证码之后一小时之内不再限制qps
  40 + if (apiLimitValidate) {
  41 + operations.push(cache.setAsync(`${config.app}:limiter:api:ishuman:${remoteIp}`, 1, humanExpire));
  42 + } else {
  43 + operations.push(cache.setAsync(`${config.app}:${limitKey}:ishuman:${remoteIp}`, 1, humanExpire));
  44 + }
28 45
29 - // 验证码之后一小时之内不再限制qps  
30 - if (apiLimitValidate) {  
31 - operations.push(cache.setAsync(`${config.app}:limiter:api:ishuman:${remoteIp}`, 1, humanExpire)); 46 + _.forEach(config.REQUEST_LIMIT, (val, key) => {
  47 + operations.push(cache.delAsync(`${config.app}:${limitKey}:${key}:max:${remoteIp}`));
  48 + });
32 } else { 49 } else {
33 - operations.push(cache.setAsync(`${config.app}:limiter:ishuman:${remoteIp}`, 1, humanExpire));  
34 - } 50 + operations.push(cache.delAsync(`${config.app}:limiter:${remoteIp}`));
35 51
36 - _.forEach(config.REQUEST_LIMIT, (val, key) => {  
37 - operations.push(cache.delAsync(`${config.app}:limiter:${key}:max:${remoteIp}`));  
38 - }); 52 + // 验证码之后一小时之内不再限制qps
  53 + if (apiLimitValidate) {
  54 + operations.push(cache.setAsync(`${config.app}:limiter:api:ishuman:${remoteIp}`, 1, humanExpire));
  55 + } else {
  56 + operations.push(cache.setAsync(`${config.app}:limiter:ishuman:${remoteIp}`, 1, humanExpire));
  57 + }
  58 +
  59 + _.forEach(config.REQUEST_LIMIT, (val, key) => {
  60 + operations.push(cache.delAsync(`${config.app}:limiter:${key}:max:${remoteIp}`));
  61 + });
  62 + }
39 63
40 return Promise.all(operations); 64 return Promise.all(operations);
41 } 65 }
@@ -79,7 +79,8 @@ module.exports = { @@ -79,7 +79,8 @@ module.exports = {
79 report: { 79 report: {
80 host: 'localhost', 80 host: 'localhost',
81 port: 6009, 81 port: 6009,
82 - db: 'web-apm' 82 + db: 'web-apm',
  83 + immediate: true
83 }, 84 },
84 useOneapm: false, 85 useOneapm: false,
85 useCache: true, 86 useCache: true,
@@ -248,9 +249,10 @@ if (isProduction) { @@ -248,9 +249,10 @@ if (isProduction) {
248 } 249 }
249 }, 250 },
250 report: { 251 report: {
251 - host: 'badjs.yoho.cn', 252 + host: 'badjs.yohoops.org',
252 port: 80, 253 port: 80,
253 - db: 'web-apm' 254 + db: 'web-apm',
  255 + immediate: true
254 }, 256 },
255 monitorReport: { 257 monitorReport: {
256 host: '10.66.4.25', 258 host: '10.66.4.25',
@@ -133,7 +133,11 @@ exports.serverError = () => { @@ -133,7 +133,11 @@ exports.serverError = () => {
133 } 133 }
134 134
135 if (!isHuman) { 135 if (!isHuman) {
136 - cache.setAsync(`${config.app}:limiter:${remoteIp}`, 1, limiterIpTime); 136 + if (_.get(req.app.locals, 'pc.open.apmrisk', false)) {
  137 + cache.setAsync(`${config.app}:limit2:${remoteIp}`, 1, limiterIpTime);
  138 + } else {
  139 + cache.setAsync(`${config.app}:limiter:${remoteIp}`, 1, limiterIpTime);
  140 + }
137 141
138 req.session[sessionLimitKey] = true; 142 req.session[sessionLimitKey] = true;
139 143
  1 +
  2 +
  3 +module.exports = (predict, ifTrueFn, elseFn) => {
  4 + if (!ifTrueFn) {
  5 + ifTrueFn = (req, res, next) => next();
  6 + }
  7 +
  8 + if (!elseFn) {
  9 + elseFn = (req, res, next) => next();
  10 + }
  11 +
  12 + return (req, res, next) => {
  13 + if (predict(req, res)) {
  14 + ifTrueFn(req, res, next);
  15 + } else {
  16 + elseFn(req, res, next);
  17 + }
  18 + };
  19 +};
  1 +'use strict';
  2 +
  3 +const _ = require('lodash');
  4 +const logger = global.yoho.logger;
  5 +const ip = require('./rules/ip-list2');
  6 +const userAgent = require('./rules/useragent2');
  7 +const pathWhiteList = require('./rules/path-white-list');
  8 +
  9 +// const asynchronous = require('./rules/asynchronous');
  10 +// const fakerLimiter = require('./rules/faker-limit');
  11 +const captchaPolicy = require('./policies/captcha');
  12 +
  13 +// const reporterPolicy = require('./policies/reporter');
  14 +
  15 +const _excluded = (req) => {
  16 + return Boolean(
  17 + _.includes(pathWhiteList(), req.path)
  18 + );
  19 +};
  20 +
  21 +const limiter = (rule, policy, context) => {
  22 + return rule(context, policy);
  23 +};
  24 +
  25 +module.exports = (req, res, next) => {
  26 + const remoteIp = req.yoho.clientIp || '';
  27 + const enabled = !_.get(req.app.locals, 'pc.sys.noLimiter');
  28 + let excluded = _excluded(req);
  29 +
  30 + // 开关为关或者未获取到remoteIp,放行
  31 + if (!enabled || !remoteIp || excluded) {
  32 + logger.debug(`request remote ip: ${remoteIp}; enabled: ${enabled}`);
  33 + return next();
  34 + }
  35 +
  36 + (async function() {
  37 + const context = {
  38 + req: req,
  39 + res: res,
  40 + next: next,
  41 + remoteIp: remoteIp
  42 + };
  43 +
  44 + let results = await Promise.all([
  45 + limiter(userAgent, captchaPolicy, context),
  46 + limiter(ip, captchaPolicy, context),
  47 +
  48 + // limiter(asynchronous, captchaPolicy, context)
  49 + // limiter(fakerLimiter, reporterPolicy, context)
  50 + ]);
  51 +
  52 + let allPass = true, exclusion = false, policy = null;
  53 +
  54 + logger.debug('limiter result: ' + JSON.stringify(results));
  55 +
  56 + _.forEach(results, (result) => {
  57 + if (typeof result === 'object' && !exclusion) {
  58 + exclusion = result.exclusion;
  59 + }
  60 +
  61 + if (typeof result === 'function') {
  62 + allPass = false;
  63 + policy = result;
  64 + }
  65 + });
  66 +
  67 + if (exclusion) {
  68 + return next();
  69 + } else if (!allPass && policy) {
  70 + policy(req, res, next);
  71 + } else {
  72 + return next();
  73 + }
  74 + }()).catch((err) => {
  75 + logger.error(err);
  76 + return next();
  77 + });
  78 +};
  1 +'use strict';
  2 +
  3 +const cache = global.yoho.cache.master;
  4 +const config = global.yoho.config;
  5 +const logger = global.yoho.logger;
  6 +
  7 +const limitKey = 'limit2';
  8 +
  9 +module.exports = (limiter, policy) => {
  10 + const ipBlackKey = `pc:limiter:${limiter.remoteIp}`; // ci ip黑名单
  11 + const ipLimitKey = `${config.app}:${limitKey}:${limiter.remoteIp}`; // 业务黑名单
  12 +
  13 + return Promise.all([
  14 + cache.getAsync(ipBlackKey),
  15 + cache.getAsync(ipLimitKey)
  16 + ]).then(result => {
  17 + let ipBlackRes = result[0];
  18 + let ipLimitRes = result[1];
  19 +
  20 + logger.debug(ipBlackKey, ipBlackRes);
  21 + logger.debug(ipLimitKey, ipLimitRes);
  22 +
  23 + if ((ipBlackRes && +ipBlackRes > 0) || (ipLimitRes && +ipLimitRes > 0)) {
  24 + return Promise.resolve(policy);
  25 + } else {
  26 + return Promise.resolve(true);
  27 + }
  28 + });
  29 +};
@@ -12,7 +12,8 @@ const DEFAULT_PATH_WHITE_LIST = [ @@ -12,7 +12,8 @@ const DEFAULT_PATH_WHITE_LIST = [
12 '/common/getbanner', 12 '/common/getbanner',
13 '/common/suggestfeedback', 13 '/common/suggestfeedback',
14 '/product/search/history', 14 '/product/search/history',
15 - '/product/search/suggest' 15 + '/product/search/suggest',
  16 + '/3party/captcha.png'
16 ]; 17 ];
17 18
18 const cacheWhiteList = { 19 const cacheWhiteList = {
  1 +'use strict';
  2 +
  3 +const cache = global.yoho.cache.master;
  4 +const _ = require('lodash');
  5 +const logger = global.yoho.logger;
  6 +
  7 +
  8 +module.exports = (limiter, policy) => {
  9 + const blackKey = 'pc:limiter:ua:black';
  10 +
  11 + const ua = limiter.req.header('User-Agent');
  12 +
  13 + cache.getAsync(blackKey).then((args) => {
  14 + let blacklist = [];
  15 +
  16 + try {
  17 + blacklist = JSON.parse(args);
  18 + } catch (error) {
  19 + logger.error(error);
  20 + }
  21 +
  22 + blacklist = blacklist || [];
  23 +
  24 + if (blacklist.length === 0) {
  25 + return Promise.resolve(true);
  26 + }
  27 +
  28 + const test = (list) => {
  29 + let result = false;
  30 +
  31 + _.each(list, (item) => {
  32 + let regexp;
  33 +
  34 + try {
  35 + regexp = new RegExp(item);
  36 + } catch (e) {
  37 + logger.error(e);
  38 + }
  39 +
  40 + if (regexp.test(ua)) {
  41 + result = true;
  42 + }
  43 + });
  44 +
  45 + return result;
  46 + };
  47 +
  48 + if (test(blacklist)) {
  49 + return Promise.resolve(policy);
  50 + } else {
  51 + return Promise.resolve(true);
  52 + }
  53 + });
  54 +
  55 +};
  1 +/**
  2 + * 控制路由请求次数
  3 + * @date: 2018/03/05
  4 + */
  5 +'use strict';
  6 +
  7 +const _ = require('lodash');
  8 +const cache = global.yoho.cache.master;
  9 +const helpers = global.yoho.helpers;
  10 +const pathToRegexp = require('path-to-regexp');
  11 +const logger = global.yoho.logger;
  12 +const md5 = require('md5');
  13 +
  14 +const statusCode = {
  15 + code: 4403,
  16 + data: {},
  17 + message: '亲,您的访问次数过多,请稍后再试哦...'
  18 +};
  19 +
  20 +const limitKey = 'limit2';
  21 +
  22 +const _jumpUrl = (req, res, next, result) => {
  23 + if (result.code === 4403) {
  24 + if (req.xhr) {
  25 + res.set({
  26 + 'Cache-Control': 'no-cache',
  27 + Pragma: 'no-cache',
  28 + Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
  29 + });
  30 + return res.status(403).json(result);
  31 + }
  32 + return res.redirect(`${result.data.url}&refer=${req.originalUrl}`);
  33 + }
  34 +
  35 + return next();
  36 +};
  37 +
  38 +module.exports = () => {
  39 + return (req, res, next) => {
  40 + // default open
  41 + if (_.get(req.app.locals.pc, 'close.risk', false)) {
  42 + return next();
  43 + }
  44 +
  45 + let ip = _.get(req.yoho, 'clientIp', '');
  46 + let path = req.path || '';
  47 + let risks = _.get(req.app.locals.pc, 'json.risk', []);
  48 + let router = {};
  49 +
  50 + logger.debug(`risk => risks: ${JSON.stringify(risks)}, path: ${path}, ip: ${ip}`); // eslint-disable-line
  51 + if (_.isEmpty(path) || _.isEmpty(risks)) {
  52 + return next();
  53 + }
  54 +
  55 + _.isArray(risks) && risks.some(item => {
  56 + if (item.state === 'off') {
  57 + return false;
  58 + }
  59 +
  60 + if (!item.regRoute) {
  61 + item.regRoute = pathToRegexp(item.route);
  62 + }
  63 +
  64 + if (item.regRoute.test(path)) {
  65 + router = item;
  66 + return true;
  67 + }
  68 +
  69 + return false;
  70 + });
  71 +
  72 + logger.debug(`risk => router: ${JSON.stringify(router)}, path: ${path}`); // eslint-disable-line
  73 + if (_.isEmpty(router)) {
  74 + return next();
  75 + }
  76 +
  77 + let keyPath = md5(`${router.regRoute}`);
  78 + let limitEnable = `pc:risk:${limitKey}:${keyPath}:${ip}`;
  79 + let checkUrl = helpers.urlFormat('/3party/check', {
  80 + pid: `pc:risk:${limitKey}:${keyPath}`
  81 + });
  82 +
  83 + cache.getAsync(limitEnable)
  84 + .then(result => {
  85 + if (result) {
  86 + logger.info(`risk => getCache: ${JSON.stringify(result)}, path: ${path}`); // eslint-disable-line
  87 + return Object.assign({}, statusCode, {
  88 + data: {
  89 + url: checkUrl
  90 + }
  91 + });
  92 + } else {
  93 + return {code: 200};
  94 + }
  95 + }).then(result => {
  96 + logger.debug(`risk => result: ${JSON.stringify(result)}, path: ${path}`); // eslint-disable-line
  97 + return _jumpUrl(req, res, next, result);
  98 + }).catch(e => {
  99 + console.log(`risk => path: ${path}, err: ${e.message}`);
  100 + return next();
  101 + });
  102 + };
  103 +};
1 { 1 {
2 "name": "yohobuy-node", 2 "name": "yohobuy-node",
3 - "version": "6.6.15", 3 + "version": "6.6.17",
4 "private": true, 4 "private": true,
5 "description": "A New Yohobuy Project With Express", 5 "description": "A New Yohobuy Project With Express",
6 "repository": { 6 "repository": {
@@ -57,7 +57,7 @@ @@ -57,7 +57,7 @@
57 "urlencode": "^1.1.0", 57 "urlencode": "^1.1.0",
58 "uuid": "^2.0.2", 58 "uuid": "^2.0.2",
59 "yoho-express-session": "^2.0.0", 59 "yoho-express-session": "^2.0.0",
60 - "yoho-node-lib": "=0.6.20", 60 + "yoho-node-lib": "=0.6.32",
61 "yoho-zookeeper": "^1.0.10", 61 "yoho-zookeeper": "^1.0.10",
62 "yo-cli": "=1.0.7" 62 "yo-cli": "=1.0.7"
63 }, 63 },
@@ -1023,7 +1023,7 @@ $captchaSmsBtn.on('click', function() { @@ -1023,7 +1023,7 @@ $captchaSmsBtn.on('click', function() {
1023 } 1023 }
1024 1024
1025 return $.Deferred().reject().promise(); // eslint-disable-line 1025 return $.Deferred().reject().promise(); // eslint-disable-line
1026 - }).then(disable60sSendSmsBtn); 1026 + }).then(disable60sSendSmsBtn).fail(disable60sSendSmsBtn);
1027 }); 1027 });
1028 }); 1028 });
1029 1029
@@ -2124,17 +2124,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: @@ -2124,17 +2124,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
2124 version "1.0.2" 2124 version "1.0.2"
2125 resolved "http://npm.yohops.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 2125 resolved "http://npm.yohops.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
2126 2126
2127 -cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:  
2128 - version "2.2.2"  
2129 - resolved "http://npm.yohops.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" 2127 +cosmiconfig@^4.0.0:
  2128 + version "4.0.0"
  2129 + resolved "http://npm.yohops.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
2130 dependencies: 2130 dependencies:
2131 is-directory "^0.3.1" 2131 is-directory "^0.3.1"
2132 - js-yaml "^3.4.3"  
2133 - minimist "^1.2.0"  
2134 - object-assign "^4.1.0"  
2135 - os-homedir "^1.0.1"  
2136 - parse-json "^2.2.0"  
2137 - require-from-string "^1.1.0" 2132 + js-yaml "^3.9.0"
  2133 + parse-json "^4.0.0"
  2134 + require-from-string "^2.0.1"
2138 2135
2139 cosmiconfig@^5.0.0: 2136 cosmiconfig@^5.0.0:
2140 version "5.0.5" 2137 version "5.0.5"
@@ -4328,6 +4325,18 @@ ignore@^3.3.3, ignore@^3.3.5: @@ -4328,6 +4325,18 @@ ignore@^3.3.3, ignore@^3.3.5:
4328 version "3.3.8" 4325 version "3.3.8"
4329 resolved "http://npm.yohops.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" 4326 resolved "http://npm.yohops.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
4330 4327
  4328 +import-cwd@^2.0.0:
  4329 + version "2.1.0"
  4330 + resolved "http://npm.yohops.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
  4331 + dependencies:
  4332 + import-from "^2.1.0"
  4333 +
  4334 +import-from@^2.1.0:
  4335 + version "2.1.0"
  4336 + resolved "http://npm.yohops.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
  4337 + dependencies:
  4338 + resolve-from "^3.0.0"
  4339 +
4331 import-lazy@^2.1.0: 4340 import-lazy@^2.1.0:
4332 version "2.1.0" 4341 version "2.1.0"
4333 resolved "http://npm.yohops.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 4342 resolved "http://npm.yohops.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -4372,9 +4381,9 @@ inflight@^1.0.4: @@ -4372,9 +4381,9 @@ inflight@^1.0.4:
4372 once "^1.3.0" 4381 once "^1.3.0"
4373 wrappy "1" 4382 wrappy "1"
4374 4383
4375 -influx-batch-sender@^0.1.5:  
4376 - version "0.1.5"  
4377 - resolved "http://npm.yohops.com/influx-batch-sender/-/influx-batch-sender-0.1.5.tgz#865a5eb9a446f4e8ed442ab44e67c3532c27a5d7" 4384 +influx-batch-sender@^0.1.6:
  4385 + version "0.1.6"
  4386 + resolved "http://npm.yohops.com/influx-batch-sender/-/influx-batch-sender-0.1.6.tgz#fe4fb11ac80ece3ca791e40c8de098ce0181d499"
4378 dependencies: 4387 dependencies:
4379 debug "^3.0.1" 4388 debug "^3.0.1"
4380 lodash "^4.17.4" 4389 lodash "^4.17.4"
@@ -4855,7 +4864,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: @@ -4855,7 +4864,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
4855 version "3.0.2" 4864 version "3.0.2"
4856 resolved "http://npm.yohops.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 4865 resolved "http://npm.yohops.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
4857 4866
4858 -js-yaml@^3.11.0, js-yaml@^3.4.3, js-yaml@^3.9.0, js-yaml@^3.9.1: 4867 +js-yaml@^3.11.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
4859 version "3.12.0" 4868 version "3.12.0"
4860 resolved "http://npm.yohops.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 4869 resolved "http://npm.yohops.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
4861 dependencies: 4870 dependencies:
@@ -6275,7 +6284,7 @@ os-browserify@^0.3.0: @@ -6275,7 +6284,7 @@ os-browserify@^0.3.0:
6275 version "0.3.0" 6284 version "0.3.0"
6276 resolved "http://npm.yohops.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 6285 resolved "http://npm.yohops.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
6277 6286
6278 -os-homedir@^1.0.0, os-homedir@^1.0.1: 6287 +os-homedir@^1.0.0:
6279 version "1.0.2" 6288 version "1.0.2"
6280 resolved "http://npm.yohops.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 6289 resolved "http://npm.yohops.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
6281 6290
@@ -6941,36 +6950,20 @@ postcss-less@^2.0.0: @@ -6941,36 +6950,20 @@ postcss-less@^2.0.0:
6941 dependencies: 6950 dependencies:
6942 postcss "^5.2.16" 6951 postcss "^5.2.16"
6943 6952
6944 -postcss-load-config@^1.2.0:  
6945 - version "1.2.0"  
6946 - resolved "http://npm.yohops.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"  
6947 - dependencies:  
6948 - cosmiconfig "^2.1.0"  
6949 - object-assign "^4.1.0"  
6950 - postcss-load-options "^1.2.0"  
6951 - postcss-load-plugins "^2.3.0"  
6952 -  
6953 -postcss-load-options@^1.2.0:  
6954 - version "1.2.0"  
6955 - resolved "http://npm.yohops.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"  
6956 - dependencies:  
6957 - cosmiconfig "^2.1.0"  
6958 - object-assign "^4.1.0"  
6959 -  
6960 -postcss-load-plugins@^2.3.0:  
6961 - version "2.3.0"  
6962 - resolved "http://npm.yohops.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" 6953 +postcss-load-config@^2.0.0:
  6954 + version "2.0.0"
  6955 + resolved "http://npm.yohops.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
6963 dependencies: 6956 dependencies:
6964 - cosmiconfig "^2.1.1"  
6965 - object-assign "^4.1.0" 6957 + cosmiconfig "^4.0.0"
  6958 + import-cwd "^2.0.0"
6966 6959
6967 -postcss-loader@^2.1.4:  
6968 - version "2.1.5"  
6969 - resolved "http://npm.yohops.com/postcss-loader/-/postcss-loader-2.1.5.tgz#3c6336ee641c8f95138172533ae461a83595e788" 6960 +postcss-loader@^2.1.6:
  6961 + version "2.1.6"
  6962 + resolved "http://npm.yohops.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740"
6970 dependencies: 6963 dependencies:
6971 loader-utils "^1.1.0" 6964 loader-utils "^1.1.0"
6972 postcss "^6.0.0" 6965 postcss "^6.0.0"
6973 - postcss-load-config "^1.2.0" 6966 + postcss-load-config "^2.0.0"
6974 schema-utils "^0.4.0" 6967 schema-utils "^0.4.0"
6975 6968
6976 postcss-markdown@^0.28.0: 6969 postcss-markdown@^0.28.0:
@@ -8068,9 +8061,9 @@ require-directory@^2.1.1: @@ -8068,9 +8061,9 @@ require-directory@^2.1.1:
8068 version "2.1.1" 8061 version "2.1.1"
8069 resolved "http://npm.yohops.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 8062 resolved "http://npm.yohops.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
8070 8063
8071 -require-from-string@^1.1.0:  
8072 - version "1.2.1"  
8073 - resolved "http://npm.yohops.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" 8064 +require-from-string@^2.0.1:
  8065 + version "2.0.2"
  8066 + resolved "http://npm.yohops.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
8074 8067
8075 require-main-filename@^1.0.1: 8068 require-main-filename@^1.0.1:
8076 version "1.0.1" 8069 version "1.0.1"
@@ -10308,13 +10301,13 @@ yoho-jquery@^1.12.4: @@ -10308,13 +10301,13 @@ yoho-jquery@^1.12.4:
10308 version "1.12.4" 10301 version "1.12.4"
10309 resolved "http://npm.yohops.com/yoho-jquery/-/yoho-jquery-1.12.4.tgz#22499b325f293ee8b1d60559777348156494926d" 10302 resolved "http://npm.yohops.com/yoho-jquery/-/yoho-jquery-1.12.4.tgz#22499b325f293ee8b1d60559777348156494926d"
10310 10303
10311 -yoho-node-lib@=0.6.20:  
10312 - version "0.6.20"  
10313 - resolved "http://npm.yohops.com/yoho-node-lib/-/yoho-node-lib-0.6.20.tgz#682dbad0c5d0cbe79987dfddb872bc16c6cfb6a3" 10304 +yoho-node-lib@=0.6.30:
  10305 + version "0.6.30"
  10306 + resolved "http://npm.yohops.com/yoho-node-lib/-/yoho-node-lib-0.6.30.tgz#d22c63ca3da65c35161395c30054feab09483253"
10314 dependencies: 10307 dependencies:
10315 dnscache "^1.0.1" 10308 dnscache "^1.0.1"
10316 handlebars "^4.0.5" 10309 handlebars "^4.0.5"
10317 - influx-batch-sender "^0.1.5" 10310 + influx-batch-sender "^0.1.6"
10318 lodash "^4.13.1" 10311 lodash "^4.13.1"
10319 lru-cache "^4.1.1" 10312 lru-cache "^4.1.1"
10320 md5 "^2.1.0" 10313 md5 "^2.1.0"