Authored by 陈峰

init

other
node_modules
\ No newline at end of file
... ...
{
"env": {
"node": true
},
"extends": [
"eslint:recommended",
"yoho"
],
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 8
},
"rules": {
"camelcase": "off",
"max-len": "off"
}
}
... ...
# Created by https://www.gitignore.io/api/node,webstorm,netbeans,sublimetext,vim
### Node ###
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
jspm_packages
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
### WebStorm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
.idea/
# User-specific stuff:
.idea/workspace.xml
.idea/tasks.xml
.idea/dictionaries
.idea/vcs.xml
.idea/jsLibraryMappings.xml
# Sensitive or high-churn files:
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
# Gradle:
.idea/gradle.xml
.idea/libraries
# Mongo Explorer plugin:
.idea/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### WebStorm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
### NetBeans ###
nbproject/private/
nbbuild/
dist/
nbdist/
nbactions.xml
.nb-gradle/
### SublimeText ###
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json
### TSD ###
typings/
### Vim ###
# swap
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags
### TSD ###
typings/
### VS Code ###
.vscode/
### YOHO ###
dist
public/build/bundle/*
public/build/dll/*
public/build/dist/*
public/css/*
public/sprites
public/bundle/*
.eslintcache
.stylelintcache
*.log.*
nbproject/*
.DS_Store
.devhost
.happypack/*
.scannerwork
package-lock.json
yoho-yohobuy-wap.tar.gz
other/files
/db
other/output
\ No newline at end of file
... ...
const schedule = require('node-schedule');
const config = require('./spider-buyers.json');
const spiderBuyers = require('./spider-buyers');
schedule.scheduleJob(config.schedule, () => {
spiderBuyers();
});
... ...
const spider = require('./spider-buyers.js');
spider();
\ No newline at end of file
... ...
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));
default:
return void 0;
}
});
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([{
silent: true,
type: 'dailyfile',
level: 'info',
filename: 'logs/info.log',
}, {
silent: true,
type: 'dailyfile',
level: 'error',
filename: 'logs/error.log',
}, {
type: 'console',
level: 'debug',
}]);
... ...
const mysql = require('mysql');
const _ = require('lodash');
const isProduction = process.env.NODE_ENV === 'production';
// const {logger} = require('./logger');
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) {
let exeQuery;
if (!values) {
exeQuery = query;
} else {
exeQuery = query.replace(/:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
}
if (!isProduction) {
// logger.info(exeQuery);
}
return exeQuery;
},
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);
}
});
}).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();
});
});
});
}
changeDatabase(database) {
return new Promise(resolve => {
this.pool.end(() => {
this.createPool(database);
resolve();
});
});
}
close() {
this.pool.end();
}
}
module.exports = MysqlAdapter;
... ...
const md5 = require('yoho-md5');
const rp = require('request-promise');
const nodeLockup = require('node-lockup');
const chalk = require('chalk');
const {logger} = require('./logger');
const sign = (obj) => {
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);
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.5.0',
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'
},
timeout: 2000
});
return result;
} catch (error) {
logger.error(chalk.red(`error:${options}:tick:${tick} ====> ${error}`));
if (tick >= 3) {
return Promise.resolve({});
}
return task(options, tick + 1);
}
};
module.exports = (ids, url = 'http://du.hupu.com/mapi/product/detail', params, delay) => {
const lockTask = nodeLockup(task, delay || 1);
return ids.map(id => lockTask(Object.assign({
productId: id,
source: 'boutiqueRecommend',
url
}, params)));
};
module.exports.spiderFetch = (id, url = 'http://du.hupu.com/mapi/product/detail', params) => {
return task(Object.assign({
productId: id,
source: 'boutiqueRecommend',
url
}, params));
};
... ...
{
"name": "app-buyers",
"version": "1.0.0",
"description": "",
"main": "app-buyers.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"chalk": "^2.4.2",
"dayjs": "^1.8.12",
"lodash": "^4.17.11",
"mysql": "^2.16.0",
"node-lockup": "^1.0.3",
"node-schedule": "^1.3.2",
"request": "^2.88.0",
"request-promise": "^4.2.4",
"winston": "^3.2.1",
"winston-daily-rotate-file": "^3.8.0",
"yoho-md5": "^2.1.0"
}
}
... ...
const dayjs = require('dayjs');
const lockup = require('node-lockup');
const isBetween = require('dayjs/plugin/isBetween');
const _ = require('lodash');
const MysqlAdapter = require('./libs/mysql');
const spider = require('./libs/spider');
const config = require('./spider-buyers.json');
const {logger} = require('./libs/logger');
dayjs.extend(isBetween);
const mysql = new MysqlAdapter(config.connect, config.connect.database);
const products = {};
const RegNow = /刚刚/;
const RegMinute = /(\d+)分钟前/;
const RegHour = /(\d+)小时前/;
const RegDay = /(\d+)天前/;
const RegDate = /(\d+)(\d+)日/;
const RegDateFull = /\d+\.\d+\.\d+/;
let tableName;
const parseTime = (relativeTime) => {
const matchMinute = relativeTime.match(RegMinute);
if (matchMinute) {
return dayjs().add(0 - matchMinute[1], 'minute');
}
const matchHour = relativeTime.match(RegHour);
if (matchHour) {
return dayjs().add(0 - matchHour[1], 'hour');
}
const matchDay = relativeTime.match(RegDay);
if (matchDay) {
return dayjs().add(0 - matchDay[1], 'day');
}
const matchDate = relativeTime.match(RegDate);
if (matchDate) {
return dayjs(`2019/${matchDate[1]}/${matchDate[2]}`);
}
if (RegDateFull.test(relativeTime)) {
return dayjs(relativeTime);
}
if (RegNow.test(relativeTime)) {
return dayjs();
}
return dayjs('1990-01-01');
};
const spiderBuyers = async(productId, lsId = 0, page = 0, trys = 0) => {
const result = await spider.spiderFetch(productId, 'https://du.hupu.com/mapi/product/lastSoldList', {
lastId: lsId
});
let lastId;
let tryLogic = false;
let list = [];
if (result.status === 200) {
let skip = false;
lastId = result.data.lastId;
list = result.data.list;
list.forEach(info => {
const orderTime = parseTime(info.formatTime);
const startTime = dayjs().subtract(1, 'day').add(1, 'second');
if (!orderTime.isBefore(startTime)) {
mysql.insert('INSERT INTO `' + tableName + '` (`productId`, `nickName`, `icon`, `time`, `size`, `soldNum`, `price`) VALUES (:productId, :nickName, :icon, :time, :size, :soldNum, :price)', {
productId: productId,
nickName: info.buyer.userName,
icon: info.buyer.icon,
size: info.item.size,
time: orderTime.format('YYYY-MM-DD HH:mm:ss'),
soldNum: products[productId].count,
price: +products[productId].price / 100,
});
} else {
if (!skip) {
logger.info(`productid: ${productId}, skip time:${orderTime.format('YYYY-MM-DD HH:mm:ss')}`);
}
skip = true;
}
});
if (skip) {
return {productId};
}
} else {
if (trys < 3) {
tryLogic = true;
}
}
if (tryLogic) {
logger.info(`tryLogic ${trys}`);
return spiderBuyers(productId, lsId, page, trys + 1);
} else {
if (lastId) {
logger.info(`productId: ${productId}, nextPage: ${page}, lastId: ${lastId}`);
return spiderBuyers(productId, lastId, page + 1);
}
return {productId};
}
};
// 2721219
let max = 50000;
let failNum = 0;
let over = false;
const start = async(productId) => {
if (over) {
return;
}
if (productId >= max) {
over = true;
logger.info('over!!!!!!');
return;
}
const result = await spider.spiderFetch(productId);
if (result.status === 200) {
failNum = 0;
products[productId] = {
count: _.get(result, 'data.detail.soldNum', 0),
price: _.get(result, 'data.item.price', 0)
};
try {
await spiderBuyers(productId);
} catch (error) {
logger.info('error', error);
}
} else {
logger.info(productId, result.status);
if (result.status) {
failNum++;
}
}
if (failNum >= 20) {
over = true;
return logger.info('over!!!!!!', JSON.stringify(result));
}
return true;
};
const createDayTable = async() => {
tableName = `buyers_${dayjs().format('YYYY_MM_DD')}`;
const sql = `CREATE TABLE \`${tableName}\` (\`productId\` int(11) DEFAULT NULL,\`nickName\` varchar(50) DEFAULT NULL,\`icon\` varchar(200) DEFAULT NULL,\`time\` datetime DEFAULT NULL,\`size\` varchar(50) DEFAULT NULL,\`id\` int(11) NOT NULL AUTO_INCREMENT,\`soldNum\` int(11) DEFAULT NULL,\`price\` decimal(10,0) DEFAULT NULL,PRIMARY KEY (\`id\`),KEY \`index_name_icon\` (\`nickName\`,\`icon\`), KEY \`productid\` (\`productId\`) USING BTREE, KEY \`time\` (\`time\`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;`;
const result = await mysql.query(`SELECT table_name FROM information_schema.TABLES WHERE table_name ='${tableName}'`);
if (result.length) {
return;
}
return mysql.execute(sql);
};
const locktask = lockup(start);
// 4211292
module.exports = async() => {
await createDayTable();
Array.from({length: max}).forEach((v, i) => {
locktask(i + 1);
});
};
... ...
{
"connect": {
"database": "spider-ufo",
"host": "127.0.0.1",
"port": "3306",
"user": "root",
"password": "",
"charset": "utf8mb4",
"timezone": "+08:00"
},
"table": "buyers",
"schedule": "0 0 2 * * *"
}
\ No newline at end of file
... ...
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
ajv@^6.5.5:
version "6.10.0"
resolved "http://npm.yohops.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
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"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "http://npm.yohops.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
dependencies:
color-convert "^1.9.0"
asn1@~0.2.3:
version "0.2.4"
resolved "http://npm.yohops.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
dependencies:
safer-buffer "~2.1.0"
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"
async@^2.6.1:
version "2.6.2"
resolved "http://npm.yohops.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
dependencies:
lodash "^4.17.11"
asynckit@^0.4.0:
version "0.4.0"
resolved "http://npm.yohops.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "http://npm.yohops.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
aws4@^1.8.0:
version "1.8.0"
resolved "http://npm.yohops.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "http://npm.yohops.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
dependencies:
tweetnacl "^0.14.3"
bignumber.js@4.1.0:
version "4.1.0"
resolved "http://npm.yohops.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
bluebird@^3.5.0:
version "3.5.4"
resolved "http://npm.yohops.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
caseless@~0.12.0:
version "0.12.0"
resolved "http://npm.yohops.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
chalk@^2.4.2:
version "2.4.2"
resolved "http://npm.yohops.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
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"
dependencies:
color-name "1.1.3"
color-name@1.1.3:
version "1.1.3"
resolved "http://npm.yohops.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
color-name@^1.0.0:
version "1.1.4"
resolved "http://npm.yohops.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
color-string@^1.5.2:
version "1.5.3"
resolved "http://npm.yohops.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
color@3.0.x:
version "3.0.0"
resolved "http://npm.yohops.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a"
dependencies:
color-convert "^1.9.1"
color-string "^1.5.2"
colornames@^1.1.1:
version "1.1.1"
resolved "http://npm.yohops.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
colors@^1.2.1:
version "1.3.3"
resolved "http://npm.yohops.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
colorspace@1.1.x:
version "1.1.1"
resolved "http://npm.yohops.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972"
dependencies:
color "3.0.x"
text-hex "1.0.x"
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.7"
resolved "http://npm.yohops.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
dependencies:
delayed-stream "~1.0.0"
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"
cron-parser@^2.7.3:
version "2.11.0"
resolved "http://npm.yohops.com/cron-parser/-/cron-parser-2.11.0.tgz#c3bf477e01de6a56938d6625b92efd6cec30a8a5"
dependencies:
is-nan "^1.2.1"
moment-timezone "^0.5.23"
cycle@~1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
dashdash@^1.12.0:
version "1.14.1"
resolved "http://npm.yohops.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
dependencies:
assert-plus "^1.0.0"
dayjs@^1.8.12:
version "1.8.12"
resolved "http://npm.yohops.com/dayjs/-/dayjs-1.8.12.tgz#f9610fb9b115aa2fe2a07e742c130df418cee76a"
define-properties@^1.1.1:
version "1.1.3"
resolved "http://npm.yohops.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
dependencies:
object-keys "^1.0.12"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
diagnostics@^1.1.1:
version "1.1.1"
resolved "http://npm.yohops.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a"
dependencies:
colorspace "1.1.x"
enabled "1.0.x"
kuler "1.0.x"
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "http://npm.yohops.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
enabled@1.0.x:
version "1.0.2"
resolved "http://npm.yohops.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93"
dependencies:
env-variable "0.0.x"
env-variable@0.0.x:
version "0.0.5"
resolved "http://npm.yohops.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88"
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"
extend@~3.0.2:
version "3.0.2"
resolved "http://npm.yohops.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
extsprintf@1.3.0:
version "1.3.0"
resolved "http://npm.yohops.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
extsprintf@^1.2.0:
version "1.4.0"
resolved "http://npm.yohops.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
fast-deep-equal@^2.0.1:
version "2.0.1"
resolved "http://npm.yohops.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
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-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"
fecha@^2.3.3:
version "2.3.3"
resolved "http://npm.yohops.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
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"
forever-agent@~0.6.1:
version "0.6.1"
resolved "http://npm.yohops.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
form-data@~2.3.2:
version "2.3.3"
resolved "http://npm.yohops.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
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"
har-schema@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
har-validator@~5.1.0:
version "5.1.3"
resolved "http://npm.yohops.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
dependencies:
ajv "^6.5.5"
har-schema "^2.0.0"
has-flag@^3.0.0:
version "3.0.0"
resolved "http://npm.yohops.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
http-signature@~1.2.0:
version "1.2.0"
resolved "http://npm.yohops.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
inherits@^2.0.3, inherits@~2.0.3:
version "2.0.3"
resolved "http://npm.yohops.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
is-arrayish@^0.3.1:
version "0.3.2"
resolved "http://npm.yohops.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
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-stream@^1.1.0:
version "1.1.0"
resolved "http://npm.yohops.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
isarray@~1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isstream@~0.1.2:
version "0.1.2"
resolved "http://npm.yohops.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
jsbn@~0.1.0:
version "0.1.1"
resolved "http://npm.yohops.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "http://npm.yohops.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
json-schema@0.2.3:
version "0.2.3"
resolved "http://npm.yohops.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
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"
jsprim@^1.2.2:
version "1.4.1"
resolved "http://npm.yohops.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.2.3"
verror "1.10.0"
kuler@1.0.x:
version "1.0.1"
resolved "http://npm.yohops.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6"
dependencies:
colornames "^1.1.1"
lodash@^4.17.11:
version "4.17.11"
resolved "http://npm.yohops.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
logform@^1.6.0:
version "1.10.0"
resolved "http://npm.yohops.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e"
dependencies:
colors "^1.2.1"
fast-safe-stringify "^2.0.4"
fecha "^2.3.3"
ms "^2.1.1"
triple-beam "^1.2.0"
logform@^2.1.1:
version "2.1.2"
resolved "http://npm.yohops.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360"
dependencies:
colors "^1.2.1"
fast-safe-stringify "^2.0.4"
fecha "^2.3.3"
ms "^2.1.1"
triple-beam "^1.3.0"
long-timeout@0.1.1:
version "0.1.1"
resolved "http://npm.yohops.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514"
mime-db@~1.38.0:
version "1.38.0"
resolved "http://npm.yohops.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
mime-types@^2.1.12, mime-types@~2.1.19:
version "2.1.22"
resolved "http://npm.yohops.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
dependencies:
mime-db "~1.38.0"
moment-timezone@^0.5.23:
version "0.5.23"
resolved "http://npm.yohops.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463"
dependencies:
moment ">= 2.9.0"
"moment@>= 2.9.0", moment@^2.11.2:
version "2.24.0"
resolved "http://npm.yohops.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
ms@^2.1.1:
version "2.1.1"
resolved "http://npm.yohops.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
mysql@^2.16.0:
version "2.16.0"
resolved "http://npm.yohops.com/mysql/-/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba"
dependencies:
bignumber.js "4.1.0"
readable-stream "2.3.6"
safe-buffer "5.1.2"
sqlstring "2.3.1"
node-lockup@^1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/node-lockup/-/node-lockup-1.0.3.tgz#8472738fad3bde97719428cf2d82b07e3b282fe8"
node-schedule@^1.3.2:
version "1.3.2"
resolved "http://npm.yohops.com/node-schedule/-/node-schedule-1.3.2.tgz#d774b383e2a6f6ade59eecc62254aea07cd758cb"
dependencies:
cron-parser "^2.7.3"
long-timeout "0.1.1"
sorted-array-functions "^1.0.0"
oauth-sign@~0.9.0:
version "0.9.0"
resolved "http://npm.yohops.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
object-hash@^1.3.0:
version "1.3.1"
resolved "http://npm.yohops.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
object-keys@^1.0.12:
version "1.1.1"
resolved "http://npm.yohops.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
one-time@0.0.4:
version "0.0.4"
resolved "http://npm.yohops.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
performance-now@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
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"
psl@^1.1.24, psl@^1.1.28:
version "1.1.31"
resolved "http://npm.yohops.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
punycode@^1.4.1:
version "1.4.1"
resolved "http://npm.yohops.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "http://npm.yohops.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
qs@~6.5.2:
version "6.5.2"
resolved "http://npm.yohops.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
readable-stream@2.3.6, readable-stream@^2.3.6:
version "2.3.6"
resolved "http://npm.yohops.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.1.1:
version "3.3.0"
resolved "http://npm.yohops.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9"
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
request-promise-core@1.1.2:
version "1.1.2"
resolved "http://npm.yohops.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
dependencies:
lodash "^4.17.11"
request-promise@^4.2.4:
version "4.2.4"
resolved "http://npm.yohops.com/request-promise/-/request-promise-4.2.4.tgz#1c5ed0d71441e38ad58c7ce4ea4ea5b06d54b310"
dependencies:
bluebird "^3.5.0"
request-promise-core "1.1.2"
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
request@^2.88.0:
version "2.88.0"
resolved "http://npm.yohops.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
caseless "~0.12.0"
combined-stream "~1.0.6"
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
har-validator "~5.1.0"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
oauth-sign "~0.9.0"
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.4.3"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
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:
version "2.1.2"
resolved "http://npm.yohops.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
semver@^5.6.0:
version "5.7.0"
resolved "http://npm.yohops.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
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"
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"
sqlstring@2.3.1:
version "2.3.1"
resolved "http://npm.yohops.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40"
sshpk@^1.7.0:
version "1.16.1"
resolved "http://npm.yohops.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
bcrypt-pbkdf "^1.0.0"
dashdash "^1.12.0"
ecc-jsbn "~0.1.1"
getpass "^0.1.1"
jsbn "~0.1.0"
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
stack-trace@0.0.x:
version "0.0.10"
resolved "http://npm.yohops.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
stealthy-require@^1.1.1:
version "1.1.1"
resolved "http://npm.yohops.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
string_decoder@^1.1.1:
version "1.2.0"
resolved "http://npm.yohops.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
dependencies:
safe-buffer "~5.1.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"
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"
text-hex@1.0.x:
version "1.0.0"
resolved "http://npm.yohops.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
tough-cookie@^2.3.3:
version "2.5.0"
resolved "http://npm.yohops.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
tough-cookie@~2.4.3:
version "2.4.3"
resolved "http://npm.yohops.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
dependencies:
psl "^1.1.24"
punycode "^1.4.1"
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"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "http://npm.yohops.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "http://npm.yohops.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
uri-js@^4.2.2:
version "4.2.2"
resolved "http://npm.yohops.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
dependencies:
punycode "^2.1.0"
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "http://npm.yohops.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
uuid@^3.3.2:
version "3.3.2"
resolved "http://npm.yohops.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
verror@1.10.0:
version "1.10.0"
resolved "http://npm.yohops.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
winston-compat@^0.1.4:
version "0.1.4"
resolved "http://npm.yohops.com/winston-compat/-/winston-compat-0.1.4.tgz#599b4ce807ffe728713ecc25ede3f6b89425b739"
dependencies:
cycle "~1.0.3"
logform "^1.6.0"
triple-beam "^1.2.0"
winston-daily-rotate-file@^3.8.0:
version "3.8.0"
resolved "http://npm.yohops.com/winston-daily-rotate-file/-/winston-daily-rotate-file-3.8.0.tgz#887de6dcfad798374d4f4ed0598afd587541ffa4"
dependencies:
file-stream-rotator "^0.4.1"
object-hash "^1.3.0"
semver "^5.6.0"
triple-beam "^1.3.0"
winston-compat "^0.1.4"
winston-transport "^4.2.0"
winston-transport@^4.2.0, winston-transport@^4.3.0:
version "4.3.0"
resolved "http://npm.yohops.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66"
dependencies:
readable-stream "^2.3.6"
triple-beam "^1.2.0"
winston@^3.2.1:
version "3.2.1"
resolved "http://npm.yohops.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07"
dependencies:
async "^2.6.1"
diagnostics "^1.1.1"
is-stream "^1.1.0"
logform "^2.1.1"
one-time "0.0.4"
readable-stream "^3.1.1"
stack-trace "0.0.x"
triple-beam "^1.3.0"
winston-transport "^4.3.0"
yoho-md5@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/yoho-md5/-/yoho-md5-2.1.0.tgz#f0c00d343f775e77952ebce0826863ac52e0ad50"
... ...