Commit 99f4fcd9 authored by qinhaitao's avatar qinhaitao

Merge branch 'c_server_ts_cultivate' into 'c_server_ts_perf'

C server ts cultivate

See merge request !12
parents 75643666 92f9a78f
{
"controllers": {
"common": {
"user": {
"getVipInfo": {
"desc": "获取会员信息",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId"
]
}
],
"main": [
{
"type": "common",
"service": "user",
"function": "getShopVip",
"params": [
{ "type": "var", "value": "context" },
{ "type": "var", "value": "activityInfo" }
],
"return": true
}
]
},
"getRankList": {
"desc": "获取排行榜",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"key",
"timeKey",
"limit"
]
}
],
"main": [
{
"type": "common",
"service": "user",
"function": "getMyRankInfo",
"params": [
{ "type": "var", "value": "context.data.key" },
{ "type": "var", "value": "context.data.timeKey" },
{ "type": "var", "value": "userInfo" }
],
"return": true
},
{
"type": "common",
"service": "user",
"function": "getRank",
"params": [
{ "type": "var", "value": "context.data.key" },
{ "type": "var", "value": "context.data.timeKey" },
{ "type": "var", "value": "context.data.limit" }
],
"return": true
}
]
}
},
"task": {
"getTaskList": {
"desc": "任务列表",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId"
]
},
{
"type": "common",
"name": "registeInfos",
"params": [
"vipInfo",
"task"
]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkActivityTime"
}
]
},
{
"type": "common",
"name": "preUpdate",
"params": [
{
"type": "common",
"behave": "update",
"name": "updateVip"
},
{
"type": "common",
"behave": "update",
"name": "updateSignGrowTask"
},
{
"type": "common",
"behave": "update",
"name": "updateGrowOrderGoods"
}
]
}
],
"main": [
{
"type": "common",
"service": "Growtask",
"function": "initTaskList",
"params": [
{ "type": "var", "value": "userInfo" },
{ "type": "var", "value": "activityInfo" },
{ "type": "var", "value": "task" }
],
"return": true
}
]
},
"doCompleteTask": {
"desc": "完成任务",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"taskType"
]
},
{
"type": "common",
"name": "registeInfos",
"params": [
"session",
"task"
]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkActivityTime"
},
{
"type": "common",
"behave": "check",
"name": "checkGrowTaskLimit"
},
{
"type": "common",
"behave": "check",
"name": "checkExchangeCreditsTask"
}
]
}
],
"main": [
{
"type": "common",
"service": "Growtask",
"function": "completeTask",
"params": [
{ "type": "var", "value": "context.data.taskType" },
{ "type": "var", "value": "activityInfo" },
{ "type": "var", "value": "userInfo" },
{ "type": "var", "value": "task" }
],
"return": true
}
]
},
"receiveTaskRewards": {
"desc": "领取任务奖励",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"taskType",
"rewardsKey"
]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkActivityTime"
},
{
"type": "common",
"behave": "check",
"name": "checkRemainTimes"
}
]
}
],
"main": [
{
"type": "common",
"service": "Growtask",
"function": "receiveTaskRewards",
"params": [
{ "type": "var", "value": "context.data.taskType" },
{ "type": "var", "value": "context.data.rewardsKey" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
},
"getCollectGoodsList": {
"desc": "获取收藏商品列表",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"itemIds"
]
},
{
"type": "common",
"name": "registeInfos",
"params": [
"session"
]
}
],
"main": [
{
"type": "common",
"service": "base",
"function": "getItemListByIds",
"params": [
{ "type": "var", "value": "context.data.itemIds" },
{ "type": "var", "value": "session" }
]
},
{
"type": "common",
"service": "Growtask",
"function": "getItemListWithCollectStatus",
"params": [
{ "type": "var", "value": "commonBaseGetItemListByIdsResult1" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
}
},
"login": {
"login":{
"desc":"登录接口, 初始化/更新用户信息",
"decorators":[
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"userNick",
"avatar",
"isFollow"
]
},
{
"type": "common",
"name": "noCheckUser","params": [
"activityId"
]
},
{
"type": "common",
"name": "registeInfos",
"params": [
"vipInfo"
]
}
],
"main": [
{
"type": "common",
"service": "user",
"function": "doLogin",
"params": [
{ "type": "var", "value": "userInfo" },
{ "type": "var", "value": "vipInfo" },
{ "type": "var", "value": "activityInfo" }
],
"return": true
},
{
"type": "common",
"service": "access",
"function": "addAccess",
"params": [
{ "type": "var", "value": "commonUserDoLoginResult1" },
{ "type": "var", "value": "vipInfo" }
],
"return": true
}
]
}
},
"base": {
"getActivityBaseInfoById":{
"desc":"活动基本信息",
"decorators":[
{
"type": "common",
"name": "checkParams",
"params": [
"activityId"
]
},
{
"type": "common",
"name": "noCheckUser","params": [
"activityId"
]
}
],
"main": [
{
"type": "common",
"service": "base",
"function": "getBaseInfo",
"params": [
{ "type": "var", "value": "context.data.activityId" }
],
"return": true
}
]
}
},
"stat": {
"addStat": {
"desc": "增加埋点记录",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"type"
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "addStat",
"params": [
{ "type": "var", "value": "context.data.type" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
},
"getStats": {
"desc": "统计数据",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"startDay",
"endDay"
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "getStats",
"params": [
{ "type": "var", "value": "context.data.activityId" },
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" }
]
},
{
"type": "common",
"service": "stat",
"function": "buildExcel",
"params": [
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" },
{ "type": "var", "value": "commonStatGetStatsResult1" }
],
"return": true
}
]
}
},
"awards": {
"getMyPrizeList": {
"desc": "我的奖品列表",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [ "activityId" ]
}
],
"main": [
{
"type": "common",
"service": "awards",
"function": "getMyPrizeList",
"params": [
{ "type": "var", "value": "activityInfo" }
],
"return": true
}
]
},
"receiveObjectPrize": {
"desc": "领取实物",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [ "activityId","id", "name", "phone", "province", "city", "area", "addressDetail", "streetName" ]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkPrizeExpired"
},
{
"type": "common",
"behave": "check",
"name": "checkValidObjectPrize"
}
]
}
],
"main": [
{
"type": "common",
"service": "awards",
"function": "recieveObjectPrize",
"params": [
{ "type": "var", "value": "context" }
],
"return": true
}
]
},
"receiveEnamePrize": {
"desc": "领取权益",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [ "activityId", "id" ]
},
{
"type": "common",
"name": "registeInfos",
"params": [ "session"]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkPrizeExpired"
},
{
"type": "common",
"behave": "check",
"name": "checkValidEnamePrize"
}
]
}
],
"main": [
{
"type": "common",
"service": "awards",
"function": "recieveEnamePrize",
"params": [
{ "type": "var", "value": "context.data.id" },
{ "type": "var", "value": "awardInfo" },
{ "type": "var", "value": "session" }
],
"return": true
}
]
},
"drawLotteryPrize": {
"desc": "概率抽奖",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [ "activityId", "prizeDataType" ]
},
{
"type": "common",
"name": "registeInfos",
"params": [ "session"]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkActivityTime"
}
]
}
],
"main": [
{
"type": "common",
"service": "awards",
"function": "drawLottery",
"params": [
{ "type": "var", "value": "context.data.activityId" },
{ "type": "var", "value": "context.data.prizeDataType" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
}
},
"share": {
"getShareInfo": {
"desc": "获取邀请信息",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [ "activityId" ]
}
],
"main": [
{
"type": "common",
"service": "user",
"function": "queryDataByKey",
"params": [
{ "value": "remainTimes.invites" },
{ "type": "var", "value": "userInfo" },
{ "value": "rewards" }
],
"return": true
}
]
},
"doHelp": {
"desc": "完成分享",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"inviteId"
]
},
{
"type": "common",
"name": "registeInfos",
"params": [
"vipInfo"
]
},
{
"type": "common",
"name": "preCheck",
"params": [
{
"type": "common",
"behave": "check",
"name": "checkActivityTime"
},
{
"type": "common",
"behave": "check",
"name": "checkInviteId"
},
{
"type": "common",
"behave": "check",
"name": "checkNewVip"
},
{
"type": "common",
"behave": "check",
"name": "checkHelpRecord"
}
]
}
],
"main": [
{
"type": "common",
"service": "task",
"function": "completeTask",
"params": [
{ "value": "invites" },
{ "type": "var", "value": "activityInfo" },
{ "type": "var", "value": "inviteUserInfo" }
]
},
{
"type": "common",
"service": "stat",
"function": "addStat",
"params": [
{ "type": "var", "value": "0" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
}
}
},
"custom": {
"test1": {
"testAddStat": {
"desc": "增加埋点记录",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"type"
]
},
{
"type": "custom",
"name": "test1",
"params": [
"tt"
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "addStat",
"params": [
{ "type": "var", "value": "context.data.type" },
{ "type": "var", "value": "userInfo" }
],
"return": true
},
{
"type": "custom",
"service": "test",
"function": "test1",
"params": [
],
"return": true
}
]
},
"testGetStats": {
"desc": "统计数据",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"startDay",
"endDay"
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "getStats",
"params": [
{ "type": "var", "value": "context.data.activityId" },
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" }
]
},
{
"type": "common",
"service": "stat",
"function": "buildExcel",
"params": [
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" },
{ "type": "var", "value": "commonStatGetStatsResult1" }
],
"return": true
}
]
}
},
"test2": {
"test2addStat": {
"desc": "增加埋点记录",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"type"
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "addStat",
"params": [
{ "type": "var", "value": "context.data.type" },
{ "type": "var", "value": "userInfo" }
],
"return": true
}
]
},
"test2getStats": {
"desc": "统计数据",
"decorators": [
{
"type": "common",
"name": "checkParams",
"params": [
"activityId",
"startDay",
"endDay"
]
},
{
"type": "common",
"name": "preUpdate",
"params": [
{
"type": "common",
"behave": "update",
"name": "updateVip"
},
{
"type": "common",
"behave": "update",
"name": "updateSignTask"
},
{
"type": "common",
"behave": "update",
"name": "updateOrderGoods"
}
]
}
],
"main": [
{
"type": "common",
"service": "stat",
"function": "getStats",
"params": [
{ "type": "var", "value": "context.data.activityId" },
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" }
]
},
{
"type": "common",
"service": "stat",
"function": "buildExcel",
"params": [
{ "type": "var", "value": "context.data.startDay" },
{ "type": "var", "value": "context.data.endDay" },
{ "type": "var", "value": "commonStatGetStatsResult1" }
],
"return": true
}
]
}
}
}
}
}
\ No newline at end of file
{
"name": "cloudfn",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"optional": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
},
"@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"optional": true
},
"@babel/highlight": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
"integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"optional": true,
"requires": {
"@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"dependencies": {
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"optional": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
}
}
},
"@eslint/eslintrc": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
"integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
"optional": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
"espree": "^7.3.0",
"globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.2.1",
"js-yaml": "^3.13.1",
"lodash": "^4.17.20",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
}
},
"@types/bson": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz",
"integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==",
"requires": {
"@types/node": "*"
}
},
"@types/eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
"optional": true
},
"@types/json-schema": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
"integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
"optional": true
},
"@types/lodash": {
"version": "4.14.167",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz",
"integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==",
"optional": true
},
"@types/mongodb": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz",
"integrity": "sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==",
"requires": {
"@types/bson": "*",
"@types/node": "*"
}
},
"@types/node": {
"version": "14.14.21",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz",
"integrity": "sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A=="
},
"@typescript-eslint/eslint-plugin": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz",
"integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==",
"optional": true,
"requires": {
"@typescript-eslint/experimental-utils": "3.10.1",
"debug": "^4.1.1",
"functional-red-black-tree": "^1.0.1",
"regexpp": "^3.0.0",
"semver": "^7.3.2",
"tsutils": "^3.17.1"
}
},
"@typescript-eslint/experimental-utils": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz",
"integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==",
"optional": true,
"requires": {
"@types/json-schema": "^7.0.3",
"@typescript-eslint/types": "3.10.1",
"@typescript-eslint/typescript-estree": "3.10.1",
"eslint-scope": "^5.0.0",
"eslint-utils": "^2.0.0"
}
},
"@typescript-eslint/parser": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz",
"integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==",
"optional": true,
"requires": {
"@types/eslint-visitor-keys": "^1.0.0",
"@typescript-eslint/experimental-utils": "3.10.1",
"@typescript-eslint/types": "3.10.1",
"@typescript-eslint/typescript-estree": "3.10.1",
"eslint-visitor-keys": "^1.1.0"
}
},
"@typescript-eslint/types": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz",
"integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==",
"optional": true
},
"@typescript-eslint/typescript-estree": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz",
"integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==",
"optional": true,
"requires": {
"@typescript-eslint/types": "3.10.1",
"@typescript-eslint/visitor-keys": "3.10.1",
"debug": "^4.1.1",
"glob": "^7.1.6",
"is-glob": "^4.0.1",
"lodash": "^4.17.15",
"semver": "^7.3.2",
"tsutils": "^3.17.1"
}
},
"@typescript-eslint/visitor-keys": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz",
"integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==",
"optional": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"optional": true
},
"acorn-jsx": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"optional": true
},
"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"
}
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"optional": true,
"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-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"optional": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"optional": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"optional": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"optional": true
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"optional": true,
"requires": {
"sprintf-js": "~1.0.2"
}
},
"astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"optional": true
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"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=="
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"optional": true
},
"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"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"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==",
"optional": 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==",
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"optional": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"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=="
}
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"optional": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"optional": true
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"optional": true
},
"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"
}
},
"create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"optional": true
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"optional": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"dayjs": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.3.tgz",
"integrity": "sha512-/2fdLN987N8Ki7Id8BUN2nhuiRyxTLumQnSQf9CNncFCyqFsSKb9TNhzRYcC8K8eJSJOKvbvkImo/MKKhNi4iw=="
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"optional": true,
"requires": {
"ms": "2.1.2"
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"optional": true
},
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"optional": true
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"optional": true,
"requires": {
"esutils": "^2.0.2"
}
},
"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==",
"optional": true
},
"enquirer": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"optional": true,
"requires": {
"ansi-colors": "^4.1.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"optional": true
},
"eslint": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
"integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
"optional": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@eslint/eslintrc": "^0.3.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
"eslint-scope": "^5.1.1",
"eslint-utils": "^2.1.0",
"eslint-visitor-keys": "^2.0.0",
"espree": "^7.3.1",
"esquery": "^1.2.0",
"esutils": "^2.0.2",
"file-entry-cache": "^6.0.0",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
"globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash": "^4.17.20",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"progress": "^2.0.0",
"regexpp": "^3.1.0",
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
"table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
"optional": true
}
}
},
"eslint-config-prettier": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
"integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
"optional": true,
"requires": {
"get-stdin": "^6.0.0"
}
},
"eslint-plugin-prettier": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz",
"integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==",
"optional": true,
"requires": {
"prettier-linter-helpers": "^1.0.0"
}
},
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"optional": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
"eslint-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"optional": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"optional": true
},
"espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"optional": true,
"requires": {
"acorn": "^7.4.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"optional": true
},
"esquery": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
"integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
"optional": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"optional": true
}
}
},
"esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"optional": true,
"requires": {
"estraverse": "^5.2.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"optional": true
}
}
},
"estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"optional": true
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"optional": true
},
"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=="
},
"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==",
"optional": true
},
"fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"optional": true
},
"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==",
"optional": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"optional": true
},
"file-entry-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
"integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"optional": true,
"requires": {
"flat-cache": "^3.0.4"
}
},
"flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"optional": true,
"requires": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
}
},
"flatted": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
"integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
"optional": true
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"optional": true
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"optional": true
},
"get-stdin": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
"integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
"optional": true
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"optional": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"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==",
"optional": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"globals": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
"optional": true,
"requires": {
"type-fest": "^0.8.1"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"optional": true
},
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"optional": true
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"optional": true,
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
}
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"optional": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"optional": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"optional": true
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"optional": 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==",
"optional": 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==",
"optional": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"optional": true
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"optional": true
},
"js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"optional": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
"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==",
"optional": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"optional": true
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"optional": true,
"requires": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
}
},
"lodash": {
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"optional": true,
"requires": {
"yallist": "^4.0.0"
}
},
"make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"optional": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"mpath": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
"integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"optional": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"optional": true
},
"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"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"optional": true,
"requires": {
"wrappy": "1"
}
},
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"optional": true,
"requires": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
}
},
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"optional": true,
"requires": {
"callsites": "^3.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"optional": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"optional": true
},
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"optional": true
},
"prettier": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
"integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
"optional": true
},
"prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"optional": true,
"requires": {
"fast-diff": "^1.1.2"
}
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"optional": true
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"optional": true
},
"regexpp": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
"optional": true
},
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"optional": true
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"optional": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"optional": true,
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "7.3.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
"integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"optional": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"optional": true,
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"optional": true
},
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"optional": true,
"requires": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
"is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"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==",
"optional": 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==",
"optional": true
}
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"optional": true
},
"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"
}
},
"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==",
"optional": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"optional": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"optional": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"optional": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"table": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"optional": true,
"requires": {
"ajv": "^7.0.2",
"lodash": "^4.17.20",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
},
"dependencies": {
"ajv": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
"optional": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"optional": true
}
}
},
"taobao-mini-sdk": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/taobao-mini-sdk/-/taobao-mini-sdk-0.2.4.tgz",
"integrity": "sha512-hl0grgq5Jtw6DB0zl5fVDAO+5dZmtd0ogRed02d5CT2615A8VbKu0yR/EtrEoguzB6Or8Tjd84+H025Y5j7Alg==",
"requires": {
"@types/mongodb": "^3.5.26"
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"optional": true
},
"ts-node": {
"version": "9.1.1",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
"integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
"optional": true,
"requires": {
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"source-map-support": "^0.5.17",
"yn": "3.1.1"
}
},
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"optional": true
},
"tsutils": {
"version": "3.19.1",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz",
"integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==",
"optional": true,
"requires": {
"tslib": "^1.8.1"
}
},
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"optional": true,
"requires": {
"prelude-ls": "^1.2.1"
}
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"optional": true
},
"typescript": {
"version": "3.9.7",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
"integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
"optional": true
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"optional": true,
"requires": {
"punycode": "^2.1.0"
}
},
"v8-compile-cache": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
"integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"optional": true
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"optional": true,
"requires": {
"isexe": "^2.0.0"
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"optional": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"optional": true
},
"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"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"optional": true
},
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"optional": true
}
}
}
/** @format */
import { services, checkParams, registeInfos, preCheck, preUpdate } from '../../decorator/common'
import { checkActivityTime, checkTaskLimit, checkExchangeCreditsTask, checkRemainTimes } from '../../utils/common/check'
import { updateVip, updateSignTask, updateOrderGoods } from '../../utils/common/update'
import {
checkActivityTime,
checkGrowTaskLimit,
checkExchangeCreditsTask,
checkRemainTimes
} from '../../utils/common/check'
import { updateVip, updateSignGrowTask, updateGrowOrderGoods } from '../../utils/common/update'
import customUtil from '../../utils/custom'
import { resultsModel } from '../../sdk'
import { CommonTaskService, CommonBaseService } from '../../service/common'
import { CommonGrowtaskService, CommonBaseService } from '../../service/common'
export default class TaskController {
/**
* 任务列表
*/
@checkParams(['activityId'])
@registeInfos(['vipInfo'])
@services([CommonTaskService])
@registeInfos(['vipInfo', 'task'])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime])
@preUpdate([updateVip, updateSignTask, updateOrderGoods])
@preUpdate([updateVip, updateSignGrowTask, updateGrowOrderGoods])
async getTaskList(
context: IContext<IParams>,
{ activityInfo, userInfo, vipInfo }: IControllerInfos,
[commonTaskService]: [CommonTaskService]
{ activityInfo, userInfo, vipInfo, task }: IControllerInfos,
[commonGrowtaskService]: [CommonGrowtaskService]
) {
const commonTaskInitTaskListResult1 = await commonTaskService.initTaskList(userInfo, activityInfo)
const commonGrowtaskInitTaskListResult1 = await commonGrowtaskService.initTaskList(userInfo, activityInfo, task)
return resultsModel.success({
...commonTaskInitTaskListResult1
...commonGrowtaskInitTaskListResult1
})
}
/**
* 完成任务
*/
@checkParams(['activityId', 'taskType'])
@registeInfos(['session'])
@services([CommonTaskService])
@preCheck([checkActivityTime, checkTaskLimit, checkExchangeCreditsTask])
@registeInfos(['session', 'task'])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime, checkGrowTaskLimit, checkExchangeCreditsTask])
async doCompleteTask(
context: IContext<IParams>,
{ activityInfo, userInfo, session }: IControllerInfos,
[commonTaskService]: [CommonTaskService]
{ activityInfo, userInfo, session, task }: IControllerInfos,
[commonGrowtaskService]: [CommonGrowtaskService]
) {
const commonTaskCompleteTaskResult1 = await commonTaskService.completeTask(
const commonGrowtaskCompleteTaskResult1 = await commonGrowtaskService.completeTask(
context.data.taskType,
activityInfo,
userInfo
userInfo,
task
)
return resultsModel.success({
...commonTaskCompleteTaskResult1
...commonGrowtaskCompleteTaskResult1
})
}
/**
* 领取任务奖励
*/
@checkParams(['activityId', 'taskType', 'rewardsKey'])
@services([CommonTaskService])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime, checkRemainTimes])
async receiveTaskRewards(
context: IContext<IParams>,
{ activityInfo, userInfo }: IControllerInfos,
[commonTaskService]: [CommonTaskService]
[commonGrowtaskService]: [CommonGrowtaskService]
) {
const commonTaskReceiveTaskRewardsResult1 = await commonTaskService.receiveTaskRewards(
const commonGrowtaskReceiveTaskRewardsResult1 = await commonGrowtaskService.receiveTaskRewards(
context.data.taskType,
context.data.rewardsKey,
userInfo
)
return resultsModel.success({
...commonTaskReceiveTaskRewardsResult1
...commonGrowtaskReceiveTaskRewardsResult1
})
}
/**
......@@ -71,19 +77,19 @@ export default class TaskController {
*/
@checkParams(['activityId', 'itemIds'])
@registeInfos(['session'])
@services([CommonBaseService, CommonTaskService])
@services([CommonBaseService, CommonGrowtaskService])
async getCollectGoodsList(
context: IContext<IParams>,
{ activityInfo, userInfo, session }: IControllerInfos,
[commonBaseService, commonTaskService]: [CommonBaseService, CommonTaskService]
[commonBaseService, commonGrowtaskService]: [CommonBaseService, CommonGrowtaskService]
) {
const commonBaseGetItemListByIdsResult1 = await commonBaseService.getItemListByIds(context.data.itemIds, session)
const commonTaskGetItemListWithCollectStatusResult2 = await commonTaskService.getItemListWithCollectStatus(
const commonGrowtaskGetItemListWithCollectStatusResult2 = await commonGrowtaskService.getItemListWithCollectStatus(
commonBaseGetItemListByIdsResult1,
userInfo
)
return resultsModel.success({
...commonTaskGetItemListWithCollectStatusResult2
...commonGrowtaskGetItemListWithCollectStatusResult2
})
}
}
/** @format */
import { services, preCheck, registeInfos, preUpdate, checkParams } from '../decorator/common'
import { resultsModel } from '../sdk'
import { CommonStatService, CommonGrowtaskService } from '../service/common'
import { STAT_TYPE } from '../constants'
import { checkActivityTime, checkInviteId, checkHelpRecord, checkNewVip } from '../utils/common/check'
import { updateHelpRecord, updateVip } from '../utils/common/update'
import { getTask } from '../utils'
export default class Share {
/**
* 完成分享
*/
@checkParams(['activityId', 'inviteId'])
@registeInfos(['vipInfo'])
@services([CommonGrowtaskService, CommonStatService])
@preCheck([checkActivityTime, checkInviteId, checkNewVip, checkHelpRecord])
@preUpdate([updateVip, updateHelpRecord])
async doHelp(
context: IContext<IParams>,
{ userInfo, activityInfo }: IControllerInfos,
[growTaskService, statService]: [CommonGrowtaskService, CommonStatService],
{ inviteUserInfo }: IPreCheckData
) {
// 如果邀请任务是每日的,则需要请求每日任务信息
const task = await growTaskService.getTask(context, inviteUserInfo.openId)
const result = await growTaskService.completeTask('invites', activityInfo, inviteUserInfo, task)
statService.addStat(STAT_TYPE.INITE_SUCCESS, userInfo)
return resultsModel.success(result)
}
}
/** @format */
import { checkParams, services, registeInfos, preCheck } from '../decorator/common'
import { resultsModel } from '../sdk'
import { CommonGrowtaskService, CommonBaseService } from '../service/common'
import { ITaskInfo } from '../service/common/task.service'
import {
checkActivityTime,
checkGrowTaskLimit,
checkExchangeCreditsTask,
checkRemainTimes,
checkInviteId
} from '../utils/common/check'
import { preUpdate } from '../decorator/common'
import { updateVip, updateSignGrowTask, updateGrowOrderGoods } from '../utils/common/update'
export default class Task {
/**
* 任务列表
*/
@checkParams(['activityId'])
@registeInfos(['vipInfo', 'task'])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime])
@preUpdate([updateVip, updateSignGrowTask, updateGrowOrderGoods])
async getTaskList(
context: IContext<IParams>,
{ userInfo, activityInfo, task }: IControllerInfos,
[growTaskService]: [CommonGrowtaskService]
): Promise<IResult<{ list: ITaskInfo[] }>> {
// 读取B端 tasks字段配置自动生成任务列表
const result = await growTaskService.initTaskList(userInfo, activityInfo, task)
return resultsModel.success({
...result
})
}
/**
* 完成任务
*
* 商品相关任务 需要传itemId参数
* 积分兑换任务 需要传credits参数
*/
@checkParams(['activityId', 'taskType', 'itemId?', 'credits?'])
@registeInfos(['session', 'task'])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime, checkGrowTaskLimit, checkExchangeCreditsTask])
async doCompleteTask(
context: IContext<IParams>,
{ userInfo, activityInfo, task }: IControllerInfos,
[growTaskService]: [CommonGrowtaskService]
) {
const { taskType } = context.data
// 更新user表
const result = await growTaskService.completeTask(taskType, activityInfo, userInfo, task)
return resultsModel.success(result)
}
/**
* 领取任务奖励
* 领取的奖励增加的key值 如: gameTimes 前端传入
*/
@checkParams(['activityId', 'taskType', 'rewardsKey'])
@services([CommonGrowtaskService])
@preCheck([checkActivityTime, checkRemainTimes])
async receiveTaskRewards(
context: IContext<IParams>,
{ userInfo }: IControllerInfos,
[growTaskService]: [CommonGrowtaskService]
): Promise<IResult<{ rewards: number }>> {
const { rewardsKey } = context.data
const { taskType } = context.data
const rewardsResult = await growTaskService.receiveTaskRewards(taskType, rewardsKey, userInfo)
return resultsModel.success(rewardsResult)
}
/**
* 获取收藏商品列表
*/
@checkParams(['activityId', 'itemIds'])
@registeInfos(['session'])
@services([CommonBaseService, CommonGrowtaskService])
async getCollectGoodsList(
context: IContext<IParams>,
{ session, userInfo }: IControllerInfos,
[commonBaseService, growTaskService]: [CommonBaseService, CommonGrowtaskService]
) {
const { itemIds } = context.data
const list = await commonBaseService.getItemListByIds(itemIds, session)
const listWithCollectStatus = await growTaskService.getItemListWithCollectStatus(list, userInfo)
return resultsModel.success(listWithCollectStatus)
}
}
......@@ -10,6 +10,8 @@ export const JOIN_DB_NAME = 'c_user_join'
export const SIGN_DB_NAME = 'c_user_sign'
export const TASK_DB_NAME = 'c_user_tasks'
export const STAT_DB_NAME = 'c_stats'
export const ERROR_LOG_DB_NAME = 'error_log'
......@@ -19,3 +21,5 @@ export const SELLER_INFO_DB_NAME = 'a_seller_info'
export const PRIZE_CONFIG_DB_NAME = 'b_prize_config'
export const ACTIVITY_CONFIG_DB_NAME = 'b_activity_config'
export const OEDER_DB_NAME = 'c_user_order'
/** @format */
import { CommonUserService, CommonBaseService } from '../../service/common'
import { getSellerSession, getUserOrderlist } from '../../utils'
import { getSellerSession, getUserOrderlist, getTask } from '../../utils'
import { formatVipCbUrl, getShopVip } from '../../utils/common/vip'
import { CODE_TYPES } from '../../errorCode'
import { resultsModel, TBAPIS } from '../../sdk'
export type IInfo = 'session' | 'vipInfo' | 'taobaoOrderList' | 'credits'
export type IInfo = 'session' | 'vipInfo' | 'taobaoOrderList' | 'credits' | 'task'
async function initBaseInfo(context: IContext<IParams>, baseInfos: ICheckControllerInfos, needInfos: IInfo[]) {
const handler = context?.cloud?.dataspace?.context?.handler
......@@ -54,6 +54,12 @@ async function initBaseInfo(context: IContext<IParams>, baseInfos: ICheckControl
baseInfos.credits = credits
}
if (needInfos.includes('task') && !baseInfos.credits) {
const task = await getTask(context)
if (!task._id) return CODE_TYPES.ERROR_UPDATE_RETRY
baseInfos.task = task
}
return baseInfos
}
......
/**
* 任务相关方法
*
* @format
*/
import UserService from './user.service'
import { BaseDao } from '../../sdk'
import { getToday, getUserOrderlist, generateVipUrl, formatVipCbUrl, setNewFollowUserData } from '../../utils'
import { TASK_RATE_TYPE, TASK_STATUS } from '../../constants'
import { TASK_DB_NAME } from '../../db'
import {
getTotalCompleteTask,
setGrowTaskStatus,
updateTaskInfo,
getTodayCompleteGrowTask,
getOrderCount
} from '../../utils/common/task'
import { CODE_TYPES } from '../../errorCode'
export interface ITaskInfo {
taskType?: string // 任务类型
url?: string // 链接地址
rewards: number // 任务奖励
itemIds?: string // 商品配置ids 商品相关任务返回
todayCompleteTimes?: number // 今日完成次数
completeTimes?: number // 总共完成次数
taskRateType: number // 任务频率
times?: number // 任务每日限制次数
waitReceive?: number // 待领取次数
title: string // 任务文案
status: number // 任务状态 1未完成 2 待领取 3 已完成
}
export default class TaskService extends UserService {
taskInfodao: IBaseDao
constructor(context: IContext<IParams>) {
super(context)
this.taskInfodao = new BaseDao(context, TASK_DB_NAME)
}
// 根据活动tasks字段渲染任务
async initTaskList(userInfo: IUserInfo, activityInfo: IActivityInfo, task: ITask) {
let list = []
const keyList = Object.keys(activityInfo?.tasks || {})
for (let index = 0; index < keyList.length; index++) {
// @ts-ignore
const taskType: ITaskType = keyList[index]
list.push(await this.initTask(task, taskType, activityInfo?.tasks?.[taskType]?.title, userInfo, activityInfo))
}
return {
list
}
}
/**
* 根据任务类型初始化 b端 tasks字段必须有相应的配置
*
* @param {ITaskType} taskType 任务类型
* @param {string} title 任务标题
* @param {IActivityInfo} activityInfo 任务配置
* @param {IUserInfo} userInfo 用户信息
* @return {ITaskInfo} {ITaskInfo} 任务信息
* @memberof TaskService
*/
async initTask(
task: ITask,
taskType: ITaskType,
title: string,
userInfo: IUserInfo,
activityInfo: IActivityInfo
): Promise<ITaskInfo> {
if (!activityInfo?.tasks?.[taskType]) {
console.error(`活动缺少${taskType}任务配置项`)
}
const { value, itemIds = '', taskRateType, times = 1, link = '' } = activityInfo?.tasks?.[taskType] || {}
const { remainTimes } = userInfo
let { todayCompleteTimes } = getTodayCompleteGrowTask(taskType, task)
let { completeTimes } = getTotalCompleteTask(taskType, userInfo)
if (taskType === 'orderGoods') {
//如果是下单任务,需要单独去根据订单类型去订单表获取下单列表
todayCompleteTimes = completeTimes = await getOrderCount(
this.context,
userInfo.openId,
activityInfo._id,
taskRateType
)
}
return {
taskType,
title,
itemIds,
rewards: value,
taskRateType,
times,
url: taskType === 'member' ? generateVipUrl(formatVipCbUrl(this.context)) : link,
todayCompleteTimes,
completeTimes,
status: setGrowTaskStatus(userInfo, taskType, taskRateType, times, todayCompleteTimes, completeTimes),
waitReceive: remainTimes?.[taskType]
}
}
/**
*
* 领取任务奖励
*
* @param {ITaskType} taskType
* @param {string} awardsTargetKey
* @param {IUserInfo} userInfo
* @return {number} rewards
* @memberof TaskService
*/
async receiveTaskRewards(
taskType: ITaskType,
awardsTargetKey: string,
userInfo: IUserInfo
): Promise<{
rewards: number
}> {
const waitReceiveTimes = userInfo?.remainTimes?.[taskType]
await this.updateUser(userInfo._id, {
$set: {
[`remainTimes.${taskType}`]: 0
},
$inc: {
[awardsTargetKey]: waitReceiveTimes
}
})
return {
rewards: waitReceiveTimes
}
}
/**
*根据任务类型更新任务待领取次数和任务记录
*
* @param {string} taskType
* @param {number} activityInfo
* @param {IActivityInfo} userInfo
* @returns {boolean}
* @memberof TaskService
*/
async completeTask(
taskType: ITaskType,
activityInfo: IActivityInfo,
userInfo: IUserInfo,
task: ITask = {},
customRecord: Object = {}
) {
const today = getToday()
const rewards = activityInfo?.tasks?.[taskType]?.value || 0
const { tasks } = activityInfo
const {
[taskType]: { taskRateType }
} = tasks
const {
openId,
data: { itemId }
} = this.context
const record = {
itemId,
openId: taskType === 'invites' ? openId : undefined,
createTime: Date.now(),
...customRecord
}
if (taskRateType === TASK_RATE_TYPE.EVERYDAY) {
//如果是每日任务,则更新每日任务表
const result = await updateTaskInfo(this.context, task._id, taskType, record)
if (result === 1) {
const updateResult = await this.updateUser(userInfo._id, {
$inc: {
[`remainTimes.${taskType}`]: +rewards
}
})
return updateResult === 1 ? { ok: 1 } : CODE_TYPES.ERROR_DO_TASK
}
return CODE_TYPES.ERROR_DO_TASK
} else {
//永久任务就更新永久任务表
let updateQuery: IUpdateQuery = {
$inc: {
[`remainTimes.${taskType}`]: +rewards
},
$push: {
[`taskInfo.${today}.${taskType}`]: { ...record, createTime: Date.now() }
}
}
if (taskType === 'follow') {
updateQuery.$set = {
follow: setNewFollowUserData(userInfo.follow)
}
}
const result = await this.updateUser(userInfo._id, updateQuery)
return result === 1 ? { ok: 1 } : CODE_TYPES.ERROR_DO_TASK
}
}
async getItemListWithCollectStatus(list: { list: ITaoBaoItems[] }, userInfo: IUserInfo) {
const { taskInfo } = getTotalCompleteTask('collectGoods', userInfo)
return {
list: list.list.map(v => {
return {
...v,
// 完成列表是否含有itemId
collected: taskInfo.some(completeItem => completeItem.itemId === v.itemId)
}
})
}
}
/**
* 获取用户任务参与信息
* @param context
* @param openId
* @param activityId
*/
async getTask(context: IContext<IParams>, openId: string = '', activityId?: string): Promise<ITask> {
activityId = activityId ? activityId : context.data.activityId
openId = openId ? openId : context.openId
const createDay = getToday()
//查询每日任务完成记录
const result: ITask = await this.taskInfodao.findOne({
openId,
activityId,
createDay
})
//如果还没有今天的任务数据,则新增一条用户任务数据
if (!result) {
const insertObj = {
openId,
activityId,
taskInfo: {},
createTime: Date.now(),
createDay: createDay
}
const insertResult = await this.taskInfodao.insertOne(insertObj)
return { ...insertObj, _id: insertResult }
}
return result
}
}
......@@ -8,6 +8,7 @@ import CommonTaskService from './task.service'
import CommonStatService from './stat.service'
import CommonGameService from './game.service'
import CommonSignService from './sign.service'
import CommonGrowtaskService from './growTask.service'
const common = {
CommonAccessService,
......@@ -17,7 +18,8 @@ const common = {
CommonTaskService,
CommonStatService,
CommonGameService,
CommonSignService
CommonSignService,
CommonGrowtaskService
}
export default common
......@@ -30,5 +32,6 @@ export {
CommonTaskService,
CommonStatService,
CommonGameService,
CommonSignService
CommonSignService,
CommonGrowtaskService
}
......@@ -10,6 +10,7 @@ import { ACTIVITY_STATUS } from '../../constants'
import UserService from './user.service'
import { getToday } from '../../utils'
import { CODE_TYPES } from '../../errorCode'
import { getDistanceDays } from '../../utils/common/sign'
import { formatDate } from '../../utils/common/date'
export default class SignService extends UserService {
......@@ -30,9 +31,7 @@ export default class SignService extends UserService {
userNick,
isSignLater: !!subscribeSignDay,
createDay: today,
signTime: subscribeSignDay
? formatDate(subscribeSignDay).format('YYYY-MM-DD')
: formatDate().format('YYYY-MM-DD'),
signTime: subscribeSignDay ? formatDate(subscribeSignDay).getDate() : formatDate().getDate(),
signDay: subscribeSignDay || today,
createTime: Date.now()
})
......@@ -48,7 +47,14 @@ export default class SignService extends UserService {
const { openId } = this.context
const signInfoList: ISignInfoAggregate[] = await this.signdao.aggregate(
{ $match: { activityId, openId } },
{ $project: { d: { $dayOfYear: '$signTime' }, y: { $year: '$signTime' }, signTime: '$signTime' } }
{
$project: {
d: { $dayOfYear: '$signTime' },
y: { $year: '$signTime' },
signTime: '$signTime',
signDay: '$signDay'
}
}
)
return signInfoList
......
......@@ -37,7 +37,7 @@ export default class TaskService extends UserService {
}
}
/**
* 根据任务类型初始化 b端 tasks字段必须有相应的配置
* 根据任务类型初始化 b端 tasks字段必须有相应的配置TODO
*
* @param {ITaskType} taskType 任务类型
* @param {string} title 任务标题
......
......@@ -29,6 +29,7 @@ interface IControllerInfos {
activityInfo: IActivityInfo
session?: string
credits?: number
task?: ITask
taobaoOrderList?: ITaoBaoOrders[]
}
......@@ -51,6 +52,15 @@ interface IVipInfo {
url?: string
}
interface ITask {
_id?: string
openId?: string
activityId?: string
taskInfo?: any
createDay?: string
createTime?: number
}
type IFunction = (...args: any[]) => any
type ValueOf<T> = T extends any[] ? T[number] : T[keyof T]
......@@ -6,7 +6,7 @@ interface IUserSign {
userNick: string
createTime: number
createDay: string
signTime: string
signTime?: any
signDay: string
isSignLater?: boolean // 是否补签
}
......@@ -15,5 +15,11 @@ interface ISignInfoAggregate {
_id?: string
d: number
y: number
signDay: string
signTime: Date
}
interface signDayList {
isSing: boolean
signDay: string
}
/** @format */
import { resultsModel } from '../../../sdk'
import { CODE_TYPES } from '../../../errorCode'
import { getTotalCompleteTask, getTodayCompleteGrowTask } from '../task'
import { TASK_RATE_TYPE } from '../../../constants'
export default async function checkTaskLimit(
context: IContext<{ activityId: string; taskType: ITaskType; itemId?: string }>,
{ userInfo, activityInfo, task }: IControllerInfos
) {
const { taskType, itemId } = context.data
const { itemIds } = activityInfo?.tasks?.[taskType] || {}
if (!taskType) {
console.error('使用checkTaskLimit, 云函数必须传入taskType参数')
return
}
if (!activityInfo?.tasks?.[taskType]) {
return resultsModel.error(CODE_TYPES.SYSTEM_ERROR, `该活动缺少${taskType}配置项`)
}
if (itemId && !itemIds) {
return resultsModel.error(CODE_TYPES.SYSTEM_ERROR, `该任务缺少商品配置项`)
}
// B端配置商品ids不匹配正确
if (itemId && itemIds) {
const itemIdArray: number[] = Array.isArray(itemIds) ? itemIds : itemIds.split(',').map(v => +v)
if (!itemIdArray.includes(+itemId)) return resultsModel.error(CODE_TYPES.PARAMS_ERROR, '商品id不匹配')
}
const { taskRateType, times = 1 } = activityInfo?.tasks?.[taskType]
// 永久任务已经完成
const { completeTimes } = getTotalCompleteTask(taskType, userInfo)
const hasComplete = completeTimes >= times && taskRateType === TASK_RATE_TYPE.FOREVER
if (hasComplete) return resultsModel.error(CODE_TYPES.ERROR_TASK_LIMIT, `该任务已完成,去看看其它任务吧~`)
// 每日任务今天已经完成
const { todayCompleteTimes, todayTaskInfo } = getTodayCompleteGrowTask(taskType, task)
const hasCompleteToday = times && todayCompleteTimes === times && taskRateType === TASK_RATE_TYPE.EVERYDAY
if (hasCompleteToday) {
return resultsModel.error(CODE_TYPES.ERROR_TASK_LIMIT, `该任务今天已完成,明天再来吧~`)
}
// 今日任务该商品已经完成
const itemHasCompleteToday =
todayTaskInfo.find(v => v.itemId && v.itemId === itemId) && taskRateType === TASK_RATE_TYPE.EVERYDAY
if (itemHasCompleteToday) {
return resultsModel.error(CODE_TYPES.PARAMS_ERROR, '今日该商品任务已完成')
}
}
......@@ -13,6 +13,7 @@ import checkUserInfo, { checkGameTimes } from './checkUserInfo'
import checkJoinId from './checkJoinId'
import checkOpenPrizeStatus from './checkOpenPrizeStatus'
import checkSign from './checkSign'
import checkGrowTaskLimit from './checkGrowTaskLimit'
const check = {
checkActivityTime,
......@@ -31,7 +32,8 @@ const check = {
checkJoinId,
checkGameTimes,
checkOpenPrizeStatus,
checkSign
checkSign,
checkGrowTaskLimit
}
export default check
......@@ -53,5 +55,6 @@ export {
checkJoinId,
checkGameTimes,
checkOpenPrizeStatus,
checkSign
checkSign,
checkGrowTaskLimit
}
......@@ -42,6 +42,7 @@ export function formatDate(date: string | number = Date.now()) {
getHour: () => dayjs(beijingDate).get('hour'),
getMinute: () => dayjs(beijingDate).get('minute'),
geSecond: () => dayjs(beijingDate).get('second'),
getMillisecond: () => dayjs(beijingDate).get('millisecond')
getMillisecond: () => dayjs(beijingDate).get('millisecond'),
getDate: () => dayjs(beijingDate).date()
}
}
......@@ -3,8 +3,10 @@
import * as dayjs from 'dayjs'
import { uniq } from 'lodash'
import { getToday } from './getToday'
import { formatDate } from './date'
const isLeapYear = (year: number) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0
const oneDayTime = 24 * 3600 * 1000
// 获取最大连续签到天数
export const getMaxContinusSignDays = (signInfoList: ISignInfoAggregate[]): number => {
......@@ -37,3 +39,48 @@ export const getMaxContinusSignDays = (signInfoList: ISignInfoAggregate[]): numb
export const getSignedByDay = (signInfoList: ISignInfoAggregate[], day = getToday()): boolean => {
return signInfoList.some(v => dayjs(v.signTime).format('yyyy/MM/dd') === day)
}
// 获取当前几天签到信息(包含今天)
export const getDistanceDays = (days: number, signInfoList: ISignInfoAggregate[]): signDayList[] => {
let signDayList = []
for (let index = 0; index < days; index++) {
let signDay = formatDate(dayjs().subtract(index, 'day').valueOf()).format()
const signInfo = signInfoList.find(v => v.signDay === signDay)
signDayList.push({
signDay,
isSign: signInfo ? true : false
})
}
return signDayList
}
// 获取几天前至今连续签到天数(包含今天),如果昨天签到今天未签到,则也算连续签到,不算断签
export const getContinueDays = (days: number, signInfoList: ISignInfoAggregate[]): number => {
const minYear = Math.min.apply(
null,
signInfoList.map(v => +v.y)
)
const list: number[] = signInfoList
.map(v => {
const gap = (isLeapYear ? 366 : 365) * (v.y - minYear)
return gap + v.d
})
.sort((a, b) => a - b)
if (list.length === 0) return 0
let m = uniq(list.sort((a, b) => a - b))
let max = 0
//判断当天或者昨天是否已经签到
const isSign = signInfoList.some(
v => v.signDay === getToday() || v.signDay === formatDate(dayjs().subtract(-1, 'day').valueOf()).format()
)
for (let i = 0; i < days; i++) {
if (isSign && m[i + 1] - m[i] === 1) {
//当天或者昨天已经签到,则开始计算连续签到天数
max++
} else {
break
}
}
return max
}
......@@ -2,6 +2,9 @@
import { getToday } from './getToday'
import { TASK_STATUS, TASK_RATE_TYPE } from '../../constants'
import { TASK_DB_NAME, OEDER_DB_NAME } from '../../db'
import { BaseDao } from '../../sdk'
import Task from '../../controller/task.controller'
/**
* 根据任务类型获取任务完成情况
......@@ -97,3 +100,139 @@ export function setTaskStatus(
break
}
}
/**
* 获取用户任务参与信息
* @param context
* @param openId
* @param activityId
*/
export const getTask = async (context: IContext<IParams>, openId: string = '', activityId?: string): Promise<ITask> => {
activityId = activityId ? activityId : context.data.activityId
openId = openId ? openId : context.openId
const taskInfodao: IBaseDao = new BaseDao(context, TASK_DB_NAME)
const createDay = getToday()
//查询每日任务完成记录
const result: ITask = await taskInfodao.findOne({
openId,
activityId,
createDay
})
//如果还没有今天的任务数据,则新增一条用户任务数据
if (!result) {
const insertObj = {
openId,
activityId,
taskInfo: {},
createTime: Date.now(),
createDay: createDay
}
const insertResult = await taskInfodao.insertOne(insertObj)
return { ...insertObj, _id: insertResult }
}
return result
}
/**
* 获取养成类每日任务信息
* @param taskType
* @param task
*/
export function getTodayCompleteGrowTask(
taskType: string,
task: ITask
): {
todayCompleteTimes: number
todayTaskInfo: ITaskDetail[]
} {
const today = getToday()
return {
todayCompleteTimes: task?.taskInfo?.[today]?.[taskType]?.length || 0,
todayTaskInfo: task?.taskInfo?.[today]?.[taskType] || []
}
}
/**
* 更新每日任务,适用于购买商品每日任务
* @param context
* @param activityId
*/
export async function updateTaskInfo(context: IContext<IParams>, _id: string, taskType: string, value) {
let taskInfodao: IBaseDao = new BaseDao(context, TASK_DB_NAME)
const today = getToday()
return await taskInfodao.update(
{
_id
},
{
$push: {
[`taskInfo.${today}.${taskType}`]: value
}
}
)
}
/**
* 更新每日任务,适用于购买商品每日任务
* @param context
* @param activityId
*/
export async function getOrderCount(
context: IContext<IParams>,
openId: string,
activityId: string,
taskRateType: number
) {
let orderdao: IBaseDao = new BaseDao(context, OEDER_DB_NAME)
const project =
taskRateType === TASK_RATE_TYPE.EVERYDAY
? {
openId,
activityId,
createDay: getToday()
}
: {
openId,
activityId
}
return await orderdao.count(project)
}
/**
*
* 根据用户和任务完成情况,设置任务状态
*
* @param {IUserInfo} useInfo
* @param {string} taskType
* @param {number} taskRateType
* @param {number} [limitTimesEverday] 每天限制次数 任务频率为每天的时候必填
* @return {taskTatus} 1未完成 2 待领取 3 已完成
* @memberof TaskService
*/
export function setGrowTaskStatus(
userInfo: IUserInfo,
taskType: string,
taskRateType: number,
limitTimesEveryday: number = 1,
todayCompleteTimes: number,
completeTimes: number
): number {
const waitReceive = userInfo?.remainTimes?.[taskType] || 0
if (waitReceive) return TASK_STATUS.WAIT_RECEIVE
switch (taskRateType) {
case TASK_RATE_TYPE.FOREVER:
return completeTimes >= limitTimesEveryday ? TASK_STATUS.DONE : TASK_STATUS.WAIT_DO
break
case TASK_RATE_TYPE.EVERYDAY:
return todayCompleteTimes >= limitTimesEveryday ? TASK_STATUS.DONE : TASK_STATUS.WAIT_DO
break
case TASK_RATE_TYPE.NOLIMIT:
return TASK_STATUS.WAIT_DO
break
}
}
......@@ -4,6 +4,8 @@ import updateSignTask from './updateSignTask'
import updateOrderGoods from './updateOrderGoods'
import updateFirstLoginToday from './updateFirstLoginToday'
import updateUserInfo, { reduceGameTimes, updateHelpRecord } from './updateUserInfo'
import updateSignGrowTask from './updateSignGrowTask'
import updateGrowOrderGoods from './updateGrowOrderGoods'
const update = {
updateVip,
......@@ -12,7 +14,9 @@ const update = {
updateFirstLoginToday,
updateUserInfo,
reduceGameTimes,
updateHelpRecord
updateHelpRecord,
updateSignGrowTask,
updateGrowOrderGoods
}
export default update
......@@ -24,5 +28,7 @@ export {
updateFirstLoginToday,
updateUserInfo,
reduceGameTimes,
updateHelpRecord
updateHelpRecord,
updateSignGrowTask,
updateGrowOrderGoods
}
/** @format */
import { getToday } from '../getToday'
import { TASK_RATE_TYPE } from '../../../constants'
import { getUserOrderlist } from '../getUserOrderlist'
import { OEDER_DB_NAME } from '../../../db'
import { resultsModel } from '../../../sdk'
import { BaseDao } from '../../../sdk'
import { CODE_TYPES } from '../../../errorCode'
import { formatDate } from '../date'
export default async function updateGrowOrderGoods(
context: IContext<IParams>,
{ userInfo, activityInfo }: IControllerInfos
): Promise<IPreUpdateQuery> {
const taskType = 'orderGoods'
const { value, itemIds, taskRateType, times } = activityInfo?.tasks?.[taskType] || {}
let orderdao: IBaseDao = new BaseDao(context, OEDER_DB_NAME)
const orderList =
taskRateType === TASK_RATE_TYPE.EVERYDAY
? await orderdao.find({
openId: userInfo.openId,
activityId: userInfo.activityId,
createDay: getToday
})
: await orderdao.find({
openId: userInfo.openId,
activityId: userInfo.activityId
})
const completeTimes = orderList?.length || 0
if (!activityInfo?.tasks?.[taskType]) return {}
// 每日任务或者是永久任务的任务且已完成
if (taskRateType !== TASK_RATE_TYPE.NOLIMIT && completeTimes >= times) {
return {}
}
const today = getToday()
//设置查询淘宝订单时间
let startTime = Date.now()
if (taskRateType === TASK_RATE_TYPE.EVERYDAY) {
let TodayTime = formatDate(today).getTimestamp()
startTime = TodayTime > userInfo.createTime ? TodayTime : userInfo.createTime
} else {
startTime = userInfo.createTime || activityInfo?.startTime || Date.now()
}
const orderResult = await getUserOrderlist(
context,
//@ts-ignore
startTime,
Date.now()
)
const itemIdsArr = itemIds.split(',').map(v => +v)
let projection = {
$inc: {
[`remainTimes.${taskType}`]: 0
},
$set: {}
}
//筛选符合任务的订单并添加到下单表
let targetOrders = []
orderResult.forEach(v => {
if (
// 商品订单包含目标商品 且orderId为新订单
itemIdsArr.includes(v.itemId) &&
// @ts-ignore
!orderList.some(order => order.orderId === v.orderId) &&
!targetOrders.some(order => order.orderId === v.orderId)
) {
if (targetOrders.length + completeTimes >= times) {
return
}
targetOrders.push({
openId: userInfo.openId,
activityId: activityInfo._id,
itemId: v.itemId,
orderId: v.orderId,
tId: v.tId,
createTime: Date.now(),
createDay: today
})
}
})
if (targetOrders?.length) {
const result = await orderdao.insertMany(targetOrders)
if (!result || result.length === 0) {
// @ts-ignore
return resultsModel.error(CODE_TYPES.SYSTEM_ERROR, '订单任务更新失败')
}
projection.$inc[`remainTimes.${taskType}`] = result.length * value
}
return projection
}
/** @format */
import { getToday } from '../getToday'
import { getTodayCompleteGrowTask, updateTaskInfo } from '../task'
export default async function updateSignTask(
context: IContext<IParams>,
{ activityInfo, task }: IControllerInfos
): Promise<IPreUpdateQuery | undefined> {
if (!activityInfo?.tasks?.sign) return
// 获取签到奖励
const { value } = activityInfo?.tasks?.sign || {}
const { todayCompleteTimes } = getTodayCompleteGrowTask('sign', task)
if (todayCompleteTimes === 0) {
const result = await updateTaskInfo(context, task._id, 'sign', { createTime: Date.now() })
return result === 1
? {
$inc: {
'remainTimes.sign': value || 0
}
}
: {}
}
return {}
}
......@@ -27,3 +27,5 @@ export * from './common/userUpdate'
export * from './common/format'
export * from './common/doHandler'
export * from './common/task'
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