Commit e7e4fa08 authored by zhaofei's avatar zhaofei

s

parent ff980819
{
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@tbmp/mp-cloud-sdk": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/@tbmp/mp-cloud-sdk/download/@tbmp/mp-cloud-sdk-1.1.4.tgz",
"integrity": "sha1-DMuRzXfRfFLNbwyxWENoz9/Rqd0="
},
"async-validator": {
"version": "3.4.0",
"resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-3.4.0.tgz?cache=0&sync_timestamp=1596623608639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-validator%2Fdownload%2Fasync-validator-3.4.0.tgz",
"integrity": "sha1-hxs+WUEkv0xOt7zRqeeLRPOwnK4="
},
"dayjs": {
"version": "1.9.4",
"resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.9.4.tgz?cache=0&sync_timestamp=1603435778328&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdayjs%2Fdownload%2Fdayjs-1.9.4.tgz",
"integrity": "sha1-/N6YTiJ/QpbwTnsFcgra0uEHHxs="
},
"lodash": {
"version": "4.17.20",
"resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336053864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
"integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI="
},
"miniapp-router": {
"version": "0.1.9",
"resolved": "https://registry.npm.taobao.org/miniapp-router/download/miniapp-router-0.1.9.tgz",
"integrity": "sha1-fRwYj37+eWMbzyRzRYP45Ly0G70="
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz",
"integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M="
}
}
}
.tea
.DS_Store
.vscode
debug.log
node_modules
\ No newline at end of file
# 数据模拟
```bash
cnpm install
```
```bash
cd mockServer
```
```bash
cnpm install
```
```bash
➜ mockServer npm run start
```
## 库表规范
http://cf.dui88.com/pages/viewpage.action?pageId=63937755
## sdk 接口文档说明
http://cf.dui88.com/pages/viewpage.action?pageId=66194323
{
"runtime": "nodejs8",
"version": "1.0"
}
\ No newline at end of file
const { DEFAULT_CODE_TYPES } = require('./sdk');
let BusinessError = {
// 更新重试失败(用于并发更新)
ERROR_UPDATE_RETRY: {
code: `210001`,
defaultMsg: `系统错误`
},
// 活动不存在
ERROR_NO_ACTIVITY: {
code: `220001`,
defaultMsg: `活动不存在`
},
// 活动未开始
ERROR_ACTIVITY_NOSTART: {
code: `220002`,
defaultMsg: `活动未开始`
},
// 活动已结束
ERROR_ACTIVITY_OVER: {
code: `220003`,
defaultMsg: `活动已结束`
},
// 排行榜未开奖
ERROR_NO_RANKOEPN:{
code: `220004`,
defaultMsg: `排行榜未开奖`
},
// 当局复活卡使用次数已达上限
ERROR_NO_USE_CARD:{
code: `220005`,
defaultMsg: `当局游戏最多只能使用2张复活卡哦`
},
// 用户不存在
ERROR_NO_USER: {
code: `310002`,
defaultMsg: `用户不存在`
},
// 需要成为会员才能助力哦
ERROR_NEEDMEMBER_DOHELP: {
code: `310004`,
defaultMsg: '需要成为会员才能助力哦'
},
// 任务奖励已领取
ERROR_TASK_ALREADYRECEIVE: {
code: `430002`,
defaultMsg: `任务奖励已领取`
},
// 任务已完成
ERROR_TASK_COMPLETE: {
code: `430003`,
defaultMsg: `任务已完成`
},
// 暂无次数可领取
ERROR_TASK_NORECEIVE: {
code: `430003`,
defaultMsg: `暂无次数可领取`
},
ERROR_FORBIDDEN_OPE: {
code: `530001`,
defaultMsg: `非法操作`
},
ERROR_RECEIVE_PRIZE: {
code: `630002`,
defaultMsg: `奖励已领取`
},
ERROR_SEND_PRIZE: {
code: `730001`,
defaultMsg: `发奖失败`
},
ERROR_NO_PRIZE: {
code: `730002`,
defaultMsg: `奖品不存在`
},
ERROR_NO_STOCK: {
code: `730003`,
defaultMsg: `库存不足`
},
ERROR_PRIZE_EXPIRED: {
code: `740001`,
defaultMsg: `奖品已超过领取时间`
},
ERROR_TASK_NORECEIVE: {
code: `930002`,
defaultMsg: `该任务不可领取`
},
ERROR_NOT_NEW_USER: {
code: `930003`,
defaultMsg: `新玩家才可以助力哦`
},
ERROR_NOT_VIP: {
code: `930004`,
defaultMsg: `成为会员才能为TA助力哦!`
},
ERROR_INVALID_INVITE_USER: {
code: `930005`,
defaultMsg: `inviteId无效`
},
ERROR_ASSIST_ALREADY: {
code: `930006`,
defaultMsg: `已为好友成功助力过了`
},
ERROR_NO_VIP: {
code: `930007`,
defaultMsg: `请先加入会员`
},
ERROR_EXCHANGE_FAIL: {
code: `930008`,
defaultMsg: `兑换失败,请稍后再试`
},
ERROR_NO_MySELF: {
code: `930009`,
defaultMsg: `自己不能给自己助力哦`
},
ERROR_CREDIT_NUM: {
code: `100001`,
defaultMsg: `积分不足`
},
ERROR_NO_GAME_COUNT: {
code: `100002`,
defaultMsg: `钻石不足`
},
ERROR_NO_CARD_COUNT: {
code: `100003`,
defaultMsg: `复活卡不足`
}
}
const TASK_LIST = [
{
taskType: 'follow',
rewards:10,//钻石
status: 0
},
{
taskType: 'sign',
rewards: 10,//钻石
status: 0
},
{
taskType: 'orderGoods',
rewards: 5,//复活卡
status: 0
},
{
taskType: 'inviteFriends',
status: 0,
rewards: 20,//钻石
value: 1,//复活卡
},
{
taskType: 'browseGoods',
rewards: 1,//复活卡
status: 0
},
{
taskType: 'exchangeCredits',
limitTimes: 2,
rewards: 10,//钻石
times: 0,
value: 20
}
]
const CODE_TYPES = Object.assign({}, DEFAULT_CODE_TYPES, BusinessError);
//tb 接口返回部分错误
const TBERROR = {
'USER_PERMISSION_EXCEED_MAX_RIGHT_COUNT_IN_DAY': '今日领取达到上限,明日再来领取哦',
'COUPON_INVALID_OR_DELETED': '权益无效或者被删除,请联系商家',
'APPLY_OWNSELF_COUPON': '不能领取自己家店铺权益',
'APPLY_SINGLE_COUPON_COUNT_EXCEED_LIMIT': '请至卡券包删除无用权益再领取',
'NO_RIGHT_QUANTITY': '权益库存不足,请联系商家',
'ERRORA_3_567': '领取失败,为风险用户',
'Invalid session': '订购应用已过期,请联系商家处理',
'NO_RIGHT_QUANTITY': '权益库存不足,请联系商家'
}
// 领取奖品状态
const DRAW_STATUS = {
// 待领取
WAITAWARD: 1,
// 处理中
PROCESSING: 2,
// 领取成功
SUCCESS: 3,
// 领取失败
FAIL: 4,
// 已过期
EXPIRED: 5,
// 重新领取
RETRY: 6
}
// 物流状态
const SHIP_STATUS = {
//未填写收货地址
NO_ADDRESS: 1,
//未发货
UNSHIPPED: 2,
//已发货
SHIPPED: 3
}
// 奖品类型
const PRIZE_TYPE = {
ENAME: 1,
CREDITS: 2,
OBJECT: 3,
THANKS: 5
};
// C端的APP NAME
const C_APP_NAME = 'promotioncenter-3000000026263524';
//商家店铺地址
const SHOP_URL = 'http://shop112900255.m.taobao.com'
//加入会员后回调 &query=activityId%3D5f34e1c4964f9706aa7d803c&inviteId%3D12222
const CALL_BACK_URL = 'https://m.duanqu.com?_ariver_appid=3000000026263524&nbsv=0.1.2008191102.0&nbsource=debug&nbsn=DEBUG&_mp_code=tb&query'
// 订单状态 WAIT_BUYER_PAY:等待买家付款
const TAOBAO_SUCCESS_ORDER_STATUS = [
"WAIT_SELLER_SEND_GOODS",//等待卖家发货
"SELLER_CONSIGNED_PART",//卖家部分发货
"WAIT_BUYER_CONFIRM_GOODS",//等待买家确认收货
"TRADE_BUYER_SIGNED",//买家已签收(货到付款专用)
"TRADE_FINISHED",//交易成功
"PAID_FORBID_CONSIGN",//该状态代表订单已付款但是处于禁止发货状态。
];
// 活动状态
const ACTIVITY_STATUS = {
NORMAL: 1,
DELETE: 2
};
//鞋子类型map
const SHOE_TYPE_MAP = {
1: "normal",//新用户赠送 款鞋一
2: "primary",//款鞋二 1次免伤
3: "medium"//款鞋三 2次免伤
};
const NORMAL_TOOL_TYPE = 1;
//每局游戏消耗10钻石
const ONCE_DIAMOND_REDUCE = 10
const NEW_USER_DIAMAND = 20
const SHOE_TYPE_REWARDS = {
1: 0,
2: 10,//10钻石兑换1次免伤
3: 20//20钻石兑换2次免伤
}
// 任务类型
const TASK_TYPE = {
//1秒入会
MEMBER: 'member',
//每日免费
FREE_MASONRYS: 'sign',
// 邀请好友
INVITES: 'inviteFriends',
// 购买商品
BUY_GOODS: 'orderGoods',
// 关注店铺
FOLLOW: 'follow',
// 浏览商品
BROWSE: 'browseGoods',
//积分兑换
EXCHANAGE: 'exchangeCredits',
}
//任务奖励
const TASK_TYPE_WIN = {
// 1秒入会得复活卡
MEMBER: 1,
//每日登录
DAY: 10,
// 邀请好友得20钻石
INVITES: 20,
//邀请好友非店铺会员得复活卡
NEN_INVITES: 2,
// 购买商品得复活卡
BUY_GOODS: 5,
// 关注店铺
FOLLOW: 10,
// 浏览商品得复活卡
BROWSE: 1,
//积分兑换
EXCHANAGE_CREDITS: 10,
}
//20积分兑换10钻石
const EXCHANAGE_CREDITS = 20
//任务频率类型常量
const TASK_RATE_TYPE = {
FOREVER: 1,
EVERYDAY: 2,
NOLIMIT: 3,
};
// 积分兑换限制
const EXCHANGE_CREDITS_LIMIT = { value: 2, type: TASK_RATE_TYPE.EVERYDAY };
// 浏览商品限制
const BROSER_LIMIT = { value: 1, type: TASK_RATE_TYPE.EVERYDAY };
// 邀请好友限制
const INVITE_FRIENDS_LIMIT = { value: 5, type: TASK_RATE_TYPE.EVERYDAY };
//游戏记录状态
const JOIN_INFO_STATUS = {
START: 0,
FINISH: 1
}
//助力成功
const ASSIST_SUCCESS = 1
//助力成功 新入会获得30钻石
const FIRST_DIAMOND = 30
// 排行榜开奖状态
const OPEN_PRIZE_STATUS = {
WAITOPEN: 1,
OPENING: 2,
SUCCESS: 3,
FAIL: 4
};
//鞋子使用打点类型
const USE_SHOES_DATA = {
1: 'useNormal',
2: 'usePrimary',
3: 'useMedium'
}
//埋点数据类型
const DATA_TYPE = {
newAddUv:'newAddUv',//首次进入uv 1
accesssPv:'accesssPv',//访问pv 1
accesssUv:'accesssUv',//访问uv
joinGamePv:'joinGamePv',//参与pv 1
joinGameUv:'joinGameUv',//参与uv
countFollow:'countFollow',//关注店铺完成pv 1
dayLogin:'dayLogin',//每日登录任务完成 1
dayLoginUv: 'dayLoginUv',
completeInvited:'completeInvited',//邀请好友任务完成Pv 1
invitedMember: 'invitedMember',//带来好友已入会(未入会isvip) 1
beBrowse:'beBrowse',//每日浏览完成uv 1
exchanageCredit:'exchanageCredit',//积分兑换钻石pv(前端)
inviteFriend:'inviteFriend',//邀请好友发起Pv(前端)
useNormal:'useNormal',//款鞋一使用pv 前端打点
usePrimary:'usePrimary',//款鞋二使用pv 前端打点
useMedium:'useMedium',//款鞋三使用pv 前端打点
consumption:'consumption',//每日消费uv(点击去下单) (前端)
exchanagePrize:'exchanagePrize',//每日兑换uv(兑换商场)(前端)
addShoesUv:'addShoesUv',//获得碎片Uv 1
reduceShoesUv:'reduceShoesUv',//使用碎片Uv
addCardUv:'addCardUv',//获得复活卡Uv 1
reduceCardUv:'reduceCardUv',//使用复活卡Uv 1
reduceDiamondUv:'reduceDiamondUv',//消耗钻石Uv
reduceCreditUv:'reduceCreditUv',//消耗积分Uv
countDiamond:'countDiamond',//当日累计消耗钻石
countCredit:'countCredit',//当日累计消耗积分
countMember:'countMember',//入会人数
countShoes:'countShoes',//碎片获取总量
useCountShoes:'useCountShoes',//碎片使用总量
countCards:'countCards',//复活卡获取总量
useCountCards:'useCountCards',//复活卡使用总量
assistRecord:'assistRecord',//助力记录
orderPrice:'orderPrice',//订单价格
}
let rand = (function(){
let seed = (new Date()).getTime()
function r(){
seed = (seed*9301+49297)%233280
return seed/(233280.0)
}
return function(number){
return Math.ceil(r()*number)
}
})()
module.exports = {
CODE_TYPES,
C_APP_NAME,
TBERROR,
DRAW_STATUS,
PRIZE_TYPE,
TAOBAO_SUCCESS_ORDER_STATUS,
ACTIVITY_STATUS,
TASK_TYPE,
SHIP_STATUS,
OPEN_PRIZE_STATUS,
TASK_TYPE_WIN,
JOIN_INFO_STATUS,
DATA_TYPE,
ASSIST_SUCCESS,
SHOE_TYPE_MAP,
NORMAL_TOOL_TYPE,
INVITE_FRIENDS_LIMIT,
BROSER_LIMIT,
EXCHANGE_CREDITS_LIMIT,
FIRST_DIAMOND,
TASK_LIST,
SHOE_TYPE_REWARDS,
ONCE_DIAMOND_REDUCE,
EXCHANAGE_CREDITS,
USE_SHOES_DATA,
SHOP_URL,
NEW_USER_DIAMAND,
rand
}
\ No newline at end of file
const { pipeActivityInfo } = require('./base.controller');
const UserService = require('../service/user.service');
const AwardsService = require('../service/awards.service');
const { CODE_TYPES } = require('../constants');
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
/**
* 我的奖品列表
* @param {*} context
*/
const getMyPrizeList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以查看我的奖品
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let awardSer = new AwardsService(context);
let result = await awardSer.getMyPrizeList({openId: context.openId, activityId: context.data.activityId});
return resultModel.success(result);
}
/**
* 领取实物
* @param {*} context
*/
const receiveObjectPrize = async(context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以领取实物
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let { provinceName, cityName, detailInfo, countyName, streetName, cityCode, _id, name, phone, activityId } = context.data;
if (!_id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少_id`)
}
if (!name) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少name`)
}
if (!phone) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少phone`)
}
if (!provinceName) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少provinceName`)
}
if (!cityName) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少cityName`)
}
if (!countyName) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少countyName`)
}
if (!detailInfo) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少detailInfo`)
}
let awardSer = new AwardsService(context);
let result = await awardSer.recieveObjectPrize(_id, {activityId, provinceName, cityName, detailInfo, countyName, streetName, cityCode, name, phone});
if (result.code) {
return resultModel.error(result);
}
return resultModel.success(result);
}
/**
* 权益重新领取
* @param {*} context
*/
const receiveEnamePrize = async(context) => {
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以领取权益
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let {_id} = context.data;
if (!_id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少_id`)
}
let awardsSer = new AwardsService(context);
let result = await awardsSer.recieveEnamePrize(_id, pipeRes._id);
if (result.code) {
return resultModel.error(result);
}
if (result.remark) {
return resultModel.error(result, result.remark);
}
return resultModel.success(result);
}
module.exports = {
getMyPrizeList,
receiveObjectPrize,
receiveEnamePrize
}
\ No newline at end of file
const BaseService = require('../service/base.service');
const { CODE_TYPES, ACTIVITY_STATUS, OPEN_PRIZE_STATUS } = require('../constants');
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
// 活动判断
const pipeActivityInfo = async (context) => {
let activitySer = new BaseService(context);
let { activityId } = context.data;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
// 活动基本情况
let activityInfo = await activitySer.getBaseInfo(activityId);
// 活动不存在
if (!activityInfo && activityInfo.deleteStatus === ACTIVITY_STATUS.DELETE) {
return resultModel.error(CODE_TYPES.ERROR_NO_ACTIVITY);
}
let { startTime, endTime } = activityInfo;
let currentTime = Date.now();
if (currentTime < startTime) {
return resultModel.error(CODE_TYPES.ERROR_ACTIVITY_NOSTART, `活动未开始`);
}
if (currentTime > endTime) {
return resultModel.error(CODE_TYPES.ERROR_ACTIVITY_OVER, `活动已结束`);
}
return activityInfo;
}
// 活动基本信息
const getActivityBaseInfoById = async(context) => {
let activitySer = new BaseService(context);
let { activityId } = context.data;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
// 活动基本情况
let activityInfo = await activitySer.getBaseInfo(activityId);
// 活动不存在
if (!activityInfo && activityInfo.deleteStatus === ACTIVITY_STATUS.DELETE) {
return resultModel.error(CODE_TYPES.ERROR_NO_ACTIVITY);
}
let { startTime, endTime, rule, _id, title } = activityInfo
return resultModel.success({
title,
startTime,
endTime,
rule,
activityId: _id,
rankLimit: 100,
openPrizeTime: endTime,
openPrize: (activityInfo.openPrizeStatus && activityInfo.openPrizeStatus === OPEN_PRIZE_STATUS.SUCCESS)
});
}
module.exports = {
pipeActivityInfo,
getActivityBaseInfoById
}
\ No newline at end of file
const { pipeActivityInfo } = require('./base.controller');
const UserJoinService = require("../service/userJoin.service");
const UserService = require('../service/user.service');
const StatService = require("../service/stat.service");
const { CODE_TYPES, ONCE_DIAMOND_REDUCE, JOIN_INFO_STATUS, DATA_TYPE, SHOE_TYPE_REWARDS, SHOE_TYPE_MAP, USE_SHOES_DATA } = require('../constants');
const { getToday, getSellerSession } = require('../utils');
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
const getGameInfo = async context => {
// const pipeRes = await pipeActivityInfo(context);
// if (pipeRes.code) {
// return pipeRes;
// }
let { activityId } = context.data;
let { openId } = context;
const userService = new UserService(context);
const userJoinSer = new UserJoinService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
let { diamond, resurgenceCards, member, toolInfo } = userInfo;
//初始积分
let { session } = await getSellerSession(context, activityId);
let initialCredits = await userService.queryUserCredits(session) || 0
console.log('initialCredits:'+initialCredits)
let joinCount = await userJoinSer.getJoinCount({activityId, openId});
let result = {
diamond,
resurgenceCards,
guideComplete: joinCount > 0,
initialCredits: member.flag ? initialCredits : 0,
toolInfo
}
return resultModel.success(result);
}
// 开始游戏
const startGame = async context => {
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
const userService = new UserService(context);
const statService = new StatService(context);
const userInfo = await userService.getUserInfo();
const userJoinSer = new UserJoinService(context);
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
let { activityId } = context.data;
const { openId } = context
const { diamond, userNick, maxScore, shoes, member } = userInfo;
if (diamond < ONCE_DIAMOND_REDUCE) {
return resultModel.error(CODE_TYPES.ERROR_NO_GAME_COUNT);
}
let joinCount = await userJoinSer.getJoinCount({activityId, openId});
let todayJoinCount = await userJoinSer.getJoinCount({activityId, openId, createDay: getToday() });
const joinId = await userJoinSer.insertGameInfo({ userNick, maxScore, shoes, score: 0, isVip: member.flag, cards: 0 });
let lastTool = await userJoinSer.getLastGameInfo()
console.log('lastTool'+JSON.stringify(lastTool))
let lastToolType = (lastTool && lastTool.toolType) ? lastTool.toolType : 1
await userService.updateUser(userInfo._id, {
guideComplete: joinCount > 0
});
return resultModel.success({
id: joinId,
guideComplete: joinCount > 0,
isFirstTime: todayJoinCount == 0,
lastToolType
});
}
const submitGame = async context => {
const { activityId, id, score, shoes } = context.data;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `id必填`);
}
if (!score && score !== 0) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `score必填`);
}
if (!shoes && shoes !== 0) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `shoes必填`);
}
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
const userService = new UserService(context);
const userJoinSer = new UserJoinService(context);
const statService = new StatService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
const joinInfo = await userJoinSer.getGameInfo(id,activityId);
if (!joinInfo) return resultModel.error(CODE_TYPES.ERROR_NO_JOIN_INFO);
if (!(joinInfo.status && joinInfo.status == JOIN_INFO_STATUS.START)) {
resultModel.error(CODE_TYPES.ERROR_JOIN_STATUS_ERROR);
}
let { totalScore:oldTotalScore, maxScore, totalShoes:oldShoes, resurgenceCards:oldCards } = userInfo
let newMaxScore = +maxScore > score ? maxScore : parseInt(score)
await userJoinSer.updateGameInfo(id, activityId, {
submitGame: Date.now(),
submitDay: getToday(),
score: parseInt(score),
maxScore: newMaxScore,
duration: Date.now() - joinInfo.createTime,
status: JOIN_INFO_STATUS.FINISH
});
const totalScore = +oldTotalScore + parseInt(score);
const totalShoes = oldShoes + shoes;
await userService.updateUser(userInfo._id, {
totalScore,
totalShoes,
maxScoreTime: Date.now(),
maxScore: newMaxScore,
});
const { rank } = await userService.getUserRank(newMaxScore);
console.log('rank:'+rank)
const list = await userService.getSideScoreUser(newMaxScore,rank)
console.log('rankList:'+list)
//埋点统计
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addShoesUv, value: shoes })
return resultModel.success({
score,
rankList:list,
maxScore: newMaxScore,
shoes
});
}
//选择道具
const chooseTool = async context => {
const { openId } = context
const { activityId, id, toolType} = context.data;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!toolType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `toolType必填`);
}
const userService = new UserService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
const userJoinSer = new UserJoinService(context);
const statService = new StatService(context);
const joinCount = await userJoinSer.getJoinCount({activityId, openId});
const joinInfo = await userJoinSer.getGameInfo(id,activityId);
if (!joinInfo) return resultModel.error(CODE_TYPES.ERROR_NO_JOIN_INFO);
let { diamond } = userInfo
//完成新手引导赠送 1次款鞋2 toolType == 2 && joinCount === 1
if(toolType == 1 || (toolType == 2 && joinCount === 1)) {
await userJoinSer.updateGameInfo(id, activityId, {
toolType,
});
await statService.addStat({ activityId, type: USE_SHOES_DATA[toolType] });
//埋点数据 消耗砖石
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.reduceDiamondUv, value: ONCE_DIAMOND_REDUCE })
await userService.updateUser(userInfo._id, {
diamond: diamond > ONCE_DIAMOND_REDUCE ? diamond - ONCE_DIAMOND_REDUCE : 0
});
return resultModel.success({
id,
toolType,
diamond: diamond > ONCE_DIAMOND_REDUCE ? diamond - ONCE_DIAMOND_REDUCE : 0
})
}
if(+diamond < (SHOE_TYPE_REWARDS[toolType] + ONCE_DIAMOND_REDUCE)) {
return resultModel.error(CODE_TYPES.ERROR_NO_GAME_COUNT);
}
await userJoinSer.updateGameInfo(id, activityId, {
toolType
});
//兑换鞋子
await userService.updateUser(userInfo._id, {
diamond: +diamond - (SHOE_TYPE_REWARDS[toolType] + ONCE_DIAMOND_REDUCE)
});
//消耗砖石打点
await statService.addStatNumberUv({ activityId, type:DATA_TYPE.reduceDiamondUv, value: (SHOE_TYPE_REWARDS[toolType] + ONCE_DIAMOND_REDUCE) });
await statService.addStat({ activityId, type: USE_SHOES_DATA[toolType] });
return resultModel.success({
id,
toolType,
diamond: +diamond - (SHOE_TYPE_REWARDS[toolType] + ONCE_DIAMOND_REDUCE)
})
}
//游戏复活
const doResurrection = async context => {
const { activityId, id } = context.data;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `id必填`);
}
const userService = new UserService(context);
const userJoinSer = new UserJoinService(context);
const statService = new StatService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
let { resurgenceCards: oldCards } = userInfo
if(oldCards < 1) {
return resultModel.error(CODE_TYPES.ERROR_NO_CARD_COUNT);
}
const joinInfo = await userJoinSer.getGameInfo(id,activityId);
if (!joinInfo) return resultModel.error(CODE_TYPES.ERROR_NO_JOIN_INFO);
let { cards } = joinInfo
if(cards && cards >= 2) {
return resultModel.error(CODE_TYPES.ERROR_NO_USE_CARD);
}
await userJoinSer.updateGameInfo(id, activityId, {
cards: cards ? cards + 1 : 1
});
const resurgenceCards = oldCards > 1 ? oldCards - 1 : 0;
await userService.updateUser(userInfo._id, {
resurgenceCards
});
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.reduceCardUv, value: 1 })
return resultModel.success({
id,
resurgenceCards: oldCards > 1 ? oldCards - 1 : 0
});
}
module.exports = {
getGameInfo,
startGame,
submitGame,
chooseTool,
doResurrection
}
\ No newline at end of file
const UserService = require('../service/user.service');
const BaseService = require('../service/base.service');
const { pipeActivityInfo } = require('./base.controller');
const UserJoinService = require("../service/userJoin.service");
const { login } = require('./user.controller');
const TaskService = require('../service/task.service');
const StatService = require("../service/stat.service");
const { CODE_TYPES, TASK_TYPE, TASK_LIST, TASK_TYPE_WIN, DATA_TYPE, SHOP_URL } = require('../constants');
const { ResultsModel, dateFormatter, TBAPIS, transformBeijingDate } = require('../sdk');
const { getToday, logger, getSellerSession, getUserOrderlist } = require('../utils')
let resultModel = new ResultsModel();
//是否可助力
const isHelp = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
const { inviteId, activityId } = context.data;
const { openId } = context
if (!inviteId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `inviteId必填`);
}
if(inviteId === openId) {
return resultModel.error(CODE_TYPES.ERROR_NO_MySELF, `自己不能给自己助力哦`);
}
const userJoinSer = new UserJoinService(context);
const statService = new StatService(context)
const userService = new UserService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) {
//用户首次进入
await login()
}
let { session } = await getSellerSession(context, activityId);
// 是否是会员
let { isvip, url } = await userService.getShopVip(session);
console.log('isvip'+isvip)
//带来好友未入会pv 已经入会
await statService.addStat({ activityId, type: DATA_TYPE.invitedMember, isvip })
//增加用户助力记录 value:1 未助力 2已助力
let helpCount = await statService.getStatCount({ activityId, type: DATA_TYPE.assistRecord })
if(helpCount == 0) {
await statService.addStat({ activityId, type: DATA_TYPE.assistRecord, isNewVip: !isvip, value: 1, inviteId })
}
if(!isvip) {
return resultModel.success({
isvip,
url
})
}
let joinCount = await userJoinSer.getJoinCount({activityId, openId});
if(joinCount > 0) {
return resultModel.error(CODE_TYPES.ERROR_NOT_NEW_USER, `新玩家才可以助力哦`)
}
return resultModel.success({
isvip,
url
})
}
//购买浏览商品列表
const getBrowseGoodsList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束
if (pipeRes.code) {
return pipeRes;
}
let ids = "";
if (pipeRes.tasks && pipeRes.tasks.browseGoods) {
ids = pipeRes.tasks.browseGoods.itemIds;
}
let list = [];
if (ids) {
let taskSer = new TaskService(context);
list = await taskSer.getGoodsList(ids);
}
console.log('list ', list);
return resultModel.success({
goodsList: list,
shopUrl: SHOP_URL
});
}
//购买下单商品列表
const getOrderList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束
if (pipeRes.code) {
return pipeRes;
}
let ids = "";
if (pipeRes.tasks && pipeRes.tasks.orderGoods) {
ids = pipeRes.tasks.orderGoods.itemIds;
}
let list = [];
if (ids) {
let taskSer = new TaskService(context);
list = await taskSer.getGoodsList(ids);
}
console.log('list ', list);
return resultModel.success({
goodsList: list,
shopUrl: SHOP_URL
});
}
//获取任务列表
const getTaskList = async (context) => {
logger('getTaskList', context.data);
const { activityId } = context.data;
const pipeRes = await pipeActivityInfo(context);
console.log('---------------'+pipeRes)
if (pipeRes.code) {
return pipeRes;
}
try {
let userSer = new UserService(context);
let statSer = new StatService(context);
let taskService = new TaskService(context)
let today = getToday();
let userInfo = await userSer.getUserInfo()
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
}
let { remainTimes, recordTask, taskInfo, _id } = userInfo
let todayTask = taskInfo[today]
let { followStatus, orders:oldOrderRecord, memberStatus } = recordTask
if(!todayTask) {
todayTask = {
browseGoods: { value: TASK_TYPE_WIN.BROWSE, status: 0},
invites: [],
orders: [],
exchangeCredits: [],
sign: { value: TASK_TYPE_WIN.DAY, status: 1}
}
remainTimes = {
...remainTimes,
sign: 1
}
}
//是否有未生效的新订单
let newOrders = await taskService.getNewBuyGoodsOrders(pipeRes, userInfo) || []
console.log('newOrders:'+JSON.stringify(newOrders))
let goodsTaskWaitReceive = newOrders ? newOrders.length : 0;
let oldRecord = todayTask.orders ? todayTask.orders : []
oldOrderRecord = oldOrderRecord || []
//订单支付成功uv
if (goodsTaskWaitReceive > 0) {
for(let i = 0; i < newOrders.length; i++) {
let o = newOrders[i]
let orderDetail = {
"itemId": o.itemId,
"orderId": o.orderId,
"price": o.price,
};
oldRecord.push({
"createTime": transformBeijingDate(Date.now()),
"orderId": o.orderId
})
oldOrderRecord.push({
"createTime": transformBeijingDate(Date.now()),
"orderId": o.orderId
})
//下单打点
await statSer.addStat({activityId, type: DATA_TYPE.orderPrice, orderInfo:orderDetail, price: o.price })
}
//完成下单uv
await statSer.addStat({ activityId, type: DATA_TYPE.consumptionUv });
}
//更新用户信息
let param = {
remainTimes: {
...remainTimes,
orders: goodsTaskWaitReceive + remainTimes.orders
},
recordTask: {
...recordTask,
orders: oldOrderRecord
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
orders: oldRecord
}
}
}
await userSer.updateUser(_id,param)
//获取更新后打用户信息
let updateUserInfo = await userSer.getUserInfo()
let memberRecord = updateUserInfo.member
let { browseGoods, exchangeCredits, sign } = updateUserInfo.taskInfo[today]
let { invites:remainInvites, orders:oldOrders, member: oldMember, browseGoods:oldBrowseGoods } = updateUserInfo.remainTimes
let taskList = TASK_LIST.map(el => {
if(el.taskType == TASK_TYPE.BROWSE) {
el.status = browseGoods && browseGoods.status ? browseGoods.status : oldBrowseGoods ? 1 : 0
}
if(el.taskType == TASK_TYPE.FOLLOW) {
el.status = followStatus ? followStatus : 0
}
if(el.taskType == TASK_TYPE.FREE_MASONRYS) {
el.status = sign && sign.status ? sign.status : 0
}
if(el.taskType == TASK_TYPE.INVITES) {
el.status = remainInvites == 0 ? 0 : 1
}
if(el.taskType == TASK_TYPE.BUY_GOODS) {
el.status = oldOrders == 0 ? 0 : 1
}
if(el.taskType == TASK_TYPE.EXCHANAGE) {
el.status = (exchangeCredits.length == 2) ? 2 : 0
el.times = exchangeCredits.length || 0
}
if(el.taskType == TASK_TYPE.FOLLOW && followStatus == 2) {
return;
}
return el
})
if(!memberRecord.flag || (memberRecord.flag && memberStatus == 1 && oldMember == 1)) {
let { session } = await getSellerSession(context, activityId);
let { isvip, url } = await userSer.getShopVip(session);
taskList.unshift({
taskType: 'member',
rewards:1,//复活卡
status: memberStatus,
isvip,
url
})
}
return resultModel.success(taskList.filter(el => el))
}
catch(err) {
console.log('获取新订单失败:'+err)
return resultModel.error(err)
}
}
// 领取任务次数
const completeTask = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
let { taskType, activityId, quantity } = context.data;
if (!taskType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType必填`);
}
if (![TASK_TYPE.INVITES, TASK_TYPE.BUY_GOODS, TASK_TYPE.FREE_MASONRYS, TASK_TYPE.FOLLOW,TASK_TYPE.BROWSE,TASK_TYPE.EXCHANAGE,TASK_TYPE.MEMBER].includes(taskType)) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType非法`);
}
let userSer = new UserService(context);
let userInfo = await userSer.getUserInfo();
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
}
//积分兑换验证是否会员
if(TASK_TYPE.EXCHANAGE == taskType) {
let { session } = await getSellerSession(context, activityId);
let { isvip, url } = await userSer.getShopVip(session);
if(!isvip) {
return resultModel.error(CODE_TYPES.ERROR_NO_VIP, `请先加入会员`)
}
}
let taskSer = new TaskService(context);
let result = await taskSer.receiveTaskRewards(pipeRes, userInfo, taskType, quantity);
console.log('result'+JSON.stringify(result))
if (result.code) {
return resultModel.error(result);
}
return resultModel.success(result);
}
//完成任务
const doCompleteTask = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
let { taskType, inviteId } = context.data;
if (!taskType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType必填`);
}
if (![TASK_TYPE.INVITES, TASK_TYPE.FOLLOW, TASK_TYPE.BROWSE].includes(taskType)) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType非法`);
}
let userSer = new UserService(context);
let userInfo = await userSer.getUserInfo();
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
}
let taskSer = new TaskService(context);
let result = await taskSer.doCompleteTask(userInfo, taskType);
if (result.code) {
return resultModel.error(result);
}
console.log('result'+result)
return resultModel.success(result);
}
module.exports = {
getBrowseGoodsList,
getOrderList,
getTaskList,
completeTask,
doCompleteTask,
isHelp
}
\ No newline at end of file
const UserService = require('../service/user.service');
const ActivityService = require('../service/base.service');
const UserJoinService = require("../service/userJoin.service");
const AccessService = require("../service/access.service");
const StatService = require("../service/stat.service");
const { CODE_TYPES, DATA_TYPE, TASK_TYPE, NEW_USER_DIAMAND } = require('../constants');
const { logger, addErrorLog, getToday, getSellerSession } = require('../utils')
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
/**
* 登陆
*/
const login = async (context) => {
logger('login', context.data);
const {
userNick,
activityId,
avatar,
inviteId = "",
isFollow = false
} = context.data;
const { openId } = context;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!userNick || !avatar) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `userNick, avatar 必填`);
}
try {
const activityService = new ActivityService(context);
const userService = new UserService(context);
const accessService = new AccessService(context);
const statService = new StatService(context);
const UserJoinSer = new UserJoinService(context);
let activityInfo = await activityService.getBaseInfo(activityId);
// 活动不存在
if (!activityInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_ACTIVITY);
}
let { session } = await getSellerSession(context, activityId);
// 是否是会员
let { isvip, url } = await userService.getShopVip(session);
let joinCount = await UserJoinSer.getJoinCount({activityId, openId});
// let isvip = false;
let today = getToday();
let userInfo = await userService.getUserInfo();
//访问pv
await accessService.addAccess(isvip, DATA_TYPE.accesssPv);
//每日登录任务完成打点
await statService.addStat({ activityId, type: DATA_TYPE.dayLogin })
//初始积分
let initialCredits = await userService.queryUserCredits(session) || 0
if (userInfo) {
let { _id, member, diamond, resurgenceCards, info, remainTimes, recordTask } = userInfo;
let todyInfo = info[today]
let loginTimes = todyInfo && todyInfo.login ? todyInfo.login + 1 : 1
if (!member.newMember && !member.flag && isvip) {
let { member: remainMember } = remainTimes
let { memberStatus } = recordTask
await userService.updateUser(_id, {
inviteId,
member: {
flag: isvip,
newMember: isvip,
bememberTime: Date.now()
},
remainTimes: {
...remainTimes,
member: remainMember == 0 ? 1 : remainMember
},
recordTask: {
...recordTask,
memberStatus: memberStatus == 0 ? 1 : memberStatus
},
info: {
...info,
[today]:{
login: loginTimes
}
}
});
await statService.addStat({ activityId, type: DATA_TYPE.countMember })
}
else {
await userService.updateUser(_id, {
inviteId,
info: {
...info,
[today]:{
login: loginTimes
}
}
});
}
return resultModel.success({
inviteId: openId,
diamond,
resurgenceCards,
initialCredits: isvip? initialCredits : 0,
guideComplete: joinCount > 0
});
}
//首次进入uv
await statService.addStat({ activityId, type:DATA_TYPE.newAddUv });
// if(isvip) {
// await statService.addStat({ activityId, type: DATA_TYPE.countMember })
// }
let result = await userService.insertInitUser({
userNick,
activityId,
avatar,
openId,
inviteId,
diamond: NEW_USER_DIAMAND,
totalScore: 0,
maxScore: 0,
rankPrizePop: 0,
initialCredits,
resurgenceCards: 0,
totalShoes: 0,
guideComplete: false,
member: {
flag: isvip,
newMember: false,
},
follow: {
flag: isFollow,
newFollow: false,
},
toolInfo: {
normal:1,
primary:0,
medium:0
},
remainTimes: {
[TASK_TYPE.BROWSE]: 0,
orders: 0,
invites: 0,
[TASK_TYPE.FOLLOW]: isFollow ? 1 : 0,
[TASK_TYPE.FREE_MASONRYS]: 0,
newMember: 0,
member: isvip ? 1 : 0
},
recordTask: {
invites: [],
orders: [],
followStatus: isFollow ? 1 : 0,
memberStatus: isvip ? 1 : 0
},
taskInfo: {},
info: {
[today]: {
login: 1
}
},
});
if (result) {
return resultModel.success({
inviteId: openId,
diamond: 0,
resurgenceCards: 0,
initialCredits: isvip? initialCredits : 0,
guideComplete: joinCount > 0
});
}
return resultModel.error(CODE_TYPES.ERROR_LOGIN_INSERT);
} catch (e) {
console.log(e, "login接口出错了");
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, "用户登录失败");
}
};
/**
* 判断是否VIP
*/
const getVipInfo = async context => {
logger('getVipInfo', context.data);
let { activityId } = context.data
if(!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR,`activityId必填`)
}
const { session } = await getSellerSession(context, activityId);
if(!session) {
await addErrorLog(context, { functionName: 'getVipInfo', errorMessage: '获取卖家session失败'});
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, '获取卖家session失败');
}
const userService = new UserService(context);
const statService = new StatService(context);
let userInfo = await userService.getUserInfo();
let { _id, member } = userInfo
try {
let vipInfo = await userService.getShopVip(session);
let realVip = vipInfo.isVip
if(!member.flag && vipInfo.isvip) {
//初始积分
let initialCredits = await userService.queryUserCredits(session) || 0
await userService.updateUser(_id, {
initialCredits: vipInfo.isVip ? initialCredits : 0,
member: {
flag: vipInfo.isvip,
newMember: true,
bememberTime: Date.now()
}
});
await statService.addStat({ activityId, type: DATA_TYPE.countMember })
}
//如果已入会 再退出会员,则判定为会员
if(member.flag && member.newMember && !vipInfo.isvip) {
vipInfo.isvip = true
}
return resultModel.success({
...vipInfo,
realVip,
})
} catch (error) {
console.log('判断是否vip失败'+error)
}
}
/**
* 加入会员(joinType:1 游戏复活,2任务列表)
*/
const doJoin = async context => {
logger('doJoin', context.data);
let { activityId, joinType } = context.data
if(!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR,`activityId必填`)
}
if(!joinType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR,`joinType必填`)
}
const { session } = await getSellerSession(context, activityId);
if(!session) {
await addErrorLog(context, { functionName: 'getVipInfo', errorMessage: '获取卖家session失败'});
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, '获取卖家session失败');
}
const userService = new UserService(context);
const statService = new StatService(context);
let userInfo = await userService.getUserInfo();
let { _id, member, resurgenceCards, recordTask, remainTimes } = userInfo
const { isvip, url } = await userService.getShopVip(session);
if(!isvip) {
return resultModel.error(CODE_TYPES.ERROR_NO_VIP, `请先加入会员`)
}
try {
let { memberStatus } = recordTask || {}
if(memberStatus != 2 && isvip) {
//初始积分
await userService.updateUser(_id, {
member: {
flag: isvip,
newMember: true,
bememberTime: Date.now()
},
recordTask: {
...recordTask,
memberStatus: joinType == 2 ? 1 : 2
},
remainTimes: {
...remainTimes,
member: joinType == 2 ? 1 : 0
}
});
//获得复活卡
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:1 })
await statService.addStat({ activityId, type: DATA_TYPE.countMember })
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.reduceCardUv, value: 1 })
return resultModel.success(joinType == 1 ? {
resurgenceCards,
rewards: 1
}: true)
}
return resultModel.success(true)
} catch (error) {
console.log('加入会员失败'+error)
}
}
/**
* 埋点数据
*/
const addData = async context => {
logger('doJoin', context.data);
let { activityId, type } = context.data
if(!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR,`activityId必填`)
}
if(!DATA_TYPE[type]) return resultModel.error(CODE_TYPES.PARAMS_ERROR,`type类型非法`)
console.log('DATA_TYPE:'+DATA_TYPE[type])
const statService = new StatService(context);
await statService.addStat({ activityId, type })
return resultModel.success(true)
}
/**
* 获取用户积分
* @param {*} context
*/
const getUserCredits = async context => {
logger('getUserCredits', context.data);
let { activityId } = context.data
if(!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR,`activityId必填`)
}
const { session } = await getSellerSession(context, activityId);
if(!session) {
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, '获取卖家session失败');
}
const userService = new UserService(context);
let { isvip, url } = await userService.getShopVip(session);
if(!isvip) {
return resultModel.success({
isvip,
url,
quantity: 0
})
}
try {
let quantity = await userService.queryUserCredits(session) || 0
return resultModel.success({
isvip,
url,
quantity
})
} catch (error) {
console.log('获取用户积分失败'+error)
}
}
/**
* 加积分(测试使用)
*/
const addUserCredits = async context => {
const { activityId, quantity } = context.data;
const userService = new UserService(context);
let { session } = await getSellerSession(context, activityId);
await userService.updateUserCredits(quantity, session, optType = 'add')
let initialCredits = await userService.queryUserCredits(session) || 0
console.log('initialCredits'+JSON.stringify(initialCredits))
}
module.exports = {
login,
getVipInfo,
doJoin,
addData,
getUserCredits,
addUserCredits
}
\ No newline at end of file
const ACCESS_DB_NAME = 'c_user_access';
const USER_DB_NAME = 'c_user';
const USER_JOIN_DB_NAME = 'c_user_join';
const DATA_DB_NAME = 'c_stat_info';
const AWARDS_DB_NAME = 'c_awards_info';
const ERROR_LOG_DB_NAME = 'error_log';
const SELLER_INFO_DB_NAME = 'a_seller_info';
const PRIZE_CONFIG_DB_NAME = 'b_prize_config';
const ACTIVITY_CONFIG_DB_NAME = 'b_activity_config';
module.exports = {
ACCESS_DB_NAME,
USER_DB_NAME,
AWARDS_DB_NAME,
ERROR_LOG_DB_NAME,
SELLER_INFO_DB_NAME,
PRIZE_CONFIG_DB_NAME,
ACTIVITY_CONFIG_DB_NAME,
USER_JOIN_DB_NAME,
DATA_DB_NAME
}
const {
getActivityBaseInfoById
} = require('./controller/base.controller');
const {
login,
getVipInfo,
doJoin,
addData,
getUserCredits,
addUserCredits
} = require('./controller/user.controller');
const {
getBrowseGoodsList,
getOrderList,
getTaskList,
completeTask,
doCompleteTask,
isHelp
} = require('./controller/task.controller');
const {
getGameInfo,
startGame,
submitGame,
chooseTool,
doResurrection
} = require('./controller/game.controller');
const {
getMyPrizeList,
receiveObjectPrize,
receiveEnamePrize
} = require('./controller/awards.controller');
module.exports = {
login,
getVipInfo,
getActivityBaseInfoById,
getBrowseGoodsList,
getOrderList,
getTaskList,
completeTask,
doCompleteTask,
isHelp,
getGameInfo,
startGame,
submitGame,
chooseTool,
doResurrection,
doJoin,
getMyPrizeList,
receiveObjectPrize,
receiveEnamePrize,
addData,
getUserCredits,
addUserCredits
}
\ No newline at end of file
{
"name": "mockserver",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"dev": true,
"requires": {
"defer-to-connect": "^1.0.1"
}
},
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
"@types/http-proxy": {
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz",
"integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==",
"requires": {
"@types/node": "*"
}
},
"@types/node": {
"version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"ajv": {
"version": "6.12.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-align": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
"integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
"dev": true,
"requires": {
"string-width": "^3.0.0"
},
"dependencies": {
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
}
}
},
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"anymatch": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
},
"axios": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
"dev": true
},
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"boxen": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
"integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
"dev": true,
"requires": {
"ansi-align": "^3.0.0",
"camelcase": "^5.3.1",
"chalk": "^3.0.0",
"cli-boxes": "^2.2.0",
"string-width": "^4.1.0",
"term-size": "^2.1.0",
"type-fest": "^0.8.1",
"widest-line": "^3.1.0"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"chokidar": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
"integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
"dev": true,
"requires": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
"fsevents": "~2.1.2",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.4.0"
}
},
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
"dev": true
},
"cli-boxes": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
"integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==",
"dev": true
},
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
"integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
"dev": true,
"requires": {
"dot-prop": "^5.2.0",
"graceful-fs": "^4.1.2",
"make-dir": "^3.0.0",
"unique-string": "^2.0.0",
"write-file-atomic": "^3.0.0",
"xdg-basedir": "^4.0.0"
}
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-parser": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
"integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
"requires": {
"cookie": "0.4.0",
"cookie-signature": "1.0.6"
}
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
"integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
"dev": true
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true
},
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"dot-prop": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
"integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
"dev": true,
"requires": {
"is-obj": "^2.0.0"
}
},
"duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"requires": {
"once": "^1.4.0"
}
},
"escape-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
"integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
"dev": true
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"eventemitter3": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "=3.1.0"
}
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fsevents": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
"dev": true,
"optional": true
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"global-dirs": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
"integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
"dev": true,
"requires": {
"ini": "^1.3.5"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-yarn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
"dev": true
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"requires": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
}
},
"http-proxy-middleware": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.5.tgz",
"integrity": "sha512-CKzML7u4RdGob8wuKI//H8Ein6wNTEQR7yjVEzPbhBLGdOfkfvgTnp2HLnniKBDP9QW4eG10/724iTWLBeER3g==",
"requires": {
"@types/http-proxy": "^1.17.4",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"lodash": "^4.17.19",
"micromatch": "^4.0.2"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
"dev": true
},
"import-lazy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
"integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
"dev": true
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"requires": {
"ci-info": "^2.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-installed-globally": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
"integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
"dev": true,
"requires": {
"global-dirs": "^2.0.1",
"is-path-inside": "^3.0.1"
}
},
"is-npm": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
"integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
"dev": true
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
},
"is-path-inside": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
"integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
"dev": true
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-yarn-global": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"dev": true,
"requires": {
"json-buffer": "3.0.0"
}
},
"latest-version": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
"integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
"dev": true,
"requires": {
"package-json": "^6.3.0"
}
},
"lodash": {
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"dev": true
},
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"requires": {
"semver": "^6.0.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
}
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
},
"mime-types": {
"version": "2.1.27",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"requires": {
"mime-db": "1.44.0"
}
},
"mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"nodemon": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
"integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
"dev": true,
"requires": {
"chokidar": "^3.2.2",
"debug": "^3.2.6",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.0.4",
"pstree.remy": "^1.1.7",
"semver": "^5.7.1",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.2",
"update-notifier": "^4.0.0"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
"dev": true,
"requires": {
"abbrev": "1"
}
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"normalize-url": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
"integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
"dev": true,
"requires": {
"got": "^9.6.0",
"registry-auth-token": "^4.0.0",
"registry-url": "^5.0.0",
"semver": "^6.2.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
"dev": true
},
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.1"
}
},
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"pupa": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
"integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
"dev": true,
"requires": {
"escape-goat": "^2.0.0"
}
},
"qs": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
"integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"requires": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
}
},
"readdirp": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
"integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"registry-auth-token": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
"integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
"dev": true,
"requires": {
"rc": "^1.2.8"
}
},
"registry-url": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
"integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
"dev": true,
"requires": {
"rc": "^1.2.8"
}
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"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.3",
"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.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}
}
},
"request-promise": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
"integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
"requires": {
"bluebird": "^3.5.0",
"request-promise-core": "1.1.4",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"request-promise-core": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
"integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
"requires": {
"lodash": "^4.17.19"
}
},
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
},
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"dev": true,
"requires": {
"lowercase-keys": "^1.0.0"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"semver-diff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
"integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
"dev": true,
"requires": {
"semver": "^6.3.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"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"
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"string-object-to-object": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string-object-to-object/-/string-object-to-object-1.0.3.tgz",
"integrity": "sha512-mYDydxoAlwy7d1WfKjLLtYSs5g5sK4i9uFMEcziW93YA2OwvLk3vIHULeBdCJWsxdF9x41z8YX42HOuEgc9u5Q=="
},
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
}
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"term-size": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
"integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
"dev": true
},
"to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dev": true,
"requires": {
"nopt": "~1.0.10"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"requires": {
"is-typedarray": "^1.0.0"
}
},
"undefsafe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
"integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
"dev": true,
"requires": {
"debug": "^2.2.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
}
}
},
"unique-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
"integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
"requires": {
"crypto-random-string": "^2.0.0"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"update-notifier": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
"integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
"dev": true,
"requires": {
"boxen": "^4.2.0",
"chalk": "^3.0.0",
"configstore": "^5.0.1",
"has-yarn": "^2.1.0",
"import-lazy": "^2.1.0",
"is-ci": "^2.0.0",
"is-installed-globally": "^0.3.1",
"is-npm": "^4.0.0",
"is-yarn-global": "^0.3.0",
"latest-version": "^5.0.0",
"pupa": "^2.0.1",
"semver-diff": "^3.1.1",
"xdg-basedir": "^4.0.0"
}
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"requires": {
"punycode": "^2.1.0"
}
},
"url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
"integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
"dev": true,
"requires": {
"prepend-http": "^2.0.0"
}
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
"integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
"dev": true,
"requires": {
"string-width": "^4.0.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
"xdg-basedir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
"integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
"dev": true
}
}
}
{
"name": "mockserver",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon --watch sdk --watch ../ --watch server.js server.js mock"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"http-proxy-middleware": "^1.0.5",
"qs": "^6.9.4",
"request": "^2.88.2",
"request-promise": "^4.2.5",
"string-object-to-object": "^1.0.3"
},
"port": 5555,
"serverProxy": {
"target": "http://10.172.58.215/"
},
"devDependencies": {
"nodemon": "^2.0.4"
}
}
const {CURD_REQUEST} = require('./request');
class BaseDao {
constructor(context, dbName) {
this.db = context.db;
this.TABLE = dbName;
}
/**
* 查询一条数据
* @param query
* @param options
*/
async findOne(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `find`, query: query || {}, options: options || {}});
return result[0];
}
/**
* 查询多条数据
* @param query
* @param options
*/
async find(query, options) {
console.log(`db`, this.db)
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `find`, query: query || {}, options: options || {}});
return result;
}
/**
* 插入单条数据
* @param document
*/
async insertOne(document) {
console.log(`insertOne`, document)
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `insert`, document: document || {}});
return result;
}
/**
* 插入多条数据
* @param documents 插入对象
*/
async insertMany(documents) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `insert`, document: documents || [{}]});
return result;
}
/**
* 更新数据
* @param query
* @param options
*/
async update(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `update`, query: query || {}, options: options || {}});
let res = result.nModified > 0 ? 1: 0;
console.log(`update结果`, res);
return res;
}
/**
* 删除多条数据
* @param query
* @param options
*/
async delete(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `delete`, query: query || {}, options: options || {}});
return result;
}
/**
* 获取条目数
* @param query
* @param options
*/
async count(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `count`, query: query || {}, options: options || {}});
return result;
}
}
module.exports = BaseDao;
\ No newline at end of file
const {TBAPI_REQUEST} = require('./request');
let TBAPIS = {}
const APIS = [
`getItemListByItemIds`,
`getPrizeByEname`,
`getShopVipUrl`,
`queryVipinfo`,
`benefitSend`,
`queryCredits`,
`changeCredits`,
`getShopInfo`,
`getBuyerOrderList`,
];
APIS.forEach(v => {
TBAPIS[v] = async (query) => {
let result = await TBAPI_REQUEST(process.db, v, query);
console.log(`TBAPIS.${v}----参数`, process.db, v, query);
console.log(`result`, result);
return result.tbvalue;
};
});
module.exports = TBAPIS;
\ No newline at end of file
const dateFormatter = (thisDate, fmt = 'yyyy-MM-dd hh:mm:ss') => {
thisDate = new Date(thisDate)
console.log(`thisDate`, thisDate)
const o = {
'M+': thisDate.getMonth() + 1,
'd+': thisDate.getDate(),
'h+': thisDate.getHours(),
'm+': thisDate.getMinutes(),
's+': thisDate.getSeconds(),
'q+': Math.floor((thisDate.getMonth() + 3) / 3),
S: thisDate.getMilliseconds(),
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(
RegExp.$1,
(thisDate.getFullYear() + '').substr(4 - RegExp.$1.length)
);
for (const k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
}
}
return fmt;
};
module.exports = dateFormatter
\ No newline at end of file
const BaseDao = require('./BaseDao');
const TBAPIS = require('./TBAPIS');
const transformBeijingDate = require('./transformBeijingDate');
const dateFormatter = require('./dateFormatter')
module.exports = {
BaseDao,
TBAPIS,
transformBeijingDate,
dateFormatter
}
\ No newline at end of file
var axios = require('axios')
let port = require('../package.json').port|| 5555;
const request = async (path, params) => {
let res = await axios({
method: 'post',
url: path,
data: params,
baseURL: `http://127.0.0.1:${port}`
});
if (!res.data.data) {
console.log(`调用${path}${JSON.stringify(params)}\n返回结果`, res.data)
return false
}
return res.data.data
}
const CURD_REQUEST= async ({db, TABLE, type, query, options, document}) => {
// 参数
let data={
dbName: db,
TABLE,
query,
options,
document
};
console.log(`请求参数`, data)
let path=`/proxy/dataMock/${type}`;
return await request(path, data);
};
const TBAPI_REQUEST=async (db,funName,query) => {
// 参数
let data={
dbName: db,
funName
};
let path=`/proxy/dataMock/tbapi`;
let params={
dbName: data.dbName,
funName: data.funName,
query
}
return await request(path, params);
};
module.exports={
CURD_REQUEST,
TBAPI_REQUEST
};
\ No newline at end of file
module.exports = (day) => {
if (day) {
return new Date(day).getTime();
}else {
return new Date().getTime();
}
}
\ No newline at end of file
var express = require('express');
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var {createProxyMiddleware} = require('http-proxy-middleware');
const routers = require('../index');
const {port, serverProxy } = require('./package.json');
var app = express();
app.use(cookieParser());
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.json({message: `ok`});
});
// 执行本地云函数方法
app.post('/handler', async (req, res) => {
console.log(req.body);
let {data, openId, db } = req.body;
if(!db) {
res.json({message: `参数错误,缺少数据库db`});
}
if(!openId) {
res.json({message: `参数错误,缺少openId`});
}
try{
let query = JSON.parse(JSON.stringify(data))
}catch(e) {
res.json({message: `查询参数格式错误`});
}
let {handler, data: queryData} = data
if (!handler) {
res.json({message: `格式错误, handler参数不能为空`});
}
if (!queryData) {
res.json({message: `格式错误, data参数不能为空`});
}
if(!process.db) {
process.db = db;
}
req.context = {
openId,
db,
data: queryData
};
if(routers[handler]) {
let result = await routers[handler](req.context);
res.json(result);
}else {
res.json({message: `函数${handler}不存在`});
}
});
// 获取本地export的数据库表及云函数
app.get('/getDBHandlers', async(req, res) => {
let dbs = require('../db');
let handlers = routers;
// dbsInfo
let dbArray = []
let handlerArray = []
Object.keys(dbs).map(v => {
dbArray.push(dbs[v]);
});
Object.keys(handlers).map(v => {
handlerArray.push(v)
});
console.log(dbArray, handlerArray)
res.json({
dbs: dbArray,
handlers: handlerArray,
success: true
});
})
const ProxyOption = {
target: serverProxy.target,
changeOrigin: true,
pathRewrite: (path, req) => {
console.log(`path`, path)
return path.replace('/proxy', '');
},
onProxyReq: (proxyReq, req, res) => {
console.log(`req.body`, req.body)
if (req.body) {
let bodyData = JSON.stringify(req.body);
console.log(`bodyData`, bodyData)
// incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
proxyReq.setHeader('Content-Type', 'application/json');
proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
// stream the content
proxyReq.write(bodyData);
}
}
}
app.use('/proxy', createProxyMiddleware(ProxyOption));
app.listen(port || 5555);
const data = {
"activityId":"5f35eded0cb7330c94e04eda",
"userNick":"123",
"avatar":"9000989900",
}
const data2 = {
"activityId":"5f35eded0cb7330c94e04eda",
"taskType":"freeMasonrys"
}
\ No newline at end of file
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.npm.taobao.org/@sindresorhus/is/download/@sindresorhus/is-0.14.0.tgz?cache=0&sync_timestamp=1597573685903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40sindresorhus%2Fis%2Fdownload%2F%40sindresorhus%2Fis-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha1-n7OjzzEyMoFR81PeRjLgHlIQK+o=
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.npm.taobao.org/@szmarczak/http-timer/download/@szmarczak/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
integrity sha1-sWZeLEYaLNkvTBu/UNVFTeDUtCE=
dependencies:
defer-to-connect "^1.0.1"
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz?cache=0&sync_timestamp=1596837707987&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fcolor-name%2Fdownload%2F%40types%2Fcolor-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=
"@types/http-proxy@^1.17.4":
version "1.17.4"
resolved "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596840717330&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b"
integrity sha1-58kuPb4+E6p5lED/QubToXqdBFs=
dependencies:
"@types/node" "*"
"@types/node@*":
version "14.0.27"
resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-14.0.27.tgz?cache=0&sync_timestamp=1596839161536&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1"
integrity sha1-oVGHOvWl6FG1GzsGXJ5jOQqeDrE=
abbrev@1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=
accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80=
dependencies:
mime-types "~2.1.24"
negotiator "0.6.2"
ajv@^6.12.3:
version "6.12.4"
resolved "https://registry.npm.taobao.org/ajv/download/ajv-6.12.4.tgz?cache=0&sync_timestamp=1597480799381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
integrity sha1-BhT6zEUiEn+nE0Rca/0+vTduIjQ=
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-align@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/ansi-align/download/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
integrity sha1-tTazcc9ofKrvI2wY0+If43l0Z8s=
dependencies:
string-width "^3.0.0"
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=
ansi-regex@^5.0.0:
version "5.0.0"
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=
ansi-styles@^4.1.0:
version "4.2.1"
resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
integrity sha1-kK51xCTQCNJiTFvynq0xd+v881k=
dependencies:
"@types/color-name" "^1.1.1"
color-convert "^2.0.1"
anymatch@~3.1.1:
version "3.1.1"
resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
integrity sha1-xV7PAhheJGklk5kxDBc84xIzsUI=
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
asn1@~0.2.3:
version "0.2.4"
resolved "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=
dependencies:
safer-buffer "~2.1.0"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
aws4@^1.8.0:
version "1.10.1"
resolved "https://registry.npm.taobao.org/aws4/download/aws4-1.10.1.tgz?cache=0&sync_timestamp=1597238704875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
integrity sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=
axios@^0.19.2:
version "0.19.2"
resolved "https://registry.npm.taobao.org/axios/download/axios-0.19.2.tgz?cache=0&sync_timestamp=1594827603723&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=
dependencies:
follow-redirects "1.5.10"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
dependencies:
tweetnacl "^0.14.3"
binary-extensions@^2.0.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
integrity sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=
bluebird@^3.5.0:
version "3.7.2"
resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
body-parser@1.19.0, body-parser@^1.19.0:
version "1.19.0"
resolved "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=
dependencies:
bytes "3.1.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "1.7.2"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.7.0"
raw-body "2.4.0"
type-is "~1.6.17"
boxen@^4.2.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/boxen/download/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
integrity sha1-5BG2I1fW1tNlh8isPV2XTaoHDmQ=
dependencies:
ansi-align "^3.0.0"
camelcase "^5.3.1"
chalk "^3.0.0"
cli-boxes "^2.2.0"
string-width "^4.1.0"
term-size "^2.1.0"
type-fest "^0.8.1"
widest-line "^3.1.0"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
braces@^3.0.1, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
dependencies:
fill-range "^7.0.1"
bytes@3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.npm.taobao.org/cacheable-request/download/cacheable-request-6.1.0.tgz?cache=0&sync_timestamp=1579606262568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacheable-request%2Fdownload%2Fcacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
integrity sha1-IP+4vRYrpL4R6VZ9gj22UQUsqRI=
dependencies:
clone-response "^1.0.2"
get-stream "^5.1.0"
http-cache-semantics "^4.0.0"
keyv "^3.0.0"
lowercase-keys "^2.0.0"
normalize-url "^4.1.0"
responselike "^1.0.2"
camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chokidar@^3.2.2:
version "3.4.2"
resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.2.tgz?cache=0&sync_timestamp=1596728921978&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
integrity sha1-ONyOZY3sOAl0HrPve7Ckf+QkIy0=
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
glob-parent "~5.1.0"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.4.0"
optionalDependencies:
fsevents "~2.1.2"
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=
cli-boxes@^2.2.0:
version "2.2.0"
resolved "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
integrity sha1-U47K6PnGylCOPDyVtFP+k8tMFo0=
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/clone-response/download/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
dependencies:
mimic-response "^1.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=
dependencies:
delayed-stream "~1.0.0"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/configstore/download/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
integrity sha1-02UCG130uYzdGH1qOw4/anzF7ZY=
dependencies:
dot-prop "^5.2.0"
graceful-fs "^4.1.2"
make-dir "^3.0.0"
unique-string "^2.0.0"
write-file-atomic "^3.0.0"
xdg-basedir "^4.0.0"
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=
dependencies:
safe-buffer "5.1.2"
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js=
cookie-parser@^1.4.5:
version "1.4.5"
resolved "https://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.5.tgz?cache=0&sync_timestamp=1584246006993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie-parser%2Fdownload%2Fcookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49"
integrity sha1-PlctS3wMgPnGHa9gTkM2gxtdHUk=
dependencies:
cookie "0.4.0"
cookie-signature "1.0.6"
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525873712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU=
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
dependencies:
assert-plus "^1.0.0"
debug@2.6.9, debug@^2.2.0:
version "2.6.9"
resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=
dependencies:
ms "2.0.0"
debug@=3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=
dependencies:
ms "2.0.0"
debug@^3.2.6:
version "3.2.6"
resolved "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps=
dependencies:
ms "^2.1.1"
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.npm.taobao.org/decompress-response/download/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.npm.taobao.org/defer-to-connect/download/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha1-MxrgUMCNz3ifjIOnuB8O2U9KxZE=
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
dot-prop@^5.2.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574926376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
integrity sha1-w07MKVVtxF8fTCJpe29JBODMT8s=
dependencies:
is-obj "^2.0.0"
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=
dependencies:
once "^1.4.0"
escape-goat@^2.0.0:
version "2.1.1"
resolved "https://registry.npm.taobao.org/escape-goat/download/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
integrity sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU=
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventemitter3@^4.0.0:
version "4.0.4"
resolved "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.4.tgz?cache=0&sync_timestamp=1589283105849&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
integrity sha1-tUY6zmNaCD0Bi9x8kXtMXxCoU4Q=
express@^4.17.1:
version "4.17.1"
resolved "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1585184310145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=
dependencies:
accepts "~1.3.7"
array-flatten "1.1.1"
body-parser "1.19.0"
content-disposition "0.5.3"
content-type "~1.0.4"
cookie "0.4.0"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "~1.1.2"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.5"
qs "6.7.0"
range-parser "~1.2.1"
safe-buffer "5.1.2"
send "0.17.1"
serve-static "1.14.1"
setprototypeof "1.1.1"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599651635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
dependencies:
to-regex-range "^5.0.1"
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
follow-redirects@1.5.10:
version "1.5.10"
resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
integrity sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=
dependencies:
debug "=3.1.0"
follow-redirects@^1.0.0:
version "1.13.0"
resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
integrity sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs=
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz?cache=0&sync_timestamp=1573027040291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y=
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
fsevents@~2.1.2:
version "2.1.3"
resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=
get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&sync_timestamp=1597056455691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU=
dependencies:
pump "^3.0.0"
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&sync_timestamp=1597056455691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha1-SWaheV7lrOZecGxLe+txJX1uItM=
dependencies:
pump "^3.0.0"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
dependencies:
assert-plus "^1.0.0"
glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz?cache=0&sync_timestamp=1584836110944&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=
dependencies:
is-glob "^4.0.1"
global-dirs@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/global-dirs/download/global-dirs-2.0.1.tgz?cache=0&sync_timestamp=1573231918216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobal-dirs%2Fdownload%2Fglobal-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
integrity sha1-rN87tmhbzVXLNeigUiZlaelGkgE=
dependencies:
ini "^1.3.5"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.npm.taobao.org/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1596795791808&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
integrity sha1-7fRefWf5lUVwXeH3u+7rEhdl7YU=
dependencies:
"@sindresorhus/is" "^0.14.0"
"@szmarczak/http-timer" "^1.1.2"
cacheable-request "^6.0.0"
decompress-response "^3.3.0"
duplexer3 "^0.1.4"
get-stream "^4.1.0"
lowercase-keys "^1.0.1"
mimic-response "^1.0.1"
p-cancelable "^1.0.0"
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
graceful-fs@^4.1.2:
version "4.2.4"
resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&sync_timestamp=1588086876757&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
har-validator@~5.1.3:
version "5.1.5"
resolved "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz?cache=0&sync_timestamp=1596082653557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhar-validator%2Fdownload%2Fhar-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0=
dependencies:
ajv "^6.12.3"
har-schema "^2.0.0"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
has-yarn@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/has-yarn/download/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha1-E34RNUp7W/EapctknPDG8/8rLnc=
http-cache-semantics@^4.0.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz?cache=0&sync_timestamp=1583107049902&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-cache-semantics%2Fdownload%2Fhttp-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha1-SekcXL82yblLz81xwj1SSex045A=
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407676273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz?cache=0&sync_timestamp=1593407676273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=
dependencies:
depd "~1.1.2"
inherits "2.0.4"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-proxy-middleware@^1.0.5:
version "1.0.5"
resolved "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-1.0.5.tgz#4c6e25d95a411e3d750bc79ccf66290675176dc2"
integrity sha1-TG4l2VpBHj11C8ecz2YpBnUXbcI=
dependencies:
"@types/http-proxy" "^1.17.4"
http-proxy "^1.18.1"
is-glob "^4.0.1"
lodash "^4.17.19"
micromatch "^4.0.2"
http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz?cache=0&sync_timestamp=1589778321455&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy%2Fdownload%2Fhttp-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=
dependencies:
eventemitter3 "^4.0.0"
follow-redirects "^1.0.0"
requires-port "^1.0.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1585807874533&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=
dependencies:
safer-buffer ">= 2.1.2 < 3"
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz?cache=0&sync_timestamp=1592055969434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore-by-default%2Fdownload%2Fignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inherits@2.0.4:
version "2.0.4"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=
dependencies:
binary-extensions "^2.0.0"
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-ci/download/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw=
dependencies:
ci-info "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=
dependencies:
is-extglob "^2.1.1"
is-installed-globally@^0.3.1:
version "0.3.2"
resolved "https://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.3.2.tgz?cache=0&sync_timestamp=1586162509580&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-installed-globally%2Fdownload%2Fis-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
integrity sha1-/T76ee5nDRGHIzGC1bCh3QAxMUE=
dependencies:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
is-npm@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/is-npm/download/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
integrity sha1-yQ3YOAaW34enptgjwg0LErvjyE0=
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=
is-path-inside@^3.0.1:
version "3.0.2"
resolved "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
integrity sha1-9SIPyCo+IzdXKR3dycWHfyofMBc=
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-yarn-global@^0.3.0:
version "0.3.0"
resolved "https://registry.npm.taobao.org/is-yarn-global/download/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
integrity sha1-1QLTOCWQ6jAEiTdGdUyJE5lz4jI=
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
json-buffer@3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/json-buffer/download/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA=
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.2.3"
verror "1.10.0"
keyv@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/keyv/download/keyv-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
integrity sha1-7MIoSG9pmR5J6UdkhaW+Ho/FxNk=
dependencies:
json-buffer "3.0.0"
latest-version@^5.0.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/latest-version/download/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
integrity sha1-EZ3+kI/jjRXfpD7NE/oS7Igy+s4=
dependencies:
package-json "^6.3.0"
lodash@^4.17.19:
version "4.17.20"
resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336053864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha1-JgPni3tLAAbLyi+8yKMgJVislHk=
make-dir@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=
dependencies:
semver "^6.0.0"
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=
dependencies:
braces "^3.0.1"
picomatch "^2.0.5"
mime-db@1.44.0:
version "1.44.0"
resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
integrity sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=
mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.27"
resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz?cache=0&sync_timestamp=1587700357245&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
integrity sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=
dependencies:
mime-db "1.44.0"
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/mimic-response/download/mimic-response-1.0.1.tgz?cache=0&sync_timestamp=1589481326973&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-response%2Fdownload%2Fmimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=
minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0:
version "1.2.5"
resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=
ms@^2.1.1:
version "2.1.2"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=
nodemon@^2.0.4:
version "2.0.4"
resolved "https://registry.npm.taobao.org/nodemon/download/nodemon-2.0.4.tgz?cache=0&sync_timestamp=1589456003432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnodemon%2Fdownload%2Fnodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416"
integrity sha1-VbCTGetIjWOUqpgYFIwMLRwExBY=
dependencies:
chokidar "^3.2.2"
debug "^3.2.6"
ignore-by-default "^1.0.1"
minimatch "^3.0.4"
pstree.remy "^1.1.7"
semver "^5.7.1"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.2"
update-notifier "^4.0.0"
nopt@~1.0.10:
version "1.0.10"
resolved "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
dependencies:
abbrev "1"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=
normalize-url@^4.1.0:
version "4.5.0"
resolved "https://registry.npm.taobao.org/normalize-url/download/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
integrity sha1-RTNUCH5sqWlXvY9br3U/WYIUISk=
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
dependencies:
ee-first "1.1.1"
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.npm.taobao.org/p-cancelable/download/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha1-0HjRWjr0CSIMiG8dmgyi5EGrJsw=
package-json@^6.3.0:
version "6.5.0"
resolved "https://registry.npm.taobao.org/package-json/download/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
integrity sha1-b+7ayjXnVyWHbQsOZJdGl/7RRbA=
dependencies:
got "^9.6.0"
registry-auth-token "^4.0.0"
registry-url "^5.0.0"
semver "^6.2.0"
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1574278831909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/prepend-http/download/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
proxy-addr@~2.0.5:
version "2.0.6"
resolved "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz?cache=0&sync_timestamp=1582556112011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fproxy-addr%2Fdownload%2Fproxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=
dependencies:
forwarded "~0.1.2"
ipaddr.js "1.9.1"
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=
pstree.remy@^1.1.7:
version "1.1.8"
resolved "https://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpstree.remy%2Fdownload%2Fpstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
integrity sha1-wkIiT0pnwh9oaDm720rCgrg3PTo=
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpunycode%2Fdownload%2Fpunycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew=
pupa@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/pupa/download/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
integrity sha1-29yf9I/76komoGm2+fersFEAhyY=
dependencies:
escape-goat "^2.0.0"
qs@6.7.0:
version "6.7.0"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=
qs@^6.9.4:
version "6.9.4"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
integrity sha1-kJCykNH5FyjTwi5UhDykSupatoc=
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=
range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI=
dependencies:
bytes "3.1.0"
http-errors "1.7.2"
iconv-lite "0.4.24"
unpipe "1.0.0"
rc@^1.2.8:
version "1.2.8"
resolved "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
readdirp@~3.4.0:
version "3.4.0"
resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
integrity sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=
dependencies:
picomatch "^2.2.1"
registry-auth-token@^4.0.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-4.2.0.tgz?cache=0&sync_timestamp=1594638395069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregistry-auth-token%2Fdownload%2Fregistry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da"
integrity sha1-HTff/acrvs0PWB5HFVQCE6Zet9o=
dependencies:
rc "^1.2.8"
registry-url@^5.0.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/registry-url/download/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
integrity sha1-6YM0tQ1UNLgRNrROxjjZwgCcUAk=
dependencies:
rc "^1.2.8"
request-promise-core@1.1.4:
version "1.1.4"
resolved "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.4.tgz?cache=0&sync_timestamp=1595378713145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest-promise-core%2Fdownload%2Frequest-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
integrity sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8=
dependencies:
lodash "^4.17.19"
request-promise@^4.2.5:
version "4.2.6"
resolved "https://registry.npm.taobao.org/request-promise/download/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2"
integrity sha1-fn5blXhjDm9ZjjgTwPjrNCon8KI=
dependencies:
bluebird "^3.5.0"
request-promise-core "1.1.4"
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
request@^2.88.2:
version "2.88.2"
resolved "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=
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.3"
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.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/responselike/download/responselike-1.0.2.tgz?cache=0&sync_timestamp=1570573217730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresponselike%2Fdownload%2Fresponselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
dependencies:
lowercase-keys "^1.0.0"
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1589129103371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
version "5.2.1"
resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1589129103371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
"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 "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=
semver-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.npm.taobao.org/semver-diff/download/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
integrity sha1-Bfd85Z8yXgDicGr9Z7tQbdscoys=
dependencies:
semver "^6.3.0"
semver@^5.7.1:
version "5.7.1"
resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1586886267748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=
semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886267748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
send@0.17.1:
version "0.17.1"
resolved "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=
dependencies:
debug "2.6.9"
depd "~1.1.2"
destroy "~1.0.4"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "~1.7.2"
mime "1.6.0"
ms "2.1.1"
on-finished "~2.3.0"
range-parser "~1.2.1"
statuses "~1.5.0"
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
send "0.17.1"
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=
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"
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1587327902535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
stealthy-require@^1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
string-object-to-object@^1.0.3:
version "1.0.3"
resolved "https://registry.npm.taobao.org/string-object-to-object/download/string-object-to-object-1.0.3.tgz#f817b3dfe68ea010c120c9445fe88bc481799799"
integrity sha1-+Bez3+aOoBDBIMlEX+iLxIF5l5k=
string-width@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE=
dependencies:
emoji-regex "^7.0.1"
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
string-width@^4.0.0, string-width@^4.1.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
integrity sha1-lSGCxGzHssMT0VluYjmSvRY7crU=
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
strip-ansi@^5.1.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=
dependencies:
ansi-regex "^5.0.0"
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&sync_timestamp=1594567543744&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.1.0"
resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
integrity sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=
dependencies:
has-flag "^4.0.0"
term-size@^2.1.0:
version "2.2.0"
resolved "https://registry.npm.taobao.org/term-size/download/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
integrity sha1-Hxat7f6b3BiADhd2ghc0CG/MZ1M=
to-readable-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/to-readable-stream/download/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha1-zgqgwvPfat+FLvtASng+d8BHV3E=
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
dependencies:
is-number "^7.0.0"
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=
touch@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/touch/download/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
integrity sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=
dependencies:
nopt "~1.0.10"
tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=
dependencies:
media-typer "0.3.0"
mime-types "~2.1.24"
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
integrity sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=
dependencies:
is-typedarray "^1.0.0"
undefsafe@^2.0.2:
version "2.0.3"
resolved "https://registry.npm.taobao.org/undefsafe/download/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
integrity sha1-axZucJStRjE7IgLafsws18xueq4=
dependencies:
debug "^2.2.0"
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/unique-string/download/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
integrity sha1-OcZFH4GvsnSd4rIz4/fF6IQ72J0=
dependencies:
crypto-random-string "^2.0.0"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
update-notifier@^4.0.0:
version "4.1.1"
resolved "https://registry.npm.taobao.org/update-notifier/download/update-notifier-4.1.1.tgz?cache=0&sync_timestamp=1597574328608&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupdate-notifier%2Fdownload%2Fupdate-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746"
integrity sha1-iV/IViu+ZmF5UA+fLOusTyYyN0Y=
dependencies:
boxen "^4.2.0"
chalk "^3.0.0"
configstore "^5.0.1"
has-yarn "^2.1.0"
import-lazy "^2.1.0"
is-ci "^2.0.0"
is-installed-globally "^0.3.1"
is-npm "^4.0.0"
is-yarn-global "^0.3.0"
latest-version "^5.0.0"
pupa "^2.0.1"
semver-diff "^3.1.1"
xdg-basedir "^4.0.0"
uri-js@^4.2.2:
version "4.2.2"
resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=
dependencies:
punycode "^2.1.0"
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
dependencies:
prepend-http "^2.0.0"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1595886825323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
verror@1.10.0:
version "1.10.0"
resolved "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/widest-line/download/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
integrity sha1-gpIzO79my0X/DeFgOxNreuFJbso=
dependencies:
string-width "^4.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^3.0.0:
version "3.0.3"
resolved "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=
dependencies:
imurmurhash "^0.1.4"
is-typedarray "^1.0.0"
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha1-S8jZmEQDaWIl74OhVzy7y0552xM=
{
"name": "testst2",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"cfb": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz",
"integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==",
"requires": {
"adler-32": "~1.2.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
"integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"dayjs": {
"version": "1.8.33",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.33.tgz",
"integrity": "sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw=="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"node-xlsx": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.15.0.tgz",
"integrity": "sha512-rQyhWDJ/k60wQemov7a8MlToastWTidrAVFRwTWV+s53LN/SRwU4lnmc5xuFXx/ay+uaLAsAQBp6BkVob5OjOA==",
"requires": {
"buffer-from": "^1.1.0",
"xlsx": "^0.14.1"
}
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"ssf": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz",
"integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==",
"requires": {
"frac": "~1.1.2"
}
},
"taobao-mini-sdk": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/taobao-mini-sdk/-/taobao-mini-sdk-0.1.2.tgz",
"integrity": "sha512-glePe3kdmNNVoEkoPyHRzi5hM1XwIMgJ0Vhh1ouMrzD5sRhG+qCByKhHCjmBddRdEr92DY/3fGrh9lsokF2f+A=="
},
"xlsx": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.14.5.tgz",
"integrity": "sha512-s/5f4/mjeWREmIWZ+HtDfh/rnz51ar+dZ4LWKZU3u9VBx2zLdSIWTdXgoa52/pnZ9Oe/Vu1W1qzcKzLVe+lq4w==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.2",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"ssf": "~0.10.2"
}
}
}
}
{
"name": "testst2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"license": "ISC",
"sdkVersion": "*",
"dependencies": {
"node-xlsx": "^0.15.0",
"taobao-mini-sdk": "0.1.2",
"dayjs": "^1.8.28"
},
"config": {
"notNeedLogin": []
}
}
// 特别注意以下的引用方式,需要.default
const { BaseDao, TBAPI, Utils } = require('taobao-mini-sdk/lib/index').default;
const { DEFAULT_CODE_TYPES, dateFormatter,transformBeijingDate,getStartTimestamp,getEndTimestamp, ResultsModel} = Utils.default;
const TBAPIS = TBAPI.default;
let default_sdk = {
DEFAULT_CODE_TYPES,
ResultsModel,
dateFormatter,
getStartTimestamp,
getEndTimestamp
};
let Config
let mock = process.argv[2];
console.log(`mock`, mock);
// 云函数环境
if (mock !== 'mock') {
Config = Object.assign({}, default_sdk, {
BaseDao,
TBAPIS,
transformBeijingDate
});
}
// 本地环境
else {
let MockConfig = require('./mockServer/sdk');
Config = Object.assign({}, default_sdk, MockConfig);
console.log(Config);
}
module.exports = Config;
/**
* 访问明细
*/
const {
BaseDao
} = require('../sdk');
const { getToday } = require('../utils');
const { ACCESS_DB_NAME } = require('../db');
class UserAccessService {
constructor(context) {
this.context = context;
this.accessdao = new BaseDao(context, ACCESS_DB_NAME);
}
/**
* 增加访问记录
* @param {是否关注店铺} newFollow
*/
async addAccess(isVip = false, type, newFollow = false) {
let {
openId,
data
} = this.context;
let {
activityId,
userNick,
avatar,
inviteId
} = data;
return await this.accessdao.insertOne({
openId,
activityId,
userNick,
avatar,
isReceiveShare: !!inviteId,
inviteId,
isVip,
newFollow,
accessTime: Date.now(),
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
type
});
}
async addComeAccess(type) {
let { openId, data } = this.context;
let { activityId, userNick = "" } = data;
return await this.accessdao.insertOne({
openId,
activityId,
userNick,
accessTime: Date.now(),
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
type,
});
}
}
module.exports = UserAccessService;
/**
* 奖励
*/
const { BaseDao } = require('../sdk');
const UserService = require('./user.service');
const { CODE_TYPES, DRAW_STATUS, PRIZE_TYPE, ACTIVITY_STATUS, SHIP_STATUS } = require('../constants');
const {AWARDS_DB_NAME, PRIZE_CONFIG_DB_NAME } = require('../db');
const { sendTBAward, getSellerSession } = require('../utils');
class AwardsService extends UserService{
constructor(context) {
super(context);
this.awardsdao = new BaseDao(context, AWARDS_DB_NAME);
this.activityprizedao = new BaseDao(context, PRIZE_CONFIG_DB_NAME);
}
// 根据奖品Id扣库存
async reduceStock(_id) {
let result = await this.activityprizedao.findOne({_id, deleteStatus: ACTIVITY_STATUS.NORMAL});
// 奖品不存在
if (!result) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
let {switchStock, stock, useStock} = result;
// 若不限制库存
if (switchStock === 2) {
return true;
}
// 若库存不足
if (useStock >= stock) {
return CODE_TYPES.ERROR_NO_STOCK;
}
try{
await this.activityprizedao.update(
{
_id ,
$where: "this.useStock < this.stock"
},
{
$inc: {
useStock: +1
}
}
);
return true;
}catch(e) {
console.log(`扣库存(实物)失败:`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 插入奖品记录
* @param {*} award
*/
async addAward(award) {
try {
return await this.awardsdao.insertOne({
...award,
createTime: Date.now(),
updateTime: Date.now()
});
}catch(e) {
console.log(`插入中奖记录错误:`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 我的奖品
* @param {*} param0
*/
async getMyPrizeList({openId, activityId}) {
// 获取奖品领取过期时间
let { awardReceiveExpiredTime, endTime } = await this.getBaseInfo(activityId);
//奖品失效时间为活动后48h
let endPrizeTime = endTime + 48 * 60 * 60 * 1000;
let myprizeList = await this.awardsdao.find({openId, activityId}, {
sort: {
createTime: -1
}
});
// 若有过期时间,且已过期
if (endPrizeTime) {
let currentTime = Date.now()
myprizeList.map(v => {
if(currentTime > endPrizeTime) {
if ([DRAW_STATUS.WAITAWARD, DRAW_STATUS.RETRY].includes(v.drawStatus)) {
v.drawStatus = DRAW_STATUS.EXPIRED;
v.remark = `奖品已过期`;
}
}
v.expiredTime = endPrizeTime;
})
}
return {
endPrizeTime,
list: myprizeList
};
}
// 领取实物
async recieveObjectPrize(_id, {activityId, provinceName, cityName, detailInfo, countyName, streetName, cityCode, name, phone}) {
// 若有过期时间,且已过期
let { awardReceiveExpiredTime } = await this.getBaseInfo(activityId);
if (awardReceiveExpiredTime && Date.now() > awardReceiveExpiredTime) {
return CODE_TYPES.ERROR_PRIZE_EXPIRED
}
let award = await this.awardsdao.findOne({_id});
console.log(`receiveObject-award`, award);
// 奖品不存在
if (!award) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
// 已领取
if (award.drawStatus === DRAW_STATUS.SUCCESS) {
return CODE_TYPES.ERROR_RECEIVE_PRIZE;
}
// 不是实物,非法操作
if (award.type !== PRIZE_TYPE.OBJECT) {
return CODE_TYPES.ERROR_FORBIDDEN_OPE;
}
try {
let result = await this.awardsdao.update({_id}, {
$set: {
receiveName: name,
phone,
drawStatus: DRAW_STATUS.SUCCESS,
address: {
provinceName,
cityName,
countyName,
detailInfo,
streetName,
cityCode,
},
shipStatus: SHIP_STATUS.UNSHIPPED,
receiveTime: Date.now(),
updateTime: Date.now()
}
});
return true;
}catch(e) {
console.log(`领取实物错误:`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
// 发放淘宝权益(奖品数据已插入到awards_info表,且状态drawStatus 为1或者6)
async recieveEnamePrize(_id, activityId) {
// 若有过期时间,且已过期
let { awardReceiveExpiredTime } = await this.getBaseInfo(activityId);
if (awardReceiveExpiredTime && Date.now() > awardReceiveExpiredTime) {
return CODE_TYPES.ERROR_PRIZE_EXPIRED;
}
let result = {};
let award = await this.awardsdao.findOne({_id});
// 奖品不存在
if (!award) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
// 已领取
if (award.drawStatus === DRAW_STATUS.SUCCESS) {
return CODE_TYPES.ERROR_RECEIVE_PRIZE;
}
console.log(`award.drawStatus`, award.drawStatus);
// 状态不是1,6
if (![DRAW_STATUS.WAITAWARD, DRAW_STATUS.RETRY].includes(award.drawStatus)) {
return CODE_TYPES.ERROR_FORBIDDEN_OPE;
}
let { session } = await getSellerSession(this.context);
// 发放淘宝权益
result = await sendTBAward(this.context, session, award);
// 更新
await this.awardsdao.update({_id}, {
$set: {
drawStatus: result.drawStatus,
remark: result.remark,
updateTime: Date.now()
}
});
return result;
}
/**
* 获取活动配置项奖品
* @param {*} _id
*/
async getActivityPrizeById(_id) {
return await this.activityprizedao.findOne({_id, deleteStatus: ACTIVITY_STATUS.NORMAL}, {
sort: {
index: 1
}
});
}
}
module.exports = AwardsService;
\ No newline at end of file
/**
* 基本信息
*/
const { BaseDao, transformBeijingDate, dateFormatter } = require('../sdk');
const { ACTIVITY_CONFIG_DB_NAME } = require('../db');
class BaseService {
constructor(context) {
this.context = context;
this.activitydao = new BaseDao(context, ACTIVITY_CONFIG_DB_NAME);
}
/**
* @desc 活动基本信息
* @param {活动id} activityId
* @returns 返回活动详情,若不存在活动,返回为null
*/
async getBaseInfo(activityId) {
if (!activityId) {
activityId = this.context.data.activityId
}
return await this.activitydao.findOne({_id: activityId});
}
}
module.exports = BaseService;
\ No newline at end of file
/**
* 访问明细
*/
const { BaseDao } = require("../sdk");
const { getToday } = require("../utils");
const { DATA_DB_NAME } = require("../db");
class StatService {
constructor(context) {
this.context = context;
this.statService = new BaseDao(context, DATA_DB_NAME);
}
/**
* 增加访问记录
* @param {数据信息} info
*/
async addStat(info) {
let { openId } = this.context;
return await this.statService.insertOne({
...info,
openId,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
/**
* 增加积分 砖石 复活卡 消耗 砖石 复活卡 获得 记录
* @param {数据信息} info
*/
async addStatNumberUv(info) {
let { openId } = this.context;
let { activityId, type, value } = info
let record = await this.statService.findOne({
openId,
activityId,
type,
createDay: getToday()
});
if (null == record) {
return await this.statService.insertOne({
...info,
openId,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
//已经有数据
let oldValue = record.value ? record.value : 0
return await this.statService.update({ _id: record._id }, {
$set :{
...record,
value: oldValue + value,
openId,
updateTime: Date.now(),
}
});
}
/**
* 编辑访问记录 数据缓存使用
* @param {数据信息} info
*/
async updateStat(_id,info) {
let { openId } = this.context;
return await this.statService.update({_id},{
$set: {
...info,
openId,
updateTime: Date.now()
}
});
}
async getStatTypeInfo(info) {
let { openId } = this.context;
let result = await this.statService.find({
...info,
openId,
},{
limit: 1,
sort: {
updateTime: -1
}
});
return result[0]
}
async getStatCount(info) {
let { openId } = this.context;
return this.statService.count({
...info,
openId,
});
}
}
module.exports = StatService;
/**
* 任务
*/
const UserService = require('./user.service');
const UserJoinService = require('./userJoin.service');
const StatService = require("./stat.service");
const { TBAPIS, transformBeijingDate } = require('../sdk');
const {
CODE_TYPES, TASK_TYPE, TASK_TYPE_WIN, EXCHANAGE_CREDITS, DRAW_STATUS, DATA_TYPE, FIRST_DIAMOND
} = require('../constants');
const { getToday, getSellerSession, getUserOrderlist, logger } = require('../utils')
class TaskService extends UserService {
async getGoodsList(ids) {
let { session } = await getSellerSession(this.context);
let result = await TBAPIS.getItemListByItemIds(this.context, session, ids, {});
console.log('result', result);
let items = (result.items && result.items.item) || [];
let list = items.map(v => {
return {
url: v.detail_url,
id: v.num_iid,
name: v.title,
image: v.pic_url,
desc: v.desc,
price: v.price
}
});
return list;
}
//完成任务
async doCompleteTask(userInfo, taskType) {
if (taskType === TASK_TYPE.INVITES) {
return await this.doInvitesTask(userInfo);
} else if (taskType === TASK_TYPE.FOLLOW) {
return await this.doFollowTask(userInfo);
}else if (taskType === TASK_TYPE.BROWSE) {
return await this.doBrowseTask(userInfo);
}
return CODE_TYPES.PARAMS_ERROR;
}
// 领取任务奖励
async receiveTaskRewards(activityInfo, userInfo, taskType, quantity) {
if (taskType === TASK_TYPE.INVITES) {
return await this.getInvitesTaskRewards(userInfo);
} else if (taskType === TASK_TYPE.BUY_GOODS) {
return await this.getBuyGoodsTaskRewards(userInfo);
}
else if (taskType === TASK_TYPE.FREE_MASONRYS) {
return await this.getFreeRewards(userInfo);
}
else if (taskType === TASK_TYPE.FOLLOW) {
return await this.getFollowRewards(userInfo);
}
else if (taskType === TASK_TYPE.BROWSE) {
return await this.getBrowseRewards(userInfo);
}
else if (taskType === TASK_TYPE.EXCHANAGE) {
return await this.getExchangeRewards(userInfo, quantity);
}
else if (taskType === TASK_TYPE.MEMBER) {
return await this.getMemberRewards(userInfo);
}
return CODE_TYPES.PARAMS_ERROR;
}
//邀请任务完成
async doInvitesTask(userInfo) {
const { inviteId, activityId } = this.context.data
const { openId } = this.context;
if (!inviteId) {
return CODE_TYPES.PARAMS_ERROR;
}
if(inviteId === openId) {
return CODE_TYPES.PARAMS_ERROR;
}
const { session } = await getSellerSession(this.context);
let { isvip, url } = await this.getShopVip(session);
if (!isvip) {
return CODE_TYPES.ERROR_NOT_VIP
}
//判断是否玩过游戏
const userJoinSer = new UserJoinService(this.context);
const statService = new StatService(this.context);
let joinCount = await userJoinSer.getJoinCount({activityId, openId});
if(joinCount > 0) {
return CODE_TYPES.ERROR_NOT_NEW_USER
}
//邀请人信息
const inviteUserInfo = await this.getUserInfoByOpenId(inviteId);
if (!inviteUserInfo) return CODE_TYPES.ERROR_INVALID_INVITE_USER;
const helpInfo = await statService.getStatTypeInfo({ activityId, type: DATA_TYPE.assistRecord })
console.log('helpInfo'+helpInfo)
let { value, isNewVip } = helpInfo
//已经助力过 不能助力
if(value == 2) {
return CODE_TYPES.ERROR_ASSIST_ALREADY
}
//邀请者信息
let { _id, taskInfo, remainTimes, recordTask } = inviteUserInfo
let today = getToday()
let todayTask = taskInfo[today] || {}
let oldRemain = remainTimes.invites ? remainTimes.invites : 0
let oldMemberNum = remainTimes.newMember ? remainTimes.newMember : 0
let oldRecord = recordTask.invites ? recordTask.invites : []
let todayRecord = todayTask.invites ? todayTask.invites : []
//非店铺会员
oldMemberNum = isNewVip ? +oldMemberNum + 1 : oldMemberNum
oldRemain = oldRemain + 1
oldRecord.push({ openId, newMember: isNewVip })
todayRecord.push({ openId, newMember: isNewVip })
let record = {
recordTask: {
...recordTask,
invites: oldRecord
},
remainTimes: {
...remainTimes,
invites: oldRemain,
newMember: oldMemberNum
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
invites: todayRecord
}
}
}
//助力成功添加记录
await statService.updateStat(helpInfo._id,{
value: 2
})
// 更新邀请者信息
await this.userdao.update({ _id },{ $set: record });
// 更新被邀请者信息
let oldDiamond = userInfo.diamond ? userInfo.diamond : 0
let oldMemberRecord = userInfo.member
if (!oldMemberRecord.newMember && !oldMemberRecord.flag && isvip) {
oldMemberRecord = {
flag: isvip,
newMember: isvip,
bememberTime: Date.now()
}
await statService.addStat({ activityId, type: DATA_TYPE.countMember })
}
let userRecord = {
diamond: oldDiamond + FIRST_DIAMOND,
member: oldMemberRecord,
recordTask: {
...userInfo.recordTask,
memberStatus: 1
},
remainTimes: {
...userInfo.remainTimes,
member: 1
}
}
await this.userdao.update({ _id: userInfo._id }, { $set: userRecord });
//埋点统计
await statService.addStat({ activityId, type: DATA_TYPE.completeInvited })
return {
rewards: FIRST_DIAMOND
};
}
//浏览任务完成
async doBrowseTask(userInfo) {
const { activityId } = this.context.data
let today = getToday()
const { _id, taskInfo, remainTimes } = userInfo
const todayTask = taskInfo[today] || {}
let { browseGoods } = todayTask
let { value, status } = browseGoods || {}
if(status == 2) {
return CODE_TYPES.ERROR_TASK_ALREADYRECEIVE;
}
let oldBrowserRem = remainTimes.browseGoods ? remainTimes.browseGoods : 0
let record = {
remainTimes: {
...remainTimes,
browseGoods: oldBrowserRem + 1
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
browseGoods: { value, status: 1 }
}
}
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
//埋点统计
const statService = new StatService(this.context);
await statService.addStat({ activityId, type: DATA_TYPE.beBrowse })
if(result) return true;
}
//关注店铺任务完成
async doFollowTask(userInfo) {
const { activityId } = this.context.data
const { _id, remainTimes, recordTask, follow } = userInfo
let { followStatus } = recordTask
if(followStatus == 2 || follow.flag) {
return CODE_TYPES.ERROR_TASK_ALREADYRECEIVE;
}
let record = {
follow: {
flag: true,
newFollow: true,
befollowTime: Date.now()
},
recordTask: {
...recordTask,
followStatus: 1
},
remainTimes: {
...remainTimes,
follow: 1
},
}
//埋点统计
const statService = new StatService(this.context);
await statService.addStat({ activityId, type: DATA_TYPE.countFollow })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return true;
}
//领取加入会员任务奖励
async getMemberRewards(userInfo) {
const { activityId } = this.context.data
const { _id, resurgenceCards, remainTimes, recordTask } = userInfo
const { member } = remainTimes
const { memberStatus } = recordTask
if(member == 0 || memberStatus == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
let oldResurgenceCards = resurgenceCards ? resurgenceCards : 0
let record = {
resurgenceCards: oldResurgenceCards + TASK_TYPE_WIN.MEMBER,
remainTimes: {
...remainTimes,
member: 0
},
recordTask: {
...recordTask,
memberStatus: 2
}
}
//获得复活卡打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:TASK_TYPE_WIN.MEMBER })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.MEMBER,
rewards: TASK_TYPE_WIN.MEMBER
};
}
//领取关注店铺任务奖励
async getFollowRewards(userInfo) {
const { _id, diamond, remainTimes, recordTask } = userInfo
const { follow } = remainTimes
const { followStatus } = recordTask
if(follow == 0 || followStatus == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
let oldDiamond = diamond ? diamond : 0
let record = {
diamond: oldDiamond + TASK_TYPE_WIN.FOLLOW,
remainTimes: {
...remainTimes,
follow: 0
},
recordTask: {
...recordTask,
followStatus: 2
}
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.FOLLOW,
rewards: TASK_TYPE_WIN.FOLLOW
};
}
//领取每日登录任务奖励
async getFreeRewards(userInfo) {
let today = getToday()
const { _id, diamond, taskInfo, remainTimes } = userInfo
const todayTask = taskInfo[today]
let { sign: { value, status} } = todayTask
if(status == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
let oldDiamond = diamond ? diamond : 0
let record = {
diamond: oldDiamond + value,
remainTimes: {
...remainTimes,
sign: 0
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
sign: { value, status: 2 }
}
}
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.FREE_MASONRYS,
rewards: TASK_TYPE_WIN.DAY
};
}
//领取每浏览商品任务奖励
async getBrowseRewards(userInfo) {
const { activityId } = this.context.data
let today = getToday()
let { _id, resurgenceCards, taskInfo, remainTimes } = userInfo
const todayTask = taskInfo[today]
let { browseGoods: { value, status} } = todayTask
if(remainTimes.browseGoods == 0 || status == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
//status = 0 领取上一日奖励
//增加复活卡次数
let oldResurCard = resurgenceCards ? resurgenceCards : 0
let record = status == 0 ? {
resurgenceCards: oldResurCard + (+remainTimes.browseGoods * TASK_TYPE_WIN.BROWSE),
remainTimes: {
...remainTimes,
browseGoods: 0
}
} : {
resurgenceCards: oldResurCard + (+remainTimes.browseGoods * TASK_TYPE_WIN.BROWSE),
remainTimes: {
...remainTimes,
browseGoods: 0
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
browseGoods: { value, status: 2 }
}
}
}
//获得复活卡打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:(+remainTimes.browseGoods * TASK_TYPE_WIN.BROWSE) })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.BROWSE,
rewards: (+remainTimes.browseGoods * TASK_TYPE_WIN.BROWSE)
};
}
//领取每日兑换任务奖励
async getExchangeRewards(userInfo, quantity) {
const { activityId } = this.context.data
let today = getToday()
const { _id, diamond, taskInfo } = userInfo
const todayTask = taskInfo[today]
let { exchangeCredits } = todayTask
let exchangeTimes = exchangeCredits ? exchangeCredits.length : 0
//无兑换任务
if(exchangeTimes >= 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
const { session } = await getSellerSession(this.context);
let currentCredits = quantity ? +quantity : 0 //await this.queryUserCredits(session) || 0
console.log('currentCredits'+JSON.stringify(currentCredits))
//积分不足
if(currentCredits < EXCHANAGE_CREDITS) {
return CODE_TYPES.ERROR_CREDIT_NUM;
}
//扣减积分 record_id
let reduceResult = this.updateUserCredits(EXCHANAGE_CREDITS,session)
console.log('reduceResult'+JSON.stringify(reduceResult))
if(!reduceResult) {
return CODE_TYPES.ERROR_EXCHANGE_FAIL;
}
if(reduceResult) {
let oldDiamond = diamond ? diamond : 0
let newRredit = exchangeCredits ? exchangeCredits : []
newRredit.push({
createTime: Date.now(),
diamond: TASK_TYPE_WIN.EXCHANAGE_CREDITS,
value: EXCHANAGE_CREDITS
})
console.log('newRredit'+JSON.stringify(newRredit))
let record = {
diamond: oldDiamond + TASK_TYPE_WIN.EXCHANAGE_CREDITS,
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
exchangeCredits: newRredit
}
}
}
//消耗积分打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.reduceCreditUv, value:EXCHANAGE_CREDITS })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.EXCHANAGE,
rewards: TASK_TYPE_WIN.EXCHANAGE_CREDITS
};
}
return false;
}
//领取邀请任务奖励
async getInvitesTaskRewards(userInfo) {
const { activityId } = this.context.data
let { _id, diamond, resurgenceCards, recordTask, taskInfo, remainTimes } = userInfo
let { invites, newMember } = remainTimes
let today = getToday()
//领取次数
diamond += (invites * TASK_TYPE_WIN.INVITES)
resurgenceCards += (newMember * TASK_TYPE_WIN.NEN_INVITES)
let newRecord = taskInfo[today].invites ? taskInfo[today].invites : []
let oldRecord = recordTask.invites ? recordTask.invites : []
newRecord.forEach(el => {
el.times = Date.now()
oldRecord.push (el)
})
let record = {
diamond,
resurgenceCards,
recordTask: {
...recordTask,
invites: oldRecord
},
remainTimes: {
...remainTimes,
invites: 0,
newMember: 0
}
}
let statService = new StatService(this.context)
console.log('result'+JSON.stringify(record))
//获得复活卡打点
if(newMember > 0) {
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:(newMember * TASK_TYPE_WIN.NEN_INVITES) })
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
console.log('result'+JSON.stringify(result))
if(result) return {
taskType: TASK_TYPE.INVITES,
rewards: (invites * TASK_TYPE_WIN.INVITES),
value: (newMember * TASK_TYPE_WIN.NEN_INVITES)
};
}
async getBuyGoodsTaskRewards(userInfo) {
logger('getBuyGoodsTaskRewards', userInfo);
const { activityId } = this.context.data
let { _id, resurgenceCards, remainTimes } = userInfo
let { orders } = remainTimes
// 领取次数
resurgenceCards += (orders * TASK_TYPE_WIN.BUY_GOODS);
let record = {
resurgenceCards,
remainTimes: {
...remainTimes,
orders: 0
},
updateTime: Date.now()
}
console.log('record'+JSON.stringify(record))
//获得复活卡打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:(orders * TASK_TYPE_WIN.BUY_GOODS) })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
if(result) return {
taskType: TASK_TYPE.BUY_GOODS,
rewards: (orders * TASK_TYPE_WIN.BUY_GOODS)
};
}
//获取未生效的成功购买商品订单
async getNewBuyGoodsOrders(activityInfo, userInfo) {
let lastBuyTime = activityInfo.startTime || userInfo.createTime;
if (!lastBuyTime) {
return [];
}
//获取商品列表
if (!(activityInfo.tasks && activityInfo.tasks.orderGoods && activityInfo.tasks.orderGoods.itemIds)) {
return [];
}
let itemIds = activityInfo.tasks.orderGoods.itemIds.split(',');
//调用淘宝API查询用户订单
let orders = await getUserOrderlist(this.context, lastBuyTime, Date.now());
console.log('orders', orders);
//已使用的订单ID
let orderRecord = userInfo.recordTask.orders ? userInfo.recordTask.orders : [];
let orderNums = orderRecord.map(o => o.orderId);
//购买指定商品的新订单
orders = orders.filter(o => {
let flag = itemIds.indexOf(o.itemId + '') >= 0 && orderNums.indexOf(o.orderId) < 0; //&& orderNums.length < BUY_GOODS_LIMIT;
orderNums.push(o.orderId);
return flag;
});
return orders;
}
/**
* 添加助力记录
* @param {*} param0
*/
async addAssistRecord(userInfo, { value }) {
// value 1 助力成功 2老会员不能助力 3不是会员 4 已经助力过了
const { inviteId } = this.context.data;
const record = await this.initRecordData(userInfo, {
type: DATA_TYPE.assistRecord
}, {
inviteId,
value
});
return await this.dataDao.insertOne(record);
}
/**
* 查询记录
* @param {*} conditions
*/
async getRecordByCondition(conditions) {
return await this.dataDao.findOne(conditions);
}
/**
* 初始化记录
* @param {*} param0
* @param {*} customData
*/
async initRecordData(userInfo, { type }, customData = {}) {
const { openId, data } = this.context;
let { activityId, userNick } = data;
if (!userNick) {
if (userInfo) {
userNick = userInfo.userNick;
}
}
let record = {
openId,
activityId,
userNick,
type,
createTime: Date.now(),
createDay: getToday(),
...customData
}
return record;
}
}
module.exports = TaskService;
\ No newline at end of file
/**
* 用户相关方法
*/
const { BaseDao, TBAPIS } = require('../sdk');
const BaseService = require('./base.service');
const { USER_DB_NAME, DATA_DB_NAME } = require('../db');
const { getToday } = require('../utils')
const { TASK_TYPE_WIN } = require('../constants')
class UserService extends BaseService{
constructor(context) {
super(context);
this.userdao = new BaseDao(context, USER_DB_NAME);
this.dataDao = new BaseDao(context, DATA_DB_NAME);
}
/**
* @desc 获取当前打开活动的用户详情
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfo() {
let { openId, data } = this.context;
let { activityId } = data;
let record = await this.userdao.findOne({openId, activityId });
return record;
}
/**
* @desc 根据inviteId获取用户详情
* @desc 常用于助力分享码为用户openId, 被邀请人打开活动助力时需要获取邀请人的用户详情
* @param {邀请人的openId} inviteId
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfoByOpenId(inviteId) {
let { activityId } = this.context.data;
let record = await this.userdao.findOne({openId: inviteId, activityId });
return record;
}
/**
* @desc 获取是否是会员
* @param {调用淘宝接口的session} session
* @returns {isvip: boolean(是否是会员), url: string(入会链接) }
*/
async getShopVip(session, callbackUrl = "") {
// 会员mock,当传递的参数有vipmock: true,则表示已经是会员
let { vipmock = false} = this.context.data;
if (vipmock) {
return {
isvip: true
}
}
let result = {}
let shopUrl = {};
try{
result = await TBAPIS.queryVipinfo(this.context, session);
shopUrl = await TBAPIS.getShopVipUrl(
this.context, session,
{
"source": "isvapp", "entrance": "duiba"
},
callbackUrl
);
}catch(e) {
console.log(e);
}
console.log(`result, shopUrl`, result, shopUrl);
return {
isvip: !!(result.result && result.result.member_info),
url: shopUrl.result && shopUrl.result.result
}
}
/**
* @desc 更新用户表
* @param {用户的主键id} _id
* @param {更新的对象} document
* @returns 若更新成功,返回为1; 若更新失败,返回为 0 或系统直接报错
*/
async updateUser(_id, document) {
console.log(document);
return await this.userdao.update({_id}, {$set: {
...document,
updateTime: Date.now()
}});
}
/**
* @desc 根据用户主键id查找用户详情
* @param {用户的主键id} _id
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfoById(_id) {
return await this.userdao.findOne({_id});
}
async insertInitUser(userInfo) {
let serverTime = Date.now();
return this.userdao.insertOne({
...userInfo,
createTime: serverTime,
updateTime: serverTime,
createDay: getToday(),
});
}
/**
* 查询用户积分
*/
async queryUserCredits(session) {
try {
let result = await TBAPIS.queryCredits(this.context,session)
console.log(result)
return result;
} catch (e) {
console.log(`查询用户积分失败: `, e);
return false;
}
}
/**
* 更新(加扣)用户积分
* @param {number} quantity 数量
* @param {string} optType add 增加 reduce 减少
* @param {number} changeType 变更类型
*/
async updateUserCredits(
quantity,
session,
optType = 'reduce',
changeType = 1
) {
const isAdd = optType === 'add';
try {
const options = {
quantity, // 积分数量, 每次变更的数量
change_type: changeType, //变更类型:0交易,1:互动活动,2:权益兑换,3:手工调整
opt_type: isAdd ? '0' : 1, // 操作类型,0:增加,1:扣减
remark: `参与活动` // 备注
};
console.log(`${isAdd ? '加' : '扣'}积分请求参数`, options);
const result = await TBAPIS.changeCredits(this.context,session,options)
console.log(
`${isAdd ? '加' : '扣'}积分返回结果:${JSON.stringify(result)}`
);
return result;
} catch (e) {
console.log(`更新用户积分失败`, e);
return false;
}
}
/**
* 获取用户排名
*/
async getUserRank(maxScore) {
let { activityId } = this.context.data;
const { openId } = this.context;
let sameScoreList = await this.userdao.find({ maxScore: maxScore, activityId: activityId }, {
sort: { maxScoreTime: 1 }
});
let rank = "";
let gap = 0;
//说明有多个跟自己同分数的人
for (let j = 0; j < sameScoreList.length; j++) {
if (sameScoreList[j].openId == openId) {
gap = j;
}
}
rank = await this.userdao.count({ maxScore: { $gt: maxScore }, activityId: activityId });
console.log("rank", rank, "----", gap);
rank = rank + 1 + gap;
return { rank };
}
// 获取周边两位排名用户,及自己
async getSideScoreUser(maxScore, myRank) {
let { activityId } = this.context.data;
let sameScoreList = await this.userdao.find({ maxScore: maxScore, activityId: activityId }, {
sort: { maxScoreTime: 1 },
projection: {
userNick: 1,
avatar: 1,
maxScore: 1
},
});
//防止概率性问题
if(sameScoreList.length == 0) {
sameScoreList = await this.userdao.find({ maxScore: maxScore, activityId: activityId }, {
sort: { maxScoreTime: 1 },
projection: {
userNick: 1,
avatar: 1,
maxScore: 1
},
});
}
// 大于分数的一位
const greaterUser = await this.userdao.find({ maxScore: { $gt: maxScore }, activityId: activityId }, {
limit: 1,
projection: {
userNick: 1,
avatar: 1,
maxScore: 1
},
sort: {
maxScore: 1,
maxScoreTime: 1
}
});
// 小于分数的一位
const lessUser = await this.userdao.find({ maxScore: { $lt: maxScore }, activityId: activityId, maxScoreTime: { $exists: true } }, {
limit: 1,
projection: {
userNick: 1,
avatar: 1,
maxScore: 1
},
sort: {
maxScore: -1,
maxScoreTime: 1
}
});
// 没有和自己相同分数的人;
console.log('sameScoreList'+JSON.stringify(sameScoreList))
const noSameUser = sameScoreList.length === 1;
const greaterUserInfo = greaterUser.length && greaterUser[0];
const lessUserInfo = lessUser.length && lessUser[0];
if(noSameUser) {
let list = [];
if(greaterUserInfo) {
list.push({
...greaterUserInfo,
rank: myRank - 1
})
};
list.push({
...sameScoreList[0],
isSelf: true,
rank: myRank
})
if(lessUserInfo) {
list.push({
...lessUserInfo,
rank: myRank + 1
})
}
return list.map(v => {
if(v.isSelf) return v;
return {
...v,
userNick: `${v.userNick[0]}***${v.userNick[v.userNick.length -1]}`
}
})
}
let gap = 0;
//说明有多个跟自己同分数的人
for (let j = 0; j < sameScoreList.length; j++) {
if (sameScoreList[j].openId == this.context.openId) {
gap = j;
}
};
// 多个分数相同的人 自己是第一个
if(gap === 0) {
let list = [];
if(greaterUserInfo) {
list.push({
...greaterUserInfo,
rank: myRank - 1
})
};
list.push({
...sameScoreList[0],
isSelf: true,
rank: myRank
})
list.push({
...sameScoreList[1],
rank: myRank + 1
})
return list.map(v => {
if(v.isSelf) return v;
return {
...v,
userNick: `${v.userNick[0]}***${v.userNick[v.userNick.length -1]}`
}
})
} // 多个分数相同的人 自己是最后一个
else if (gap === sameScoreList.length - 1) {
let list = [];
list.push({
...sameScoreList[gap - 1],
rank: myRank - 1
})
list.push({
...sameScoreList[gap],
isSelf: true,
rank: myRank
})
if(lessUserInfo) {
list.push({
...lessUserInfo,
rank: myRank + 1
})
}
return list.map(v => {
if(v.isSelf) return v;
return {
...v,
userNick: `${v.userNick[0]}***${v.userNick[v.userNick.length -1]}`
}
})
} else {
let list = [];
list.push({
...sameScoreList[gap - 1],
rank: myRank - 1
})
list.push({
...sameScoreList[gap],
isSelf: true,
rank: myRank
})
list.push({
...sameScoreList[gap + 1],
rank: myRank + 1
})
return list.map(v => {
if(v.isSelf) return v;
return {
...v,
userNick: `${v.userNick[0]}***${v.userNick[v.userNick.length -1]}`
}
})
}
}
async getTotalRankUserCount(activityId) {
return await this.userdao.count({ activityId, maxScoreTime: { $exists: true } });
}
// 排行榜, 前1000名
async getRankList(activityId, pageNum, pageSize) {
console.log(`activityId`, activityId);
return await this.userdao.find({ activityId, maxScoreTime: { $exists: true } }, {
projection: {
userNick: 1,
avatar: 1,
totalScore: 1,
openId: 1
},
sort: {
totalScore: -1,
maxScoreTime: 1
},
limit: pageSize,
skip: (pageNum - 1) * pageSize,
});
}
}
module.exports = UserService;
\ No newline at end of file
/**
* 访问明细
*/
const { BaseDao } = require("../sdk");
const { getToday } = require("../utils");
const { USER_JOIN_DB_NAME } = require("../db");
const {JOIN_INFO_STATUS} = require('../constants');
class UserJoinService {
constructor(context) {
this.context = context;
this.userJoinDao = new BaseDao(context, USER_JOIN_DB_NAME);
}
// 用户开始游戏
async insertGameInfo(userInfo) {
const { openId, data } = this.context;
const { activityId } = data;
return this.userJoinDao.insertOne({
openId,
activityId,
...userInfo,
status: JOIN_INFO_STATUS.START,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
// 更新用户游戏数据
async updateGameInfo(_id, activityId, info) {
return this.userJoinDao.update(
{
_id,
activityId,
},
{
$set: {
...info,
updateTime: Date.now(),
},
}
);
}
async getGameInfo(_id, activityId) {
return this.userJoinDao.findOne({
_id,
activityId,
});
}
//上一次游戏信息
async getLastGameInfo() {
const { openId, data: { activityId } } = this.context;
const lastList = await this.userJoinDao.find({ openId, activityId, toolType: { $in: [1,2,3] } }, {
limit: 1,
sort: {
updateTime: -1
}
});
console.log('lastList'+lastList)
return lastList[0]
}
async getGameInfoListByToolType(activityId, toolType) {
const { openId } = this.context;
return this.userJoinDao.find({
activityId,
openId,
toolType,
});
}
async getUserJoinTotalScore(activityId) {
const { openId } = this.context;
return this.context.cloud.db.collection(USER_JOIN_DB_NAME).aggregate([
{
$match: { activityId, openId },
},
{
$group: {
_id: "$toolType",
score: { $sum: "$score" },
},
},
]);
}
async getJoinCount(info) {
return this.userJoinDao.count({
...info
});
}
}
module.exports = UserJoinService;
// 获取商家session
const getSellerSession = require('./package/getSession');
// 获取当天时间进行format
const getToday = require('./package/getToday');
// 发放淘宝奖品(权益/积分)
const sendTBAward = require('./package/sendTBAward');
// 通用并发接口
const lockUpdate = require('./package/lockUpdate');
// 用户订单
const getUserOrderlist = require('./package/getUserOrderlist');
//打印调用日志
const { logger, addErrorLog } = require('./package/log');
module.exports = {
getSellerSession,
getToday,
sendTBAward,
lockUpdate,
getUserOrderlist,
logger,
addErrorLog
}
/**
* 获取商家session
*/
const { SELLER_INFO_DB_NAME, ACTIVITY_CONFIG_DB_NAME } = require('../../db');
const { BaseDao } = require('../../sdk')
const getSellerSession = async (context, activityId) => {
if (!activityId) {
activityId = context.data.activityId;
}
let activitydao = new BaseDao(context, ACTIVITY_CONFIG_DB_NAME)
let sellerdao = new BaseDao(context, SELLER_INFO_DB_NAME)
let activityConfigResult = await activitydao.find({ _id: activityId });
if (!activityConfigResult || !activityConfigResult[0]) return {};
let result = await sellerdao.find({
openId: activityConfigResult[0].openId
});
console.log(`getSellerSession`, result);
if (!result || !result[0]) return {};
return {
session: result[0].accessToken
};
}
module.exports = getSellerSession;
\ No newline at end of file
const { transformBeijingDate, dateFormatter } = require('../../sdk');
// 获取今天的时间
const getToday = ()=> {
return dateFormatter(transformBeijingDate(), 'yyyy/MM/dd');
}
module.exports = getToday;
\ No newline at end of file
/**
* 用户购买记录查询
*/
const dayjs = require('dayjs');
const {dateFormatter, transformBeijingDate, TBAPIS} = require('../../sdk');
const getSellerSession = require('./getSession');
const { TAOBAO_SUCCESS_ORDER_STATUS } = require('../../constants');
const getUserOrderlist = async (context, queryStartTime, queryEndTime) => {
try{
let results = [];
let currentTime = Date.now();
// 开始时间以Math.max(当前时间倒推3个月,queryStartTime)
let lastUpdateTime = dayjs().add(-3, 'month').valueOf();
console.log(`lastUpdateTime`, lastUpdateTime);
// 若倒推的3个月时间小于传入的查询开始时间, 则以查询开始时间作为最后更新时间
if(lastUpdateTime < queryStartTime) {
lastUpdateTime = queryStartTime;
}
let { session } = await getSellerSession(context);
// 获取用户在lastUpdateTime ~ currentTime区间的购买情况
let params = {
startTime: dateFormatter(transformBeijingDate(lastUpdateTime)),
endTime: dateFormatter(transformBeijingDate(queryEndTime || currentTime)),
openId: context.openId,
session
}
let orderResult = await TBAPIS.getBuyerOrderList(context, params);
console.log(`orderResult`, JSON.stringify(orderResult));
if (orderResult.total_results > 0) {
const { trade } = orderResult.trades;
console.log('trade:'+JSON.stringify(trade))
trade.forEach((i) => {
if (TAOBAO_SUCCESS_ORDER_STATUS.includes(i.status)) {
i.orders.order.forEach((s) => {
results.push({
payTime: i.pay_time,
itemId: s.num_iid,
time: i.created,
price: s.price,
orderId: s.oid,
img: s.pic_path,
title: s.title,
});
});
}
});
}
console.log(`已支付的订单列表`, results);
return results;
}catch(e) {
console.log(`错误`, e);
return [];
}
}
module.exports = getUserOrderlist;
\ No newline at end of file
const {CODE_TYPES} = require('../../constants');
/**
* 并发更新
* @param {接收数组或对象} daoqueryArr : [{dao: userdao, query:{_id:_id}}, {dao: activityprizedao, query: {userNick, status ...}}]
* @param {*} fn
* @param {*} times
*/
const lockUpdate = async(daoqueryArr, fn, times=5) => {
if (typeof daoqueryArr !=='object') {
console.log(`lockUpdate 参数错误`);
return false;
}
if (!daoqueryArr instanceof Array) {
daoqueryArr = [daoqueryArr];
}
let time = 0;
console.log(`进入update并发处理次数`, times);
let success = false;
try{
while (time++ < times && !success) {
// 依次锁住表
let updateRes = [];
let error = false
for(let i = 0; i < daoqueryArr.length; i++) {
let daoquery = daoqueryArr[i];
if (!daoquery.dao || !daoquery.query) {
success = true;
error = true
console.log(`daoquery`, daoquery)
break
}else {
console.log(`daoquery`, daoquery)
let canupdate = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 2}});
updateRes.push(canupdate);
}
}
if (error) {
return `调用lockUpdate方法参数不符合规范`
}
console.log(`updateRes`, updateRes)
// 若都锁定成功了,执行内部调用
if (updateRes.every((v) => v === 1)) {
const ret = await fn();
console.log(`完成调用,解锁操作执行--------------`);
daoqueryArr.forEach(async daoquery => {
console.log(daoquery)
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`更新lockStatus为1`, ures);
});
success = true;
return ret;
} else {
console.log(`进入waitFor了,需等待30ms`)
await waitFor(30);
success = false;
}
}
}catch(e) {
console.log(e);
daoqueryArr.forEach(async daoquery => {
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`更新lockStatus为1`, ures);
});
success = false;
}
console.log(`daoqueryArr`, daoqueryArr)
// 稍后重试
if (!success) {
daoqueryArr.forEach(async daoquery => {
console.log(daoquery)
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`操作${times}次后更新lockStatus为1`, ures);
});
return CODE_TYPES.ERROR_UPDATE_RETRY;
}
function waitFor(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
});
}
}
module.exports = lockUpdate;
const logger = (methodName, params) => {
console.log(`调用方法: ${methodName}`, params);
}
// 发送错误日志
const addErrorLog = async (context, data = {}) => {
if (!context) return false;
const {
openId,
data: { activityId }
} = context;
const dbName = 'error_log';
const db = context.cloud.db;
const { functionName, errorMessage, catchType = 1 } = data;
const record = {
openId,
activityId,
functionName,
errorMessage,
catchType,
createTime: Date.now()
};
try {
return await db.collection(dbName).insertOne(record);
} catch (e) {
console.log(`添加记录失败-${dbName}:`, e);
return false;
}
};
module.exports = {
logger,
addErrorLog
}
\ No newline at end of file
const { PRIZE_TYPE, DRAW_STATUS, C_APP_NAME, TBERROR, CODE_TYPES } = require('../../constants');
const { TBAPIS } = require('../../sdk');
/**
* 发奖,包含权益,实物,积分
* @param {*} document 必须要有{ type, ename, _id }
* @param {*} session
* @param {*} context
*/
const sendTBAward = async (context, session, document) => {
let { type, ename, _id, credits } = document;
if (!type) {
return CODE_TYPES.PARAMS_ERROR;
}
if (type === PRIZE_TYPE.OBJECT) {
return document;
}
// 发奖
try {
console.log(`type`, type);
// 若中奖为权益
if (type === PRIZE_TYPE.ENAME) {
console.log(`中权益`);
let {drawStatus, remark} = await sendEname(ename, _id, session, context);
console.log(`drawStatus, remark`, drawStatus, remark);
document.drawStatus = drawStatus;
document.remark = remark;
} else if (type === PRIZE_TYPE.CREDITS) {
let { drawStatus, remark } = await sendCredits(credits, session, context);
document.drawStatus = drawStatus;
document.remark = remark;
}
return document;
}catch(e) {
console.log(`发奖错误`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 发放积分
* @param {发放的积分数} credits
* @param {*} session
* @param {*} context
* @returns {drawStatus, remark}
*/
const sendCredits = async (credits, session, context) => {
let drawStatus = '';
let remark = '';
let result = await TBAPIS.changeCredits(context, session, {
quantity: credits,
change_type: 2,
opt_type: '0',
remark: `参与活动加积分`
});
if (result) {
drawStatus = DRAW_STATUS.SUCCESS;
} else {
drawStatus = DRAW_STATUS.FAIL;
remark = result.result_msg;
}
return {drawStatus, remark};
}
/**
* @desc 发放权益
* @param {权益名称} ename
* @param {唯一key} uniqueId
* @param {*} session
* @param {*} context
* @returns { drawStatus, remark }
*/
const sendEname = async (ename, uniqueId, session, context) => {
let result = {};
try{
result = await TBAPIS.benefitSend(context, {
right_ename: ename,
receiver_id: context.openId,
unique_id: uniqueId,
app_name: C_APP_NAME,
session
});
}catch(e) {
console.log(`发放权益失败`, e);
result = e;
}
let drawStatus = '';
let remark = '';
if (result.result_success) {
drawStatus = DRAW_STATUS.SUCCESS;
} else {
let result_code = result.result_code;
if (['APPLY_SINGLE_COUPON_COUNT_EXCEED_LIMIT', 'APPLY_ONE_SELLER_COUNT_EXCEED_LIMIT', 'USER_PERMISSION_EXCEED_MAX_RIGHT_COUNT_IN_DAY'].includes(result_code)) {
drawStatus = DRAW_STATUS.RETRY;
} else {
drawStatus = DRAW_STATUS.FAIL;
}
remark = TBERROR[result_code || result.msg] || result.result_msg || result.sub_msg || `发放失败`;
}
return {remark, drawStatus};
}
module.exports = sendTBAward;
\ No newline at end of file
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
adler-32@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25"
integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=
cfb@^1.1.2:
version "1.2.0"
resolved "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8"
integrity sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=
dependencies:
adler-32 "~1.2.0"
crc-32 "~1.2.0"
printj "~1.1.2"
codepage@~1.14.0:
version "1.14.0"
resolved "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=
dependencies:
commander "~2.14.1"
exit-on-epipe "~1.0.1"
commander@~2.14.1:
version "2.14.1"
resolved "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
integrity sha1-IjUSPjevjKPGXfRbAm29NXsBuao=
commander@~2.17.1:
version "2.17.1"
resolved "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha1-vXerfebelCBc6sxy8XFtKfIKd78=
crc-32@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha1-yy224puIUI4y2d0OwWk+e0Ghggg=
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
dayjs@^1.8.28:
version "1.8.33"
resolved "https://registry.npm.taobao.org/dayjs/download/dayjs-1.8.33.tgz?cache=0&sync_timestamp=1597033960849&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdayjs%2Fdownload%2Fdayjs-1.8.33.tgz#18bc4a2b6c1c6f4d67b4c4f2536c0b97e5b766f7"
integrity sha1-GLxKK2wcb01ntMTyU2wLl+W3Zvc=
exit-on-epipe@~1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
integrity sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=
frac@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha1-PXT39keMiKG1AgMG10fcYxPHTQs=
node-xlsx@^0.15.0:
version "0.15.0"
resolved "https://registry.npm.taobao.org/node-xlsx/download/node-xlsx-0.15.0.tgz#1f1b0d7adce5c706e86bfd96a5aa0005bf8a9dc3"
integrity sha1-HxsNetzlxwboa/2WpaoABb+KncM=
dependencies:
buffer-from "^1.1.0"
xlsx "^0.14.1"
printj@~1.1.0, printj@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
integrity sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=
ssf@~0.10.2:
version "0.10.3"
resolved "https://registry.npm.taobao.org/ssf/download/ssf-0.10.3.tgz#8eae1fc29c90a552e7921208f81892d6f77acb2b"
integrity sha1-jq4fwpyQpVLnkhII+BiS1vd6yys=
dependencies:
frac "~1.1.2"
taobao-mini-sdk@0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/taobao-mini-sdk/download/taobao-mini-sdk-0.1.2.tgz?cache=0&sync_timestamp=1592807245146&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftaobao-mini-sdk%2Fdownload%2Ftaobao-mini-sdk-0.1.2.tgz#c4d36c8549aa6fdad51b6bca623c1de91a660c2b"
integrity sha1-xNNshUmqb9rVG2vKYjwd6RpmDCs=
xlsx@^0.14.1:
version "0.14.5"
resolved "https://registry.npm.taobao.org/xlsx/download/xlsx-0.14.5.tgz?cache=0&sync_timestamp=1597269620835&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.14.5.tgz#3637e914d791bdca7382816e173f7d725ed0e0d2"
integrity sha1-NjfpFNeRvcpzgoFuFz99cl7Q4NI=
dependencies:
adler-32 "~1.2.0"
cfb "^1.1.2"
codepage "~1.14.0"
commander "~2.17.1"
crc-32 "~1.2.0"
exit-on-epipe "~1.0.1"
ssf "~0.10.2"
.tea
.DS_Store
.vscode
debug.log
node_modules
\ No newline at end of file
# 数据模拟
```bash
cnpm install
```
```bash
cd mockServer
```
```bash
cnpm install
```
```bash
➜ mockServer npm run start
```
## 库表规范
http://cf.dui88.com/pages/viewpage.action?pageId=63937755
## sdk 接口文档说明
http://cf.dui88.com/pages/viewpage.action?pageId=66194323
{
"runtime": "nodejs8",
"version": "1.0"
}
\ No newline at end of file
const {
DEFAULT_CODE_TYPES
} = require('./sdk');
let BusinessError = {
// 更新重试失败(用于并发更新)
ERROR_UPDATE_RETRY: {
code: `210001`,
defaultMsg: `系统错误`
},
// 活动不存在
ERROR_NO_ACTIVITY: {
code: `220001`,
defaultMsg: `活动不存在`
},
// 活动未开始
ERROR_ACTIVITY_NOSTART: {
code: `220002`,
defaultMsg: `活动未开始`
},
// 活动已结束
ERROR_ACTIVITY_OVER: {
code: `220003`,
defaultMsg: `活动已结束`
},
// 排行榜未开奖
ERROR_NO_RANKOEPN: {
code: `220004`,
defaultMsg: `排行榜未开奖`
},
// 用户不存在
ERROR_NO_USER: {
code: `310002`,
defaultMsg: `用户不存在`
},
// 需要成为会员才能助力哦
ERROR_NEEDMEMBER_DOHELP: {
code: `310004`,
defaultMsg: '需要成为会员才能助力哦'
},
// 任务奖励已领取
ERROR_TASK_ALREADYRECEIVE: {
code: `430002`,
defaultMsg: `任务奖励已领取`
},
// 任务已完成
ERROR_TASK_COMPLETE: {
code: `430003`,
defaultMsg: `任务已完成`
},
// 暂无次数可领取
ERROR_TASK_NORECEIVE: {
code: `430003`,
defaultMsg: `暂无次数可领取`
},
ERROR_FORBIDDEN_OPE: {
code: `530001`,
defaultMsg: `非法操作`
},
ERROR_RECEIVE_PRIZE: {
code: `630002`,
defaultMsg: `奖励已领取`
},
ERROR_SEND_PRIZE: {
code: `730001`,
defaultMsg: `发奖失败`
},
ERROR_NO_PRIZE: {
code: `730002`,
defaultMsg: `奖品不存在`
},
ERROR_NO_STOCK: {
code: `730003`,
defaultMsg: `库存不足`
},
ERROR_PRIZE_EXPIRED: {
code: `740001`,
defaultMsg: `奖品已超过领取时间`
},
ERROR_TASK_NORECEIVE: {
code: `930002`,
defaultMsg: `该任务不可领取`
},
ERROR_NOT_NEW_VIP: {
code: `930003`,
defaultMsg: `新玩家才可以助力哦`
},
ERROR_NOT_VIP: {
code: `930004`,
defaultMsg: `成为会员才能为TA助力哦!`
},
ERROR_INVALID_INVITE_USER: {
code: `930005`,
defaultMsg: `inviteId无效`
},
ERROR_ASSIST_ALREADY: {
code: `930006`,
defaultMsg: `已为好友成功助力过了`
},
ERROR_CREDIT_NUM: {
code: `100001`,
defaultMsg: `积分不足`
},
ERROR_SYSTEM: {
code: `100002`,
defaultMsg: `系统错误`
},
ERROR_NO_SHOES: {
code: `100003`,
defaultMsg: `鞋子数量不足`
},
ERROR_EXCHANGE: {
code: `100004`,
defaultMsg: `兑换失败`
}
}
const TASK_LIST = [{
taskType: 'follow',
rewards: 10, //砖石
status: 0
},
{
taskType: 'orderGoods',
rewards: 5, //复活卡
status: 0
},
{
taskType: 'inviteFriends',
status: 0,
rewards: 20, //砖石
value: 0,
},
{
taskType: 'browseGoods',
rewards: 1, //复活卡
status: 0
},
{
taskType: 'exchangeCredits',
limitTimes: 2,
rewards: 50, //砖石
times: 0
},
{
taskType: 'sign',
rewards: 10, //砖石
status: 0
}
]
const CODE_TYPES = Object.assign({}, DEFAULT_CODE_TYPES, BusinessError);
//tb 接口返回部分错误
const TBERROR = {
'USER_PERMISSION_EXCEED_MAX_RIGHT_COUNT_IN_DAY': '今日领取达到上限,明日再来领取哦',
'COUPON_INVALID_OR_DELETED': '权益无效或者被删除,请联系商家',
'APPLY_OWNSELF_COUPON': '不能领取自己家店铺权益',
'APPLY_SINGLE_COUPON_COUNT_EXCEED_LIMIT': '请至卡券包删除无用权益再领取',
'NO_RIGHT_QUANTITY': '权益库存不足,请联系商家',
'ERRORA_3_567': '领取失败,为风险用户',
'Invalid session': '订购应用已过期,请联系商家处理',
'NO_RIGHT_QUANTITY': '权益库存不足,请联系商家'
}
// 领取奖品状态
const DRAW_STATUS = {
// 待领取
WAITAWARD: 1,
// 处理中
PROCESSING: 2,
// 领取成功
SUCCESS: 3,
// 领取失败
FAIL: 4,
// 已过期
EXPIRED: 5,
// 重新领取
RETRY: 6
}
// 物流状态
const SHIP_STATUS = {
//未填写收货地址
NO_ADDRESS: 0,
//未发货
UNSHIPPED: 1,
//已发货
SHIPPED: 2
}
// 奖品类型
const PRIZE_TYPE = {
ENAME: 1,
CREDITS: 2,
OBJECT: 3,
THANKS: 5
};
// C端的APP NAME
const C_APP_NAME = 'promotioncenter-3000000026263524';
// 订单状态
const TAOBAO_SUCCESS_ORDER_STATUS = [
"WAIT_SELLER_SEND_GOODS",
"SELLER_CONSIGNED_PART",
"WAIT_BUYER_CONFIRM_GOODS",
"TRADE_BUYER_SIGNED",
"TRADE_FINISHED",
"PAID_FORBID_CONSIGN",
];
// 活动状态
const ACTIVITY_STATUS = {
NORMAL: 1,
DELETE: 2
};
//鞋子类型map
const SHOE_TYPE_MAP = {
1: "normal", //新用户赠送1次免伤
2: "primary",
3: "medium"
};
const NORMAL_TOOL_TYPE = 1;
//每局游戏消耗10砖石
const ONCE_DIAMOND_RE = 10;
const SHOE_TYPE_REWARDS = {
1: 0,
2: 20, //20砖石兑换
3: 30 //30砖石兑换
}
// 任务类型
const TASK_TYPE = {
//每日免费
FREE_MASONRYS: 'sign',
// 邀请好友
INVITES: 'inviteFriends',
// 购买商品
BUY_GOODS: 'orderGoods',
// 关注店铺
FOLLOW: 'follow',
// 浏览商品
BROWSE: 'browseGoods',
//积分兑换
EXCHANAGE: 'exchangeCredits',
}
//任务奖励
const TASK_TYPE_WIN = {
//每日登录
DAY: 10,
// 邀请好友得20砖石
INVITES: 20,
//邀请好友非店铺会员得复活卡
NEN_INVITES: 1,
// 购买商品得复活卡
BUY_GOODS: 5,
// 关注店铺
FOLLOW: 10,
// 浏览商品得复活卡
BROWSE: 1,
//积分兑换
EXCHANAGE_CREDITS: 50,
}
//任务频率类型常量
const TASK_RATE_TYPE = {
FOREVER: 1,
EVERYDAY: 2,
NOLIMIT: 3,
};
// 积分兑换限制
const EXCHANGE_CREDITS_LIMIT = {
value: 2,
type: TASK_RATE_TYPE.EVERYDAY
};
// 浏览商品限制
const BROSER_LIMIT = {
value: 1,
type: TASK_RATE_TYPE.EVERYDAY
};
// 邀请好友限制
const INVITE_FRIENDS_LIMIT = {
value: 5,
type: TASK_RATE_TYPE.EVERYDAY
};
//游戏记录状态
const JOIN_INFO_STATUS = {
START: 0,
FINISH: 1
}
//助力成功
const ASSIST_SUCCESS = 1
//助力成功 新入会获得30砖石
const FIRST_DIAMOND = 30
// 排行榜开奖状态
const OPEN_PRIZE_STATUS = {
WAITOPEN: 1,
OPENING: 2,
SUCCESS: 3,
FAIL: 4
};
//埋点数据类型
const DATA_TYPE = {
newAddUv: 'newAddUv', //首次进入uv
accesssPv: 'accesssPv', //访问pv
accesssUv: 'accesssUv', //访问uv
joinGamePv: 'joinGamePv', //参与pv
joinGameUv: 'joinGameUv', //参与uv
useNormalUv: 'useNormalUv', //款鞋一使用uv
usePrimaryUv: 'usePrimaryUv', //款鞋二使用uv
useMediumUv: 'useMediumUv', //款鞋三使用uv
countFollowUv: 'countFollowUv', //关注店铺完成uv
dayLoginUv: 'dayLoginUv', //每日登录任务完成
exchanageCreditPv: 'exchanageCreditPv', //积分兑换砖石pv(前端)
exchanageCreditUv: 'exchanageCreditUv', //积分兑换砖石uv
inviteFriendPv: 'inviteFriendPv', //邀请好友发起Pv(前端)
inviteFriendUv: 'inviteFriendUv', //邀请好友发起Uv
completeInvitedPv: 'completeInvitedPv', //邀请好友任务完成Pv 1
completeInvitedUv: 'completeInvitedUv', //邀请好友任务完成Uv 1
beInvitedMember: 'beInvitedMember', //带来好友已入会
noInvitedMember: 'noInvitedMember', //带来好友未入会
beBrowseUv: 'beBrowseUv', //每日浏览完成uv
consumptionUv: 'consumptionUv', //每日消费uv(去下单) 1
exchanagePrize: 'exchanagePrize', //每日兑换uv(兑换商场)(前端)
addShoesUv: 'addShoesUv', //获得碎片Uv
reduceShoesUv: 'reduceShoesUv', //使用碎片Uv
addCardUv: 'addCardUv', //获得复活卡Uv
reduceCardUv: 'reduceCardUv', //使用复活卡Uv
reduceDiamondUv: 'reduceDiamondUv', //消耗砖石Uv
reduceCreditUv: 'reduceCreditUv', //消耗积分Uv
countDiamond: 'countDiamond', //当日累计消耗砖石
countCredit: 'countCredit', //当日累计消耗积分
countMember: 'countMember', //入会人数
countShoes: 'countShoes', //碎片获取总量
useCountShoes: 'useCountShoes', //碎片使用总量
countCards: 'countCards', //复活卡获取总量
useCountCards: 'useCountCards', //复活卡使用总量
assistRecord: 'assistRecord', //助力记录
orderPrice: 'orderPrice', //订单价格
}
let rand = (function () {
let seed = (new Date()).getTime()
function r() {
seed = (seed * 9301 + 49297) % 233280
return seed / (233280.0)
}
return function (number) {
return Math.ceil(r() * number)
}
})()
const SHIP_TYPE = {
INIT: 1,
ADD_ADDRESS: 2,
SEND_GOODS: 3
}
const PRIZE_DATA_TYPE = {
RANK: 1,
EXCHANGE: 2
}
const HAS_EXCHANGE = {
EXCHANGE: 2,
NO_EXCHANGE: 1
}
module.exports = {
CODE_TYPES,
C_APP_NAME,
TBERROR,
DRAW_STATUS,
PRIZE_TYPE,
TAOBAO_SUCCESS_ORDER_STATUS,
ACTIVITY_STATUS,
TASK_TYPE,
SHIP_STATUS,
OPEN_PRIZE_STATUS,
TASK_TYPE_WIN,
JOIN_INFO_STATUS,
DATA_TYPE,
ASSIST_SUCCESS,
SHOE_TYPE_MAP,
NORMAL_TOOL_TYPE,
INVITE_FRIENDS_LIMIT,
BROSER_LIMIT,
EXCHANGE_CREDITS_LIMIT,
FIRST_DIAMOND,
TASK_LIST,
SHOE_TYPE_REWARDS,
rand,
PRIZE_DATA_TYPE,
SHIP_TYPE,
HAS_EXCHANGE
}
\ No newline at end of file
const {
pipeActivityInfo
} = require('./base.controller');
const UserService = require('../service/user.service');
const AwardsService = require('../service/awards.service');
const {
CODE_TYPES,
PRIZE_DATA_TYPE,
DRAW_STATUS,
PRIZE_TYPE,
SHIP_TYPE,
HAS_EXCHANGE
} = require('../constants');
const {
ResultsModel
} = require('../sdk');
let resultModel = new ResultsModel();
/**
* 我的奖品列表
* @param {*} context
*/
const getMyPrizeList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以查看我的奖品
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let awardSer = new AwardsService(context);
let result = await awardSer.getMyPrizeList({
openId: context.openId,
activityId: context.data.activityId
});
return resultModel.success(result);
}
/**
* 领取实物
* @param {*} context
*/
const receiveObjectPrize = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以领取实物
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let {
provice,
city,
area,
addressdetail,
_id,
name,
phone,
activityId
} = context.data;
if (!_id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少_id`)
}
if (!name) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少name`)
}
if (!phone) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少phone`)
}
if (!provice) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少provice`)
}
if (!city) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少city`)
}
if (!area) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少area`)
}
if (!addressdetail) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少addressdetail`)
}
let awardSer = new AwardsService(context);
let result = await awardSer.recieveObjectPrize(_id, {
activityId,
provice,
city,
area,
addressdetail,
name,
phone
});
if (result.code) {
return resultModel.error(result);
}
return resultModel.success(result);
}
/**
* 权益重新领取
* @param {*} context
*/
const receiveEnamePrize = async (context) => {
let pipeRes = await pipeActivityInfo(context);
// 活动结束可以领取权益
if (pipeRes.code && pipeRes.code !== CODE_TYPES.ERROR_ACTIVITY_OVER.code) {
return pipeRes;
}
let {
_id
} = context.data;
if (!_id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `缺少_id`)
}
let awardsSer = new AwardsService(context);
let result = await awardsSer.recieveEnamePrize(_id, pipeRes._id);
if (result.code) {
return resultModel.error(result);
}
if (result.remark) {
return resultModel.error(result, result.remark);
}
return resultModel.success(result);
}
const exchanagePrize = async (context) => {
let {
activityId,
id
} = context.data;
let {
openId
} = context;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `id必填`);
}
try {
const awardsSer = new AwardsService(context);
const userSer = new UserService(context);
let hasExchangeList = await awardsSer.getUserPrizeById(activityId, id);
if (hasExchangeList.length) {
resultModel.error(CODE_TYPES.ERROR_SYSTEM, '奖品已经兑换过了');
}
let prizeInfo = await awardsSer.getActivityPrizeById(id);
if (!prizeInfo) return resultModel.error(CODE_TYPES.ERROR_SYSTEM, '奖品不存在');
let {
value,
_id: prizeId,
...prizeRest
} = prizeInfo;
let {
totalShoes,
userNick,
_id: userId
} = await userSer.getUserInfo();
if (totalShoes < value) {
return resultModel.error(CODE_TYPES.ERROR_NO_SHOES);
}
let res = await awardsSer.reduceStock(prizeId);
if (!res || res.code === CODE_TYPES.ERROR_NO_STOCK.code || res.code === CODE_TYPES.SYSTEM_ERROR.code) {
return resultModel.error(CODE_TYPES.ERROR_EXCHANGE, res.defaultMsg || '兑换失败')
}
let shipType = prizeRest.type === PRIZE_TYPE.OBJECT ? {
shipStatus: SHIP_TYPE.INIT
} : {}
let award = {
prizeId,
userNick,
exchangeValue: value,
drawStatus: DRAW_STATUS.WAITAWARD,
...prizeRest,
...shipType,
openId,
}
let insertRes = await awardsSer.addAward(award);
if (!insertRes) {
return resultModel.error(CODE_TYPES.ERROR_EXCHANGE)
}
await userSer.updateUser(userId, {
totalShoes: +totalShoes - +value
})
return resultModel.success({
...award,
id: insertRes
})
} catch (e) {
console.log(e, 'exchanagePrize')
return resultModel.error(CODE_TYPES.ERROR_SYSTEM)
}
}
const getExchanageList = async (context) => {
let {
activityId
} = context.data;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
try {
const awardsSer = new AwardsService(context);
const userSer = new UserService(context);
let exchangePrizeList = await awardsSer.getPrizeByType(activityId, PRIZE_DATA_TYPE.EXCHANGE);
let hasExchangePrize = await awardsSer.getUserPrizeByType(activityId, PRIZE_DATA_TYPE.EXCHANGE) || [];
let hasEchangeIds = hasExchangePrize.map(i => i.prizeId);
exchangePrizeList = exchangePrizeList.map(i => {
if (hasEchangeIds.includes(i._id)) {
return {
...i,
status: HAS_EXCHANGE.EXCHANGE
}
}
return {
...i,
status: HAS_EXCHANGE.NO_EXCHANGE
};
})
let {
totalShoes
} = await userSer.getUserInfo();
return resultModel.success({
totalShoes,
list: exchangePrizeList
})
} catch (e) {
console.log(e, 'getExchanageList')
return resultModel.error(CODE_TYPES.ERROR_SYSTEM)
}
}
module.exports = {
getMyPrizeList,
receiveObjectPrize,
receiveEnamePrize,
getExchanageList,
exchanagePrize
}
\ No newline at end of file
const BaseService = require('../service/base.service');
const { CODE_TYPES, ACTIVITY_STATUS, OPEN_PRIZE_STATUS } = require('../constants');
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
// 活动判断
const pipeActivityInfo = async (context) => {
let activitySer = new BaseService(context);
let { activityId } = context.data;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
// 活动基本情况
let activityInfo = await activitySer.getBaseInfo(activityId);
// 活动不存在
if (!activityInfo && activityInfo.deleteStatus === ACTIVITY_STATUS.DELETE) {
return resultModel.error(CODE_TYPES.ERROR_NO_ACTIVITY);
}
let { startTime, endTime } = activityInfo;
let currentTime = Date.now();
if (currentTime < startTime) {
return resultModel.error(CODE_TYPES.ERROR_ACTIVITY_NOSTART, `活动未开始`);
}
if (currentTime > endTime) {
return resultModel.error(CODE_TYPES.ERROR_ACTIVITY_OVER, `活动已结束`);
}
return activityInfo;
}
// 活动基本信息
const getActivityBaseInfoById = async(context) => {
let activitySer = new BaseService(context);
let { activityId } = context.data;
// 参数校验
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
// 活动基本情况
let activityInfo = await activitySer.getBaseInfo(activityId);
activityInfo.rankLimit = 1000;
activityInfo.openPrizeTime = activityInfo.endTime + 48 * 60 * 60 * 1000;
activityInfo.openPrize = (activityInfo.openPrizeStatus && activityInfo.openPrizeStatus === OPEN_PRIZE_STATUS.SUCCESS);
return resultModel.success(activityInfo);
}
module.exports = {
pipeActivityInfo,
getActivityBaseInfoById
}
\ No newline at end of file
const { pipeActivityInfo } = require('./base.controller');
const UserJoinService = require("../service/userJoin.service");
const UserService = require('../service/user.service');
const AwardsService = require('../service/awards.service');
const GameService = require('../service/game.service');
const { CODE_TYPES, DRAW_STATUS, SHIP_STATUS, SAMPLE_STATUS, B_PRIZE_TYPE, PRIZE_TYPE, JOIN_INFO_STATUS, DATA_TYPE } = require('../constants');
const { getToday, getSellerSession, statInsertPV, statInsertUV } = require('../utils');
const { ResultsModel } = require('../sdk');
let resultModel = new ResultsModel();
const getGameInfo = async context => {
const pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
let { activityId } = context.data;
let { openId } = context;
const userService = new UserService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
const UserJoinSer = new UserJoinService(context);
let joinCount = await UserJoinSer.getJoinCount(activityId, openId);
let { diamond, resurgenceCards, initialCredits, member } = userInfo;
//初始积分
let { session } = await getSellerSession(context, activityId);
let initialCredits = await userService.queryUserCredits(session) || 0
let result = {
guideComplete: joinCount > 0 ? 1 : 0,
diamond,
resurgenceCards,
initialCredits: member.flag ? initialCredits : 0,
isVip: isvip,
vipLink: url,
}
return resultModel.success(result);
}
// 开始游戏
const startGame = async context => {
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
const userService = new UserService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
let { activityId } = context.data;
const { diamond } = userInfo;
if (diamond < 10) {
return resultModel.error(CODE_TYPES.ERROR_NO_GAME_COUNT);
}
const gameService = new GameService(context);
const joinId = await gameService.addJoin(userInfo.userNick);
//埋点数据
statInsertPV({ activityId, openId, type: DATA_TYPE.joinPv });
statInsertUV({ activityId, openId, type: DATA_TYPE.joinUv });
await userService.updateUser(userInfo._id, {
diamond: userInfo.diamond - 10,
newUserGuide: 1
});
//首次参与活动老会员UV
if (gameTime == 0 && userInfo.member && userInfo.member.flag) {
const dataService = new DataService(context);
dataService.insertUV({ activityId, openId, type: DATA_TYPE.joinOldMemberUv });
}
return resultModel.success({
id: joinId,
isvip,
url
});
}
const submitGame = async context => {
const { activityId, id, score } = context.data;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!id) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `id必填`);
}
if (!score && score !== 0) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `score必填`);
}
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
const userService = new UserService(context);
const userInfo = await userService.getUserInfo();
if (!userInfo) return resultModel.error(CODE_TYPES.ERROR_NO_USER);
const gameService = new GameService(context);
const joinInfo = await gameService.getJoinInfo(id);
if (!joinInfo) return resultModel.error(CODE_TYPES.ERROR_NO_JOIN_INFO);
if (!(joinInfo.status && joinInfo.status == JOIN_INFO_STATUS.START)) {
resultModel.error(CODE_TYPES.ERROR_JOIN_STATUS_ERROR);
}
await gameService.updateJoin(id, {
submitGame: Date.now(),
submitDay: getToday(),
score,
duration: Date.now() - joinInfo.createTime,
prizeId: prizeResult._id,
awardId: prizeResult.awardId,
prizeType,
status: JOIN_INFO_STATUS.FINISH
});
const totalScore = userInfo.totalScore + score;
await userService.updateUser(userInfo._id, {
totalScore,
// info: userInfo['info'],
updateScoreTime: Date.now()
});
const { rank } = await userService.getUserRank(totalScore);
let { _id, ename, type, image, name, awardId } = prizeResult;
let prize = { _id, ename, type, image, name, awardId };
return resultModel.success({
score,
rank,
totalScore,
redPacketReminder,
prize
});
}
module.exports = {
getGameInfo,
startGame,
submitGame
}
\ No newline at end of file
const UserService = require('../service/user.service');
const BaseService = require('../service/base.service');
const { pipeActivityInfo } = require('./base.controller');
const { login } = require('./user.controller');
const TaskService = require('../service/task.service');
const StatService = require("../service/stat.service");
const { CODE_TYPES, TASK_TYPE, TASK_LIST, TASK_TYPE_WIN } = require('../constants');
const { ResultsModel, dateFormatter, TBAPIS, transformBeijingDate } = require('../sdk');
const { getToday, logger, getSellerSession, getUserOrderlist, statInsertPV, statInsertUV } = require('../utils')
let resultModel = new ResultsModel();
//购买浏览商品列表
const getBrowseGoodsList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束
if (pipeRes.code) {
return pipeRes;
}
let ids = "";
if (pipeRes.tasks && pipeRes.tasks.orderGoods) {
ids = pipeRes.tasks.orderGoods.itemIds;
}
let list = [];
if (ids) {
let taskSer = new TaskService(context);
list = await taskSer.getGoodsList(ids);
}
console.log('list ', list);
return resultModel.success(list);
}
//购买下单商品列表
const getOrderList = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
// 活动结束
if (pipeRes.code) {
return pipeRes;
}
let ids = "";
if (pipeRes.tasks && pipeRes.tasks.orderGoods) {
ids = pipeRes.tasks.orderGoods.itemIds;
}
let list = [];
if (ids) {
let taskSer = new TaskService(context);
list = await taskSer.getGoodsList(ids);
}
console.log('list ', list);
return resultModel.success(list);
}
//获取任务列表
const getTaskList = async (context) => {
logger('getTaskList', context.data);
const pipeRes = await pipeActivityInfo(context);
console.log('---------------'+pipeRes)
if (pipeRes.code) {
return pipeRes;
}
try {
let userSer = new UserService(context);
let statSer = new StatService(context);
let taskService = new TaskService(context)
let today = getToday();
let userInfo = await userSer.getUserInfo()
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
}
let { remainTimes, recordTask, taskInfo, _id } = userInfo
let todayTask = taskInfo[today]
let { followStatus, orders:oldOrderRecord } = recordTask
if(!todayTask) {
todayTask = {
browserGoods: { value: TASK_TYPE_WIN.BROWSE, status: 0},
invites: [],
orders: [],
exchangeCredits: [],
sign: { value: TASK_TYPE_WIN.DAY, status: 1}
}
}
//是否有未生效的新订单
let newOrders = await taskService.getNewBuyGoodsOrders(pipeRes, userInfo);
let goodsTaskWaitReceive = newOrders.length;
let oldRecord = todayTask.orders ? todayTask.orders : []
oldOrderRecord = oldOrderRecord || []
//订单支付成功uv
if (goodsTaskWaitReceive > 0) {
newOrders.forEach(el => {
let orderDetail = {
"itemId": o.itemId,
"orderId": o.orderId,
"price": o.price,
};
oldRecord.push({
"createTime": transformBeijingDate(Date.now()),
"orderId": o.orderId
})
oldOrderRecord.push({
"createTime": transformBeijingDate(Date.now()),
"orderId": o.orderId
})
//下单打点
statSer.addStat({activityId, type: DATA_TYPE.orderPrice, orderInfo:orderDetail})
})
let { activityId, openId } = userInfo;
statInsertUV({ activityId, openId, type: DATA_TYPE.consumptionUv });
}
//更新用户信息
let param = {
remainTimes: {
...remainTimes,
orders: goodsTaskWaitReceive + remainTimes.orders
},
recordTask: {
...recordTask,
orders: oldOrderRecord
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
orders: oldRecord
}
}
}
await userSer.update(_id,param)
//获取更新后打用户信息
let updateUserInfo = await userSer.getUserInfo()
let { browserGoods, invites, exchangeCredits, freeDiamond } = updateUserInfo.taskInfo[today]
let { invites:remainInvites, orders:oldOrders } = updateUserInfo.remainTimes
let taskList = TASK_LIST.map(el => {
if(el.taskType == TASK_TYPE.BROWSE) {
el.status = browserGoods.status
}
if(el.taskType == TASK_TYPE.FOLLOW) {
el.status = followStatus
}
if(el.taskType == TASK_TYPE.FREE_MASONRYS) {
el.status = freeDiamond.status
}
if(el.taskType == TASK_TYPE.INVITES) {
el.status = remainInvites == 0 ? 0 : 1
}
if(el.taskType == TASK_TYPE.BUY_GOODS) {
el.status = orders == 0 ? 0 : 1
}
if(el.taskType == TASK_TYPE.EXCHANAGE) {
el.status = goodsTaskWaitReceive > 0 ? 1 : oldOrders > 0 ? 1 : 0
el.times = exchangeCredits.length || 0
}
})
return resultModel.success({ taskList })
}
catch(err) {
console.log('获取新订单失败')
}
}
// 领取任务次数
const completeTask = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
let { taskType } = context.data;
if (!taskType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType必填`);
}
if (![TASK_TYPE.INVITES, TASK_TYPE.BUY_GOODS, TASK_TYPE.FREE_MASONRYS, TASK_TYPE.FOLLOW,TASK_TYPE.BROWSE,TASK_TYPE.EXCHANAGE].includes(taskType)) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType非法`);
}
let userSer = new UserService(context);
let userInfo = await userSer.getUserInfo();
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
// await login(context)
// userInfo = await userSer.getUserInfo();
}
let taskSer = new TaskService(context);
let result = await taskSer.receiveTaskRewards(pipeRes, userInfo, taskType);
if (result.code) {
return resultModel.error(result);
}
return resultModel.success(result);
}
//完成任务
const doCompleteTask = async (context) => {
// 判断活动
let pipeRes = await pipeActivityInfo(context);
if (pipeRes.code) {
return pipeRes;
}
let { taskType, isNewVip, inviteId } = context.data;
if (!taskType) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType必填`);
}
if (![TASK_TYPE.INVITES, TASK_TYPE.FOLLOW, TASK_TYPE.BROWSE].includes(taskType)) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `taskType非法`);
}
let userSer = new UserService(context);
let userInfo = await userSer.getUserInfo();
// 用户不存在
if (!userInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_USER);
}
let taskSer = new TaskService(context);
let result = await taskSer.doCompleteTask(userInfo, taskType, isNewVip);
if (result.code) {
return resultModel.error(result);
}
return resultModel.success(result);
}
module.exports = {
getBrowseGoodsList,
getOrderList,
getTaskList,
completeTask,
doCompleteTask
}
\ No newline at end of file
const UserService = require('../service/user.service');
const ActivityService = require('../service/base.service');
const UserJoinService = require("../service/userJoin.service");
const AccessService = require("../service/access.service");
const StatService = require("../service/stat.service");
const AwardsService = require('../service/awards.service');
const {
CODE_TYPES,
DATA_TYPE,
INVITE_FRIENDS_LIMIT,
OPEN_PRIZE_STATUS,
PRIZE_DATA_TYPE
} = require('../constants');
const {
logger,
addErrorLog,
getToday,
getSellerSession,
statInsertUV
} = require('../utils')
const {
ResultsModel
} = require('../sdk');
let resultModel = new ResultsModel();
/**
* 登陆
*/
const login = async (context) => {
logger('login', context.data);
const {
userNick,
activityId,
avatar,
inviteId = "",
isFollow = false
} = context.data;
const {
openId
} = context;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`);
}
if (!userNick || !avatar) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `userNick, avatar 必填`);
}
try {
const activityService = new ActivityService(context);
const userService = new UserService(context);
const accessService = new AccessService(context);
const statService = new StatService(context);
const UserJoinSer = new UserJoinService(context);
let activityInfo = await activityService.getBaseInfo(activityId);
// 活动不存在
if (!activityInfo) {
return resultModel.error(CODE_TYPES.ERROR_NO_ACTIVITY);
}
let {
session
} = await getSellerSession(context, activityId);
// 是否是会员
let {
isvip,
url
} = await userService.getShopVip(session);
let joinCount = await UserJoinSer.getJoinCount(activityId, openId);
// let isvip = false;
let today = getToday();
let userInfo = await userService.getUserInfo();
//访问pv
await accessService.addAccess(isvip, DATA_TYPE.accesssPv);
//访问uv
await accessService.addAccess(isvip, DATA_TYPE.accesssUv);
//初始积分
let initialCredits = await userService.queryUserCredits(session) || 0
if (userInfo) {
let {
_id,
member,
diamond,
resurgenceCards
} = userInfo;
if (!member.newMember && !member.flag) {
await userService.updateUser(_id, {
inviteId,
initialCredits,
member: {
flag: isvip,
newMember: isvip ? true : false,
}
});
}
return resultModel.success({
inviteId: openId,
diamond,
resurgenceCards,
initialCredits: isvip ? initialCredits : 0,
newUserGuide: joinCount > 0 ? 1 : 0,
isVip: isvip,
vipLink: url,
});
}
//首次进入uv
await statInsertUV(context, {
openId,
activityId,
type: DATA_TYPE.newAddUv
});
let result = await userService.insertInitUser({
userNick,
activityId,
avatar,
openId,
inviteId,
diamond: 0,
totalScore: 0,
maxScore: 0,
rankPrizePop: 0,
initialCredits,
resurgenceCards: 0,
totalShoes: 0,
newUserGuide: 0,
member: {
flag: isvip,
newMember: false,
},
follow: {
flag: isFollow,
newFollow: false,
},
toolInfo: {
normal: 1,
primary: 0,
medium: 0
},
remainTimes: {
[TASK_TYPE.BROWSE]: 0,
[TASK_TYPE.BUY_GOODS]: 0,
[TASK_TYPE.INVITES]: 0,
[TASK_TYPE.FOLLOW]: isFollow ? 1 : 0,
[TASK_TYPE.FREE_MASONRYS]: 1,
},
recordTask: {
invites: [],
orders: [],
followStatus: isFollow ? 1 : 0
},
taskInfo: {},
info: {
[today]: {
login: 1
}
},
});
if (result) {
return resultModel.success({
inviteId: openId,
diamond: 0,
resurgenceCards: 0,
initialCredits: isvip ? initialCredits : 0,
newUserGuide: joinCount > 0 ? 1 : 0,
isVip: isvip,
vipLink: url,
});
}
return resultModel.error(CODE_TYPES.ERROR_LOGIN_INSERT);
} catch (e) {
console.log(e, "login接口出错了");
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, "用户登录失败");
}
};
/**
* 判断是否VIP
*/
const getVipInfo = async context => {
logger('getVipInfo', context.data);
let {
activityId
} = context.data
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`)
}
const {
session
} = await getSellerSession(context, activityId);
if (!session) {
await addErrorLog(context, {
functionName: 'getVipInfo',
errorMessage: '获取卖家session失败'
});
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, '获取卖家session失败');
}
const userService = new UserService(context);
let userInfo = await userService.getUserInfo();
let {
_id,
member
} = userInfo
try {
let vipInfo = await userService.getShopVip(session);
if (!member.flag && vipInfo.isvip) {
await userService.updateUser(_id, {
inviteId,
initialCredits: isVip ? initialCredits : 0,
member: {
flag: vipInfo.isvip,
newMember: true,
bememberTime: Date.now()
}
});
}
return resultModel.success(vipInfo)
} catch (error) {
console.log('判断是否vip失败' + error)
}
}
const getRankList = async (context) => {
logger('getRankList', context.data);
let {
activityId
} = context.data
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`)
}
const userService = new UserService(context);
const awardsSer = new AwardsService(context);
try {
let {
maxScore,
userNick,
} = await userService.getUserInfo();
let {
rank
} = await userService.getUserRank(maxScore);
let list = await userService.getRankList(activityId);
let prizeList = await awardsSer.getPrizeByType(activityId, PRIZE_DATA_TYPE.RANK)
return resultModel.success({
detail: {
rank,
maxScore,
userNick
},
list: list.map(i => {
return {
...i,
userNick: i.userNick[0] + "***" + i.userNick[i.userNick.length - 1]
}
}),
prizeList
})
} catch (error) {
console.log('获取排行失败' + error)
}
}
const rankPrizePop = async (context) => {
logger('rankPrizePop', context.data);
let {
activityId
} = context.data
let {
openId
} = context;
if (!activityId) {
return resultModel.error(CODE_TYPES.PARAMS_ERROR, `activityId必填`)
}
const userSer = new UserService(context);
const awardsSer = new AwardsService(context);
const userJoinSer = new UserJoinService(context);
const activitySer = new ActivityService(context);
try {
let {
maxScore,
rankPrizePop,
_id: userId
} = await userSer.getUserInfo();
let {
openPrizeStatus
} = await activitySer.getBaseInfo(activityId);
let {
rank
} = await userSer.getUserRank(maxScore);
let prize = await awardsSer.getUserAwardPrizeByType(activityId, PRIZE_DATA_TYPE.RANK) || '';
let userJoinCount = await userJoinSer.getJoinCount(activityId, openId)
if (prize || openPrizeStatus === OPEN_PRIZE_STATUS.SUCCESS) {
await userSer.updateUser(userId, {
rankPrizePop: 1
})
}
return resultModel.success({
rank,
prize,
needPop: rankPrizePop === 0 && userJoinCount > 0
})
} catch (error) {
console.log('获取排行失败' + error)
return resultModel.error(CODE_TYPES.SYSTEM_ERROR, '获取排行失败')
}
}
module.exports = {
// login,
// getVipInfo,
getRankList,
rankPrizePop
}
\ No newline at end of file
const ACCESS_DB_NAME = 'c_user_access';
const USER_DB_NAME = 'c_user';
const USER_JOIN_DB_NAME = 'c_user_join';
const DATA_DB_NAME = 'c_stat_info';
const AWARDS_DB_NAME = 'c_awards_info';
const ERROR_LOG_DB_NAME = 'error_log';
const SELLER_INFO_DB_NAME = 'a_seller_info';
const PRIZE_CONFIG_DB_NAME = 'b_prize_config';
const ACTIVITY_CONFIG_DB_NAME = 'b_activity_config';
module.exports = {
ACCESS_DB_NAME,
USER_DB_NAME,
AWARDS_DB_NAME,
ERROR_LOG_DB_NAME,
SELLER_INFO_DB_NAME,
PRIZE_CONFIG_DB_NAME,
ACTIVITY_CONFIG_DB_NAME,
USER_JOIN_DB_NAME,
DATA_DB_NAME
}
const {
// getActivityBaseInfoById
} = require('./controller/base.controller');
const {
// login
getRankList,
rankPrizePop
} = require('./controller/user.controller');
const {
// getBrowseGoodsList,
// getOrderList,
// getTaskList,
// completeTask,
// doCompleteTask
} = require('./controller/task.controller');
const {
// getMyPrizeList,
// receiveObjectPrize,
// receiveEnamePrize
getExchanageList,
exchanagePrize,
} = require('./controller/awards.controller');
module.exports = {
getRankList,
rankPrizePop,
getExchanageList,
exchanagePrize
}
\ No newline at end of file
{
"name": "mockserver",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"dev": true,
"requires": {
"defer-to-connect": "^1.0.1"
}
},
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
"@types/http-proxy": {
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz",
"integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==",
"requires": {
"@types/node": "*"
}
},
"@types/node": {
"version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"ajv": {
"version": "6.12.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-align": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
"integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
"dev": true,
"requires": {
"string-width": "^3.0.0"
},
"dependencies": {
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
}
}
},
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"anymatch": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
},
"axios": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
"dev": true
},
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"boxen": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
"integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
"dev": true,
"requires": {
"ansi-align": "^3.0.0",
"camelcase": "^5.3.1",
"chalk": "^3.0.0",
"cli-boxes": "^2.2.0",
"string-width": "^4.1.0",
"term-size": "^2.1.0",
"type-fest": "^0.8.1",
"widest-line": "^3.1.0"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"chokidar": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
"integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
"dev": true,
"requires": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
"fsevents": "~2.1.2",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.4.0"
}
},
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
"dev": true
},
"cli-boxes": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
"integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==",
"dev": true
},
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
"integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
"dev": true,
"requires": {
"dot-prop": "^5.2.0",
"graceful-fs": "^4.1.2",
"make-dir": "^3.0.0",
"unique-string": "^2.0.0",
"write-file-atomic": "^3.0.0",
"xdg-basedir": "^4.0.0"
}
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-parser": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
"integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
"requires": {
"cookie": "0.4.0",
"cookie-signature": "1.0.6"
}
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
"integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
"dev": true
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true
},
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"dot-prop": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
"integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
"dev": true,
"requires": {
"is-obj": "^2.0.0"
}
},
"duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"requires": {
"once": "^1.4.0"
}
},
"escape-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
"integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
"dev": true
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"eventemitter3": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "=3.1.0"
}
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fsevents": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
"dev": true,
"optional": true
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"global-dirs": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
"integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
"dev": true,
"requires": {
"ini": "^1.3.5"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-yarn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
"dev": true
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"requires": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
}
},
"http-proxy-middleware": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.5.tgz",
"integrity": "sha512-CKzML7u4RdGob8wuKI//H8Ein6wNTEQR7yjVEzPbhBLGdOfkfvgTnp2HLnniKBDP9QW4eG10/724iTWLBeER3g==",
"requires": {
"@types/http-proxy": "^1.17.4",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"lodash": "^4.17.19",
"micromatch": "^4.0.2"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
"dev": true
},
"import-lazy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
"integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
"dev": true
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"requires": {
"ci-info": "^2.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-installed-globally": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
"integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
"dev": true,
"requires": {
"global-dirs": "^2.0.1",
"is-path-inside": "^3.0.1"
}
},
"is-npm": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
"integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
"dev": true
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
},
"is-path-inside": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
"integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
"dev": true
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-yarn-global": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"dev": true,
"requires": {
"json-buffer": "3.0.0"
}
},
"latest-version": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
"integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
"dev": true,
"requires": {
"package-json": "^6.3.0"
}
},
"lodash": {
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"dev": true
},
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"requires": {
"semver": "^6.0.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
}
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
},
"mime-types": {
"version": "2.1.27",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"requires": {
"mime-db": "1.44.0"
}
},
"mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"nodemon": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
"integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
"dev": true,
"requires": {
"chokidar": "^3.2.2",
"debug": "^3.2.6",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.0.4",
"pstree.remy": "^1.1.7",
"semver": "^5.7.1",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.2",
"update-notifier": "^4.0.0"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
"dev": true,
"requires": {
"abbrev": "1"
}
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"normalize-url": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
"integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
"dev": true,
"requires": {
"got": "^9.6.0",
"registry-auth-token": "^4.0.0",
"registry-url": "^5.0.0",
"semver": "^6.2.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
"dev": true
},
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.1"
}
},
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"pupa": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
"integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
"dev": true,
"requires": {
"escape-goat": "^2.0.0"
}
},
"qs": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
"integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"requires": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
}
},
"readdirp": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
"integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"registry-auth-token": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
"integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
"dev": true,
"requires": {
"rc": "^1.2.8"
}
},
"registry-url": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
"integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
"dev": true,
"requires": {
"rc": "^1.2.8"
}
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"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.3",
"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.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}
}
},
"request-promise": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
"integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
"requires": {
"bluebird": "^3.5.0",
"request-promise-core": "1.1.4",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"request-promise-core": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
"integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
"requires": {
"lodash": "^4.17.19"
}
},
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
},
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"dev": true,
"requires": {
"lowercase-keys": "^1.0.0"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"semver-diff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
"integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
"dev": true,
"requires": {
"semver": "^6.3.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"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"
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"string-object-to-object": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string-object-to-object/-/string-object-to-object-1.0.3.tgz",
"integrity": "sha512-mYDydxoAlwy7d1WfKjLLtYSs5g5sK4i9uFMEcziW93YA2OwvLk3vIHULeBdCJWsxdF9x41z8YX42HOuEgc9u5Q=="
},
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
}
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"term-size": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
"integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
"dev": true
},
"to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dev": true,
"requires": {
"nopt": "~1.0.10"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"requires": {
"is-typedarray": "^1.0.0"
}
},
"undefsafe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
"integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
"dev": true,
"requires": {
"debug": "^2.2.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
}
}
},
"unique-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
"integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
"requires": {
"crypto-random-string": "^2.0.0"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"update-notifier": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
"integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
"dev": true,
"requires": {
"boxen": "^4.2.0",
"chalk": "^3.0.0",
"configstore": "^5.0.1",
"has-yarn": "^2.1.0",
"import-lazy": "^2.1.0",
"is-ci": "^2.0.0",
"is-installed-globally": "^0.3.1",
"is-npm": "^4.0.0",
"is-yarn-global": "^0.3.0",
"latest-version": "^5.0.0",
"pupa": "^2.0.1",
"semver-diff": "^3.1.1",
"xdg-basedir": "^4.0.0"
}
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"requires": {
"punycode": "^2.1.0"
}
},
"url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
"integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
"dev": true,
"requires": {
"prepend-http": "^2.0.0"
}
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
"integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
"dev": true,
"requires": {
"string-width": "^4.0.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
"xdg-basedir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
"integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
"dev": true
}
}
}
{
"name": "mockserver",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon --watch sdk --watch ../ --watch server.js server.js mock"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"http-proxy-middleware": "^1.0.5",
"qs": "^6.9.4",
"request": "^2.88.2",
"request-promise": "^4.2.5",
"string-object-to-object": "^1.0.3"
},
"port": 5555,
"serverProxy": {
"target": "http://10.172.58.215/"
},
"devDependencies": {
"nodemon": "^2.0.4"
}
}
const {CURD_REQUEST} = require('./request');
class BaseDao {
constructor(context, dbName) {
this.db = context.db;
this.TABLE = dbName;
}
/**
* 查询一条数据
* @param query
* @param options
*/
async findOne(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `find`, query: query || {}, options: options || {}});
return result[0];
}
/**
* 查询多条数据
* @param query
* @param options
*/
async find(query, options) {
console.log(`db`, this.db)
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `find`, query: query || {}, options: options || {}});
return result;
}
/**
* 插入单条数据
* @param document
*/
async insertOne(document) {
console.log(`insertOne`, document)
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `insert`, document: document || {}});
return result;
}
/**
* 插入多条数据
* @param documents 插入对象
*/
async insertMany(documents) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `insert`, document: documents || [{}]});
return result;
}
/**
* 更新数据
* @param query
* @param options
*/
async update(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `update`, query: query || {}, options: options || {}});
let res = result.nModified > 0 ? 1: 0;
console.log(`update结果`, res);
return res;
}
/**
* 删除多条数据
* @param query
* @param options
*/
async delete(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `delete`, query: query || {}, options: options || {}});
return result;
}
/**
* 获取条目数
* @param query
* @param options
*/
async count(query, options) {
let result = await CURD_REQUEST({db: this.db, TABLE: this.TABLE, type: `count`, query: query || {}, options: options || {}});
return result;
}
}
module.exports = BaseDao;
\ No newline at end of file
const {TBAPI_REQUEST} = require('./request');
let TBAPIS = {}
const APIS = [
`getItemListByItemIds`,
`getPrizeByEname`,
`getShopVipUrl`,
`queryVipinfo`,
`benefitSend`,
`queryCredits`,
`changeCredits`,
`getShopInfo`,
`getBuyerOrderList`,
];
APIS.forEach(v => {
TBAPIS[v] = async (query) => {
let result = await TBAPI_REQUEST(process.db, v, query);
console.log(`TBAPIS.${v}----参数`, process.db, v, query);
console.log(`result`, result);
return result.tbvalue;
};
});
module.exports = TBAPIS;
\ No newline at end of file
const dateFormatter = (thisDate, fmt = 'yyyy-MM-dd hh:mm:ss') => {
thisDate = new Date(thisDate)
console.log(`thisDate`, thisDate)
const o = {
'M+': thisDate.getMonth() + 1,
'd+': thisDate.getDate(),
'h+': thisDate.getHours(),
'm+': thisDate.getMinutes(),
's+': thisDate.getSeconds(),
'q+': Math.floor((thisDate.getMonth() + 3) / 3),
S: thisDate.getMilliseconds(),
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(
RegExp.$1,
(thisDate.getFullYear() + '').substr(4 - RegExp.$1.length)
);
for (const k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
}
}
return fmt;
};
module.exports = dateFormatter
\ No newline at end of file
const BaseDao = require('./BaseDao');
const TBAPIS = require('./TBAPIS');
const transformBeijingDate = require('./transformBeijingDate');
const dateFormatter = require('./dateFormatter')
module.exports = {
BaseDao,
TBAPIS,
transformBeijingDate,
dateFormatter
}
\ No newline at end of file
var axios = require('axios')
let port = require('../package.json').port|| 5555;
const request = async (path, params) => {
let res = await axios({
method: 'post',
url: path,
data: params,
baseURL: `http://127.0.0.1:${port}`
});
if (!res.data.data) {
console.log(`调用${path}${JSON.stringify(params)}\n返回结果`, res.data)
return false
}
return res.data.data
}
const CURD_REQUEST= async ({db, TABLE, type, query, options, document}) => {
// 参数
let data={
dbName: db,
TABLE,
query,
options,
document
};
console.log(`请求参数`, data)
let path=`/proxy/dataMock/${type}`;
return await request(path, data);
};
const TBAPI_REQUEST=async (db,funName,query) => {
// 参数
let data={
dbName: db,
funName
};
let path=`/proxy/dataMock/tbapi`;
let params={
dbName: data.dbName,
funName: data.funName,
query
}
return await request(path, params);
};
module.exports={
CURD_REQUEST,
TBAPI_REQUEST
};
\ No newline at end of file
module.exports = (day) => {
if (day) {
return new Date(day).getTime();
}else {
return new Date().getTime();
}
}
\ No newline at end of file
var express = require('express');
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var {createProxyMiddleware} = require('http-proxy-middleware');
const routers = require('../index');
const {port, serverProxy } = require('./package.json');
var app = express();
app.use(cookieParser());
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.json({message: `ok`});
});
// 执行本地云函数方法
app.post('/handler', async (req, res) => {
console.log(req.body);
let {data, openId, db } = req.body;
if(!db) {
res.json({message: `参数错误,缺少数据库db`});
}
if(!openId) {
res.json({message: `参数错误,缺少openId`});
}
try{
let query = JSON.parse(JSON.stringify(data))
}catch(e) {
res.json({message: `查询参数格式错误`});
}
let {handler, data: queryData} = data
if (!handler) {
res.json({message: `格式错误, handler参数不能为空`});
}
if (!queryData) {
res.json({message: `格式错误, data参数不能为空`});
}
if(!process.db) {
process.db = db;
}
req.context = {
openId,
db,
data: queryData
};
if(routers[handler]) {
let result = await routers[handler](req.context);
res.json(result);
}else {
res.json({message: `函数${handler}不存在`});
}
});
// 获取本地export的数据库表及云函数
app.get('/getDBHandlers', async(req, res) => {
let dbs = require('../db');
let handlers = routers;
// dbsInfo
let dbArray = []
let handlerArray = []
Object.keys(dbs).map(v => {
dbArray.push(dbs[v]);
});
Object.keys(handlers).map(v => {
handlerArray.push(v)
});
console.log(dbArray, handlerArray)
res.json({
dbs: dbArray,
handlers: handlerArray,
success: true
});
})
const ProxyOption = {
target: serverProxy.target,
changeOrigin: true,
pathRewrite: (path, req) => {
console.log(`path`, path)
return path.replace('/proxy', '');
},
onProxyReq: (proxyReq, req, res) => {
console.log(`req.body`, req.body)
if (req.body) {
let bodyData = JSON.stringify(req.body);
console.log(`bodyData`, bodyData)
// incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
proxyReq.setHeader('Content-Type', 'application/json');
proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
// stream the content
proxyReq.write(bodyData);
}
}
}
app.use('/proxy', createProxyMiddleware(ProxyOption));
app.listen(port || 5555);
const data = {
"activityId":"5f35eded0cb7330c94e04eda",
"userNick":"123",
"avatar":"9000989900",
}
const data2 = {
"activityId":"5f35eded0cb7330c94e04eda",
"taskType":"freeMasonrys"
}
\ No newline at end of file
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.npm.taobao.org/@sindresorhus/is/download/@sindresorhus/is-0.14.0.tgz?cache=0&sync_timestamp=1597573685903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40sindresorhus%2Fis%2Fdownload%2F%40sindresorhus%2Fis-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha1-n7OjzzEyMoFR81PeRjLgHlIQK+o=
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.npm.taobao.org/@szmarczak/http-timer/download/@szmarczak/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
integrity sha1-sWZeLEYaLNkvTBu/UNVFTeDUtCE=
dependencies:
defer-to-connect "^1.0.1"
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz?cache=0&sync_timestamp=1596837707987&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fcolor-name%2Fdownload%2F%40types%2Fcolor-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=
"@types/http-proxy@^1.17.4":
version "1.17.4"
resolved "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596840717330&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b"
integrity sha1-58kuPb4+E6p5lED/QubToXqdBFs=
dependencies:
"@types/node" "*"
"@types/node@*":
version "14.0.27"
resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-14.0.27.tgz?cache=0&sync_timestamp=1596839161536&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1"
integrity sha1-oVGHOvWl6FG1GzsGXJ5jOQqeDrE=
abbrev@1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=
accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80=
dependencies:
mime-types "~2.1.24"
negotiator "0.6.2"
ajv@^6.12.3:
version "6.12.4"
resolved "https://registry.npm.taobao.org/ajv/download/ajv-6.12.4.tgz?cache=0&sync_timestamp=1597480799381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
integrity sha1-BhT6zEUiEn+nE0Rca/0+vTduIjQ=
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-align@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/ansi-align/download/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
integrity sha1-tTazcc9ofKrvI2wY0+If43l0Z8s=
dependencies:
string-width "^3.0.0"
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=
ansi-regex@^5.0.0:
version "5.0.0"
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=
ansi-styles@^4.1.0:
version "4.2.1"
resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
integrity sha1-kK51xCTQCNJiTFvynq0xd+v881k=
dependencies:
"@types/color-name" "^1.1.1"
color-convert "^2.0.1"
anymatch@~3.1.1:
version "3.1.1"
resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
integrity sha1-xV7PAhheJGklk5kxDBc84xIzsUI=
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
asn1@~0.2.3:
version "0.2.4"
resolved "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=
dependencies:
safer-buffer "~2.1.0"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
aws4@^1.8.0:
version "1.10.1"
resolved "https://registry.npm.taobao.org/aws4/download/aws4-1.10.1.tgz?cache=0&sync_timestamp=1597238704875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
integrity sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=
axios@^0.19.2:
version "0.19.2"
resolved "https://registry.npm.taobao.org/axios/download/axios-0.19.2.tgz?cache=0&sync_timestamp=1594827603723&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=
dependencies:
follow-redirects "1.5.10"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
dependencies:
tweetnacl "^0.14.3"
binary-extensions@^2.0.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
integrity sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=
bluebird@^3.5.0:
version "3.7.2"
resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
body-parser@1.19.0, body-parser@^1.19.0:
version "1.19.0"
resolved "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=
dependencies:
bytes "3.1.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "1.7.2"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.7.0"
raw-body "2.4.0"
type-is "~1.6.17"
boxen@^4.2.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/boxen/download/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
integrity sha1-5BG2I1fW1tNlh8isPV2XTaoHDmQ=
dependencies:
ansi-align "^3.0.0"
camelcase "^5.3.1"
chalk "^3.0.0"
cli-boxes "^2.2.0"
string-width "^4.1.0"
term-size "^2.1.0"
type-fest "^0.8.1"
widest-line "^3.1.0"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
braces@^3.0.1, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
dependencies:
fill-range "^7.0.1"
bytes@3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.npm.taobao.org/cacheable-request/download/cacheable-request-6.1.0.tgz?cache=0&sync_timestamp=1579606262568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacheable-request%2Fdownload%2Fcacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
integrity sha1-IP+4vRYrpL4R6VZ9gj22UQUsqRI=
dependencies:
clone-response "^1.0.2"
get-stream "^5.1.0"
http-cache-semantics "^4.0.0"
keyv "^3.0.0"
lowercase-keys "^2.0.0"
normalize-url "^4.1.0"
responselike "^1.0.2"
camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chokidar@^3.2.2:
version "3.4.2"
resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.2.tgz?cache=0&sync_timestamp=1596728921978&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
integrity sha1-ONyOZY3sOAl0HrPve7Ckf+QkIy0=
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
glob-parent "~5.1.0"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.4.0"
optionalDependencies:
fsevents "~2.1.2"
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=
cli-boxes@^2.2.0:
version "2.2.0"
resolved "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
integrity sha1-U47K6PnGylCOPDyVtFP+k8tMFo0=
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/clone-response/download/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
dependencies:
mimic-response "^1.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=
dependencies:
delayed-stream "~1.0.0"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/configstore/download/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
integrity sha1-02UCG130uYzdGH1qOw4/anzF7ZY=
dependencies:
dot-prop "^5.2.0"
graceful-fs "^4.1.2"
make-dir "^3.0.0"
unique-string "^2.0.0"
write-file-atomic "^3.0.0"
xdg-basedir "^4.0.0"
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=
dependencies:
safe-buffer "5.1.2"
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js=
cookie-parser@^1.4.5:
version "1.4.5"
resolved "https://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.5.tgz?cache=0&sync_timestamp=1584246006993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie-parser%2Fdownload%2Fcookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49"
integrity sha1-PlctS3wMgPnGHa9gTkM2gxtdHUk=
dependencies:
cookie "0.4.0"
cookie-signature "1.0.6"
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525873712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU=
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
dependencies:
assert-plus "^1.0.0"
debug@2.6.9, debug@^2.2.0:
version "2.6.9"
resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=
dependencies:
ms "2.0.0"
debug@=3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=
dependencies:
ms "2.0.0"
debug@^3.2.6:
version "3.2.6"
resolved "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps=
dependencies:
ms "^2.1.1"
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.npm.taobao.org/decompress-response/download/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.npm.taobao.org/defer-to-connect/download/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha1-MxrgUMCNz3ifjIOnuB8O2U9KxZE=
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
dot-prop@^5.2.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574926376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
integrity sha1-w07MKVVtxF8fTCJpe29JBODMT8s=
dependencies:
is-obj "^2.0.0"
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=
dependencies:
once "^1.4.0"
escape-goat@^2.0.0:
version "2.1.1"
resolved "https://registry.npm.taobao.org/escape-goat/download/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
integrity sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU=
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventemitter3@^4.0.0:
version "4.0.4"
resolved "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.4.tgz?cache=0&sync_timestamp=1589283105849&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
integrity sha1-tUY6zmNaCD0Bi9x8kXtMXxCoU4Q=
express@^4.17.1:
version "4.17.1"
resolved "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1585184310145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=
dependencies:
accepts "~1.3.7"
array-flatten "1.1.1"
body-parser "1.19.0"
content-disposition "0.5.3"
content-type "~1.0.4"
cookie "0.4.0"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "~1.1.2"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.5"
qs "6.7.0"
range-parser "~1.2.1"
safe-buffer "5.1.2"
send "0.17.1"
serve-static "1.14.1"
setprototypeof "1.1.1"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599651635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
dependencies:
to-regex-range "^5.0.1"
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
follow-redirects@1.5.10:
version "1.5.10"
resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
integrity sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=
dependencies:
debug "=3.1.0"
follow-redirects@^1.0.0:
version "1.13.0"
resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
integrity sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs=
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz?cache=0&sync_timestamp=1573027040291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y=
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
fsevents@~2.1.2:
version "2.1.3"
resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=
get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&sync_timestamp=1597056455691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU=
dependencies:
pump "^3.0.0"
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&sync_timestamp=1597056455691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha1-SWaheV7lrOZecGxLe+txJX1uItM=
dependencies:
pump "^3.0.0"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
dependencies:
assert-plus "^1.0.0"
glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz?cache=0&sync_timestamp=1584836110944&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=
dependencies:
is-glob "^4.0.1"
global-dirs@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/global-dirs/download/global-dirs-2.0.1.tgz?cache=0&sync_timestamp=1573231918216&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobal-dirs%2Fdownload%2Fglobal-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
integrity sha1-rN87tmhbzVXLNeigUiZlaelGkgE=
dependencies:
ini "^1.3.5"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.npm.taobao.org/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1596795791808&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
integrity sha1-7fRefWf5lUVwXeH3u+7rEhdl7YU=
dependencies:
"@sindresorhus/is" "^0.14.0"
"@szmarczak/http-timer" "^1.1.2"
cacheable-request "^6.0.0"
decompress-response "^3.3.0"
duplexer3 "^0.1.4"
get-stream "^4.1.0"
lowercase-keys "^1.0.1"
mimic-response "^1.0.1"
p-cancelable "^1.0.0"
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
graceful-fs@^4.1.2:
version "4.2.4"
resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&sync_timestamp=1588086876757&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
har-validator@~5.1.3:
version "5.1.5"
resolved "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz?cache=0&sync_timestamp=1596082653557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhar-validator%2Fdownload%2Fhar-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0=
dependencies:
ajv "^6.12.3"
har-schema "^2.0.0"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
has-yarn@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/has-yarn/download/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha1-E34RNUp7W/EapctknPDG8/8rLnc=
http-cache-semantics@^4.0.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz?cache=0&sync_timestamp=1583107049902&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-cache-semantics%2Fdownload%2Fhttp-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha1-SekcXL82yblLz81xwj1SSex045A=
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407676273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz?cache=0&sync_timestamp=1593407676273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=
dependencies:
depd "~1.1.2"
inherits "2.0.4"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-proxy-middleware@^1.0.5:
version "1.0.5"
resolved "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-1.0.5.tgz#4c6e25d95a411e3d750bc79ccf66290675176dc2"
integrity sha1-TG4l2VpBHj11C8ecz2YpBnUXbcI=
dependencies:
"@types/http-proxy" "^1.17.4"
http-proxy "^1.18.1"
is-glob "^4.0.1"
lodash "^4.17.19"
micromatch "^4.0.2"
http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz?cache=0&sync_timestamp=1589778321455&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy%2Fdownload%2Fhttp-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=
dependencies:
eventemitter3 "^4.0.0"
follow-redirects "^1.0.0"
requires-port "^1.0.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1585807874533&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=
dependencies:
safer-buffer ">= 2.1.2 < 3"
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz?cache=0&sync_timestamp=1592055969434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore-by-default%2Fdownload%2Fignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inherits@2.0.4:
version "2.0.4"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=
dependencies:
binary-extensions "^2.0.0"
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-ci/download/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw=
dependencies:
ci-info "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=
dependencies:
is-extglob "^2.1.1"
is-installed-globally@^0.3.1:
version "0.3.2"
resolved "https://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.3.2.tgz?cache=0&sync_timestamp=1586162509580&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-installed-globally%2Fdownload%2Fis-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
integrity sha1-/T76ee5nDRGHIzGC1bCh3QAxMUE=
dependencies:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
is-npm@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/is-npm/download/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
integrity sha1-yQ3YOAaW34enptgjwg0LErvjyE0=
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=
is-path-inside@^3.0.1:
version "3.0.2"
resolved "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
integrity sha1-9SIPyCo+IzdXKR3dycWHfyofMBc=
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-yarn-global@^0.3.0:
version "0.3.0"
resolved "https://registry.npm.taobao.org/is-yarn-global/download/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
integrity sha1-1QLTOCWQ6jAEiTdGdUyJE5lz4jI=
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
json-buffer@3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/json-buffer/download/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA=
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.2.3"
verror "1.10.0"
keyv@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/keyv/download/keyv-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
integrity sha1-7MIoSG9pmR5J6UdkhaW+Ho/FxNk=
dependencies:
json-buffer "3.0.0"
latest-version@^5.0.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/latest-version/download/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
integrity sha1-EZ3+kI/jjRXfpD7NE/oS7Igy+s4=
dependencies:
package-json "^6.3.0"
lodash@^4.17.19:
version "4.17.20"
resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336053864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha1-JgPni3tLAAbLyi+8yKMgJVislHk=
make-dir@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=
dependencies:
semver "^6.0.0"
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=
dependencies:
braces "^3.0.1"
picomatch "^2.0.5"
mime-db@1.44.0:
version "1.44.0"
resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
integrity sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=
mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.27"
resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz?cache=0&sync_timestamp=1587700357245&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
integrity sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=
dependencies:
mime-db "1.44.0"
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/mimic-response/download/mimic-response-1.0.1.tgz?cache=0&sync_timestamp=1589481326973&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-response%2Fdownload%2Fmimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=
minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0:
version "1.2.5"
resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=
ms@^2.1.1:
version "2.1.2"
resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=
nodemon@^2.0.4:
version "2.0.4"
resolved "https://registry.npm.taobao.org/nodemon/download/nodemon-2.0.4.tgz?cache=0&sync_timestamp=1589456003432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnodemon%2Fdownload%2Fnodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416"
integrity sha1-VbCTGetIjWOUqpgYFIwMLRwExBY=
dependencies:
chokidar "^3.2.2"
debug "^3.2.6"
ignore-by-default "^1.0.1"
minimatch "^3.0.4"
pstree.remy "^1.1.7"
semver "^5.7.1"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.2"
update-notifier "^4.0.0"
nopt@~1.0.10:
version "1.0.10"
resolved "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
dependencies:
abbrev "1"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=
normalize-url@^4.1.0:
version "4.5.0"
resolved "https://registry.npm.taobao.org/normalize-url/download/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
integrity sha1-RTNUCH5sqWlXvY9br3U/WYIUISk=
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
dependencies:
ee-first "1.1.1"
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.npm.taobao.org/p-cancelable/download/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha1-0HjRWjr0CSIMiG8dmgyi5EGrJsw=
package-json@^6.3.0:
version "6.5.0"
resolved "https://registry.npm.taobao.org/package-json/download/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
integrity sha1-b+7ayjXnVyWHbQsOZJdGl/7RRbA=
dependencies:
got "^9.6.0"
registry-auth-token "^4.0.0"
registry-url "^5.0.0"
semver "^6.2.0"
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1574278831909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/prepend-http/download/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
proxy-addr@~2.0.5:
version "2.0.6"
resolved "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz?cache=0&sync_timestamp=1582556112011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fproxy-addr%2Fdownload%2Fproxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=
dependencies:
forwarded "~0.1.2"
ipaddr.js "1.9.1"
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=
pstree.remy@^1.1.7:
version "1.1.8"
resolved "https://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpstree.remy%2Fdownload%2Fpstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
integrity sha1-wkIiT0pnwh9oaDm720rCgrg3PTo=
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpunycode%2Fdownload%2Fpunycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew=
pupa@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/pupa/download/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
integrity sha1-29yf9I/76komoGm2+fersFEAhyY=
dependencies:
escape-goat "^2.0.0"
qs@6.7.0:
version "6.7.0"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=
qs@^6.9.4:
version "6.9.4"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
integrity sha1-kJCykNH5FyjTwi5UhDykSupatoc=
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=
range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI=
dependencies:
bytes "3.1.0"
http-errors "1.7.2"
iconv-lite "0.4.24"
unpipe "1.0.0"
rc@^1.2.8:
version "1.2.8"
resolved "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
readdirp@~3.4.0:
version "3.4.0"
resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
integrity sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=
dependencies:
picomatch "^2.2.1"
registry-auth-token@^4.0.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-4.2.0.tgz?cache=0&sync_timestamp=1594638395069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregistry-auth-token%2Fdownload%2Fregistry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da"
integrity sha1-HTff/acrvs0PWB5HFVQCE6Zet9o=
dependencies:
rc "^1.2.8"
registry-url@^5.0.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/registry-url/download/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
integrity sha1-6YM0tQ1UNLgRNrROxjjZwgCcUAk=
dependencies:
rc "^1.2.8"
request-promise-core@1.1.4:
version "1.1.4"
resolved "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.4.tgz?cache=0&sync_timestamp=1595378713145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest-promise-core%2Fdownload%2Frequest-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
integrity sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8=
dependencies:
lodash "^4.17.19"
request-promise@^4.2.5:
version "4.2.6"
resolved "https://registry.npm.taobao.org/request-promise/download/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2"
integrity sha1-fn5blXhjDm9ZjjgTwPjrNCon8KI=
dependencies:
bluebird "^3.5.0"
request-promise-core "1.1.4"
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
request@^2.88.2:
version "2.88.2"
resolved "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=
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.3"
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.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/responselike/download/responselike-1.0.2.tgz?cache=0&sync_timestamp=1570573217730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresponselike%2Fdownload%2Fresponselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
dependencies:
lowercase-keys "^1.0.0"
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1589129103371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
version "5.2.1"
resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1589129103371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
"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 "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=
semver-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.npm.taobao.org/semver-diff/download/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
integrity sha1-Bfd85Z8yXgDicGr9Z7tQbdscoys=
dependencies:
semver "^6.3.0"
semver@^5.7.1:
version "5.7.1"
resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1586886267748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=
semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886267748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
send@0.17.1:
version "0.17.1"
resolved "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=
dependencies:
debug "2.6.9"
depd "~1.1.2"
destroy "~1.0.4"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "~1.7.2"
mime "1.6.0"
ms "2.1.1"
on-finished "~2.3.0"
range-parser "~1.2.1"
statuses "~1.5.0"
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
send "0.17.1"
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=
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"
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1587327902535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
stealthy-require@^1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
string-object-to-object@^1.0.3:
version "1.0.3"
resolved "https://registry.npm.taobao.org/string-object-to-object/download/string-object-to-object-1.0.3.tgz#f817b3dfe68ea010c120c9445fe88bc481799799"
integrity sha1-+Bez3+aOoBDBIMlEX+iLxIF5l5k=
string-width@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE=
dependencies:
emoji-regex "^7.0.1"
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
string-width@^4.0.0, string-width@^4.1.0:
version "4.2.0"
resolved "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
integrity sha1-lSGCxGzHssMT0VluYjmSvRY7crU=
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
strip-ansi@^5.1.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=
dependencies:
ansi-regex "^5.0.0"
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&sync_timestamp=1594567543744&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.1.0"
resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
integrity sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=
dependencies:
has-flag "^4.0.0"
term-size@^2.1.0:
version "2.2.0"
resolved "https://registry.npm.taobao.org/term-size/download/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
integrity sha1-Hxat7f6b3BiADhd2ghc0CG/MZ1M=
to-readable-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/to-readable-stream/download/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha1-zgqgwvPfat+FLvtASng+d8BHV3E=
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
dependencies:
is-number "^7.0.0"
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=
touch@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/touch/download/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
integrity sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=
dependencies:
nopt "~1.0.10"
tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=
dependencies:
media-typer "0.3.0"
mime-types "~2.1.24"
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
integrity sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=
dependencies:
is-typedarray "^1.0.0"
undefsafe@^2.0.2:
version "2.0.3"
resolved "https://registry.npm.taobao.org/undefsafe/download/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
integrity sha1-axZucJStRjE7IgLafsws18xueq4=
dependencies:
debug "^2.2.0"
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/unique-string/download/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
integrity sha1-OcZFH4GvsnSd4rIz4/fF6IQ72J0=
dependencies:
crypto-random-string "^2.0.0"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
update-notifier@^4.0.0:
version "4.1.1"
resolved "https://registry.npm.taobao.org/update-notifier/download/update-notifier-4.1.1.tgz?cache=0&sync_timestamp=1597574328608&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupdate-notifier%2Fdownload%2Fupdate-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746"
integrity sha1-iV/IViu+ZmF5UA+fLOusTyYyN0Y=
dependencies:
boxen "^4.2.0"
chalk "^3.0.0"
configstore "^5.0.1"
has-yarn "^2.1.0"
import-lazy "^2.1.0"
is-ci "^2.0.0"
is-installed-globally "^0.3.1"
is-npm "^4.0.0"
is-yarn-global "^0.3.0"
latest-version "^5.0.0"
pupa "^2.0.1"
semver-diff "^3.1.1"
xdg-basedir "^4.0.0"
uri-js@^4.2.2:
version "4.2.2"
resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=
dependencies:
punycode "^2.1.0"
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/url-parse-lax/download/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
dependencies:
prepend-http "^2.0.0"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1595886825323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
verror@1.10.0:
version "1.10.0"
resolved "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/widest-line/download/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
integrity sha1-gpIzO79my0X/DeFgOxNreuFJbso=
dependencies:
string-width "^4.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^3.0.0:
version "3.0.3"
resolved "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=
dependencies:
imurmurhash "^0.1.4"
is-typedarray "^1.0.0"
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/xdg-basedir/download/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha1-S8jZmEQDaWIl74OhVzy7y0552xM=
{
"name": "testst2",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"cfb": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz",
"integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==",
"requires": {
"adler-32": "~1.2.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
"integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"dayjs": {
"version": "1.8.33",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.33.tgz",
"integrity": "sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw=="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"node-xlsx": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.15.0.tgz",
"integrity": "sha512-rQyhWDJ/k60wQemov7a8MlToastWTidrAVFRwTWV+s53LN/SRwU4lnmc5xuFXx/ay+uaLAsAQBp6BkVob5OjOA==",
"requires": {
"buffer-from": "^1.1.0",
"xlsx": "^0.14.1"
}
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"ssf": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz",
"integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==",
"requires": {
"frac": "~1.1.2"
}
},
"taobao-mini-sdk": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/taobao-mini-sdk/-/taobao-mini-sdk-0.1.2.tgz",
"integrity": "sha512-glePe3kdmNNVoEkoPyHRzi5hM1XwIMgJ0Vhh1ouMrzD5sRhG+qCByKhHCjmBddRdEr92DY/3fGrh9lsokF2f+A=="
},
"xlsx": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.14.5.tgz",
"integrity": "sha512-s/5f4/mjeWREmIWZ+HtDfh/rnz51ar+dZ4LWKZU3u9VBx2zLdSIWTdXgoa52/pnZ9Oe/Vu1W1qzcKzLVe+lq4w==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.2",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"ssf": "~0.10.2"
}
}
}
}
{
"name": "testst2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"license": "ISC",
"sdkVersion": "*",
"dependencies": {
"node-xlsx": "^0.15.0",
"taobao-mini-sdk": "0.1.2",
"dayjs": "^1.8.28"
},
"config": {
"notNeedLogin": []
}
}
// 特别注意以下的引用方式,需要.default
const { BaseDao, TBAPI, Utils } = require('taobao-mini-sdk/lib/index').default;
const { DEFAULT_CODE_TYPES, dateFormatter,transformBeijingDate,getStartTimestamp,getEndTimestamp, ResultsModel} = Utils.default;
const TBAPIS = TBAPI.default;
let default_sdk = {
DEFAULT_CODE_TYPES,
ResultsModel,
dateFormatter,
getStartTimestamp,
getEndTimestamp
};
let Config
let mock = process.argv[2];
console.log(`mock`, mock);
// 云函数环境
if (mock !== 'mock') {
Config = Object.assign({}, default_sdk, {
BaseDao,
TBAPIS,
transformBeijingDate
});
}
// 本地环境
else {
let MockConfig = require('./mockServer/sdk');
Config = Object.assign({}, default_sdk, MockConfig);
console.log(Config);
}
module.exports = Config;
/**
* 访问明细
*/
const {
BaseDao
} = require('../sdk');
const { getToday } = require('../utils');
const { ACCESS_DB_NAME } = require('../db');
class UserAccessService {
constructor(context) {
this.context = context;
this.accessdao = new BaseDao(context, ACCESS_DB_NAME);
}
/**
* 增加访问记录
* @param {是否关注店铺} newFollow
*/
async addAccess(isVip = false, type, newFollow = false) {
let {
openId,
data
} = this.context;
let {
activityId,
userNick,
avatar,
inviteId
} = data;
return await this.accessdao.insertOne({
openId,
activityId,
userNick,
avatar,
isReceiveShare: !!inviteId,
inviteId,
isVip,
newFollow,
accessTime: Date.now(),
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
type
});
}
async addComeAccess(type) {
let { openId, data } = this.context;
let { activityId, userNick = "" } = data;
return await this.accessdao.insertOne({
openId,
activityId,
userNick,
accessTime: Date.now(),
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
type,
});
}
}
module.exports = UserAccessService;
/**
* 奖励
*/
const {
BaseDao
} = require('../sdk');
const UserService = require('./user.service');
const {
CODE_TYPES,
DRAW_STATUS,
PRIZE_TYPE,
ACTIVITY_STATUS,
PRIZE_DATA_TYPE,
SHIP_TYPE
} = require('../constants');
const {
AWARDS_DB_NAME,
PRIZE_CONFIG_DB_NAME
} = require('../db');
const {
sendTBAward,
getSellerSession,
getToday
} = require('../utils');
class AwardsService extends UserService {
constructor(context) {
super(context);
this.awardsdao = new BaseDao(context, AWARDS_DB_NAME);
this.activityprizedao = new BaseDao(context, PRIZE_CONFIG_DB_NAME);
}
// 根据奖品Id扣库存
async reduceStock(_id) {
let result = await this.activityprizedao.findOne({
_id,
deleteStatus: ACTIVITY_STATUS.NORMAL
});
// 奖品不存在
if (!result) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
let {
switchStock,
stock,
useStock
} = result;
// 若不限制库存
if (switchStock === 2) {
return true;
}
// 若库存不足
if (useStock >= stock) {
return CODE_TYPES.ERROR_NO_STOCK;
}
try {
let res = await this.activityprizedao.update({
_id,
$where: "this.useStock < this.stock"
}, {
$inc: {
useStock: +1
}
});
if (res) {
return true;
}
return false;
} catch (e) {
console.log(`扣库存(实物)失败:`, e);
return false;
// return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 插入奖品记录
* @param {*} award
*/
async addAward(award) {
try {
return await this.awardsdao.insertOne({
...award,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday()
});
} catch (e) {
console.log(`插入中奖记录错误:`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 我的奖品
* @param {*} param0
*/
async getMyPrizeList({
openId,
activityId
}) {
// 获取奖品领取过期时间
let {
awardReceiveExpiredTime
} = await this.getBaseInfo(activityId);
let myprizeList = await this.awardsdao.find({
openId,
activityId
}, {
sort: {
createTime: -1
}
});
// 若有过期时间,且已过期
if (awardReceiveExpiredTime) {
let currentTime = Date.now()
myprizeList.map(v => {
if (currentTime > awardReceiveExpiredTime) {
if ([DRAW_STATUS.WAITAWARD, DRAW_STATUS.RETRY].includes(v.drawStatus)) {
v.drawStatus = DRAW_STATUS.EXPIRED;
v.remark = `奖品已过期`;
}
}
v.expiredTime = awardReceiveExpiredTime;
})
}
return myprizeList;
}
// 领取实物
async recieveObjectPrize(_id, {
activityId,
provice,
city,
area,
addressdetail,
name,
phone
}) {
// 若有过期时间,且已过期
let {
awardReceiveExpiredTime
} = await this.getBaseInfo(activityId);
if (awardReceiveExpiredTime && Date.now() > awardReceiveExpiredTime) {
return CODE_TYPES.ERROR_PRIZE_EXPIRED
}
let award = await this.awardsdao.findOne({
_id
});
console.log(`receiveObject-award`, award);
// 奖品不存在
if (!award) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
// 已领取
if (award.drawStatus === DRAW_STATUS.SUCCESS) {
return CODE_TYPES.ERROR_RECEIVE_PRIZE;
}
// 不是实物,非法操作
if (award.type !== PRIZE_TYPE.OBJECT) {
return CODE_TYPES.ERROR_FORBIDDEN_OPE;
}
try {
let result = await this.awardsdao.update({
_id
}, {
$set: {
receiveName: name,
phone,
drawStatus: DRAW_STATUS.SUCCESS,
provice,
city,
area,
addressdetail,
shipStatus: SHIP_TYPE.INIT,
receiveTime: Date.now(),
updateTime: Date.now()
}
});
return true;
} catch (e) {
console.log(`领取实物错误:`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
// 发放淘宝权益(奖品数据已插入到awards_info表,且状态drawStatus 为1或者6)
async recieveEnamePrize(_id, activityId) {
// 若有过期时间,且已过期
let {
awardReceiveExpiredTime
} = await this.getBaseInfo(activityId);
if (awardReceiveExpiredTime && Date.now() > awardReceiveExpiredTime) {
return CODE_TYPES.ERROR_PRIZE_EXPIRED;
}
let result = {};
let award = await this.awardsdao.findOne({
_id
});
// 奖品不存在
if (!award) {
return CODE_TYPES.ERROR_NO_PRIZE;
}
// 已领取
if (award.drawStatus === DRAW_STATUS.SUCCESS) {
return CODE_TYPES.ERROR_RECEIVE_PRIZE;
}
console.log(`award.drawStatus`, award.drawStatus);
// 状态不是1,6
if (![DRAW_STATUS.WAITAWARD, DRAW_STATUS.RETRY].includes(award.drawStatus)) {
return CODE_TYPES.ERROR_FORBIDDEN_OPE;
}
let {
session
} = await getSellerSession(this.context);
// 发放淘宝权益
result = await sendTBAward(this.context, session, award);
// 更新
await this.awardsdao.update({
_id
}, {
$set: {
drawStatus: result.drawStatus,
remark: result.remark,
updateTime: Date.now()
}
});
return result;
}
/**
* 获取活动配置项奖品
* @param {*} _id
*/
async getActivityPrizeById(_id) {
return await this.activityprizedao.findOne({
_id,
deleteStatus: ACTIVITY_STATUS.NORMAL
});
}
async getRankPrizeList(activityId) {
return await this.activityprizedao.find({
activityId,
deleteStatus: ACTIVITY_STATUS.NORMAL,
prizeType: PRIZE_DATA_TYPE.RANK
})
}
async getUserAwardPrizeByType(activityId, prizeType) {
let {
openId
} = this.context;
return await this.awardsdao.findOne({
activityId,
openId,
prizeType,
})
}
async getPrizeByType(activityId, prizeType) {
return await this.activityprizedao.find({
activityId,
prizeType,
deleteStatus: ACTIVITY_STATUS.NORMAL
}, {
sort: {
level: 1
}
})
}
async getUserPrizeByType(activityId, prizeType) {
let {
openId
} = this.context;
return await this.awardsdao.find({
activityId,
prizeType,
openId
}, {
sort: {
createTime: -1
}
})
}
async getUserPrizeById(activityId, prizeId) {
let {
openId
} = this.context;
return await this.awardsdao.find({
activityId,
prizeId,
openId,
prizeType: PRIZE_DATA_TYPE.EXCHANGE
})
}
}
module.exports = AwardsService;
\ No newline at end of file
/**
* 基本信息
*/
const { BaseDao, transformBeijingDate, dateFormatter } = require('../sdk');
const { ACTIVITY_CONFIG_DB_NAME } = require('../db');
class BaseService {
constructor(context) {
this.context = context;
this.activitydao = new BaseDao(context, ACTIVITY_CONFIG_DB_NAME);
}
/**
* @desc 活动基本信息
* @param {活动id} activityId
* @returns 返回活动详情,若不存在活动,返回为null
*/
async getBaseInfo(activityId) {
if (!activityId) {
activityId = this.context.data.activityId
}
return await this.activitydao.findOne({_id: activityId});
}
}
module.exports = BaseService;
\ No newline at end of file
const {
BaseDao
} = require('../sdk');
const { getToday } = require('../utils');
const { JOIN_DB_NAME } = require('../db');
const {JOIN_INFO_STATUS} = require('../constants');
class GameService {
constructor(context) {
this.context = context;
this.joindao = new BaseDao(context, JOIN_DB_NAME);
}
async addJoin(userNick, maxScore = 0) {
const { activityId } = this.context.data;
const { openId } = this.context;
const record = {
activityId,
userNick,
openId,
createDay: getToday(),
createTime: Date.now(),
updateTime: Date.now(),
score: 0,
maxScore,
shoes: 0,
status: JOIN_INFO_STATUS.START
}
return await this.joindao.insertOne(record);
}
async getJoinInfo() {
const { openId } = this.context;
const { activityId } = this.context.data;
return await this.joindao.findOne({ openId, activityId })
}
async updateJoin(_id, document) {
return await this.joindao.update({
_id
}, {
$set: document
})
}
}
module.exports = GameService;
/**
* 访问明细
*/
const { BaseDao } = require("../sdk");
const { getToday } = require("../utils");
const { DATA_DB_NAME } = require("../db");
class StatService {
constructor(context) {
this.context = context;
this.statService = new BaseDao(context, DATA_DB_NAME);
}
/**
* 增加访问记录
* @param {数据信息} info
*/
async addStat(info) {
let { openId } = this.context;
return await this.statService.insertOne({
...info,
openId,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
/**
* 增加积分 砖石 复活卡 消耗 砖石 复活卡 获得 记录
* @param {数据信息} info
*/
async addStatNumberUv(info) {
let { openId } = this.context;
let { activityId, type, value } = info
let record = await this.statService.findOne({
openId,
activityId,
type,
createDay: getToday()
});
if (null == record) {
return await this.statService.insertOne({
...info,
openId,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
//已经有数据
let oldValue = record.value ? record.value : 0
return await this.statService.update({
...record,
value: oldValue + value,
openId,
updateTime: Date.now(),
});
}
}
module.exports = StatService;
/**
* 任务
*/
const UserService = require('./user.service');
const GameService = require('./game.service')
const StatService = require("./stat.service");
const { TBAPIS, transformBeijingDate } = require('../sdk');
const {
CODE_TYPES, TASK_TYPE, TASK_TYPE_WIN, BUY_GOODS_LIMIT, DRAW_STATUS, DATA_TYPE, FIRST_DIAMOND
} = require('../constants');
const { getToday, getSellerSession, getUserOrderlist, statInsertPV, statInsertUV } = require('../utils')
class TaskService extends UserService {
async getGoodsList(ids) {
let { session } = await getSellerSession(this.context);
let result = await TBAPIS.getItemListByItemIds(this.context, session, ids, {});
console.log('result', result);
let items = (result.items && result.items.item) || [];
let list = items.map(v => {
return {
url: v.detail_url,
id: v.num_iid,
name: v.title,
image: v.pic_url,
desc: v.desc,
price: v.price
}
});
return list;
}
//完成任务
async doCompleteTask(userInfo, taskType, isNewVip = 1) {
if (taskType === TASK_TYPE.INVITES) {
return await this.doInvitesTask(userInfo, isNewVip);
} else if (taskType === TASK_TYPE.FOLLOW) {
return await this.doFollowTask(userInfo);
}else if (taskType === TASK_TYPE.BROWSE) {
return await this.doBrowseTask(userInfo);
}
return CODE_TYPES.PARAMS_ERROR;
}
// 领取任务奖励
async receiveTaskRewards(activityInfo, userInfo, taskType) {
if (taskType === TASK_TYPE.INVITES) {
return await this.getInvitesTaskRewards(userInfo);
} else if (taskType === TASK_TYPE.BUY_GOODS) {
return await this.getBuyGoodsTaskRewards(userInfo);
}
else if (taskType === TASK_TYPE.FREE_MASONRYS) {
return await this.getFreeRewards(userInfo);
}
else if (taskType === TASK_TYPE.FOLLOW) {
return await this.getFollowRewards(userInfo);
}
else if (taskType === TASK_TYPE.BROWSE) {
return await this.getBrowseRewards(userInfo);
}
else if (taskType === TASK_TYPE.EXCHANAGE) {
return await this.getExchangeRewards(userInfo);
}
return CODE_TYPES.PARAMS_ERROR;
}
//邀请任务完成
async doInvitesTask(userInfo) {
const { isNewVip, inviteId, activityId } = this.context.data
const { openId } = context;
if (!inviteId) {
return CODE_TYPES.PARAMS_ERROR;
}
if(inviteId === openId) {
return CODE_TYPES.PARAMS_ERROR;
}
const { session } = await getSellerSession(this.context);
let { isvip, url } = await this.userdao.getShopVip(session);
if (!isvip) {
return CODE_TYPES.ERROR_NOT_VIP
}
//判断是否玩过游戏
const gameService = new GameService(this.context)
const joinInfo = await gameService.getJoinInfo()
if(joinInfo) {
return CODE_TYPES.ERROR_NOT_NEW_VIP
}
//邀请人信息
const inviteUserInfo = await this.userdao.getUserInfo(inviteId);
if (!inviteUserInfo) return CODE_TYPES.ERROR_INVALID_INVITE_USER;
const invitedInfo = await dataService.getRecordByCondition({
activityId,
openId,
type: DATA_TYPE.assistRecord
});
//已经助力过 不能助力
if(invitedInfo) {
return CODE_TYPES.ERROR_ASSIST_ALREADY
}
//邀请者信息
let { _id, taskInfo, remainTimes, recordTask } = inviteUserInfo
let today = getToday()
let todayTask = taskInfo[today]
let oldRemain = remainTimes.invites ? remainTimes.invites : 0
let oldMemberNum = remainTimes.newMember ? remainTimes.newMember : 0
let oldRecord = recordTask.invites ? recordTask.invites : []
let todayRecord = todayTask.invites ? todayTask.invites : []
//非店铺会员
oldMemberNum = (isNewVip - 0) == 1 ? oldMemberNum + TASK_TYPE_WIN.NEN_INVITES : oldMemberNum
oldRemain = oldRemain + 1
oldRecord.push({ openId, newMember: isNewVip })
todayRecord.push({ openId, newMember: isNewVip })
let record = {
recordTask: {
...recordTask,
invites: oldRecord
},
remainTimes: {
...remainTimes,
invites: oldRemain,
newMember: oldMemberNum
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
invites: todayRecord
}
}
}
//助力成功添加记录
await dataService.addAssistRecord(userInfo,{
value: 4
})
// 更新邀请者信息
await this.userdao.update({ _id },{ $set: record });
// 更新被邀请者信息
let userRecord = {
diamond: userInfo.diamond + FIRST_DIAMOND
}
let result = await this.userdao.update({ _id:userInfo._id }, { $set: userRecord });
return {
diamond: FIRST_DIAMOND
};
}
//浏览任务完成
async doBrowseTask(userInfo) {
let today = getToday()
const { _id, taskInfo, remainTimes } = userInfo
const todayTask = taskInfo[today]
let { browserGoods: { value, status } } = todayTask
if(status == 2) {
return CODE_TYPES.ERROR_TASK_ALREADYRECEIVE;
}
let record = {
remainTimes: {
...remainTimes,
browserGoods: remainTimes.browserGoods + 1
},
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
browserGoods: { value, status: 1 }
}
}
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//关注店铺任务完成
async doFollowTask(userInfo) {
let today = getToday()
const { _id, remainTimes, recordTask, follow } = userInfo
let { followStatus } = recordTask
if(followStatus == 2 || follow.flag) {
return CODE_TYPES.ERROR_TASK_ALREADYRECEIVE;
}
let record = {
follow: {
flag: true,
newFollow: true,
befollowTime: Date.now()
},
recordTask: {
...recordTask,
followStatus: 1
},
remainTimes: {
...remainTimes,
follow: 1
},
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//领取关注店铺任务奖励
async getFollowRewards(userInfo) {
const { _id, diamond, remainTimes, recordTask } = userInfo
const { follow } = remainTimes
const { followStatus } = recordTask
if(follow == 0 || followStatus == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
let oldDiamond = diamond ? diamond : 0
let record = {
diamond: oldDiamond + TASK_TYPE_WIN.FOLLOW,
recordTask: {
...recordTask,
followStatus: 2
}
}
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//领取每日登录任务奖励
async getFreeRewards(userInfo) {
let today = getToday()
const { _id, diamond, activityId } = userInfo
const todayTask = taskInfo[today]
let { freeDiamond: { value, status} } = todayTask
if(status == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
let oldDiamond = diamond ? diamond : 0
let record = {
diamond: oldDiamond + value,
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
freeDiamond: { value, status: 2 }
}
}
}
//每日登录任务完成打点
let statService = new StatService(this.context)
await statService.addStat({ activityId, type: DATA_TYPE.dayLoginUv })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//领取每浏览商品任务奖励
async getBrowseRewards(userInfo) {
let today = getToday()
let { _id, resurgenceCards, taskInfo, remainTimes } = userInfo
const todayTask = taskInfo[today]
let { browserGoods: { value, status} } = todayTask
if(remainTimes.browserGoods == 0 || status == 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
//增加复活卡次数
let oldResurCard = resurgenceCards ? resurgenceCards : 0
let record = {
resurgenceCards: oldResurCard + TASK_TYPE_WIN.BROWSE,
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
browserGoods: { value, status: 2 }
}
}
}
//获得复活卡打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:TASK_TYPE_WIN.BROWSE })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//领取每日兑换任务奖励
async getExchangeRewards(userInfo) {
let today = getToday()
const { _id, diamond, activityId, taskInfo } = userInfo
const todayTask = taskInfo[today]
let { exchangeCredits } = todayTask
let exchangeTimes = exchangeCredits ? exchangeCredits.length : []
//无兑换任务
if(exchangeTimes >= 2) {
return CODE_TYPES.ERROR_TASK_NORECEIVE;
}
const { session } = await getSellerSession(this.context);
let currentCredits = await this.userdao.queryUserCredits(session)
//积分不足
if(currentCredits < TASK_TYPE_WIN.EXCHANAGE_CREDITS) {
return CODE_TYPES.ERROR_CREDIT_NUM;
}
//扣减积分
let reduceResult = this.userdao.updateUserCredits(TASK_TYPE_WIN.EXCHANAGE_CREDITS,session)
if(reduceResult) {
let oldDiamond = diamond ? diamond : 0
let oldRredit = exchangeCredits ? exchangeCredits : []
let newRredit = oldRredit.push({
createTime: Date.now(),
diamond: ASK_TYPE_WIN.EXCHANAGE_CREDIT,
value: ASK_TYPE_WIN.EXCHANAGE_CREDIT
})
console.log(newRredit)
let record = {
diamond: oldDiamond + TASK_TYPE_WIN.EXCHANAGE_CREDIT,
initialCredits: currentCredits - TASK_TYPE_WIN.EXCHANAGE_CREDIT,
taskInfo: {
...taskInfo,
[today]: {
...todayTask,
exchangeCredits: newRredit
}
}
}
//消耗积分打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.reduceCreditUv, value:TASK_TYPE_WIN.EXCHANAGE_CREDIT })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
return false;
}
//领取邀请任务奖励
async getInvitesTaskRewards(userInfo) {
let { _id, diamond, resurgenceCards, recordTask, taskInfo, remainTimes, openId, activityId } = userInfo
let { invites, newMember } = remainTimes
let today = getToday()
//领取次数
diamond += invites * TASK_TYPE_WIN.INVITES
resurgenceCards += newMember
let newRecord = taskInfo[today].invites ? taskInfo[today].invites : []
let oldRecord = recordTask.invites ? recordTask.invites : []
newRecord.forEach(el => {
el.times = Date.now()
oldRecord.push (el)
})
let record = {
diamond,
resurgenceCards,
recordTask: {
...recordTask,
invites: oldRecord
},
remainTimes: {
...remainTimes,
invites: 0,
newMember: 0
}
}
//获得复活卡打点
if(newMember > 0) {
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:newMember })
}
//邀请好友完成Pv Uv
await statInsertPV({ openId, activityId, type: DATA_TYPE.completeInvitedPv })
await statInsertUV({ openId, activityId, type: DATA_TYPE.completeInvitedUv })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
async getBuyGoodsTaskRewards(userInfo) {
let { _id, resurgenceCards, remainTimes, activityId } = userInfo
let { orders } = remainTimes
// 领取次数
resurgenceCards += orders * TASK_TYPE_WIN.BUY_GOODS;
let record = {
resurgenceCards,
remainTimes: {
...remainTimes,
orders: 0
},
updateTime: Date.now()
}
//获得复活卡打点
let statService = new StatService(this.context)
await statService.addStatNumberUv({ activityId, type: DATA_TYPE.addCardUv, value:TASK_TYPE_WIN.BUY_GOODS })
// 更新用户信息
let result = await this.userdao.update({ _id }, { $set: record });
return result;
}
//获取未生效的成功购买商品订单
async getNewBuyGoodsOrders(activityInfo, userInfo) {
let lastBuyTime = userInfo.createTime;
if (!lastBuyTime) {
return [];
}
//获取商品列表
if (!(activityInfo.tasks && activityInfo.tasks.orderGoods && activityInfo.tasks.orderGoods.itemIds)) {
return [];
}
let itemIds = activityInfo.tasks.orderGoods.itemIds.split(',');
//调用淘宝API查询用户订单
let orders = await getUserOrderlist(this.context, lastBuyTime, Date.now());
console.log('orders', orders);
//已使用的订单ID
let orderRecord = userInfo.orderRecord ? userInfo.orderRecord : [];
let orderNums = orderRecord.map(o => o.orderId);
//购买指定商品的新订单
orders = orders.filter(o => {
let flag = itemIds.indexOf(o.itemId + '') >= 0 && orderNums.indexOf(o.orderId) < 0; //&& orderNums.length < BUY_GOODS_LIMIT;
orderNums.push(o.orderId);
return flag;
});
return orders;
}
/**
* 添加助力记录
* @param {*} param0
*/
async addAssistRecord(userInfo, { value }) {
// value 1 助力成功 2老会员不能助力 3不是会员 4 已经助力过了
const { inviteId } = this.context.data;
const record = await this.initRecordData(userInfo, {
type: DATA_TYPE.assistRecord
}, {
inviteId,
value
});
return await this.dataDao.insertOne(record);
}
/**
* 查询记录
* @param {*} conditions
*/
async getRecordByCondition(conditions) {
return await this.dataDao.findOne(conditions);
}
/**
* 初始化记录
* @param {*} param0
* @param {*} customData
*/
async initRecordData(userInfo, { type }, customData = {}) {
const { openId, data } = this.context;
let { activityId, userNick } = data;
if (!userNick) {
if (userInfo) {
userNick = userInfo.userNick;
}
}
let record = {
openId,
activityId,
userNick,
type,
createTime: Date.now(),
createDay: getToday(),
...customData
}
return record;
}
}
module.exports = TaskService;
\ No newline at end of file
/**
* 用户相关方法
*/
const {
BaseDao,
TBAPIS
} = require('../sdk');
const BaseService = require('./base.service');
const {
USER_DB_NAME,
DATA_DB_NAME
} = require('../db');
const {
TASK_TYPE_WIN
} = require('../constants')
class UserService extends BaseService {
constructor(context) {
super(context);
this.userdao = new BaseDao(context, USER_DB_NAME);
this.dataDao = new BaseDao(context, DATA_DB_NAME);
}
/**
* @desc 获取当前打开活动的用户详情
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfo() {
let {
openId,
data
} = this.context;
let {
activityId
} = data;
let record = await this.userdao.findOne({
openId,
activityId
});
return record;
}
/**
* @desc 根据inviteId获取用户详情
* @desc 常用于助力分享码为用户openId, 被邀请人打开活动助力时需要获取邀请人的用户详情
* @param {邀请人的openId} inviteId
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfoByOpenId(inviteId) {
let {
activityId
} = this.context.data;
let record = await this.userdao.findOne({
openId: inviteId,
activityId
});
return record;
}
/**
* @desc 获取是否是会员
* @param {调用淘宝接口的session} session
* @returns {isvip: boolean(是否是会员), url: string(入会链接) }
*/
async getShopVip(session, callbackUrl = "") {
// 会员mock,当传递的参数有vipmock: true,则表示已经是会员
let {
vipmock = false
} = this.context.data;
if (vipmock) {
return {
isvip: true
}
}
let result = {}
let shopUrl = {};
try {
result = await TBAPIS.queryVipinfo(this.context, session);
shopUrl = await TBAPIS.getShopVipUrl(
this.context, session, {
"source": "isvapp",
"entrance": "duiba"
},
callbackUrl
);
} catch (e) {
console.log(e);
}
console.log(`result, shopUrl`, result, shopUrl);
return {
isvip: !!(result.result && result.result.member_info),
url: shopUrl.result && shopUrl.result.result
}
}
/**
* @desc 更新用户表
* @param {用户的主键id} _id
* @param {更新的对象} document
* @returns 若更新成功,返回为1; 若更新失败,返回为 0 或系统直接报错
*/
async updateUser(_id, document) {
console.log(document);
return await this.userdao.update({
_id
}, {
$set: {
...document,
updateTime: Date.now()
}
});
}
/**
* @desc 根据用户主键id查找用户详情
* @param {用户的主键id} _id
* @returns 若用户不存在,返回null; 用户存在,返回用户信息(object对象)
*/
async getUserInfoById(_id) {
return await this.userdao.findOne({
_id
});
}
async insertInitUser(userInfo) {
let serverTime = Date.now();
return this.userdao.insertOne({
...userInfo,
createTime: serverTime,
updateTime: serverTime,
createDay: getToday(),
});
}
/**
* 查询用户积分
*/
async queryUserCredits(session) {
try {
let result = await TBAPIS.queryCredits(this.context, session)
console.log(result)
return result.result;
} catch (e) {
console.log(`查询用户积分失败: `, e);
return false;
}
}
/**
* 更新(加扣)用户积分
* @param {number} quantity 数量
* @param {string} optType add 增加 reduce 减少
* @param {number} changeType 变更类型
*/
async updateUserCredits(
quantity,
session,
optType = 'reduce',
changeType = 1
) {
const isAdd = optType === 'add';
try {
const options = {
quantity, // 积分数量, 每次变更的数量
change_type: changeType, //变更类型:0交易,1:互动活动,2:权益兑换,3:手工调整
opt_type: isAdd ? '0' : 1, // 操作类型,0:增加,1:扣减
remark: `参与活动` // 备注
};
console.log(`${isAdd ? '加' : '扣'}积分请求参数`, options);
const result = await TBAPIS.changeCredits(this.context, session, options)
console.log(
`${isAdd ? '加' : '扣'}积分返回结果:${JSON.stringify(result)}`
);
return result;
} catch (e) {
console.log(`更新用户积分失败`, e);
return false;
}
}
// 添加用户
async addUserInfo(isvip, initialCredits, activityInfo = {}) {
const {
openId,
data: {
activityId
}
} = this.context;
let userInfo = await this.userdao.findOne({
openId,
activityId
});
// 新用户
if (!userInfo) {
const record = this.initUserData(isvip, initialCredits, activityInfo);
const result = await this.userdao.insertOne(record);
console.log(result, '新用户')
record.isNewUser = true;
return record;
}
// 老用户
// 之前进入活动非会员,现在进入会员,则视为新会员用户
const memberBefore = userInfo.member.flag;
const memberNow = isvip;
if (!memberBefore && memberNow) {
userInfo.member.newMember = true;
userInfo.member.bememberTime = getToday();
//新用户埋点
const dataService = new DataService(context);
dataService.insertUV({
activityId,
openId,
type: DATA_TYPE.newMemberUv
});
};
//更新用户初始积分
if (initialCredits !== userInfo.initialCredits) {
userInfo.initialCredits = initialCredits
}
const today = getToday();
if (!userInfo[`taskInfo.everyday.${today}`]) {
let everyday = {
[today]: {
browse: {
status: 0,
rewards: TASK_TYPE_WIN.BROWSE,
done: false
},
exchanage: {
limitTimes: 2,
times: 0,
rewards: TASK_TYPE_WIN.EXCHANAGE_CREDITS,
done: false
},
freeMasonrys: {
rewards: TASK_TYPE_WIN.DAY,
done: true,
status: 0,
}
}
}
userInfo[`taskInfo.everyday`] = everyday;
console.log('老用户' + userInfo[`taskInfo.everyday`])
}
// 添加登录次数
let loginTimes = userInfo['info'][today]['login'] ? userInfo['info'][today]['login'] + 1 : 1;
// userInfo['info'][today] = userInfo['info'][today] || {};
await this.updateUser(userInfo._id, {
info: {
[today]: {
login: loginTimes
}
},
member: userInfo.member,
masonrys: userInfo.masonrys,
initialCredits: userInfo.initialCredits,
taskInfo: {
everyday: userInfo[`taskInfo.everyday`]
},
updateTime: Date.now()
})
console.log(userInfo, '旧用户')
return userInfo;
}
// 初始化用户数据
initUserData(isvip, initialCredits, activityInfo = {}) {
const {
openId,
data: {
activityId,
userNick,
avatar,
inviteId,
isFollow
}
} = this.context;
//关注店铺
let follow = {
flag: false
}
if (isFollow) {
follow.flag = true;
follow.newFollow = false;
follow.followTime = ''
}
// 初始化会员情况
let member = {
flag: false
};
if (isvip) {
member.flag = true;
member.newMember = false;
member.bememberTime = '';
}
const record = {
openId,
activityId,
userNick,
avatar,
inviteId,
member,
follow,
totalScore: 0,
maxScore: 0,
rankPrizePop: 0,
initialCredits,
diamond: 10,
resurgenceCards: 0,
totalShoes: 0,
info: {
[getToday()]: {
login: 1
}
},
newUserGuide: 0,
taskInfo: {
follow: {
rewards: TASK_TYPE_WIN.FOLLOW,
done: follow.flag,
status: 0
},
orderGoods: {
rewards: TASK_TYPE_WIN.FOLLOW,
done: false,
waitReceive: 0
},
invites: {
waitReceive: 0,
done: false,
rewards: TASK_TYPE_WIN.INVITES,
value: TASK_TYPE_WIN.NEN_INVITES,
waitValue: 0
},
everyday: {
[getToday()]: {
browse: {
status: 0,
rewards: TASK_TYPE_WIN.BROWSE,
done: false
},
exchanage: {
limitTimes: 2,
times: 0,
rewards: TASK_TYPE_WIN.EXCHANAGE_CREDITS,
done: false
},
freeMasonrys: {
rewards: TASK_TYPE_WIN.DAY,
done: true,
status: 0
}
}
}
},
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
}
return record;
}
/**
* 获取用户排名
*/
async getUserRank(maxScore) {
let {
activityId
} = this.context.data;
const {
openId
} = this.context;
let sameScoreList = await this.userdao.find({
maxScore: maxScore,
activityId: activityId
}, {
sort: {
maxScoreTime: 1
}
});
let rank = "未上榜";
if (!maxScore) return {
rank
};
sameScoreList = sameScoreList && sameScoreList.filter(i => i.maxScore > 0)
let gap = 0;
//说明有多个跟自己同分数的人
for (let j = 0; j < sameScoreList.length; j++) {
if (sameScoreList[j].openId == openId) {
gap = j;
}
}
rank = await this.userdao.count({
maxScore: {
$gt: maxScore
},
activityId: activityId
});
rank = rank + 1 + gap;
if (rank > 100) {
rank = '100+';
}
return {
rank
};
}
async getTotalRankUserCount(activityId) {
return await this.userdao.count({
activityId,
maxScoreTime: {
$exists: true
}
});
}
// 排行榜, 前100名
async getRankList(activityId, pageNum = 1, pageSize = 100) {
console.log(`activityId`, activityId);
return await this.userdao.find({
activityId,
maxScoreTime: {
$exists: true
}
}, {
projection: {
userNick: 1,
avatar: 1,
maxScore: 1,
openId: 1
},
sort: {
maxScore: -1,
maxScoreTime: 1
},
limit: pageSize,
skip: (pageNum - 1) * pageSize,
});
}
}
module.exports = UserService;
\ No newline at end of file
/**
* 访问明细
*/
const { BaseDao } = require("../sdk");
const { getToday } = require("../utils");
const { USER_JOIN_DB_NAME } = require("../db");
class UserJoinService {
constructor(context) {
this.context = context;
this.userJoinDao = new BaseDao(context, USER_JOIN_DB_NAME);
}
// 用户开始游戏
async insertGameInfo(userInfo) {
const { openId, data } = this.context;
const { activityId } = data;
return this.userJoinDao.insertOne({
openId,
activityId,
...userInfo,
createTime: Date.now(),
updateTime: Date.now(),
createDay: getToday(),
});
}
// 更新用户游戏数据
async updateGameInfo(_id, activityId, info) {
return this.userJoinDao.update(
{
_id,
activityId,
},
{
$set: {
...info,
updateTime: Date.now(),
},
}
);
}
async getGameInfo(_id, activityId) {
return this.userJoinDao.findOne({
_id,
activityId,
});
}
async getGameInfoListByToolType(activityId, toolType) {
const { openId } = this.context;
return this.userJoinDao.find({
activityId,
openId,
toolType,
});
}
async getUserJoinTotalScore(activityId) {
const { openId } = this.context;
return this.context.cloud.db.collection(USER_JOIN).aggregate([
{
$match: { activityId, openId },
},
{
$group: {
_id: "$toolType",
score: { $sum: "$score" },
},
},
]);
}
async getJoinCount(activityId, openId) {
return this.userJoinDao.count({
activityId,
openId,
});
}
}
module.exports = UserJoinService;
// 获取商家session
const getSellerSession = require('./package/getSession');
// 获取当天时间进行format
const getToday = require('./package/getToday');
// 发放淘宝奖品(权益/积分)
const sendTBAward = require('./package/sendTBAward');
// 通用并发接口
const lockUpdate = require('./package/lockUpdate');
// 用户订单
const getUserOrderlist = require('./package/getUserOrderlist');
//打印调用日志
const { logger, addErrorLog } = require('./package/log');
//埋点数据
const { statInsertPV, statInsertUV } = require('./package/statData');
module.exports = {
getSellerSession,
getToday,
sendTBAward,
lockUpdate,
getUserOrderlist,
logger,
addErrorLog,
statInsertPV,
statInsertUV
}
/**
* 获取商家session
*/
const { SELLER_INFO_DB_NAME, ACTIVITY_CONFIG_DB_NAME } = require('../../db');
const { BaseDao } = require('../../sdk')
const getSellerSession = async (context, activityId) => {
if (!activityId) {
activityId = context.data.activityId;
}
let activitydao = new BaseDao(context, ACTIVITY_CONFIG_DB_NAME)
let sellerdao = new BaseDao(context, SELLER_INFO_DB_NAME)
let activityConfigResult = await activitydao.find({ _id: activityId });
if (!activityConfigResult || !activityConfigResult[0]) return {};
let result = await sellerdao.find({
openId: activityConfigResult[0].openId
});
console.log(`getSellerSession`, result);
if (!result || !result[0]) return {};
return {
session: result[0].accessToken
};
}
module.exports = getSellerSession;
\ No newline at end of file
const { transformBeijingDate, dateFormatter } = require('../../sdk');
// 获取今天的时间
const getToday = ()=> {
return dateFormatter(transformBeijingDate(), 'yyyy/MM/dd');
}
module.exports = getToday;
\ No newline at end of file
/**
* 用户购买记录查询
*/
const dayjs = require('dayjs');
const {dateFormatter, transformBeijingDate, TBAPIS} = require('../../sdk');
const getSellerSession = require('./getSession');
const { TAOBAO_SUCCESS_ORDER_STATUS } = require('../../constants');
const getUserOrderlist = async (context, queryStartTime, queryEndTime) => {
try{
let results = [];
let currentTime = Date.now();
// 开始时间以Math.max(当前时间倒推3个月,queryStartTime)
let lastUpdateTime = dayjs().add(-3, 'month').valueOf();
console.log(`lastUpdateTime`, lastUpdateTime);
// 若倒推的3个月时间小于传入的查询开始时间, 则以查询开始时间作为最后更新时间
if(lastUpdateTime < queryStartTime) {
lastUpdateTime = queryStartTime;
}
let session = await getSellerSession(context);
// 获取用户在lastUpdateTime ~ currentTime区间的购买情况
let params = {
startTime: dateFormatter(transformBeijingDate(lastUpdateTime)),
endTime: dateFormatter(transformBeijingDate(queryEndTime || currentTime)),
openId: context.openId,
session
}
let orderResult = await TBAPIS.getBuyerOrderList(context, params);
if (orderResult.total_results > 0) {
const { trade } = orderResult.trades;
trade.forEach((i) => {
if (TAOBAO_SUCCESS_ORDER_STATUS.includes(i.status)) {
i.orders.order.forEach((s) => {
results.push({
payTime: i.pay_time,
itemId: s.num_iid,
time: i.created,
price: s.price,
orderId: s.oid,
img: s.pic_path,
title: s.title,
});
});
}
});
}
console.log(`已支付的订单列表`, results);
return results;
}catch(e) {
console.log(`错误`, e);
return [];
}
}
module.exports = getUserOrderlist;
\ No newline at end of file
const {CODE_TYPES} = require('../../constants');
/**
* 并发更新
* @param {接收数组或对象} daoqueryArr : [{dao: userdao, query:{_id:_id}}, {dao: activityprizedao, query: {userNick, status ...}}]
* @param {*} fn
* @param {*} times
*/
const lockUpdate = async(daoqueryArr, fn, times=5) => {
if (typeof daoqueryArr !=='object') {
console.log(`lockUpdate 参数错误`);
return false;
}
if (!daoqueryArr instanceof Array) {
daoqueryArr = [daoqueryArr];
}
let time = 0;
console.log(`进入update并发处理次数`, times);
let success = false;
try{
while (time++ < times && !success) {
// 依次锁住表
let updateRes = [];
let error = false
for(let i = 0; i < daoqueryArr.length; i++) {
let daoquery = daoqueryArr[i];
if (!daoquery.dao || !daoquery.query) {
success = true;
error = true
console.log(`daoquery`, daoquery)
break
}else {
console.log(`daoquery`, daoquery)
let canupdate = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 2}});
updateRes.push(canupdate);
}
}
if (error) {
return `调用lockUpdate方法参数不符合规范`
}
console.log(`updateRes`, updateRes)
// 若都锁定成功了,执行内部调用
if (updateRes.every((v) => v === 1)) {
const ret = await fn();
console.log(`完成调用,解锁操作执行--------------`);
daoqueryArr.forEach(async daoquery => {
console.log(daoquery)
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`更新lockStatus为1`, ures);
});
success = true;
return ret;
} else {
console.log(`进入waitFor了,需等待30ms`)
await waitFor(30);
success = false;
}
}
}catch(e) {
console.log(e);
daoqueryArr.forEach(async daoquery => {
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`更新lockStatus为1`, ures);
});
success = false;
}
console.log(`daoqueryArr`, daoqueryArr)
// 稍后重试
if (!success) {
daoqueryArr.forEach(async daoquery => {
console.log(daoquery)
let ures = await daoquery.dao.update(daoquery.query, {$set: {lockStatus: 1}});
console.log(`操作${times}次后更新lockStatus为1`, ures);
});
return CODE_TYPES.ERROR_UPDATE_RETRY;
}
function waitFor(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
});
}
}
module.exports = lockUpdate;
const logger = (methodName, params) => {
console.log(`调用方法: ${methodName}`, params);
}
// 发送错误日志
const addErrorLog = async (context, data = {}) => {
if (!context) return false;
const {
openId,
data: { activityId }
} = context;
const dbName = 'error_log';
const db = context.cloud.db;
const { functionName, errorMessage, catchType = 1 } = data;
const record = {
openId,
activityId,
functionName,
errorMessage,
catchType,
createTime: Date.now()
};
try {
return await db.collection(dbName).insertOne(record);
} catch (e) {
console.log(`添加记录失败-${dbName}:`, e);
return false;
}
};
module.exports = {
logger,
addErrorLog
}
\ No newline at end of file
const { PRIZE_TYPE, DRAW_STATUS, C_APP_NAME, TBERROR, CODE_TYPES } = require('../../constants');
const { TBAPIS } = require('../../sdk');
/**
* 发奖,包含权益,实物,积分
* @param {*} document 必须要有{ type, ename, _id }
* @param {*} session
* @param {*} context
*/
const sendTBAward = async (context, session, document) => {
let { type, ename, _id, credits } = document;
if (!type) {
return CODE_TYPES.PARAMS_ERROR;
}
if (type === PRIZE_TYPE.OBJECT) {
return document;
}
// 发奖
try {
console.log(`type`, type);
// 若中奖为权益
if (type === PRIZE_TYPE.ENAME) {
console.log(`中权益`);
let {drawStatus, remark} = await sendEname(ename, _id, session, context);
console.log(`drawStatus, remark`, drawStatus, remark);
document.drawStatus = drawStatus;
document.remark = remark;
} else if (type === PRIZE_TYPE.CREDITS) {
let { drawStatus, remark } = await sendCredits(credits, session, context);
document.drawStatus = drawStatus;
document.remark = remark;
}
return document;
}catch(e) {
console.log(`发奖错误`, e);
return CODE_TYPES.SYSTEM_ERROR;
}
}
/**
* 发放积分
* @param {发放的积分数} credits
* @param {*} session
* @param {*} context
* @returns {drawStatus, remark}
*/
const sendCredits = async (credits, session, context) => {
let drawStatus = '';
let remark = '';
let result = await TBAPIS.changeCredits(context, session, {
quantity: credits,
change_type: 2,
opt_type: '0',
remark: `参与活动加积分`
});
if (result) {
drawStatus = DRAW_STATUS.SUCCESS;
} else {
drawStatus = DRAW_STATUS.FAIL;
remark = result.result_msg;
}
return {drawStatus, remark};
}
/**
* @desc 发放权益
* @param {权益名称} ename
* @param {唯一key} uniqueId
* @param {*} session
* @param {*} context
* @returns { drawStatus, remark }
*/
const sendEname = async (ename, uniqueId, session, context) => {
let result = {};
try{
result = await TBAPIS.benefitSend(context, {
right_ename: ename,
receiver_id: context.openId,
unique_id: uniqueId,
app_name: C_APP_NAME,
session
});
}catch(e) {
console.log(`发放权益失败`, e);
result = e;
}
let drawStatus = '';
let remark = '';
if (result.result_success) {
drawStatus = DRAW_STATUS.SUCCESS;
} else {
let result_code = result.result_code;
if (['APPLY_SINGLE_COUPON_COUNT_EXCEED_LIMIT', 'APPLY_ONE_SELLER_COUNT_EXCEED_LIMIT', 'USER_PERMISSION_EXCEED_MAX_RIGHT_COUNT_IN_DAY'].includes(result_code)) {
drawStatus = DRAW_STATUS.RETRY;
} else {
drawStatus = DRAW_STATUS.FAIL;
}
remark = TBERROR[result_code || result.msg] || result.result_msg || result.sub_msg || `发放失败`;
}
return {remark, drawStatus};
}
module.exports = sendTBAward;
\ No newline at end of file
/**
* 增加埋点数据PV
* @param {
* "openId":"",
* "activityId":"",
* "type":"",
* "value":"自定义"} data
*/
const statInsertPV = async (context, data) => {
let {
openId,
activityId,
type
} = data;
const dbName = 'c_stat_info';
const db = context.cloud.db;
if (!openId || !activityId || !type) {
console.log('埋点数据参数为空');
return null;
}
data['dayTime'] = getToday();
data['createTime'] = Date.now();
data['updateTime'] = Date.now();
try {
return await db.collection(dbName).insertOne(data);
} catch (e) {
console.log(`添加记录失败-${dbName}:`, e);
return false;
}
}
/**
* 增加埋点数据UV
* @param {
* "openId":"",
* "activityId":"",
* "type":"",
* "value":"自定义"} data
*/
const statInsertUV = async (context, data) => {
let {
openId,
activityId,
type
} = data;
if (!openId || !activityId || !type) {
console.log('埋点数据参数为空');
return null;
}
const dbName = 'c_stat_info';
const db = context.cloud.db;
let record = await db.collection(dbName).findOne({
openId,
activityId,
type,
dayTime: getToday()
});
if (null == record) {
data['dayTime'] = getToday();
data['createTime'] = Date.now();
data['updateTime'] = Date.now();
return await db.collection(dbName).insertOne(data);
}
return true;
}
module.exports = {
statInsertPV,
statInsertUV
}
\ No newline at end of file
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
adler-32@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25"
integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=
cfb@^1.1.2:
version "1.2.0"
resolved "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8"
integrity sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=
dependencies:
adler-32 "~1.2.0"
crc-32 "~1.2.0"
printj "~1.1.2"
codepage@~1.14.0:
version "1.14.0"
resolved "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=
dependencies:
commander "~2.14.1"
exit-on-epipe "~1.0.1"
commander@~2.14.1:
version "2.14.1"
resolved "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
integrity sha1-IjUSPjevjKPGXfRbAm29NXsBuao=
commander@~2.17.1:
version "2.17.1"
resolved "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha1-vXerfebelCBc6sxy8XFtKfIKd78=
crc-32@~1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha1-yy224puIUI4y2d0OwWk+e0Ghggg=
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
dayjs@^1.8.28:
version "1.8.33"
resolved "https://registry.npm.taobao.org/dayjs/download/dayjs-1.8.33.tgz?cache=0&sync_timestamp=1597033960849&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdayjs%2Fdownload%2Fdayjs-1.8.33.tgz#18bc4a2b6c1c6f4d67b4c4f2536c0b97e5b766f7"
integrity sha1-GLxKK2wcb01ntMTyU2wLl+W3Zvc=
exit-on-epipe@~1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
integrity sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=
frac@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha1-PXT39keMiKG1AgMG10fcYxPHTQs=
node-xlsx@^0.15.0:
version "0.15.0"
resolved "https://registry.npm.taobao.org/node-xlsx/download/node-xlsx-0.15.0.tgz#1f1b0d7adce5c706e86bfd96a5aa0005bf8a9dc3"
integrity sha1-HxsNetzlxwboa/2WpaoABb+KncM=
dependencies:
buffer-from "^1.1.0"
xlsx "^0.14.1"
printj@~1.1.0, printj@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
integrity sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=
ssf@~0.10.2:
version "0.10.3"
resolved "https://registry.npm.taobao.org/ssf/download/ssf-0.10.3.tgz#8eae1fc29c90a552e7921208f81892d6f77acb2b"
integrity sha1-jq4fwpyQpVLnkhII+BiS1vd6yys=
dependencies:
frac "~1.1.2"
taobao-mini-sdk@0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/taobao-mini-sdk/download/taobao-mini-sdk-0.1.2.tgz?cache=0&sync_timestamp=1592807245146&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftaobao-mini-sdk%2Fdownload%2Ftaobao-mini-sdk-0.1.2.tgz#c4d36c8549aa6fdad51b6bca623c1de91a660c2b"
integrity sha1-xNNshUmqb9rVG2vKYjwd6RpmDCs=
xlsx@^0.14.1:
version "0.14.5"
resolved "https://registry.npm.taobao.org/xlsx/download/xlsx-0.14.5.tgz?cache=0&sync_timestamp=1597269620835&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.14.5.tgz#3637e914d791bdca7382816e173f7d725ed0e0d2"
integrity sha1-NjfpFNeRvcpzgoFuFz99cl7Q4NI=
dependencies:
adler-32 "~1.2.0"
cfb "^1.1.2"
codepage "~1.14.0"
commander "~2.17.1"
crc-32 "~1.2.0"
exit-on-epipe "~1.0.1"
ssf "~0.10.2"
{
"runtime": "nodejs8",
"version": "1.0"
}
\ No newline at end of file
const { Utils } = require('taobao-mini-sdk/lib/index').default;
const { dateFormatter,transformBeijingDate } = Utils.default;
const xlsx = require("node-xlsx");
//埋点数据类型
const STAT_TYPE = {
newAddUv:'newAddUv',//首次进入uv 1
accesssPv:'accesssPv',//访问pv 1
accesssUv:'accesssUv',//访问uv
joinGamePv:'joinGamePv',//参与pv 1
joinGameUv:'joinGameUv',//参与uv
countFollow:'countFollow',//关注店铺完成pv 1
dayLogin:'dayLogin',//每日登录任务完成 1
completeInvited:'completeInvited',//邀请好友任务完成Pv 1
invitedMember: 'invitedMember',//带来好友已入会(未入会isvip) 1
beBrowse:'beBrowse',//每日浏览完成uv 1
exchanageCredit:'exchanageCredit',//积分兑换砖石pv(前端)
inviteFriend:'inviteFriend',//邀请好友发起Pv(前端)
useNormal:'useNormal',//款鞋一使用pv
usePrimary:'usePrimary',//款鞋二使用pv
useMedium:'useMedium',//款鞋三使用pv
consumption:'consumption',//每日消费uv(点击去下单) (前端)
exchanagePrize:'exchanagePrize',//每日兑换uv(兑换商场)(前端)
addShoesUv:'addShoesUv',//获得碎片Uv 1
reduceShoesUv:'reduceShoesUv',//使用碎片Uv
addCardUv:'addCardUv',//获得复活卡Uv 1
reduceCardUv:'reduceCardUv',//使用复活卡Uv 1
reduceDiamondUv:'reduceDiamondUv',//消耗砖石Uv
reduceCreditUv:'reduceCreditUv',//消耗积分Uv
countDiamond:'countDiamond',//当日累计消耗砖石
countCredit:'countCredit',//当日累计消耗积分
countMember:'countMember',//入会人数
countShoes:'countShoes',//碎片获取总量
useCountShoes:'useCountShoes',//碎片使用总量
countCards:'countCards',//复活卡获取总量
useCountCards:'useCountCards',//复活卡使用总量
assistRecord:'assistRecord',//助力记录
orderPrice:'orderPrice',//订单价格
}
function getAggSql(
matchInfo,
day,
isUv = false,
isTotal = false,
isPrice = false
) {
let groupObj = isUv
? {
_id: {
day: "$createDay",
openId: "$openId",
},
number: { $sum: 1 },
}
: {
_id: "$createDay",
number: { $sum: 1 },
};
groupObj = isTotal
? { ...groupObj, totalValue: { $push: isPrice ? "$price" : "$value" } }
: groupObj;
return [
{
$match: { ...matchInfo, createDay: day },
},
{
$group: groupObj,
},
];
}
exports.getStat = async (context) => {
let { startDay, endDay, activityId } = context.data;
const { cloud } = context;
if (!startDay) return false;
if(!endDay) {
endDay = startDay
}
let statDb = cloud.db.collection("c_stat_info");
let accessDb = cloud.db.collection("c_user_access");
let joinDb = cloud.db.collection("c_user_join");
let userDb = cloud.db.collection("c_user");
let awardsDb = cloud.db.collection("c_awards_info");
let oneDay = 24 * 3600 * 1000;
let day = startDay;
let xlsxList = [
[
"日期",
"新增uv",
"访问pv(已入会)",
"访问pv(未入会)",
"访问uv(已入会)",
"访问uv(未入会)",
"总访问uv",
"参与pv(已入会)",
"参与pv(未入会)",
"参与uv(已入会)",
"参与uv(未入会)",
"总参与uv",
"入会人数",
"累计消耗钻石",
"累计消耗积分",
"鞋款1使用uv",
"鞋款2使用uv",
"鞋款3使用uv",
// "下单金额",
"关注店铺完成uv",
"每日登录完成uv",
"积分兑换砖石pv",
"积分兑换砖石uv",
"邀请好友任务发起pv",
"邀请好友任务发起uv",
"邀请好友任务完成pv",
"邀请好友任务完成uv",
// "带来好友已入会",
// "带来好友未入会",
"每日浏览完成uv",
"每日消费uv",
"每日兑换uv",
"碎片获取总量",
"碎片使用总量",
"复活卡获取总量",
"复活卡使用总量",
],
];
while (new Date(day).getTime() <= new Date(endDay).getTime()) {
let newAddUv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.newAddUv }, day, true)
);
let vipAccessPv = await accessDb.aggregate(
getAggSql({ activityId, isVip: true }, day, false)
);
let notVipAccessPv = await accessDb.aggregate(
getAggSql({ activityId, isVip: false }, day, false)
);
let vipAccessUv = await accessDb.aggregate(
getAggSql({ activityId, isVip: true }, day, true)
);
let notVipAccessUv = await accessDb.aggregate(
getAggSql({ activityId, isVip: false }, day, true)
);
//总访问uv
let accessCountUv = await accessDb.aggregate(
getAggSql({ activityId }, day, true)
);
let vipJoinGamePv = await joinDb.aggregate(
getAggSql({ activityId, isVip: true }, day, false)
);
let noVipJoinGamePv = await joinDb.aggregate(
getAggSql({ activityId, isVip: false }, day, false)
);
let vipJoinGameUv = await joinDb.aggregate(
getAggSql({ activityId, isVip: true }, day, true)
);
let noVipJoinGameUv = await joinDb.aggregate(
getAggSql({ activityId, isVip: false }, day, true)
);
//总参与uv
let joinCountUv = await joinDb.aggregate(
getAggSql({ activityId }, day, true)
);
let countMember = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.countMember }, day, true)
);
//当日累计消耗砖石
let countDiamond = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.reduceDiamondUv }, day, true, true)
);
//当日累计消耗积分
let countCredit = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.reduceCreditUv }, day, true, true)
);
//款鞋使用
let shoeUse1 = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.useNormal },day, true )
);
let shoeUse2 = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.usePrimary },day, true )
);
let shoeUse3 = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.useMedium },day, true )
);
//下单金额
let orderPrice = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.orderPrice }, day, false, true )
);
//关注店铺
let countFollow = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.countFollow }, day, true )
);
//每日登录完成
let dayLogin = await userDb.aggregate(
[
{
$match: { activityId, [`taskInfo.${day}.sign.status`]: 2},
},
{
$group: { _id: "$openId", number: { $sum: 1 } },
}
]
);
//每日兑换pv
let exchanageCreditPv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.exchanageCredit }, day, false )
);
//每日兑换uv
let exchanageCreditUv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.exchanageCredit }, day, true )
);
//邀请好友发起pv
let inviteFriendPv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.inviteFriend }, day, false )
);
//邀请好友发起uv
let inviteFriendUv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.inviteFriend }, day, true )
);
//邀请好友完成pv
let completeInvitedPv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.completeInvited }, day, false )
);
//邀请好友完成uv
let completeInvitedUv = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.completeInvited }, day, true )
);
//带来好友已入会
let isVipInvitedMember = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.invitedMember, isvip: true }, day, true )
);
//带来好友未入会
let noIsVipInvitedMember = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.invitedMember, isvip: false }, day, true )
);
//每日浏览完成
let beBrowse = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.beBrowse }, day, true )
);
//每日消费
let consumption = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.consumption }, day, true )
);
//碎片获取总量
let countShoes = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.addShoesUv }, day, false, true )
);
//碎片使用总量
let timeRangePre = (new Date(day)).getTime()
let timeRangeNext = (new Date(day)).getTime() + 24 * 3600 * 1000 - 1
//每日兑换
let exchanagePrize = await awardsDb.aggregate(
[
{
$match: { activityId, prizeType: 2, createTime: { $gt : timeRangePre, $lte : timeRangeNext } },
},
{
$group: { _id: "$openId", number: { $sum: 1 } },
}
]
);
let countReduceShoes = await awardsDb.aggregate(
[
{
$match: { activityId, prizeType: 2, createTime: { $gt : timeRangePre, $lte : timeRangeNext } },
},
{
$group: { _id: "$createTime", number: { $sum: 1 }, totalValue: { $push: "$exchangeValue" } },
},
]
);
//复活卡获取总量
let countCards = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.addCardUv }, day, false, true )
);
//复活卡使用总量
let countReduceCards = await statDb.aggregate(
getAggSql({ activityId, type: STAT_TYPE.reduceCardUv }, day, false, true )
);
xlsxList.push([
day,
newAddUv.length || 0,
(vipAccessPv[0] && vipAccessPv[0].number) || 0,
(notVipAccessPv[0] && notVipAccessPv[0].number) || 0,
vipAccessUv.length || 0,
notVipAccessUv.length || 0,
accessCountUv.length || 0,
(vipJoinGamePv[0] && vipJoinGamePv[0].number) || 0,
(noVipJoinGamePv[0] && noVipJoinGamePv[0].number) || 0,
vipJoinGameUv.length || 0,
noVipJoinGameUv.length || 0,
joinCountUv.length || 0,
countMember.length || 0,
(countDiamond.length &&
countDiamond.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
(countCredit.length &&
countCredit.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
shoeUse1.length || 0,
shoeUse2.length || 0,
shoeUse3.length || 0,
// (orderPrice.length &&
// orderPrice.reduce((s, v) => {
// return (s = v.totalValue.reduce((m, i) => {
// return (m += i);
// }, s));
// }, 0)) || 0,
countFollow.length || 0,
dayLogin.length || 0,
(exchanageCreditPv[0] && exchanageCreditPv[0].number) || 0,
exchanageCreditUv.length || 0,
(inviteFriendPv[0] && inviteFriendPv[0].number) || 0,
inviteFriendUv.length || 0,
(completeInvitedPv[0] && completeInvitedPv[0].number) || 0,
completeInvitedUv.length || 0,
// isVipInvitedMember.length || 0,
// noIsVipInvitedMember.length || 0,
beBrowse.length || 0,
consumption.length || 0,
exchanagePrize.length || 0,
(countShoes.length &&
countShoes.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
(countReduceShoes.length &&
countReduceShoes.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
(countCards.length &&
countCards.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
(countReduceCards.length &&
countReduceCards.reduce((s, v) => {
return (s = v.totalValue.reduce((m, i) => {
return (m += i);
}, s));
}, 0)) || 0,
]);
//时间+1
let tommorrow = new Date(day).getTime() + oneDay;
day = dateFormatter(transformBeijingDate(tommorrow), 'yyyy/MM/dd');
}
let buffer = xlsx.build([
{
name: "斯凯奇奔跑吧数据",
data: xlsxList,
},
]);
// console.log(`xlsxData: ${JSON.stringify(xlsxData)}`);
try {
let result = await cloud.file.uploadFile({
fileContent: buffer,
fileName: "斯凯奇奔跑吧数据" + Date.now() + ".xlsx",
});
// result.url 需进行处理
return result.url;
} catch (e) {
console.log("上传文件出错", e);
// 打印日志
return false;
}
};
exports.getTopUser = async (context) => {
const { activityId } = context.data;
const { cloud } = context;
let userDb = cloud.db.collection("c_user");
let res = await userDb.find(
{
activityId,
},
{
sort: {
totalScore: -1,
},
limit: 100,
}
);
return res;
};
exports.inset100User = async (context) => {
const { cloud } = context;
let userDb = cloud.db.collection("c_user");
for(let i = 0;i < 90; i++) {
let recod = {
"remainTimes": {
"newMember": 0,
"browseGoods": 0,
"sign": 0,
"member": 1,
"invites": 0,
"orders": 0,
"follow": 0
},
"totalShoes": 20,
"openId": "AAGvCTXPAL-pl8nrX7woalGD",
"rankPrizePop": 0,
"guideComplete": true,
"activityId": "5f3b3b6e9da6714ab709b859",
"userNick": "duiba2",
"member": {
"newMember": false,
"flag": true
},
"taskInfo": {},
"info": {
"2020/08/26": {
"login": 1
}
},
"initialCredits": 0,
"inviteId": "",
"resurgenceCards": 0,
"createDay": "2020/08/26",
"updateTime": 1598433994730,
"avatar": "http://wwc.alicdn.com/avatar/getAvatar.do?userIdStr=MHx4MCMHP8xSPGx0PCxGPHxWPGxYPCxWXFv4P8xWPkQT&width=80&height=80&type=sns",
"maxScore": 355,
"follow": {
"flag": false,
"newFollow": false
},
"totalScore": 1392,
"diamond": 0,
"maxScoreTime": 1598433994730,
"createTime": 1598431915312,
"recordTask": {
"followStatus": 0,
"invites": [],
"memberStatus": 1,
"orders": []
},
"toolInfo": {
"normal": 1,
"medium": 0,
"primary": 0
}
}
console.log('oneUser:'+JSON.stringify(recod))
await userDb.insertOne(recod)
}
};
//测试方法 5f35eded0cb7330c94e04eda 5f3b3b6e9da6714ab709b859
// {
// "handler": "getStat",
// "data": {
// "activityId":"5f50641e3075d9e976e28d72",
// "startDay":"2020/09/03",
// "endDay":"2020/09/03"
// }
// }
{
"name": "stat",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz",
"integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8="
},
"cfb": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz",
"integrity": "sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=",
"requires": {
"adler-32": "~1.2.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz",
"integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao="
}
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1595168214577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz",
"integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz",
"integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz",
"integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz",
"integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs="
},
"node-xlsx": {
"version": "0.15.0",
"resolved": "https://registry.npm.taobao.org/node-xlsx/download/node-xlsx-0.15.0.tgz",
"integrity": "sha1-HxsNetzlxwboa/2WpaoABb+KncM=",
"requires": {
"buffer-from": "^1.1.0",
"xlsx": "^0.14.1"
}
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz",
"integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI="
},
"ssf": {
"version": "0.10.3",
"resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.10.3.tgz",
"integrity": "sha1-jq4fwpyQpVLnkhII+BiS1vd6yys=",
"requires": {
"frac": "~1.1.2"
}
},
"taobao-mini-sdk": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/taobao-mini-sdk/-/taobao-mini-sdk-0.1.2.tgz",
"integrity": "sha512-glePe3kdmNNVoEkoPyHRzi5hM1XwIMgJ0Vhh1ouMrzD5sRhG+qCByKhHCjmBddRdEr92DY/3fGrh9lsokF2f+A=="
},
"xlsx": {
"version": "0.14.5",
"resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.14.5.tgz?cache=0&sync_timestamp=1594943870433&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.14.5.tgz",
"integrity": "sha1-NjfpFNeRvcpzgoFuFz99cl7Q4NI=",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.2",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"ssf": "~0.10.2"
}
}
}
}
{
"name": "stat",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"license": "ISC",
"sdkVersion": "*",
"dependencies": {
"node-xlsx": "^0.15.0",
"taobao-mini-sdk": "0.1.2"
},
"config": {
"notNeedLogin": []
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment