From 8783f5c16b61a35cce81d85a7c637fb47e6f980d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E6=8C=AF=E6=9D=B0?= Date: Wed, 26 Feb 2020 13:35:15 +0800 Subject: [PATCH] GO! --- .gitignore | 42 +- config/config.development.json | 19 + models/mongo/index.js | 7 + models/mongo/players.js | 44 ++ package.json | 11 +- server.js | 81 +++- swagger/api/Player.js | 101 ++++ swagger/api/router.js | 27 ++ swagger/controllers/Player.js | 18 +- swagger/package.json | 2 +- swagger/service/PlayerService.js | 4 +- utils/db.js | 31 ++ utils/middleware.js | 39 ++ yarn.lock | 797 +++++++++++++++++++++++++++++++ 14 files changed, 1163 insertions(+), 60 deletions(-) create mode 100644 config/config.development.json create mode 100755 models/mongo/index.js create mode 100644 models/mongo/players.js create mode 100644 swagger/api/Player.js create mode 100644 swagger/api/router.js create mode 100644 utils/db.js create mode 100644 utils/middleware.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 3b9771e..dcad54d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,2 @@ -# gitignore -# Logs -logs -*.log -lerna-debug.log -npm-debug.log -yarn-error.log -yarn.lock -stats.json -package-lock.json - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -bin/Release - -# Dependency directory -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git -**/node_modules - -#Webstorm metadata -.idea - -# Mac files -.DS_Store \ No newline at end of file +!.gitignore +/node_modules \ No newline at end of file diff --git a/config/config.development.json b/config/config.development.json new file mode 100644 index 0000000..924c357 --- /dev/null +++ b/config/config.development.json @@ -0,0 +1,19 @@ +{ + "ip": "127.0.0.1", + "port": 3000, + "log_path": "/var/log/NBA", + "mongo": { + "url": "172.16.11.201", + "port": 27017, + "db": "test_dev", + "auth": false, + "username": "", + "password": "" + }, + "core": { + + }, + "redis_token": { + + } + } diff --git a/models/mongo/index.js b/models/mongo/index.js new file mode 100755 index 0000000..680a85c --- /dev/null +++ b/models/mongo/index.js @@ -0,0 +1,7 @@ +const playersModelsMakeup = require('./players'); + +const modelMakeup = { + ...playersModelsMakeup, +}; + +module.exports = modelMakeup; diff --git a/models/mongo/players.js b/models/mongo/players.js new file mode 100644 index 0000000..89bc211 --- /dev/null +++ b/models/mongo/players.js @@ -0,0 +1,44 @@ +const mongoose = require('mongoose'); +const uuid = require('uuid'); + +const { Schema } = mongoose; +/** + * 球员管理相关 models(MongoDB) 200223 + * @author DZJ + */ + +/* 定义员工schema */ +const PlayersSchema = new Schema({ + name: String, + position: { + type: String, + enum : ['C','PF','SF','PG','SG'] + }, +}); + +/** + * 新建记录 + * @param {Object} playerData + */ +PlayersSchema + .statics + .addNew = async function addNew( + playerData, + ) { + const newData = { + name: playerData.name, + position: playerData.position, + add_datetime: new Date(), + }; + const newObj = new this(newData); + await newObj.save(); + return newObj; + }; + +const Players = mongoose.model('Players', PlayersSchema, 'players'); + +const makeup = { + Players: Players, +}; + +module.exports = makeup; \ No newline at end of file diff --git a/package.json b/package.json index 7cd51e6..49fab92 100755 --- a/package.json +++ b/package.json @@ -10,8 +10,15 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "express": "^4.16.4", - "mongoose": "^5.4.8" + "mongoose": "^5.0.5", + "co": "^4.6.0", + "koa": "^2.5.3", + "koa-bodyparser": "^4.2.1", + "koa-router": "^7.4.0", + "koa-validate": "^1.0.7", + "bunyan": "^1.8.12", + "bunyan-format": "^0.2.1", + "uuid": "^3.3.2" }, "devDependencies": { "chai": "^4.2.0" diff --git a/server.js b/server.js index 72e5b39..8e95c0f 100755 --- a/server.js +++ b/server.js @@ -1,11 +1,76 @@ -const express = require('express'); +const Koa = require('koa'); +const bodyParser = require('koa-bodyparser'); +const validate = require('koa-validate'); +const bunyan = require('bunyan'); +const bformat = require('bunyan-format'); +const cors = require('@koa/cors'); +const http = require('http'); +const mongoDBModels = require('./models/mongo'); +const db = require('./utils/db'); +const app = new Koa(); +const config = require('./config/config.development'); +const responseMiddleware = require('./utils/middleware'); -const app = express(); +const main = async () => { + try { + app.projConfig = { + ...config, + }; -app.get('/', (req, res) => { - res.json({"message": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB."}); -}); + const formatOut = bformat({ outputMode: 'long' }); + app.logger = bunyan.createLogger({ + name: 'NBA_api', + src: true, + // streams: [{ stream: new BunyanLogStream() }], + streams: [{ + level: 'debug', + stream: formatOut, + }, { + level: 'error', + path: `${config.log_path}/error_log.json`, + src: true, + }], + }); -app.listen(3000, () => { - console.log("Server is listening on port 3000"); -}); \ No newline at end of file + // Mongo DB + await db.mongo(config.mongo); + app.mongoDBModels = mongoDBModels; + app.logger.info('[OK] Mongo DB'); + + // Makeup App + app.use(bodyParser()); + validate(app); + + // 挂载封装好的返回逻辑 + app.use(responseMiddleware); + + let port; + app.use(cors()); + const router = require('./swagger/api/router'); + app.use(router.routes()) + .use(router.allowedMethods()); + app.logger.info('[OK] Apis'); + port = config.port; + + port = port || config.port; + http.createServer(app.callback()).listen(port, config.ip); + + app.on('error', (err, ctx) => { + app.logger.error(err.stack); + }); + app.proxy = true; + app.logger.info(`[OK] Start -> ${config.ip}:${port}`); + } catch (err) { + console.error(err.stack); + } +}; + +main(); + +// app.get('/', (req, res) => { +// res.json({"message": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB."}); +// }); + +// app.listen(3000, () => { +// console.log("Server is listening on port 3000"); +// }); \ No newline at end of file diff --git a/swagger/api/Player.js b/swagger/api/Player.js new file mode 100644 index 0000000..53f5175 --- /dev/null +++ b/swagger/api/Player.js @@ -0,0 +1,101 @@ +class PlayerAPIs { + // Demo + async demoAPI(ctx) { + try { + const resData = { + message: 'Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB.', + }; + return ctx.JSONRes(resData); + } catch (err) { + console.error(err.stack) + return ctx.JSONError(err.message); + } + } + + async playerMiddleWare(player_id, ctx, next) { + try { + ctx.checkParams('player_id').notEmpty('球员id不能为空'); + if (ctx.errors) { + return ctx.JSONError(ctx.errors); + } + const playerObj = await ctx.app.mongoDBModels.Players + .findOne({ + _id: player_id, + }); + if (!playerObj) { + return ctx.JSONError('球员不存在'); + } + ctx.playerObj = playerObj; + return next(); + } catch (err) { + ctx.app.logger.error(err.stack); + return ctx.JSONError(err.message); + } + } + + + // addPlayer + async addPlayer(ctx) { + try { + ctx.checkBody('name').notEmpty('请输入球员名称'); + ctx.checkBody('position').notEmpty('请输入球员位置'); + if (ctx.errors) { + return ctx.JSONError(ctx.errors); + } + const playerObj = ctx.request.body; + await ctx.app.mongoDBModels.Players.addNew(playerObj); + + return ctx.JSONRes({ add_player: 'ok' }); + } catch (err) { + ctx.app.logger.error(err.stack); + return ctx.JSONError(err.message); + } + } + + // playerActionAPI + async playerActionAPI(ctx) { + try { + ctx.checkParams('action_type', '请输入操作类型').notEmpty(); + if (ctx.params.action_type === 'update') { + ctx.checkBody('name').notEmpty('必须输入球员姓名'); + ctx.checkBody('position').notEmpty('必须输入球员位置'); + } else if (ctx.params.action_type === 'delete') { + + } + if (ctx.errors) { + return ctx.JSONError(ctx.errors); + } + let resData = {}; + if (ctx.params.action_type === 'update') { + const playerDate = ctx.request.body; + await ctx.playerObj.update(playerDate); + resData = { update_player: 'ok' }; + } else if (ctx.params.action_type === 'delete') { + await ctx.playerObj.delete(); + resData = { delete_player: 'ok' }; + } + return ctx.JSONRes(resData); + } catch (err) { + ctx.app.logger.error(err.stack); + return ctx.JSONError(err.message); + } + } + + // getPlayerById + async getPlayerById(ctx) { + try { + const res = { + id: ctx.playerObj._id, + name: ctx.playerObj.name, + age: ctx.playerObj.age, + }; + return ctx.JSONRes(res); + } catch (err) { + ctx.app.logger.error(err.stack); + return ctx.JSONError(err.message); + } + } + +} + +module.exports = new PlayerAPIs(); diff --git a/swagger/api/router.js b/swagger/api/router.js new file mode 100644 index 0000000..173c5b1 --- /dev/null +++ b/swagger/api/router.js @@ -0,0 +1,27 @@ +const Router = require('koa-router'); +const PlayerAPIs = require('./Player'); + +const PlayerControllers = require('./../controllers/Player'); + +// basePath +const router = new Router({ + prefix: '/v1', + }); + +// 球员api路由 +const PlayerRouter = new Router(); + +PlayerRouter + // demo + .get('/', PlayerAPIs.demoAPI) + // 有ID参数时默认查询Player对象 + .param('player_id', PlayerAPIs.playerMiddleWare) + // 添加球员 + .post('/', PlayerAPIs.addPlayer) + // 修改球员 || 删除球员 /id/操作类型 + .post('/:player_id/:action_type', PlayerAPIs.playerActionAPI) + // 根据id获取球员 + .get('/:player_id', PlayerAPIs.getPlayerById); + +router.use('/player', PlayerRouter.routes(), PlayerRouter.allowedMethods()); +module.exports = PlayerRouter; \ No newline at end of file diff --git a/swagger/controllers/Player.js b/swagger/controllers/Player.js index 95cda8c..688dac9 100755 --- a/swagger/controllers/Player.js +++ b/swagger/controllers/Player.js @@ -4,8 +4,8 @@ var utils = require('../utils/writer.js'); var Player = require('../service/PlayerService'); module.exports.addPlayer = function addPlayer (req, res, next) { - var body = req.swagger.params['body'].value; - Player.addPlayer(body) + // var body = req.swagger.params['body'].value; + Player.addPlayer(req) .then(function (response) { utils.writeJson(res, response); }) @@ -15,8 +15,8 @@ module.exports.addPlayer = function addPlayer (req, res, next) { }; module.exports.deletePlayer = function deletePlayer (req, res, next) { - var playerId = req.swagger.params['playerId'].value; - Player.deletePlayer(playerId) + // var playerId = req.swagger.params['playerId'].value; + Player.addPlayer(req) .then(function (response) { utils.writeJson(res, response); }) @@ -26,8 +26,9 @@ module.exports.deletePlayer = function deletePlayer (req, res, next) { }; module.exports.getPlayerById = function getPlayerById (req, res, next) { - var playerId = req.swagger.params['playerId'].value; - Player.getPlayerById(playerId) + // var playerId = req.swagger.params['playerId'].value; + Player.addPlayer(req) + Player.getPlayerById(req) .then(function (response) { utils.writeJson(res, response); }) @@ -37,8 +38,9 @@ module.exports.getPlayerById = function getPlayerById (req, res, next) { }; module.exports.updatePlayer = function updatePlayer (req, res, next) { - var body = req.swagger.params['body'].value; - Player.updatePlayer(body) + // var body = req.swagger.params['body'].value; + Player.addPlayer(req) + Player.updatePlayer(req) .then(function (response) { utils.writeJson(res, response); }) diff --git a/swagger/package.json b/swagger/package.json index ea91064..57b49e3 100755 --- a/swagger/package.json +++ b/swagger/package.json @@ -15,6 +15,6 @@ "dependencies": { "connect": "^3.6.6", "js-yaml": "^3.12.1", - "swagger-tools": "0.10.4" + "swagger-tools": "0.10.4", } } diff --git a/swagger/service/PlayerService.js b/swagger/service/PlayerService.js index 319fb15..c25fe75 100755 --- a/swagger/service/PlayerService.js +++ b/swagger/service/PlayerService.js @@ -1,4 +1,5 @@ 'use strict'; +var PlayerAPIs = require('../api/Player'); /** @@ -8,8 +9,9 @@ * body Player Player object * no response value expected for this operation **/ -exports.addPlayer = function(body) { +exports.addPlayer = function(ctx) { return new Promise(function(resolve, reject) { + const res = PlayerAPIs.addPlayer(ctx); resolve(); }); } diff --git a/utils/db.js b/utils/db.js new file mode 100644 index 0000000..f47ca77 --- /dev/null +++ b/utils/db.js @@ -0,0 +1,31 @@ +const mongoose = require('mongoose'); +const qs = require('qs'); + +/** + * 初始化MongoDB数据库 + * @author Junyi + * @param {object} config - Configs for DB Instance + * @param {promise} + */ + +const initMongoDB = async (config) => { + mongoose.Promise = global.Promise; + const mongoBaseUri = config.rep ? `${config.rep_url}/${config.db}` : `${config.url}:${config.port}/${config.db}`; + const mongoQs = { + authMechanism: 'SCRAM-SHA-1', + }; + if (config.rep_set) { + mongoQs.replicaSet = config.rep_set; + } + const mongoUri = config.auth + ? `mongodb://${config.username}:${config.password}@${mongoBaseUri}?${qs.stringify(mongoQs)}` + : `mongodb://${mongoBaseUri}`; + // console.log(`mongo connection url ${mongoUri}`) + await mongoose.connect(mongoUri, { useNewUrlParser: true }); + return Promise.resolve(mongoose); +}; + + +module.exports = { + mongo: initMongoDB, +} diff --git a/utils/middleware.js b/utils/middleware.js new file mode 100644 index 0000000..18f7268 --- /dev/null +++ b/utils/middleware.js @@ -0,0 +1,39 @@ +const responseMiddleware = async (ctx, next) => { + ctx.JSONRes = (resData) => { + ctx.status = 200; + ctx.body = { + code: 200, + data: resData, + success: true, + errmsg: null, + }; + ctx.set({ + 'Content-Type': 'application/json', + }); + }; + + ctx.JSONError = (errMsg, statusCode) => { + let errmsg = ''; + if (errMsg instanceof Array) { + errMsg.map((errObj) => { + errmsg += Object.values(errObj).join(','); + }); + } else if (typeof errMsg === 'string') { + errmsg += errMsg; + } + ctx.status = statusCode || 400; + ctx.body = { + code: statusCode, + data: null, + success: false, + errmsg: errmsg, + }; + ctx.set({ + 'Content-Type': 'application/json', + }); + }; + + await next(); +}; + +module.exports = responseMiddleware; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..c6a98a3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,797 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@^1.3.5: + 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" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.npm.taobao.org/ansicolors/download/ansicolors-0.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansicolors%2Fdownload%2Fansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= + +ansistyles@~0.1.1: + version "0.1.3" + resolved "https://registry.npm.taobao.org/ansistyles/download/ansistyles-0.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansistyles%2Fdownload%2Fansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= + +any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/assertion-error/download/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs= + +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= + +bl@^2.2.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/bl/download/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" + integrity sha1-4aV0zfUo5AUwGbuACwQcCsiNpJM= + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bluebird@3.5.1: + version "3.5.1" + resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha1-2VUfnemPH82h5oPRfukaBgLuLrk= + +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" + +bson@^1.1.1, bson@~1.1.1: + version "1.1.3" + resolved "https://registry.npm.taobao.org/bson/download/bson-1.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbson%2Fdownload%2Fbson-1.1.3.tgz#aa82cb91f9a453aaa060d6209d0675114a8154d3" + integrity sha1-qoLLkfmkU6qgYNYgnQZ1EUqBVNM= + +bunyan-format@^0.2.1: + version "0.2.1" + resolved "https://registry.npm.taobao.org/bunyan-format/download/bunyan-format-0.2.1.tgz#a4b3b0d80070a865279417269e3f00ff02fbcb47" + integrity sha1-pLOw2ABwqGUnlBcmnj8A/wL7y0c= + dependencies: + ansicolors "~0.2.1" + ansistyles "~0.1.1" + xtend "~2.1.1" + +bunyan@^1.8.12: + version "1.8.12" + resolved "https://registry.npm.taobao.org/bunyan/download/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" + integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= + optionalDependencies: + dtrace-provider "~0.8" + moment "^2.10.6" + mv "~2" + safe-json-stringify "~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= + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha1-A1zeKwjuISn0qDFeqPAKANuhRTw= + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +chai@^4.2.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/chai/download/chai-4.2.0.tgz?cache=0&sync_timestamp=1571657557374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchai%2Fdownload%2Fchai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha1-dgqnLPION5XoSxKHfODoNzeqKeU= + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/check-error/download/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +co-body@^6.0.0: + version "6.0.0" + resolved "https://registry.npm.taobao.org/co-body/download/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3" + integrity sha1-lluTN9f1ZVSAeHRx9CN2ZIIIJ+M= + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +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= + +content-disposition@~0.5.2: + 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= + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.npm.taobao.org/cookies/download/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha1-EpPOSzkXQKhAbjyYcOgoxLVPP5A= + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/copy-to/download/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= + +core-util-is@~1.0.0: + 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= + +debug@3.1.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.1.0: + 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" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npm.taobao.org/deep-eql/download/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha1-38lARACtHI/gI+faHfHBR8S0RN8= + dependencies: + type-detect "^4.0.0" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +denque@^1.4.1: + version "1.4.1" + resolved "https://registry.npm.taobao.org/denque/download/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" + integrity sha1-Z0T/dkHBSMP4ppwwflEjXB9KN88= + +depd@^1.1.2, 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= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= + +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= + +dtrace-provider@~0.8: + version "0.8.8" + resolved "https://registry.npm.taobao.org/dtrace-provider/download/dtrace-provider-0.8.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdtrace-provider%2Fdownload%2Fdtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e" + integrity sha1-KZbVSQw34TR74mO0I+17KX+w2X4= + dependencies: + nan "^2.14.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= + +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= + +error-inject@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" + integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= + +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= + +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= + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/get-func-name/download/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +http-assert@^1.3.0: + version "1.4.1" + resolved "https://registry.npm.taobao.org/http-assert/download/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" + integrity sha1-xfcl1neqfoc+9zYZm4lobM6zeHg= + dependencies: + deep-equal "~1.0.1" + http-errors "~1.7.2" + +http-errors@1.7.3, http-errors@^1.3.1, http-errors@^1.6.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.npm.taobao.org/http-errors/download/http-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" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1579333981154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/inflation/download/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= + +is-generator-function@^1.0.7: + version "1.0.7" + resolved "https://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + integrity sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +json-path@^0.1.3: + version "0.1.3" + resolved "https://registry.npm.taobao.org/json-path/download/json-path-0.1.3.tgz#dce61357b3b281b28ac647ec0a709bc58a155bf8" + integrity sha1-3OYTV7OygbKKxkfsCnCbxYoVW/g= + dependencies: + json-ptr "~0.1.1" + +json-ptr@~0.1.1: + version "0.1.1" + resolved "https://registry.npm.taobao.org/json-ptr/download/json-ptr-0.1.1.tgz#bab82a31e292ce7af9e3fc7fd65acd1bbb9248e8" + integrity sha1-urgqMeKSznr54/x/1lrNG7uSSOg= + +kareem@2.3.1: + version "2.3.1" + resolved "https://registry.npm.taobao.org/kareem/download/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87" + integrity sha1-3vEtnJQQF/q/sA+HOvlenJnhvoc= + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/keygrip/download/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha1-hxsWgdXhWcYqRFsMdLYV4JF+ciY= + dependencies: + tsscmp "1.0.6" + +koa-bodyparser@^4.2.1: + version "4.2.1" + resolved "https://registry.npm.taobao.org/koa-bodyparser/download/koa-bodyparser-4.2.1.tgz#4d7dacb5e6db1106649b595d9e5ccb158b6f3b29" + integrity sha1-TX2stebbEQZkm1ldnlzLFYtvOyk= + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + +koa-compose@^3.0.0: + version "3.2.1" + resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" + integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= + dependencies: + any-promise "^1.1.0" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc= + +koa-convert@^1.2.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" + integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= + dependencies: + co "^4.6.0" + koa-compose "^3.0.0" + +koa-router@^7.4.0: + version "7.4.0" + resolved "https://registry.npm.taobao.org/koa-router/download/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" + integrity sha1-ruH3rcAtXLMdfWdGXJ6syCXoxeA= + dependencies: + debug "^3.1.0" + http-errors "^1.3.1" + koa-compose "^3.0.0" + methods "^1.0.1" + path-to-regexp "^1.1.1" + urijs "^1.19.0" + +koa-validate@^1.0.7: + version "1.0.7" + resolved "https://registry.npm.taobao.org/koa-validate/download/koa-validate-1.0.7.tgz#0b7dd3feee83cae1b4694fa06376477d945eb430" + integrity sha1-C33T/u6DyuG0aU+gY3ZHfZRetDA= + dependencies: + json-path "^0.1.3" + validator "^5.2.0" + +koa@^2.5.3: + version "2.11.0" + resolved "https://registry.npm.taobao.org/koa/download/koa-2.11.0.tgz?cache=0&sync_timestamp=1572232118391&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkoa%2Fdownload%2Fkoa-2.11.0.tgz#fe5a51c46f566d27632dd5dc8fd5d7dd44f935a4" + integrity sha1-/lpRxG9WbSdjLdXcj9XX3UT5NaQ= + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "~3.1.0" + delegates "^1.0.0" + depd "^1.1.2" + destroy "^1.0.4" + encodeurl "^1.0.2" + error-inject "^1.0.0" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^1.2.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +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= + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.npm.taobao.org/memory-pager/download/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha1-2HUWVdItOEaCdByXLyw9bfo+ZrU= + +methods@^1.0.1: + version "1.1.2" + resolved "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.43.0.tgz?cache=0&sync_timestamp=1578281104943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg= + +mime-types@^2.1.18, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.26.tgz?cache=0&sync_timestamp=1578282585871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha1-nJIfwJt+FJpl39wNpNIJlyALCgY= + dependencies: + mime-db "1.43.0" + +"minimatch@2 || 3": + 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@0.0.8: + version "0.0.8" + resolved "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz?cache=0&sync_timestamp=1579899671093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +moment@^2.10.6: + version "2.24.0" + resolved "https://registry.npm.taobao.org/moment/download/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s= + +mongodb@3.5.3: + version "3.5.3" + resolved "https://registry.npm.taobao.org/mongodb/download/mongodb-3.5.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmongodb%2Fdownload%2Fmongodb-3.5.3.tgz#f2c7ce9b5fc9a13da116ff1b6e816f6256010a86" + integrity sha1-8sfOm1/JoT2hFv8bboFvYlYBCoY= + dependencies: + bl "^2.2.0" + bson "^1.1.1" + denque "^1.4.1" + require_optional "^1.0.1" + safe-buffer "^5.1.2" + optionalDependencies: + saslprep "^1.0.0" + +mongoose-legacy-pluralize@1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/mongoose-legacy-pluralize/download/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" + integrity sha1-O6n5H6UHtRhtOZ+0CFS/8Y+1Y+Q= + +mongoose@^5.0.5: + version "5.9.2" + resolved "https://registry.npm.taobao.org/mongoose/download/mongoose-5.9.2.tgz#57ebad26784c1002f31bcdb4ecec69c9ab7a9a63" + integrity sha1-V+utJnhMEALzG8207Oxpyat6mmM= + dependencies: + bson "~1.1.1" + kareem "2.3.1" + mongodb "3.5.3" + mongoose-legacy-pluralize "1.0.2" + mpath "0.6.0" + mquery "3.2.2" + ms "2.1.2" + regexp-clone "1.0.0" + safe-buffer "5.1.2" + sift "7.0.1" + sliced "1.0.1" + +mpath@0.6.0: + version "0.6.0" + resolved "https://registry.npm.taobao.org/mpath/download/mpath-0.6.0.tgz#aa922029fca4f0f641f360e74c5c1b6a4c47078e" + integrity sha1-qpIgKfyk8PZB82DnTFwbakxHB44= + +mquery@3.2.2: + version "3.2.2" + resolved "https://registry.npm.taobao.org/mquery/download/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7" + integrity sha1-4Tg6OVGFLOI+N/YZqbNQ8fs2ZOc= + dependencies: + bluebird "3.5.1" + debug "3.1.0" + regexp-clone "^1.0.0" + safe-buffer "5.1.2" + sliced "1.0.1" + +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.2, 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= + +mv@~2: + version "2.1.1" + resolved "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +nan@^2.14.0: + version "2.14.0" + resolved "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw= + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + +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= + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +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.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" + +only@~0.0.2: + version "0.0.2" + resolved "https://registry.npm.taobao.org/only/download/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-to-regexp@^1.1.1: + version "1.8.0" + resolved "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha1-iHs7qdhDk+h6CgufTLdWGYtTVIo= + dependencies: + isarray "0.0.1" + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/pathval/download/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + +qs@^6.5.2: + version "6.9.1" + resolved "https://registry.npm.taobao.org/qs/download/qs-6.9.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha1-IAgsZct4IjY1qxqerKiHWim/jsk= + +raw-body@^2.3.3: + version "2.4.1" + resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha1-MKyC+Yu1rowVLmcUnayNVRU7Fow= + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.3.5: + version "2.3.7" + resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1581624324274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +regexp-clone@1.0.0, regexp-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/regexp-clone/download/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" + integrity sha1-Ii25Z2IydwViYLmSYmNUoEzpv2M= + +require_optional@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/require_optional/download/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + integrity sha1-TPNaQkf2TKPfjC7yCMxJSxyo/C4= + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= + dependencies: + glob "^6.0.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +safe-buffer@^5.1.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk= + +safe-json-stringify@~1: + version "1.2.0" + resolved "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" + integrity sha1-NW5EvJjx+TzkXfFLzXwBzahuCv0= + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +saslprep@^1.0.0: + version "1.0.3" + resolved "https://registry.npm.taobao.org/saslprep/download/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" + integrity sha1-TAL5RrVs9UKX40e6EJPnrKxM8iY= + dependencies: + sparse-bitfield "^3.0.3" + +semver@^5.1.0: + version "5.7.1" + resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1581458063470&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= + +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= + +sift@7.0.1: + version "7.0.1" + resolved "https://registry.npm.taobao.org/sift/download/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" + integrity sha1-R9YsULFZ0xbxNy+LU/nBDNIaSwg= + +sliced@1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/sliced/download/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" + integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.npm.taobao.org/sparse-bitfield/download/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= + dependencies: + memory-pager "^1.0.2" + +"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#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.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= + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.npm.taobao.org/tsscmp/download/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha1-hbmVg6w1iexL/vgltQAKqRHWBes= + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.npm.taobao.org/type-detect/download/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= + +type-is@^1.6.16: + 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" + +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= + +urijs@^1.19.0: + version "1.19.2" + resolved "https://registry.npm.taobao.org/urijs/download/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a" + integrity sha1-+b4J8AxMUTS3yzz0dcHdOUUmJlo= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +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=1582662735489&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= + +validator@^5.2.0: + version "5.7.0" + resolved "https://registry.npm.taobao.org/validator/download/validator-5.7.0.tgz#7a87a58146b695ac486071141c0c49d67da05e5c" + integrity sha1-eoelgUa2laxIYHEUHAxJ1n2gXlw= + +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= + +wrappy@1: + version "1.0.2" + resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.npm.taobao.org/xtend/download/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +ylru@^1.2.0: + version "1.2.1" + resolved "https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" + integrity sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8=