Authored by 陈峰

commit

other
node_modules
\ No newline at end of file
... ...
{
"parser": "babel-eslint",
"env": {
"es6": true
},
"extends": "yoho",
"parserOptions": {
"sourceType": "module"
},
"plugins": [
"html"
],
"rules": {
"camelcase": "off"
}
"env": {
"node": true
},
"extends": [
"eslint:recommended",
"yoho"
],
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 8
},
"rules": {
"camelcase": "off",
"max-len": "off"
}
}
... ...
const schedule = require('node-schedule')
const schedule = require('node-schedule');
const Sender = require('influx-batch-sender');
const config = require('./config/index')
const dayjs = require('dayjs');
const config = require('./config/index');
const {logger} = require('./libs/logger');
require('./libs/logger')
const spiderTask = require('./tasks/spider-task');
const calvAvgTask = require('./tasks/calc-task');
const task = require('./task')
global.isProduction = process.env.NODE_ENV === 'production'
global.sender = new Sender(config.monitorReport) // 初始化数据上报
global.isProduction = process.env.NODE_ENV === 'production';
global.sender = new Sender(config.monitorReport); // 初始化数据上报
schedule.scheduleJob('0 */30 * * * *', () => {
task()
console.log('schedule.scheduleJob 0 */30 * * * *')
})
logger.info('task start spiderTask');
spiderTask(dayjs().unix());
});
console.log(process.env.NODE_ENV)
\ No newline at end of file
schedule.scheduleJob('0 10 * * * *', () => {
logger.info('task start calvAvgTask');
calvAvgTask();
});
spiderTask(dayjs().unix());
calvAvgTask();
... ...
module.exports = {
delay: 500,
database: {
connect: {
host: 'write.ufo.yohoops.org',
port: '3306',
user: 'yh_vpc_bak',
password: 'yoho@2Y$^YpNb7hp',
charset: 'utf8mb4',
timezone: '+08:00'
},
database: 'ufo_product',
},
monitorReport: {
host: '10.66.4.25',
port: 8086,
db: 'web_monitor',
},
// database: {
// connect: {
// host: '192.168.102.219',
// host: 'write.ufo.yohoops.org',
// port: '3306',
// user: 'yh_test',
// password: 'yh_test',
// user: 'yh_vpc_bak',
// password: 'yoho@2Y$^YpNb7hp',
// charset: 'utf8mb4',
// timezone: '+08:00'
// },
// database: 'ufo_product',
// },
monitorReport: {
host: '10.66.4.25',
port: 8086,
db: 'web_monitor',
},
database: {
connect: {
host: '192.168.102.219',
port: '3306',
user: 'yh_test',
password: 'yh_test',
charset: 'utf8mb4',
timezone: '+08:00'
},
database: 'ufo_product',
},
loggers: [{
silent: true,
type: 'dailyfile',
... ... @@ -41,4 +42,4 @@ module.exports = {
type: 'console',
level: 'debug',
}]
}
\ No newline at end of file
};
... ...
const config = require('../config/index')
const createLogger = require('./winston')
const {transports, createLogger, format} = require('winston');
const config = require('../config/index');
const logger = createLogger(config.loggers)
require('winston-daily-rotate-file');
logger.mount(global)
module.exports = (loggers) => {
const tps = loggers.map(log => {
switch (log.type) {
case 'console':
return new transports.Console(Object.assign({
level: 'info'
}, log));
case 'file':
return new transports.File(Object.assign({
level: 'info',
zippedArchive: true,
maxsize: 209715200, // 200m
maxFiles: 7,
}, log));
case 'dailyfile':
return new transports.DailyRotateFile(Object.assign({
level: 'info',
zippedArchive: true,
maxSize: '200m',
maxFiles: '7d',
datePattern: 'YYYY-MM-DD',
dirname: './logs'
}, log));
default:
return void 0;
}
});
return logger
\ No newline at end of file
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({
format: () => {
return new Date().toLocaleString();
}
}),
format.printf(info => `${info.level}: ${info.message}`)
),
transports: tps
});
return logger;
};
module.exports.logger = module.exports(config.loggers);
... ...
const mysql = require('mysql');
const _ = require('lodash');
const config = require('../config/index');
class MysqlAdapter {
constructor(connect, database) {
this.connect = connect;
this.database = database;
this.createPool();
}
createPool() {
this.pool = mysql.createPool(Object.assign(this.connect, {
database: this.database,
queryFormat: function(query, values) {
if (!values) {
return query;
}
return query.replace(/\:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
},
connectTimeout: 2000
}));
}
getConnection() {
return new Promise((resolve, reject) => {
this.pool.getConnection((connErr, connection) => {
if (connErr) {
reject(connErr);
} else {
resolve(connection);
}
});
});
}
query(sql, params, options) {
return this.execute(sql, params, options);
}
delete(sql, params) {
return this.execute(sql, params).then(result => {
return result.affectedRows;
});
}
update(sql, params) {
return this.execute(sql, params).then(result => {
return result.changedRows;
});
}
insert(sql, params) {
return this.execute(sql, params).then(result => {
return result.insertId;
});
}
async execute(sql, params, options = {}) {
return new Promise((resolve, reject) => {
this.getConnection().then(connection => {
connection.query(sql, params, (queryErr, result) => {
connection.release();
if (queryErr) {
reject(queryErr);
} else {
resolve(result);
}
});
}).catch(e => {
reject(e);
});
constructor(connect, database) {
this.connect = connect;
this.database = database;
this.createPool();
}
createPool() {
this.pool = mysql.createPool(Object.assign(this.connect, {
database: this.database,
queryFormat: function(query, values) {
if (!values) {
return query;
}
return query.replace(/:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
},
connectTimeout: 2000
}));
}
getConnection() {
return new Promise((resolve, reject) => {
this.pool.getConnection((connErr, connection) => {
if (connErr) {
reject(connErr);
} else {
resolve(connection);
}
});
});
}
query(sql, params, options) {
return this.execute(sql, params, options);
}
delete(sql, params) {
return this.execute(sql, params).then(result => {
return result.affectedRows;
});
}
update(sql, params) {
return this.execute(sql, params).then(result => {
return result.affectedRows;
});
}
insert(sql, params) {
return this.execute(sql, params).then(result => {
return result.insertId;
});
}
execute(sql, params) {
return new Promise((resolve, reject) => {
this.getConnection().then(connection => {
connection.query(sql, params, (queryErr, result) => {
connection.release();
if (queryErr) {
reject(queryErr);
} else {
resolve(result);
}
});
}
transaction(sqls, cb) {
return new Promise((resolve, reject) => {
this.getConnection().then(connection => {
let promises = _.map(sqls, sql => {
return new Promise((res, rej) => {
connection.query(sql, (queryErr, result) => {
if (queryErr) {
connection.rollback();
rej(queryErr);
} else {
}).catch(e => {
reject(e);
});
});
}
transaction(sqls, cb) {
return new Promise((resolve, reject) => {
this.getConnection().then(connection => {
let promises = _.map(sqls, sql => {
return new Promise((res, rej) => {
connection.query(sql, (queryErr, result) => {
if (queryErr) {
connection.rollback();
rej(queryErr);
} else {
cb && cb(sql); // eslint-disable-line
res(result);
}
});
});
});
Promise.all(promises).then(results => {
connection.commit(err => {
if (err) {
connection.rollback(() => {
connection.release();
});
reject();
} else {
connection.release();
resolve(results);
}
});
}, () => {
reject();
});
res(result);
}
});
});
});
}
changeDatabase(database) {
return new Promise(resolve => {
this.pool.end(() => {
this.createPool(database);
resolve();
});
Promise.all(promises).then(results => {
connection.commit(err => {
if (err) {
connection.rollback(() => {
connection.release();
});
reject();
} else {
connection.release();
resolve(results);
}
});
}, () => {
reject();
});
}
close() {
this.pool.end();
}
});
});
}
changeDatabase(database) {
return new Promise(resolve => {
this.pool.end(() => {
this.createPool(database);
resolve();
});
});
}
close() {
this.pool.end();
}
}
module.exports = MysqlAdapter;
module.exports.mysqlPool = new MysqlAdapter(config.database.connect, config.database.database);
... ...
const _ = require('lodash')
const MysqlAdapter = require('./mysql')
const config = require('../config/index')
const {mysqlPool} = require('./mysql');
const mysql = new MysqlAdapter(config.database.connect, config.database.database)
module.exports = async(data) => {
let dataId = 0;
const {productId, sizeId, price, time} = data;
const sknCache = {}
module.exports = async (data) => {
let dataId = 0
const {productId, sizeId, price, time} = data
const cachekey = `p:${productId}_s:${sizeId}`
if (sknCache[cachekey]) {
dataId = sknCache[cachekey].id
}
if (!dataId) {
try {
const result = await mysql.query('SELECT * FROM `channel_sku_compare` WHERE `product_id` = :productId AND `size_id` = :sizeId', {
productId,
sizeId
})
try {
const updateRows = await mysqlPool.update('UPDATE `channel_sku_compare` SET `channel_price` = :channelPrice, `update_time` = :updateTime WHERE `product_id` = :productId AND `size_id` = :sizeId', {
channelPrice: price,
updateTime: time,
productId,
sizeId
});
if (result.length) {
dataId =_.first(result).id
} else {
// mysql.insert('INSERT `channel_sku_compare` (`product_id`, `sku`, `size_id`, `channel_price`, `update_time`) VALUES (:productId, 0, :sizeId, 0, 0)', {
// productId,
// sizeId
// })
return Promise.reject(new Error(`channel_sku_compare表未找到对应的数据, productId: ${productId}, sizeId: ${sizeId}`))
}
} catch(error) {
return Promise.reject(new Error(`channel_sku_compare表查询失败: ${error.message}`))
if (!updateRows) {
return Promise.reject(new Error(`更新channel_sku_compare表失败 ${JSON.stringify(data)}`));
}
}
try {
const changedRows = await mysql.update('UPDATE `channel_sku_compare` SET `channel_price` = :channelPrice, `update_time` = :updateTime WHERE `id` = :dataId', {
const insertId = await mysqlPool.insert('INSERT INTO `channel_sku_compare_record` (`product_id`, `size_id`, `channel_price`, `create_time`) VALUES (:productId, :sizeId, :channelPrice, :createTime)', {
productId,
sizeId,
channelPrice: price,
updateTime: time / 1000,
dataId
})
createTime: time
});
if (changedRows <= 0) {
return Promise.reject(new Error(`更新channel_sku_compare表失败 dataId: ${dataId} ${JSON.stringify(data)}`))
if (!insertId) {
return Promise.reject(new Error(`插入channel_sku_compare_record表失败 ${JSON.stringify(data)}`));
} else {
return Promise.resolve({
price,
sizeId,
productId,
dataId
})
});
}
} catch (error) {
return Promise.reject(new Error(`更新channel_sku_compare表错误: ${JSON.stringify(data)}, ${error.message}`))
return Promise.reject(new Error(`更新channel_sku_compare表错误: ${JSON.stringify(data)}, ${error.message}`));
}
}
\ No newline at end of file
};
... ...
const md5 = require('yoho-md5')
const _ = require('lodash')
const rp = require('request-promise')
const nodeLockup = require('node-lockup')
const chalk = require('chalk')
const md5 = require('yoho-md5');
const rp = require('request-promise');
const nodeLockup = require('node-lockup');
const chalk = require('chalk');
const {logger} = require('./logger');
const config = require('../config/index')
const logger = global.logger
const config = require('../config/index');
const sign = (obj) => {
let constr = ''
let constr = '';
Object.keys(obj).sort().forEach(k => {
constr += k + obj[k].toString();
})
});
return md5(constr + '048a9c4943398714b356a696503d2d36');
}
};
const task = async (options, tick = 1) => {
const params = Object.assign({}, options)
const task = async(options, tick = 1) => {
const params = Object.assign({}, options);
delete params.url
params.sign = sign(params)
delete params.url;
params.sign = sign(params);
try {
const result = await rp.get({
url: options.url,
qs: params,
json: true,
headers: {
'Accept': 'application/json, text/plain, */*',
'appVersion': '3.4.2',
'Referer': 'http://du.hupu.com/mdu/product/detail.html?id=1&source=boutiqueRecommend',
Accept: 'application/json, text/plain, */*',
appVersion: '3.4.2',
Referer: 'http://du.hupu.com/mdu/product/detail.html?id=1&source=boutiqueRecommend',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 Safari/604.1',
'X-Requested-With': 'XMLHttpRequest'
}
})
});
return result
return result;
} catch (error) {
logger.error(chalk.red(`error:${options}:tick:${tick} ====> ${error}`))
logger.error(chalk.red(`error:${options}:tick:${tick} ====> ${error}`));
if (tick >= 3) {
return Promise.resolve({})
return Promise.resolve({});
}
return task(options, tick + 1)
return task(options, tick + 1);
}
}
const lockTask = nodeLockup(task, config.delay)
};
const lockTask = nodeLockup(task, config.delay);
module.exports = (ids, url = 'http://du.hupu.com/mapi/product/detail', params) => {
return ids.map(id => lockTask(Object.assign({
productId: id,
source: 'boutiqueRecommend',
url
}, params)))
}
\ No newline at end of file
}, params)));
};
... ...
const {transports, createLogger, format} = require('winston')
require('winston-daily-rotate-file')
module.exports = (loggers) => {
const tps = loggers.map(log => {
switch (log.type) {
case 'console':
return new transports.Console(Object.assign({
level: 'info'
}, log))
case 'file':
return new transports.File(Object.assign({
level: 'info',
zippedArchive: true,
maxsize: 209715200, // 200m
maxFiles: 7,
}, log))
case 'dailyfile':
return new transports.DailyRotateFile(Object.assign({
level: 'info',
zippedArchive: true,
maxSize: '200m',
maxFiles: '7d',
datePattern: 'YYYY-MM-DD',
dirname: './logs'
}, log))
}
})
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({
format: () => {
return new Date().toLocaleString()
}
}),
format.printf(info => `${info.level}: ${info.message}`)
),
transports: tps
})
logger.mount = (o) => {
o['logger'] = logger
}
return logger
}
\ No newline at end of file
const Nedb = require('nedb-promise')
const path = require('path')
const _ = require('lodash')
const dayjs = require('dayjs')
const Nedb = require('nedb-promise');
const path = require('path');
const _ = require('lodash');
const dayjs = require('dayjs');
const db = new Nedb({
filename: path.join(__dirname, `db/data.json`),
filename: path.join(__dirname, 'db/data.json'),
autoload: true
})
});
const ids = [20, 11172, 11538, 11653, 9536, 9431, 2358, 11621, 11408, 14546, 11746, 2355, 8815, 9670, 8708]
const ids = [20, 11172, 11538, 11653, 9536, 9431, 2358, 11621, 11408, 14546, 11746, 2355, 8815, 9670, 8708];
Promise.all(ids.map(id => {
return db.cfind({productId: id}).sort({date: 1}).exec().then(result => {
const firstbuys = _.first(result).lastSoldList.map(r => r.icon)
const first = _.first(result)
const last = _.last(result)
const buys = new Set(_.flatten(_.map(result, r => r.lastSoldList.map(r => r.icon))))
const intrBuys = Array.from(buys).filter(r => !_.some(firstbuys, f => f === r))
const firstbuys = _.first(result).lastSoldList.map(r => r.icon);
const first = _.first(result);
const last = _.last(result);
const buys = new Set(_.flatten(_.map(result, r => r.lastSoldList.map(r => r.icon))));
const intrBuys = Array.from(buys).filter(r => !_.some(firstbuys, f => f === r));
const group = _.groupBy(result, 'soldNum')
const group = _.groupBy(result, 'soldNum');
const dates = _.map(Object.keys(group).sort(), (k) => {
const item = _.first(group[k])
return item
})
const item = _.first(group[k]);
return item;
});
for (let i = 0; i < dates.length; i++) {
if (dates[i + 1]) {
const day = dayjs(dates[i].date)
const nextDay = dayjs(dates[i + 1].date)
const day = dayjs(dates[i].date);
const nextDay = dayjs(dates[i + 1].date);
}
}
let intrMax = 0
let intrMax = 0;
for (let i = 0; i < result.length; i++) {
if (i < result.length - 1) {
const intr = result[i + 1].soldNum - result[i].soldNum
const day = dayjs(result[i].date)
const nextDay = dayjs(result[i + 1].date)
const intr = result[i + 1].soldNum - result[i].soldNum;
const day = dayjs(result[i].date);
const nextDay = dayjs(result[i + 1].date);
if (intr >= 1) {
// console.log(result[i + 1].date, nextDay.format('YYYY-MM-DD HH:mm'), result[i].date, intr)
}
intrMax = intr > intrMax ? intr : intrMax
intrMax = intr > intrMax ? intr : intrMax;
}
}
return `soldNum${last.soldNum - first.soldNum}, buysNum${intrBuys.length}, eq${last.soldNum - first.soldNum === intrBuys.length}, productId${id}, max${intrMax}`
})
return `soldNum${last.soldNum - first.soldNum}, buysNum${intrBuys.length}, eq${last.soldNum - first.soldNum === intrBuys.length}, productId${id}, max${intrMax}`;
});
})).then(result => {
console.log(result)
})
\ No newline at end of file
console.log(result);
});
... ...
const dayjs = require('dayjs')
const _ = require('lodash')
const dayjs = require('dayjs');
const _ = require('lodash');
require('../libs/logger')
const config = require('../config/index')
const MysqlAdapter = require('../libs/mysql')
const spider = require('../libs/spider')
require('../libs/logger');
const config = require('../config/index');
const MysqlAdapter = require('../libs/mysql');
const spider = require('../libs/spider');
const mysql = new MysqlAdapter(config.database.connect, config.database.database)
const mysql = new MysqlAdapter(config.database.connect, config.database.database);
const RegDay = /(\d+)天前/
const RegDate = /(\d+)(\d+)日/
const RegDay = /(\d+)天前/;
const RegDate = /(\d+)(\d+)日/;
let count = 0
let inx = 2617;
const parseTime = (relativeTime) => {
const match = relativeTime.match(RegDay)
const match = relativeTime.match(RegDay);
if (match) {
return dayjs().add(0 - match[1], 'day')
return dayjs().add(0 - match[1], 'day');
}
const matchDate = relativeTime.match(RegDate)
const matchDate = relativeTime.match(RegDate);
if (matchDate) {
return dayjs(`2018/${matchDate[1]}/${matchDate[2]}`)
return dayjs(`2018/${matchDate[1]}/${matchDate[2]}`);
}
return dayjs()
}
return dayjs();
};
let time = Date.now()
let end = 0
let time = Date.now();
let end = 0;
const getLeftTime = () => {
let offset = (end || Date.now()) - time
let intervalTime = (offset / inx) / 1000
let leftTime = (19635 - inx) * intervalTime
const hour = parseInt(leftTime / 36000)
leftTime = leftTime % 3600
const mins = parseInt(leftTime / 60)
return `${hour}小时${mins}分钟${parseInt(leftTime % 60)}秒`
}
const spiderBuyers = async (productId, lsId = 0, page = 0) => {
let offset = (end || Date.now()) - time;
let intervalTime = (offset / inx) / 1000;
let leftTime = (19635 - inx) * intervalTime;
const hour = parseInt(leftTime / 36000);
leftTime = leftTime % 3600;
const mins = parseInt(leftTime / 60);
return `${hour}小时${mins}分钟${parseInt(leftTime % 60)}秒`;
};
const spiderBuyers = async(productId, lsId = 0, page = 0) => {
const promises = spider([productId], 'https://du.hupu.com/mapi/product/lastSoldList', {
lastId: lsId
})
});
promises.forEach(promise => promise.then(result => {
if (result.status === 200) {
const {list, lastId} = result.data
const {list, lastId} = result.data;
list.forEach(info => {
... ... @@ -59,32 +61,33 @@ const spiderBuyers = async (productId, lsId = 0, page = 0) => {
time: parseTime(info.formatTime).format('YYYY-MM-DD'),
soldNum: products[productId].count,
price: products[productId].price,
})
})
});
});
console.clear()
console.log(`page: ${page}, count: ${products[productId].count}, lastId: ${lastId}, 进度: ${inx}/${19635}(${parseInt((page * 20 + list.length) / products[productId].count * 100)}%), 剩余: ${getLeftTime()}, productId: ${productId}`)
console.clear();
console.log(`page: ${page}, count: ${products[productId].count}, lastId: ${lastId}, 进度: ${inx}/${19635}(${parseInt((page * 20 + list.length) / products[productId].count * 100)}%), 剩余: ${getLeftTime()}, productId: ${productId}`);
if (lastId) {
spiderBuyers(productId, lastId, page + 1)
spiderBuyers(productId, lastId, page + 1);
} else {
end = Date.now()
start()
end = Date.now();
start();
}
}
}))
}
const ids = [3,8,10,16,17,20,21,33,39,113,126,134,161,203,206,278,685,775,913,920,930,954,1154,1181,1188,1226,1541,2139,2188,2189,2200,2201,2284,2290,2291,2292,2294,2306,2307,2347,2348,2353,2354,2355,2356,2357,2358,2363,2390,2405,2453,2701,3428,3430,3494,3638,3655,3688,3736,3751,3869,3881,3941,4233,4371,5889,5936,6079,7705,8699,8707,8708,8722,8727,8741,8814,8815,8822,8846,8847,8865,8866,8868,8873,8874,8880,8881,8906,8920,8921,8924,8928,8929,8949,8960,8972,8981,8990,9002,9007,9008,9018,9027,9033,9043,9057,9074,9084,9104,9119,9179,9212,9224,9225,9235,9236,9240,9242,9249,9296,9309,9316,9333,9345,9356,9357,9391,9395,9405,9416,9419,9426,9429,9431,9451,9511,9534,9536,9565,9604,9670,9675,9680,9684,9754,9773,9819,9887,9888,9933,9937,9940,9946,9947,9948,9949,9951,9952,9957,9969,9970,9971,9982,10063,10097,10129,10130,10145,10207,10237,10238,10239,10240,10241,10274,10293,10307,10337,10338,10351,10407,10412,10417,10424,10437,10451,10484,10485,10486,10515,10567,10574,10579,10636,10637,10710,10762,10779,10787,10797,10798,10801,10881,10904,10941,10942,11058,11061,11063,11119,11132,11172,11213,11329,11330,11331,11373,11408,11415,11443,11446,11448,11520,11521,11538,11558,11568,11618,11621,11641,11653,11687,11723,11724,11746,11818,11826,11839,11842,11945,11989,12058,12225,12226,12238,12241,12366,12508,12548,12578,12622,12652,12766,12769,12859,12893,12951,12954,13014,13166,13270,13309,13325,13387,13612,13644,13704,13936,14058,14450,14522,14545,14546,14670,14683,14775,14886,14887,14888,14900,14917,14960,15081,15191,15192,15204,15205,15316,15357,15363,15538,15581,15676,15685,16161,16231,16256,16420,16423,17364,]
let inx = 2617
}));
};
const products = {}
const ids = [3, 8, 10, 16, 17, 20, 21, 33, 39, 113, 126, 134, 161, 203, 206, 278, 685, 775, 913, 920, 930, 954, 1154, 1181, 1188, 1226, 1541, 2139, 2188, 2189, 2200, 2201, 2284, 2290, 2291, 2292, 2294, 2306, 2307, 2347, 2348, 2353, 2354, 2355, 2356, 2357, 2358, 2363, 2390, 2405, 2453, 2701, 3428, 3430, 3494, 3638, 3655, 3688, 3736, 3751, 3869, 3881, 3941, 4233, 4371, 5889, 5936, 6079, 7705, 8699, 8707, 8708, 8722, 8727, 8741, 8814, 8815, 8822, 8846, 8847, 8865, 8866, 8868, 8873, 8874, 8880, 8881, 8906, 8920, 8921, 8924, 8928, 8929, 8949, 8960, 8972, 8981, 8990, 9002, 9007, 9008, 9018, 9027, 9033, 9043, 9057, 9074, 9084, 9104, 9119, 9179, 9212, 9224, 9225, 9235, 9236, 9240, 9242, 9249, 9296, 9309, 9316, 9333, 9345, 9356, 9357, 9391, 9395, 9405, 9416, 9419, 9426, 9429, 9431, 9451, 9511, 9534, 9536, 9565, 9604, 9670, 9675, 9680, 9684, 9754, 9773, 9819, 9887, 9888, 9933, 9937, 9940, 9946, 9947, 9948, 9949, 9951, 9952, 9957, 9969, 9970, 9971, 9982, 10063, 10097, 10129, 10130, 10145, 10207, 10237, 10238, 10239, 10240, 10241, 10274, 10293, 10307, 10337, 10338, 10351, 10407, 10412, 10417, 10424, 10437, 10451, 10484, 10485, 10486, 10515, 10567, 10574, 10579, 10636, 10637, 10710, 10762, 10779, 10787, 10797, 10798, 10801, 10881, 10904, 10941, 10942, 11058, 11061, 11063, 11119, 11132, 11172, 11213, 11329, 11330, 11331, 11373, 11408, 11415, 11443, 11446, 11448, 11520, 11521, 11538, 11558, 11568, 11618, 11621, 11641, 11653, 11687, 11723, 11724, 11746, 11818, 11826, 11839, 11842, 11945, 11989, 12058, 12225, 12226, 12238, 12241, 12366, 12508, 12548, 12578, 12622, 12652, 12766, 12769, 12859, 12893, 12951, 12954, 13014, 13166, 13270, 13309, 13325, 13387, 13612, 13644, 13704, 13936, 14058, 14450, 14522, 14545, 14546, 14670, 14683, 14775, 14886, 14887, 14888, 14900, 14917, 14960, 15081, 15191, 15192, 15204, 15205, 15316, 15357, 15363, 15538, 15581, 15676, 15685, 16161, 16231, 16256, 16420, 16423, 17364];
const products = {};
const start = () => {
const productId = inx
const productId = inx;
inx++
inx++;
if (inx >= 19635) {
console.log('over!!!!!!')
return
console.log('over!!!!!!');
return;
}
if (ids.some(id => id === productId)) {
... ... @@ -93,23 +96,24 @@ const start = () => {
productId: productId,
soldNum: result.data.detail.soldNum,
price: result.data.item.price
})
});
}));
start()
start();
} else {
if (products[productId]) {
spiderBuyers(productId)
spiderBuyers(productId);
} else {
spider([productId]).forEach(promise => promise.then(result => {
products[productId] = {
count: _.get(result, 'data.detail.soldNum', 0),
price: _.get(result, 'data.item.price', 0)
}
spiderBuyers(productId)
}))
};
spiderBuyers(productId);
}));
}
}
}
start()
};
start();
//1164952
\ No newline at end of file
// 1164952
... ...
const schedule = require('node-schedule')
const path = require('path')
const Nedb = require('nedb-promise')
const dayjs = require('dayjs')
const schedule = require('node-schedule');
const path = require('path');
const Nedb = require('nedb-promise');
const dayjs = require('dayjs');
const spider = require('../libs/spider')
const spider = require('../libs/spider');
const db = new Nedb({
filename: path.join(__dirname, `db/data.json`),
filename: path.join(__dirname, 'db/data.json'),
autoload: true
})
});
const ids = [20, 11172, 11538, 11653, 9536, 9431, 2358, 11621, 11408, 14546, 11746, 2355, 8815, 9670, 8708]
const ids = [20, 11172, 11538, 11653, 9536, 9431, 2358, 11621, 11408, 14546, 11746, 2355, 8815, 9670, 8708];
schedule.scheduleJob('0 */1 * * * *', async () => {
const date = dayjs().format('YYYY-MM-DD HH:mm')
console.log(`start scheduleJob, ${date}`)
schedule.scheduleJob('0 */1 * * * *', async() => {
const date = dayjs().format('YYYY-MM-DD HH:mm');
const result = await spider(ids)
console.log(`start scheduleJob, ${date}`);
const result = await spider(ids);
db.insert(result.map(r => {
r.date = date
return r
}))
})
\ No newline at end of file
r.date = date;
return r;
}));
});
... ...
... ... @@ -12,6 +12,7 @@
"chalk": "^2.4.1",
"cron-parser": "^2.7.1",
"dayjs": "^1.7.7",
"influx-batch-sender": "=0.1.7",
"lodash": "^4.17.11",
"mysql": "^2.16.0",
"nedb-promise": "^2.0.1",
... ... @@ -19,9 +20,12 @@
"node-schedule": "^1.3.0",
"request": "^2.88.0",
"request-promise": "^4.2.2",
"influx-batch-sender": "=0.1.7",
"winston": "^3.1.0",
"winston-daily-rotate-file": "^3.5.1",
"yoho-md5": "^2.1.0"
},
"devDependencies": {
"eslint": "^5.9.0",
"eslint-config-yoho": "^1.1.0"
}
}
... ...
const dayjs = require('dayjs');
const _ = require('lodash');
const {logger} = require('../libs/logger');
const {mysqlPool} = require('../libs/mysql');
module.exports = async() => {
const beginTime = dayjs().subtract(24, 'hour').unix();
const endTime = dayjs().unix();
const records = await mysqlPool.query('SELECT CONCAT(`product_id`, \'_\', `size_id`) AS `key`, `product_id`, `size_id`, `channel_price` FROM `channel_sku_compare_record` WHERE `create_time` BETWEEN :beginTime AND :endTime', {
beginTime,
endTime
});
const skuGroups = _.groupBy(records, 'key');
_.each(skuGroups, async(list, key) => {
if (list.length < 3) {
return;
}
const sortList = _.sortBy(list, 'channel_price');
const prices = sortList.map(p => p.channel_price);
const avgPrice = _.mean(_.dropRight(_.drop(prices)));
if (!avgPrice) {
logger.error(`计算平均价格错误, key: ${key}, avgPrice: ${avgPrice}, size: ${list.length}, beginTime: ${beginTime}, endTime: ${endTime}`);
return;
}
try {
const productId = key.split('_')[0];
const sizeId = key.split('_')[1];
const changeRows = await mysqlPool.update('UPDATE `channel_sku_compare` SET `channel_average_price` = :avgPrice WHERE `product_id` = :productId AND `size_id` = :sizeId', {
avgPrice,
productId,
sizeId
});
if (changeRows <= 0) {
logger.error(`更新平均价格失败, key: ${key}, avgPrice: ${avgPrice}, beginTime: ${beginTime}, endTime: ${endTime}`);
} else {
logger.info(`更新计算平均价成功, key: ${key}, price: ${avgPrice}`);
}
} catch (error) {
logger.error(`更新平均价格错误, error: ${error.stack}`);
}
});
};
... ...
const _ = require('lodash')
const _ = require('lodash');
const spider = require('./libs/spider')
const report = require('./libs/report')
const sknsData = require('./data/skns.json')
const sizeRelation = require('./data/size.json')
const logger = global.logger
const spider = require('../libs/spider');
const report = require('../libs/report');
const sknsData = require('../data/skns.json');
const sizeRelation = require('../data/size.json');
const {logger} = require('../libs/logger');
const sendMessage = (tick, sku, time) => {
if (!global.sender || !global.isProduction) {
return;
return;
}
try {
global.sender.addMessage({
measurement: 'spider_ufo_success_report',
tags: {
type: 'ufo'
},
fields: {
tick,
sku
},
time
});
global.sender.addMessage({
measurement: 'spider_ufo_success_report',
tags: {
type: 'ufo'
},
fields: {
tick,
sku
},
time
});
} catch (e) {
console.error(e);
console.error(e);
}
};
module.exports = async () => {
module.exports = async(time) => {
spider(sknsData.map(p => p.productId))
.forEach(promise => promise.then(result => {
if (result.status !== 200 && !_.has(result, 'data.detail')) {
logger.warn(`爬取失败记录:${JSON.stringify(result)}`)
return
logger.warn(`爬取失败记录: ${JSON.stringify(result)}`);
return;
}
const {data: {detail, sizeList}} = result
const yhProduct = sknsData.find(p => p.productId === detail.productId)
const hrtime = process.hrtime()
const timestamp = parseInt(Date.now() / 1000) * 1000000000
const {data: {detail, sizeList}} = result;
const yhProduct = sknsData.find(p => p.productId === detail.productId);
const hrtime = process.hrtime();
const timestamp = parseInt(Date.now() / 1000, 10) * 1000000000;
sizeList.forEach(s => {
if (_.isPlainObject(s.item) && s.item.price > 0) {
const find = sizeRelation[s.size]
const find = sizeRelation[s.size];
if (!find) {
return logger.error(`爬取尺码对应关系未找到: ${JSON.stringify(s)}`)
return logger.error(`爬取尺码对应关系未找到: ${JSON.stringify(s)}`);
}
report({
productId: yhProduct.yhId,
sizeId: find.sizeId,
price: s.item.price / 100,
time: Date.now()
time
}).then((data) => {
const reportTime = timestamp + process.hrtime(hrtime)[1]
const reportTime = timestamp + process.hrtime(hrtime)[1];
console.log(`productId: ${data.productId}, sizeId: ${data.sizeId}, price: ${data.price}, ${reportTime}`)
sendMessage(1, data.dataId, reportTime)
logger.info(`更新sku价格成功记录, duId:${detail.productId}, yhId: ${yhProduct.yhId}, sizeId: ${find.sizeId}, time: ${time}`);
sendMessage(1, data.dataId, reportTime);
}).catch(error => {
logger.error(error.message)
})
logger.error(error.message);
});
}
})
}))
}
\ No newline at end of file
});
}));
};
... ...
... ... @@ -2,6 +2,37 @@
# yarn lockfile v1
"@babel/code-frame@^7.0.0":
version "7.0.0"
resolved "http://npm.yohops.com/@babel%2fcode-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
dependencies:
"@babel/highlight" "^7.0.0"
"@babel/highlight@^7.0.0":
version "7.0.0"
resolved "http://npm.yohops.com/@babel%2fhighlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
dependencies:
chalk "^2.0.0"
esutils "^2.0.2"
js-tokens "^4.0.0"
acorn-jsx@^5.0.0:
version "5.0.1"
resolved "http://npm.yohops.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
acorn@^6.0.2:
version "6.0.4"
resolved "http://npm.yohops.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
ajv@^6.5.3, ajv@^6.6.1:
version "6.6.1"
resolved "http://npm.yohops.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
dependencies:
fast-deep-equal "^2.0.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^6.5.5:
version "6.5.5"
resolved "http://npm.yohops.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1"
... ... @@ -11,7 +42,15 @@ ajv@^6.5.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-styles@^3.2.1:
ansi-escapes@^3.0.0:
version "3.1.0"
resolved "http://npm.yohops.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "http://npm.yohops.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "http://npm.yohops.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
dependencies:
... ... @@ -21,6 +60,12 @@ any-promise@^1.0.0:
version "1.3.0"
resolved "http://npm.yohops.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
argparse@^1.0.7:
version "1.0.10"
resolved "http://npm.yohops.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
dependencies:
sprintf-js "~1.0.2"
asn1@~0.2.3:
version "0.2.4"
resolved "http://npm.yohops.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
... ... @@ -31,6 +76,10 @@ assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
astral-regex@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
async@0.2.10:
version "0.2.10"
resolved "http://npm.yohops.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
... ... @@ -53,6 +102,10 @@ aws4@^1.8.0:
version "1.8.0"
resolved "http://npm.yohops.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
balanced-match@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "http://npm.yohops.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
... ... @@ -73,11 +126,28 @@ bluebird@^3.5.0:
version "3.5.3"
resolved "http://npm.yohops.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "http://npm.yohops.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
caller-path@^0.1.0:
version "0.1.0"
resolved "http://npm.yohops.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
dependencies:
callsites "^0.2.0"
callsites@^0.2.0:
version "0.2.0"
resolved "http://npm.yohops.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
caseless@~0.12.0:
version "0.12.0"
resolved "http://npm.yohops.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
chalk@^2.4.1:
chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1:
version "2.4.1"
resolved "http://npm.yohops.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
... ... @@ -85,6 +155,24 @@ chalk@^2.4.1:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chardet@^0.7.0:
version "0.7.0"
resolved "http://npm.yohops.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
circular-json@^0.3.1:
version "0.3.3"
resolved "http://npm.yohops.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
cli-cursor@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
dependencies:
restore-cursor "^2.0.0"
cli-width@^2.0.0:
version "2.2.0"
resolved "http://npm.yohops.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
color-convert@^1.9.0, color-convert@^1.9.1:
version "1.9.3"
resolved "http://npm.yohops.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
... ... @@ -134,6 +222,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
concat-map@0.0.1:
version "0.0.1"
resolved "http://npm.yohops.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "http://npm.yohops.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
... ... @@ -145,6 +237,16 @@ cron-parser@^2.4.0, cron-parser@^2.7.1:
is-nan "^1.2.1"
moment-timezone "^0.5.23"
cross-spawn@^6.0.5:
version "6.0.5"
resolved "http://npm.yohops.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
semver "^5.5.0"
shebang-command "^1.2.0"
which "^1.2.9"
cycle@~1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
... ... @@ -165,6 +267,16 @@ debug@^3.0.1:
dependencies:
ms "^2.1.1"
debug@^4.0.1:
version "4.1.0"
resolved "http://npm.yohops.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87"
dependencies:
ms "^2.1.1"
deep-is@~0.1.3:
version "0.1.3"
resolved "http://npm.yohops.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
define-properties@^1.1.1:
version "1.1.3"
resolved "http://npm.yohops.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
... ... @@ -183,6 +295,12 @@ diagnostics@^1.1.1:
enabled "1.0.x"
kuler "1.0.x"
doctrine@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
dependencies:
esutils "^2.0.2"
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "http://npm.yohops.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
... ... @@ -204,10 +322,112 @@ escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "http://npm.yohops.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
eslint-config-yoho@^1.1.0:
version "1.1.0"
resolved "http://npm.yohops.com/eslint-config-yoho/-/eslint-config-yoho-1.1.0.tgz#9fc5d882a5f9e9af5c1f7914c8083d1816bc9614"
eslint-scope@^4.0.0:
version "4.0.0"
resolved "http://npm.yohops.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
dependencies:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-utils@^1.3.1:
version "1.3.1"
resolved "http://npm.yohops.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512"
eslint-visitor-keys@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
eslint@^5.9.0:
version "5.9.0"
resolved "http://npm.yohops.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e"
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.5.3"
chalk "^2.1.0"
cross-spawn "^6.0.5"
debug "^4.0.1"
doctrine "^2.1.0"
eslint-scope "^4.0.0"
eslint-utils "^1.3.1"
eslint-visitor-keys "^1.0.0"
espree "^4.0.0"
esquery "^1.0.1"
esutils "^2.0.2"
file-entry-cache "^2.0.0"
functional-red-black-tree "^1.0.1"
glob "^7.1.2"
globals "^11.7.0"
ignore "^4.0.6"
imurmurhash "^0.1.4"
inquirer "^6.1.0"
is-resolvable "^1.1.0"
js-yaml "^3.12.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0"
lodash "^4.17.5"
minimatch "^3.0.4"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.2"
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
regexpp "^2.0.1"
require-uncached "^1.0.3"
semver "^5.5.1"
strip-ansi "^4.0.0"
strip-json-comments "^2.0.1"
table "^5.0.2"
text-table "^0.2.0"
espree@^4.0.0:
version "4.1.0"
resolved "http://npm.yohops.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
dependencies:
acorn "^6.0.2"
acorn-jsx "^5.0.0"
eslint-visitor-keys "^1.0.0"
esprima@^4.0.0:
version "4.0.1"
resolved "http://npm.yohops.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
esquery@^1.0.1:
version "1.0.1"
resolved "http://npm.yohops.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
dependencies:
estraverse "^4.0.0"
esrecurse@^4.1.0:
version "4.2.1"
resolved "http://npm.yohops.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
dependencies:
estraverse "^4.1.0"
estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
version "4.2.0"
resolved "http://npm.yohops.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
esutils@^2.0.2:
version "2.0.2"
resolved "http://npm.yohops.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
extend@~3.0.2:
version "3.0.2"
resolved "http://npm.yohops.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
external-editor@^3.0.0:
version "3.0.3"
resolved "http://npm.yohops.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
dependencies:
chardet "^0.7.0"
iconv-lite "^0.4.24"
tmp "^0.0.33"
extsprintf@1.3.0:
version "1.3.0"
resolved "http://npm.yohops.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
... ... @@ -224,6 +444,10 @@ fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
fast-levenshtein@~2.0.4:
version "2.0.6"
resolved "http://npm.yohops.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
fast-safe-stringify@^2.0.4:
version "2.0.6"
resolved "http://npm.yohops.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
... ... @@ -232,12 +456,34 @@ fecha@^2.3.3:
version "2.3.3"
resolved "http://npm.yohops.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
figures@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
dependencies:
escape-string-regexp "^1.0.5"
file-entry-cache@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
dependencies:
flat-cache "^1.2.1"
object-assign "^4.0.1"
file-stream-rotator@^0.4.1:
version "0.4.1"
resolved "http://npm.yohops.com/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz#09f67b86d6ea589d20b7852c51c59de55d916d6d"
dependencies:
moment "^2.11.2"
flat-cache@^1.2.1:
version "1.3.4"
resolved "http://npm.yohops.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
dependencies:
circular-json "^0.3.1"
graceful-fs "^4.1.2"
rimraf "~2.6.2"
write "^0.2.1"
forever-agent@~0.6.1:
version "0.6.1"
resolved "http://npm.yohops.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
... ... @@ -250,12 +496,39 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "http://npm.yohops.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
getpass@^0.1.1:
version "0.1.7"
resolved "http://npm.yohops.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
dependencies:
assert-plus "^1.0.0"
glob@^7.0.5, glob@^7.1.2:
version "7.1.3"
resolved "http://npm.yohops.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
globals@^11.7.0:
version "11.9.0"
resolved "http://npm.yohops.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
graceful-fs@^4.1.2:
version "4.1.15"
resolved "http://npm.yohops.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
har-schema@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
... ... @@ -279,10 +552,31 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@^0.4.24:
version "0.4.24"
resolved "http://npm.yohops.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
dependencies:
safer-buffer ">= 2.1.2 < 3"
ignore@^4.0.6:
version "4.0.6"
resolved "http://npm.yohops.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
immediate@~3.0.5:
version "3.0.6"
resolved "http://npm.yohops.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
imurmurhash@^0.1.4:
version "0.1.4"
resolved "http://npm.yohops.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
inflight@^1.0.4:
version "1.0.6"
resolved "http://npm.yohops.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
dependencies:
once "^1.3.0"
wrappy "1"
influx-batch-sender@=0.1.7:
version "0.1.7"
resolved "http://npm.yohops.com/influx-batch-sender/-/influx-batch-sender-0.1.7.tgz#9f925bfc500e886cae27001b3cc20f2584fa464a"
... ... @@ -291,20 +585,50 @@ influx-batch-sender@=0.1.7:
lodash "^4.17.4"
request "^2.83.0"
inherits@~2.0.3:
inherits@2, inherits@~2.0.3:
version "2.0.3"
resolved "http://npm.yohops.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
inquirer@^6.1.0:
version "6.2.0"
resolved "http://npm.yohops.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8"
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.0"
cli-cursor "^2.1.0"
cli-width "^2.0.0"
external-editor "^3.0.0"
figures "^2.0.0"
lodash "^4.17.10"
mute-stream "0.0.7"
run-async "^2.2.0"
rxjs "^6.1.0"
string-width "^2.1.0"
strip-ansi "^4.0.0"
through "^2.3.6"
is-arrayish@^0.3.1:
version "0.3.2"
resolved "http://npm.yohops.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
is-nan@^1.2.1:
version "1.2.1"
resolved "http://npm.yohops.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2"
dependencies:
define-properties "^1.1.1"
is-promise@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
is-resolvable@^1.1.0:
version "1.1.0"
resolved "http://npm.yohops.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
is-stream@^1.1.0:
version "1.1.0"
resolved "http://npm.yohops.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
... ... @@ -317,10 +641,25 @@ isarray@~1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isexe@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
isstream@~0.1.2:
version "0.1.2"
resolved "http://npm.yohops.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
js-tokens@^4.0.0:
version "4.0.0"
resolved "http://npm.yohops.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
js-yaml@^3.12.0:
version "3.12.0"
resolved "http://npm.yohops.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
jsbn@~0.1.0:
version "0.1.1"
resolved "http://npm.yohops.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
... ... @@ -333,6 +672,10 @@ json-schema@0.2.3:
version "0.2.3"
resolved "http://npm.yohops.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "http://npm.yohops.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "http://npm.yohops.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
... ... @@ -352,6 +695,13 @@ kuler@1.0.x:
dependencies:
colornames "^1.1.1"
levn@^0.3.0, levn@~0.3.0:
version "0.3.0"
resolved "http://npm.yohops.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
dependencies:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lie@3.1.1:
version "3.1.1"
resolved "http://npm.yohops.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
... ... @@ -364,7 +714,7 @@ localforage@^1.3.0:
dependencies:
lie "3.1.1"
lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4:
lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5:
version "4.17.11"
resolved "http://npm.yohops.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
... ... @@ -392,11 +742,21 @@ mime-types@^2.1.12, mime-types@~2.1.19:
dependencies:
mime-db "~1.37.0"
mimic-fn@^1.0.0:
version "1.2.0"
resolved "http://npm.yohops.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
minimatch@^3.0.4:
version "3.0.4"
resolved "http://npm.yohops.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
brace-expansion "^1.1.7"
minimist@0.0.8:
version "0.0.8"
resolved "http://npm.yohops.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
mkdirp@~0.5.1:
mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.1"
resolved "http://npm.yohops.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
... ... @@ -416,6 +776,10 @@ ms@^2.1.1:
version "2.1.1"
resolved "http://npm.yohops.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
mute-stream@0.0.7:
version "0.0.7"
resolved "http://npm.yohops.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
mysql@^2.16.0:
version "2.16.0"
resolved "http://npm.yohops.com/mysql/-/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba"
... ... @@ -425,6 +789,10 @@ mysql@^2.16.0:
safe-buffer "5.1.2"
sqlstring "2.3.1"
natural-compare@^1.4.0:
version "1.4.0"
resolved "http://npm.yohops.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
nedb-promise@^2.0.1:
version "2.0.1"
resolved "http://npm.yohops.com/nedb-promise/-/nedb-promise-2.0.1.tgz#839b2e4909716fdf69500b7f68b2b8722582cd65"
... ... @@ -442,6 +810,10 @@ nedb@^1.8.0:
mkdirp "~0.5.1"
underscore "~1.4.4"
nice-try@^1.0.4:
version "1.0.5"
resolved "http://npm.yohops.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
node-lockup@^1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/node-lockup/-/node-lockup-1.0.3.tgz#8472738fad3bde97719428cf2d82b07e3b282fe8"
... ... @@ -458,6 +830,10 @@ oauth-sign@~0.9.0:
version "0.9.0"
resolved "http://npm.yohops.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
object-assign@^4.0.1:
version "4.1.1"
resolved "http://npm.yohops.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
object-hash@^1.3.0:
version "1.3.1"
resolved "http://npm.yohops.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
... ... @@ -466,18 +842,69 @@ object-keys@^1.0.12:
version "1.0.12"
resolved "http://npm.yohops.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
once@^1.3.0:
version "1.4.0"
resolved "http://npm.yohops.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
wrappy "1"
one-time@0.0.4:
version "0.0.4"
resolved "http://npm.yohops.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
onetime@^2.0.0:
version "2.0.1"
resolved "http://npm.yohops.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
dependencies:
mimic-fn "^1.0.0"
optionator@^0.8.2:
version "0.8.2"
resolved "http://npm.yohops.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
dependencies:
deep-is "~0.1.3"
fast-levenshtein "~2.0.4"
levn "~0.3.0"
prelude-ls "~1.1.2"
type-check "~0.3.2"
wordwrap "~1.0.0"
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "http://npm.yohops.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "http://npm.yohops.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
path-is-inside@^1.0.2:
version "1.0.2"
resolved "http://npm.yohops.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
path-key@^2.0.1:
version "2.0.1"
resolved "http://npm.yohops.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
performance-now@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
pluralize@^7.0.0:
version "7.0.0"
resolved "http://npm.yohops.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
prelude-ls@~1.1.2:
version "1.1.2"
resolved "http://npm.yohops.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
progress@^2.0.0:
version "2.0.1"
resolved "http://npm.yohops.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31"
psl@^1.1.24:
version "1.1.29"
resolved "http://npm.yohops.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
... ... @@ -506,6 +933,10 @@ readable-stream@2.3.6, readable-stream@^2.3.6:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
regexpp@^2.0.1:
version "2.0.1"
resolved "http://npm.yohops.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
request-promise-core@1.1.1:
version "1.1.1"
resolved "http://npm.yohops.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
... ... @@ -546,28 +977,90 @@ request@^2.83.0, request@^2.88.0:
tunnel-agent "^0.6.0"
uuid "^3.3.2"
require-uncached@^1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
dependencies:
caller-path "^0.1.0"
resolve-from "^1.0.0"
resolve-from@^1.0.0:
version "1.0.1"
resolved "http://npm.yohops.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
restore-cursor@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
dependencies:
onetime "^2.0.0"
signal-exit "^3.0.2"
rimraf@~2.6.2:
version "2.6.2"
resolved "http://npm.yohops.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
dependencies:
glob "^7.0.5"
run-async@^2.2.0:
version "2.3.0"
resolved "http://npm.yohops.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
dependencies:
is-promise "^2.1.0"
rxjs@^6.1.0:
version "6.3.3"
resolved "http://npm.yohops.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
dependencies:
tslib "^1.9.0"
safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "http://npm.yohops.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "http://npm.yohops.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
semver@^5.6.0:
semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.6.0"
resolved "http://npm.yohops.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
shebang-command@^1.2.0:
version "1.2.0"
resolved "http://npm.yohops.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
signal-exit@^3.0.2:
version "3.0.2"
resolved "http://npm.yohops.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "http://npm.yohops.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
dependencies:
is-arrayish "^0.3.1"
slice-ansi@2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7"
dependencies:
ansi-styles "^3.2.0"
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
sorted-array-functions@^1.0.0:
version "1.2.0"
resolved "http://npm.yohops.com/sorted-array-functions/-/sorted-array-functions-1.2.0.tgz#43265b21d6e985b7df31621b1c11cc68d8efc7c3"
sprintf-js@~1.0.2:
version "1.0.3"
resolved "http://npm.yohops.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
sqlstring@2.3.1:
version "2.3.1"
resolved "http://npm.yohops.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40"
... ... @@ -594,28 +1087,68 @@ stealthy-require@^1.1.0:
version "1.1.1"
resolved "http://npm.yohops.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1"
resolved "http://npm.yohops.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "http://npm.yohops.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "http://npm.yohops.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
dependencies:
ansi-regex "^3.0.0"
strip-json-comments@^2.0.1:
version "2.0.1"
resolved "http://npm.yohops.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
supports-color@^5.3.0:
version "5.5.0"
resolved "http://npm.yohops.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
dependencies:
has-flag "^3.0.0"
table@^5.0.2:
version "5.1.1"
resolved "http://npm.yohops.com/table/-/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837"
dependencies:
ajv "^6.6.1"
lodash "^4.17.11"
slice-ansi "2.0.0"
string-width "^2.1.1"
text-hex@1.0.x:
version "1.0.0"
resolved "http://npm.yohops.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
text-table@^0.2.0:
version "0.2.0"
resolved "http://npm.yohops.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
thenify@^3.2.0:
version "3.3.0"
resolved "http://npm.yohops.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
dependencies:
any-promise "^1.0.0"
through@^2.3.6:
version "2.3.8"
resolved "http://npm.yohops.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
tmp@^0.0.33:
version "0.0.33"
resolved "http://npm.yohops.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
dependencies:
os-tmpdir "~1.0.2"
tough-cookie@>=2.3.3, tough-cookie@~2.4.3:
version "2.4.3"
resolved "http://npm.yohops.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
... ... @@ -627,6 +1160,10 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
version "1.3.0"
resolved "http://npm.yohops.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
tslib@^1.9.0:
version "1.9.3"
resolved "http://npm.yohops.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "http://npm.yohops.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
... ... @@ -637,6 +1174,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "http://npm.yohops.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
type-check@~0.3.2:
version "0.3.2"
resolved "http://npm.yohops.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
dependencies:
prelude-ls "~1.1.2"
underscore@~1.4.4:
version "1.4.4"
resolved "http://npm.yohops.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
... ... @@ -663,6 +1206,12 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
which@^1.2.9:
version "1.3.1"
resolved "http://npm.yohops.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
dependencies:
isexe "^2.0.0"
winston-compat@^0.1.4:
version "0.1.4"
resolved "http://npm.yohops.com/winston-compat/-/winston-compat-0.1.4.tgz#599b4ce807ffe728713ecc25ede3f6b89425b739"
... ... @@ -703,6 +1252,20 @@ winston@^3.1.0:
triple-beam "^1.3.0"
winston-transport "^4.2.0"
wordwrap@~1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
wrappy@1:
version "1.0.2"
resolved "http://npm.yohops.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
write@^0.2.1:
version "0.2.1"
resolved "http://npm.yohops.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
dependencies:
mkdirp "^0.5.1"
yoho-md5@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/yoho-md5/-/yoho-md5-2.1.0.tgz#f0c00d343f775e77952ebce0826863ac52e0ad50"
... ...