Merge branch 'release/9.19' into 'master'
Release/9.19 See merge request !380
Showing
14 changed files
with
384 additions
and
67 deletions
@@ -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 |
doraemon/middleware/ifElseMd.js
0 → 100644
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 | +}; |
doraemon/middleware/limiter/index2.js
0 → 100644
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 | +}; |
doraemon/middleware/risk-management2.js
0 → 100644
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" |
-
Please register or login to post a comment