├── .editorconfig ├── .eslintrc ├── .gitignore ├── Dockerfile ├── Procfile ├── README.md ├── app.json ├── config ├── custom-environment-variables.json └── default.json ├── index.html ├── now.json ├── package.json ├── src ├── event.ts ├── index.ts ├── requests.ts ├── utils.ts └── web.ts ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | end_of_line = lf 3 | indent_size = 4 4 | indent_style = space 5 | insert_final_newline = true 6 | charset = utf-8 7 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "babel", 3 | "parserOptions": { 4 | "ecmaVersion": 7, 5 | "sourceType": "module" 6 | }, 7 | "env": { 8 | "jest": true 9 | }, 10 | "rules": { 11 | "quotes": [ 12 | "error", 13 | "single" 14 | ], 15 | "indent": [ 16 | "error", 17 | 4, 18 | { 19 | "SwitchCase": 1 20 | } 21 | ], 22 | "comma-dangle": [ 23 | "error", 24 | "always-multiline" 25 | ], 26 | "newline-after-var": "error", 27 | "semi": [ 28 | "error", 29 | "never" 30 | ], 31 | "eqeqeq": [ 32 | "error", 33 | "always" 34 | ] 35 | } 36 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Nodejs modules and can get from package.json 2 | node_modules 3 | 4 | # build out dist 5 | dist 6 | 7 | ## yarn files 8 | yarn-error.log 9 | 10 | cookies.json 11 | *.zip 12 | 13 | config/porduction.json 14 | config/default.json 15 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10.5.0-alpine 2 | 3 | RUN npm install -g yarn && \ 4 | mkdir -p /app 5 | 6 | COPY . /app 7 | WORKDIR /app 8 | 9 | RUN yarn && yarn run build && \ 10 | echo "#!/bin/sh" > /start && \ 11 | echo "set -e" >> /start && \ 12 | echo 'STEAM_TOKEN=${STEAM_TOKEN//,/\", \"}' >> /start && \ 13 | echo "sed -i \"s/YOUR_TOKEN/\$STEAM_TOKEN/g\" /app/config/default.json" >> /start && \ 14 | echo "node /app/dist/index.js" >> /start && \ 15 | chmod +x /start 16 | 17 | CMD ["sh", "/start"] 18 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node dist/web.js 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Steam 2018 年暑期小游戏刷分脚本 2 | 3 |

4 | Version 5 | Author 6 | Typescript 7 | node.js 8 |

9 | 10 | ## Heroku 11 | [![](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/Indexyz/steam_2018_summer_game) 12 | 13 | ## 快速使用 (Linux) 14 | 使用前先在 steam 页面上加入星球 15 | ```bash 16 | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash 17 | bash 18 | nvm install 10 19 | npm install -g yarn 20 | git clone https://github.com/Indexyz/steam_2018_summer_game.git 21 | cd steam_2018_summer_game 22 | # 编辑 config/default.json 23 | # 去 https://steamcommunity.com/saliengame/gettoken 获取 token 24 | # "token": [ 25 | # "YOUR_TOKEN" 26 | # ] 27 | # 将 YOUR_TOKEN 改为你的 TOKEN 28 | # 可以填写多个用户的 token 29 | yarn 30 | yarn run build 31 | node dist/index.js 32 | # Enjoy! 33 | ``` 34 | 35 | ## 快速使用 (Docker) 36 | ```bash 37 | docker run --name steam_game -d --restart=always -e STEAM_TOKEN=你的TOKEN indexyz/steam_2018_summer_game 38 | ``` 39 | 40 | ## Windows 下安装 41 | 安装 https://nodejs.org/zh-cn/ 和 https://yarnpkg.com/lang/zh-hans/ 然后 Download Zip 并解压 42 | ```bash 43 | # 编辑 config/default.json 44 | # 去 https://steamcommunity.com/saliengame/gettoken 获取 token 45 | # "token": [ 46 | # "YOUR_TOKEN" 47 | # ] 48 | # 将 YOUR_TOKEN 改为你的 TOKEN 49 | # 可以填写多个用户的 token 50 | yarn 51 | yarn run build 52 | node dist/index.js 53 | # Enjoy! 54 | ``` 55 | ``` 56 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Steam 2018年 夏日小游戏", 3 | "description": "自动玩夏日小游戏", 4 | "env": { 5 | "USER_TOKEN": { 6 | "description": "用户Token", 7 | "value": "" 8 | }, 9 | "WEB_PASS": { 10 | "description": "Web 界面密码", 11 | "value": "Password" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /config/custom-environment-variables.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "USER_TOKEN", 3 | "webPass": "WEB_PASS" 4 | } 5 | -------------------------------------------------------------------------------- /config/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": [ 3 | "YOUR_TOKEN" 4 | ], 5 | "webPass": "Password" 6 | } 7 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Steam Game Logger 8 | 9 | 10 |
11 | 12 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "steam-2018-summer-game", 3 | "type": "npm", 4 | "engines": { 5 | "node": "8.11.2" 6 | }, 7 | "env": { 8 | "USER_TOKEN": "", 9 | "WEB_PASS": "Password" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "steam_2018_summer_game", 3 | "version": "1.0.0", 4 | "main": "src/index.js", 5 | "repository": "git@github.com:Indexyz/steam_2018_summer_game.git", 6 | "author": "Indexyz ", 7 | "license": "MIT", 8 | "private": false, 9 | "scripts": { 10 | "build": "tsc", 11 | "type-check": "tsc --noEmit", 12 | "lint": "eslint src", 13 | "dev": "ts-node src/index.ts", 14 | "web": "ts-node dist/web.ts", 15 | "heroku-postbuild": "tsc", 16 | "now-start": "node dist/web.js" 17 | }, 18 | "dependencies": { 19 | "axios": "^0.18.0", 20 | "chalk": "^2.4.1", 21 | "config": "^1.30.0", 22 | "koa": "^2.5.1", 23 | "koa-logger": "^3.2.0", 24 | "moment": "^2.22.2", 25 | "socket.io": "^2.1.1", 26 | "socketio-auth": "^0.1.1" 27 | }, 28 | "devDependencies": { 29 | "@types/koa": "^2.0.46", 30 | "@types/node": "^10.3.3", 31 | "@types/socket.io": "^1.4.36", 32 | "eslint": "^4.19.1", 33 | "ts-node": "^7.0.0", 34 | "typescript": "^2.9.2" 35 | }, 36 | "engines": { 37 | "node": ">=6.14.3" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/event.ts: -------------------------------------------------------------------------------- 1 | import * as event from 'events' 2 | 3 | const events = { 4 | LogEvent: Symbol(), 5 | } 6 | 7 | export default new event.EventEmitter() 8 | export { events } 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import Utils from './utils' 2 | import Requests from './requests' 3 | import * as config from 'config' 4 | 5 | // get token from https://steamcommunity.com/saliengame/gettoken 6 | // can add many user 7 | const userList = config.get('token') 8 | 9 | let singleton: boolean = false 10 | if (userList.length === 1) { 11 | singleton = true 12 | } 13 | 14 | function getRandomInt(min: number, max: number): number { 15 | min = Math.ceil(min) 16 | max = Math.floor(max) 17 | return Math.floor(Math.random() * (max - min)) + min 18 | } 19 | 20 | async function SteamGame(userToken: string) { 21 | let loggerName = `Saliens (${userToken})` 22 | if (singleton) { 23 | loggerName = `Saliens` 24 | } 25 | 26 | const logger = new Utils.Logger(Utils.Logger.LEVEL_INFO, loggerName) 27 | const requests = new Requests.SalienGame(userToken, logger) 28 | let times = 0 29 | 30 | while (true) { 31 | const bossPlanet = await requests.getBossPlanet() 32 | if (bossPlanet !== null) { 33 | logger.info('>> Boss room founded, joining') 34 | await requests.joinPlanetRequest(bossPlanet.id) 35 | const planetInfo = await requests.getPlanetInfoRequest(bossPlanet.id) 36 | const zones = planetInfo.planets[0].zones 37 | .filter(item => !item.captured) 38 | .filter(item => item.type === 4) 39 | if (zones.length === 0) { 40 | continue 41 | } 42 | const zone = zones[0] 43 | await requests.joinBossZone(zone.zone_position) 44 | let damage = await requests.sendBossDamage() 45 | while (!damage.game_over) { 46 | await Utils.Time.wait(5 * Utils.Time.Second) 47 | damage = await requests.sendBossDamage() 48 | } 49 | 50 | continue 51 | } 52 | 53 | times += 1 54 | const playerInfo = await requests.getPlayerInfoRequest() 55 | 56 | const planet = await requests.getPlanetInfoRequest(playerInfo.active_planet) 57 | 58 | if (times % 10 === 1) { 59 | await requests.leaveRequest() 60 | logger.info('>> Left Planet, Joining New One') 61 | await requests.selectPlanetRequest() 62 | continue 63 | } 64 | 65 | if (planet.planets === undefined) { 66 | await requests.selectPlanetRequest() 67 | continue 68 | } 69 | 70 | const zones = planet.planets[0].zones 71 | .filter(item => !item.captured && item.top_clans) 72 | 73 | if (zones.length === 0) { 74 | logger.error(' No Available Zone Found, Please Change Your Planet') 75 | continue 76 | } 77 | 78 | const zone = zones 79 | .reduce((best, thisZone) => { 80 | if (thisZone.difficulty > best.difficulty) { 81 | return thisZone 82 | } 83 | return best 84 | }) 85 | 86 | let post_score = 2400 87 | if (zone.difficulty === 1) { 88 | post_score = 585 89 | } else if (zone.difficulty === 2) { 90 | post_score = 1170 91 | } 92 | 93 | const scoreTable = [ 94 | 0, // Level 1 95 | 1200, // Level 2 96 | 2400, // Level 3 97 | 4800, // Level 4 98 | 12000, // Level 5 99 | 30000, // Level 6 100 | 72000, // Level 7 101 | 180000, // Level 8 102 | 450000, // Level 9 103 | 1200000, // Level 10 104 | 2400000, // Level 11 105 | 3600000, // Level 12 106 | 4800000, // Level 13 107 | 6000000, // Level 14 108 | 7200000, // Level 15 109 | 8400000, // Level 16 110 | 9600000, // Level 17 111 | 10800000, // Level 18 112 | 12000000, // Level 19 113 | 14600000, // Level 20 114 | 16800000, // Level 21 115 | ] 116 | 117 | function getPercentage(current, goal) { 118 | const percentage = (Number(current) / Number(goal)) * 100 119 | return Math.round(percentage * 100) / 100 120 | } 121 | 122 | function timeConvert(mins) { 123 | const hours = (mins / 60) 124 | const rhours = Math.floor(hours) 125 | const minutes = (hours - rhours) * 60 126 | const rminutes = Math.round(minutes) 127 | return rhours + " hour(s) and " + rminutes + " minute(s)" 128 | } 129 | 130 | function getETA(current, goal, reward) { 131 | const remaining = (Number(goal) - Number(current)) / Number(reward) 132 | const time = remaining * 2 133 | return timeConvert(time) 134 | } 135 | 136 | logger.info(`>> User Level: ${playerInfo.level}`) 137 | logger.info(` Total Score: ${playerInfo.score}`) 138 | logger.info(` Level Progress: ${Number(playerInfo.score) - Number(scoreTable[playerInfo.level - 1])} ` + 139 | `out of ${Number(playerInfo.next_level_score) - Number(scoreTable[playerInfo.level - 1])} for level ${playerInfo.level + 1} ` + 140 | `(${getPercentage(playerInfo.score, playerInfo.next_level_score)}%)`) 141 | logger.info(` Until Next Level: ${getETA(playerInfo.score, playerInfo.next_level_score, post_score)}`) 142 | logger.info(` User Planet: ${planet.planets[0].state.name}`) 143 | logger.info(` Selected Zone: ${zone.gameid}`) 144 | logger.info(` Zone Reward Score: ${post_score}`) 145 | logger.info(' ') 146 | 147 | const joinMessage = await requests.joinZoneRequest(zone.zone_position); 148 | if (joinMessage.score === null) { 149 | logger.error(`!! Server Rejected Request`) 150 | continue 151 | } 152 | const randomSecond = 115 + getRandomInt(0, 5) 153 | 154 | logger.info(`>> Joined Zone, Waiting ${randomSecond} Seconds Until Submitting Score`) 155 | await Utils.Time.wait(randomSecond * Utils.Time.Second) 156 | logger.info('>> Submitting Score') 157 | let retryTimes: number = 0 158 | 159 | while (retryTimes <= 5) { 160 | retryTimes += 1 161 | logger.info(` Submitting Score (Retry ${retryTimes})`) 162 | const requestScore = await requests.postScoreRequest(post_score) 163 | 164 | if (requestScore.new_score === undefined) { 165 | logger.warn(' Received Undefined Response, Are There Multiple Instances Running?') 166 | await Utils.Time.wait((retryTimes * 2) * Utils.Time.Second) 167 | } else { 168 | logger.info(` Submitted Score (Now ${requestScore.new_score})`) 169 | break 170 | } 171 | } 172 | logger.info(' ') 173 | } 174 | } 175 | 176 | function userThread(userId: string) { 177 | SteamGame(userId).catch(err => { 178 | console.log(err) 179 | userThread(userId) 180 | }) 181 | } 182 | 183 | if (typeof userList === "string") { 184 | singleton = true 185 | userThread(userList) 186 | } else { 187 | for (const user of userList) { 188 | userThread(user) 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /src/requests.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import Utils from './utils' 3 | 4 | const steamHost = 'https://community.steam-api.com' 5 | const apiEndpoint = `${steamHost}/ITerritoryControlMinigameService` 6 | 7 | type Planet = { 8 | giveaway_apps: Array, 9 | id: string, 10 | state: { 11 | activation_time: number, 12 | active: boolean, 13 | capture_progress: number, 14 | captured: boolean, 15 | cloud_filename: string, 16 | current_players: number, 17 | difficulty: number, 18 | giveaway_id: string, 19 | image_filename: string, 20 | land_filename: string, 21 | map_filename: string, 22 | name: string, 23 | position: number, 24 | priority: number, 25 | tag_ids: string, 26 | total_joins: number, 27 | } 28 | } 29 | 30 | type BossResponse = { 31 | boss_status: { 32 | boss_hp: number, 33 | boss_max_hp: number, 34 | boss_players: Array 35 | }, 36 | game_over: boolean, 37 | num_laser_uses: number, 38 | num_team_heals: number, 39 | waiting_for_players: boolean 40 | } 41 | 42 | namespace Requests { 43 | export class SalienGame { 44 | private token: string 45 | private logger: Utils.Logger 46 | private nextHeal: number = 0 47 | private waitForPlayer: boolean = true 48 | 49 | constructor(userToken: string, logger: Utils.Logger) { 50 | this.token = userToken 51 | this.logger = logger 52 | } 53 | 54 | async getPlanetsList() { 55 | const getPlanetsRequetst = await axios.get(`${apiEndpoint}/GetPlanets/v0001/?active_only=1&language=english`) 56 | const getPlanets: { 57 | planets: Array 58 | } = getPlanetsRequetst.data.response 59 | return getPlanets 60 | } 61 | 62 | async getBossPlanet() { 63 | const getPlanets = await this.getPlanetsList() 64 | 65 | // select boss plant 66 | for (const planet of getPlanets.planets) { 67 | const planetInfo = await this.getPlanetInfoRequest(planet.id) 68 | const zones = planetInfo.planets[0].zones 69 | .filter(item => !item.captured) 70 | 71 | for (const zone of zones) { 72 | if (zone.type === 4) { 73 | return planet 74 | } 75 | } 76 | } 77 | return null 78 | } 79 | 80 | async joinPlanetRequest(planetId: string) { 81 | return await axios.post(`${apiEndpoint}/JoinPlanet/v0001/`, 82 | `id=${planetId}&access_token=${this.token}`) 83 | } 84 | 85 | async selectPlanetRequest(): Promise { 86 | this.logger.info(' Selected Best Planet') 87 | const getPlanets = await this.getPlanetsList() 88 | 89 | const best = getPlanets.planets.filter(item => item.state.active) 90 | .filter(item => !item.state.captured) 91 | .reduce((best, thisPlanet) => { 92 | if (best.state.capture_progress > thisPlanet.state.capture_progress) { 93 | return thisPlanet 94 | } 95 | return best 96 | }) 97 | 98 | this.logger.info(`++ New Planet: ${best.state.name}`) 99 | this.logger.info(` Planet Id: ${best.id}`) 100 | this.logger.info(' ') 101 | await this.joinPlanetRequest(best.id) 102 | // Adding User To SteamCN Group 103 | await axios.post(`${apiEndpoint}/RepresentClan/v0001/`, `clanid=103582791429777370&access_token=${this.token}`) 104 | return best 105 | } 106 | 107 | async getPlayerInfoRequest() { 108 | const playerInfoRequest = await axios.post(`${apiEndpoint}/GetPlayerInfo/v0001/`, `access_token=${this.token}`) 109 | const playerInfo: { 110 | active_planet: string, 111 | time_on_planet: number, 112 | active_zone_game: string, 113 | active_zone_position: string, 114 | score: string, 115 | level: number, 116 | next_level_score: string, 117 | } = playerInfoRequest.data.response 118 | return playerInfo 119 | } 120 | 121 | async levaeRequest() { 122 | const playerInfo = await this.getPlayerInfoRequest() 123 | return axios.post(`${steamHost}/IMiniGameService/LeaveGame/v0001/`, 124 | `access_token=${this.token}&gameid=${playerInfo.active_planet}`) 125 | } 126 | 127 | async getPlanetInfoRequest(planetId: string) { 128 | const planetRequest = await axios.get(`${apiEndpoint}/GetPlanet/v0001/?id=${planetId}&language=english`) 129 | const planet: { 130 | planets: Array<{ 131 | id: string, 132 | state: { 133 | name: string, 134 | }, 135 | giveaway_apps: Array, 136 | top_clans: Array, 137 | zones: Array<{ 138 | zone_position: number, 139 | leader: object, 140 | type: number, 141 | gameid: string, 142 | difficulty: number, 143 | captured: boolean, 144 | capture_progress: number, 145 | top_clans: Array 146 | }>, 147 | }> 148 | } = planetRequest.data.response 149 | return planet 150 | } 151 | 152 | async joinZoneRequest(zoneId: number) { 153 | const joinRequest = await axios.post(`${apiEndpoint}/JoinZone/v0001/`, 154 | `zone_position=${zoneId}&access_token=${this.token}`) 155 | const joinMessage: { 156 | active_planet: string|null, 157 | level: number|null, 158 | next_level_score : string|null, 159 | score : string|null, 160 | time_on_planet : number|null, 161 | } = joinRequest.data.response 162 | return joinMessage 163 | } 164 | 165 | async postScoreRequest(score: number) { 166 | const requestScoreRequest = await axios.post(`${apiEndpoint}/ReportScore/v0001/`, 167 | `access_token=${this.token}&score=${score}&language=english`) 168 | 169 | const requestScore: { 170 | new_score: string, 171 | } = requestScoreRequest.data.response 172 | return requestScore 173 | } 174 | 175 | async leaveRequest() { 176 | const playerInfo = await this.getPlayerInfoRequest() 177 | 178 | await axios.post(`${steamHost}/IMiniGameService/LeaveGame/v0001/`, 179 | `access_token=${this.token}&gameid=${playerInfo.active_planet}`) 180 | } 181 | 182 | async joinBossZone(zoneId: number, errorTimes: number = 0) { 183 | const joinRequest = await axios.post(`${apiEndpoint}/JoinBossZone/v0001/`, 184 | `access_token=${this.token}&zone_position=${zoneId}`) 185 | 186 | const joinResponse : { 187 | gameid: string, 188 | waiting_for_players: boolean, 189 | zone_info: { 190 | boss_active: boolean, 191 | capture_progress: number, 192 | captured: boolean, 193 | difficulty: number, 194 | gameid: string, 195 | leader: object, 196 | top_clans: Array, 197 | type: number, 198 | zone_position: number 199 | } 200 | } = joinRequest.data.response 201 | if (joinRequest.headers['eresult'] === 11 && errorTimes < 10) { 202 | this.logger.info('>> Join boss zone error, retrying') 203 | await this.joinBossZone(zoneId, errorTimes + 1) 204 | } 205 | this.logger.info('>> Joined BOSS zone') 206 | this.waitForPlayer = joinResponse.waiting_for_players 207 | } 208 | 209 | async sendBossDamage(): Promise { 210 | const damageTaken = 0 211 | const damageToBoss = 1 212 | let useHeal = 0 213 | const now = Math.floor(new Date().getTime() / 1000) 214 | if (now > this.nextHeal) { 215 | useHeal = 1 216 | this.nextHeal = now + 120 217 | this.logger.info('>> Using heal ability') 218 | } 219 | const damageRequest = await axios.post(`${apiEndpoint}/ReportBossDamage/v0001/`, 220 | `access_token=${this.token}&use_heal_ability=${useHeal}&damage_to_boss=${damageToBoss}&damage_taken=${damageTaken}`) 221 | const damageResponse: BossResponse = damageRequest.data.response 222 | 223 | this.waitForPlayer = damageResponse.waiting_for_players 224 | 225 | if (damageResponse.boss_status === undefined) { 226 | return damageResponse 227 | } 228 | 229 | this.logger.info(`>> Boss HP: ${damageResponse.boss_status.boss_hp} / ${damageResponse.boss_status.boss_max_hp}`) 230 | return damageResponse 231 | } 232 | } 233 | } 234 | 235 | export default Requests 236 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk' 2 | import * as moment from 'moment'; 3 | import event, { events } from './event' 4 | 5 | namespace Utils { 6 | export class Logger { 7 | static LEVEL_INFO = Symbol('info') 8 | static LEVEL_WARN = Symbol('warn') 9 | static LEVEL_ERROR = Symbol('error') 10 | 11 | level: Symbol 12 | prefix: string 13 | 14 | constructor(level: Symbol = Logger.LEVEL_INFO, prefix: string = "application") { 15 | this.level = level 16 | this.prefix = prefix 17 | } 18 | 19 | info(message: string) { 20 | if (this.level === Logger.LEVEL_INFO) { 21 | this.sendMessage(message, Logger.LEVEL_INFO) 22 | } 23 | } 24 | 25 | warn(message: string) { 26 | if (this.level === Logger.LEVEL_INFO || this.level === Logger.LEVEL_WARN) { 27 | this.sendMessage(message, Logger.LEVEL_WARN) 28 | } 29 | } 30 | 31 | error(message: string) { 32 | this.sendMessage(message, Logger.LEVEL_ERROR) 33 | } 34 | 35 | private sendMessage(message: string, level: Symbol) { 36 | let name = chalk.blue('info') 37 | let noColor = 'info' 38 | let out = console.log 39 | switch (level) { 40 | case Logger.LEVEL_WARN: { 41 | out = console.warn 42 | name = chalk.yellow('warn') 43 | noColor = 'warn' 44 | break 45 | } 46 | case Logger.LEVEL_ERROR: { 47 | out = console.error 48 | name = chalk.red('error') 49 | noColor = 'error' 50 | break 51 | } 52 | } 53 | 54 | const newMessage = `[${name}][${this.prefix}][${moment().format('LTS')}]: ${message}` 55 | event.emit(events.LogEvent, `[${noColor}][${this.prefix}][${moment().format('LTS')}]: ${message}`.replace(/ /g, " ")) 56 | out(newMessage) 57 | } 58 | } 59 | 60 | export class Time { 61 | static Second = 1000 62 | static Minute = Time.Second * 60 63 | 64 | static async wait(time: number) { 65 | return new Promise((res, rej) => { 66 | setTimeout(res, time) 67 | }) 68 | } 69 | } 70 | } 71 | 72 | export default Utils 73 | -------------------------------------------------------------------------------- /src/web.ts: -------------------------------------------------------------------------------- 1 | import * as koa from 'koa' 2 | import * as logger from 'koa-logger' 3 | import * as http from 'http' 4 | import * as io from 'socket.io' 5 | import * as util from 'util' 6 | import * as fs from 'fs' 7 | import * as auth from 'socketio-auth' 8 | import * as config from 'config' 9 | import './index' 10 | 11 | const readFile = util.promisify(fs.readFile) 12 | 13 | let HTML_TEMPALTE: null|string = null 14 | 15 | import event, { events } from './event' 16 | 17 | const app = new koa() 18 | const server = new http.Server(app.callback()) 19 | const ioApp = io(server) 20 | 21 | auth(ioApp, { 22 | authenticate: (socket, data: {username: string, password: string}, callback) => { 23 | return callback(null, data.password === config.get('webPass')) 24 | } 25 | }) 26 | 27 | ioApp.on('connection', socket => { 28 | event.on(events.LogEvent, message => { 29 | socket.emit('log', message) 30 | }) 31 | }) 32 | 33 | app.use(logger()) 34 | 35 | app.use(async ctx => { 36 | if (HTML_TEMPALTE === null) { 37 | HTML_TEMPALTE = (await readFile('index.html')).toString() 38 | } 39 | 40 | ctx.response.body = HTML_TEMPALTE 41 | }) 42 | 43 | const port = process.env.PORT || 3000 44 | 45 | server.listen(port) 46 | console.log(`App is started at port ${port}`) 47 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "commonjs", 5 | "lib": [ 6 | "es2015", 7 | "es2015.promise", 8 | "dom" 9 | ], 10 | "outDir": "dist", 11 | "declaration": true 12 | }, 13 | "include": [ 14 | "src/**/*.ts" 15 | ], 16 | "exclude": [ 17 | 18 | ], 19 | "compileOnSave": true 20 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/accepts@*": 6 | version "1.3.5" 7 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 8 | dependencies: 9 | "@types/node" "*" 10 | 11 | "@types/body-parser@*": 12 | version "1.17.0" 13 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 14 | dependencies: 15 | "@types/connect" "*" 16 | "@types/node" "*" 17 | 18 | "@types/connect@*": 19 | version "3.4.32" 20 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 21 | dependencies: 22 | "@types/node" "*" 23 | 24 | "@types/cookies@*": 25 | version "0.7.1" 26 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.1.tgz#f9f204bd6767d389eea3b87609e30c090c77a540" 27 | dependencies: 28 | "@types/connect" "*" 29 | "@types/express" "*" 30 | "@types/keygrip" "*" 31 | "@types/node" "*" 32 | 33 | "@types/events@*": 34 | version "1.2.0" 35 | resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" 36 | 37 | "@types/express-serve-static-core@*": 38 | version "4.16.0" 39 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" 40 | dependencies: 41 | "@types/events" "*" 42 | "@types/node" "*" 43 | "@types/range-parser" "*" 44 | 45 | "@types/express@*": 46 | version "4.16.0" 47 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" 48 | dependencies: 49 | "@types/body-parser" "*" 50 | "@types/express-serve-static-core" "*" 51 | "@types/serve-static" "*" 52 | 53 | "@types/http-assert@*": 54 | version "1.3.0" 55 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.3.0.tgz#5e932606153da28e1d04f9043f4912cf61fd55dd" 56 | 57 | "@types/keygrip@*": 58 | version "1.0.1" 59 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878" 60 | 61 | "@types/koa-compose@*": 62 | version "3.2.2" 63 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.2.tgz#dc106e000bbf92a3ac900f756df47344887ee847" 64 | 65 | "@types/koa@^2.0.46": 66 | version "2.0.46" 67 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.46.tgz#24bc3cd405d10fcde81f876cd8285b44d4ddc3e9" 68 | dependencies: 69 | "@types/accepts" "*" 70 | "@types/cookies" "*" 71 | "@types/events" "*" 72 | "@types/http-assert" "*" 73 | "@types/keygrip" "*" 74 | "@types/koa-compose" "*" 75 | "@types/node" "*" 76 | 77 | "@types/mime@*": 78 | version "2.0.0" 79 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 80 | 81 | "@types/node@*": 82 | version "10.3.5" 83 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.5.tgz#8423cdf6e6fb83433e489900d7600d3b61c8260c" 84 | 85 | "@types/node@^10.3.3": 86 | version "10.3.3" 87 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3" 88 | 89 | "@types/range-parser@*": 90 | version "1.2.2" 91 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" 92 | 93 | "@types/serve-static@*": 94 | version "1.13.2" 95 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 96 | dependencies: 97 | "@types/express-serve-static-core" "*" 98 | "@types/mime" "*" 99 | 100 | "@types/socket.io@^1.4.36": 101 | version "1.4.36" 102 | resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-1.4.36.tgz#9d7d175d602110a72223c7938932d8d947c429fa" 103 | dependencies: 104 | "@types/node" "*" 105 | 106 | accepts@^1.2.2, accepts@~1.3.4: 107 | version "1.3.5" 108 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 109 | dependencies: 110 | mime-types "~2.1.18" 111 | negotiator "0.6.1" 112 | 113 | acorn-jsx@^3.0.0: 114 | version "3.0.1" 115 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 116 | dependencies: 117 | acorn "^3.0.4" 118 | 119 | acorn@^3.0.4: 120 | version "3.3.0" 121 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 122 | 123 | acorn@^5.5.0: 124 | version "5.7.1" 125 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" 126 | 127 | after@0.8.2: 128 | version "0.8.2" 129 | resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 130 | 131 | ajv-keywords@^2.1.0: 132 | version "2.1.1" 133 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 134 | 135 | ajv@^5.2.3, ajv@^5.3.0: 136 | version "5.5.2" 137 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 138 | dependencies: 139 | co "^4.6.0" 140 | fast-deep-equal "^1.0.0" 141 | fast-json-stable-stringify "^2.0.0" 142 | json-schema-traverse "^0.3.0" 143 | 144 | ansi-escapes@^3.0.0: 145 | version "3.1.0" 146 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 147 | 148 | ansi-regex@^2.0.0: 149 | version "2.1.1" 150 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 151 | 152 | ansi-regex@^3.0.0: 153 | version "3.0.0" 154 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 155 | 156 | ansi-styles@^2.2.1: 157 | version "2.2.1" 158 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 159 | 160 | ansi-styles@^3.2.1: 161 | version "3.2.1" 162 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 163 | dependencies: 164 | color-convert "^1.9.0" 165 | 166 | any-promise@^1.1.0: 167 | version "1.3.0" 168 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 169 | 170 | argparse@^1.0.7: 171 | version "1.0.10" 172 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 173 | dependencies: 174 | sprintf-js "~1.0.2" 175 | 176 | array-union@^1.0.1: 177 | version "1.0.2" 178 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 179 | dependencies: 180 | array-uniq "^1.0.1" 181 | 182 | array-uniq@^1.0.1: 183 | version "1.0.3" 184 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 185 | 186 | arraybuffer.slice@~0.0.7: 187 | version "0.0.7" 188 | resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 189 | 190 | arrify@^1.0.0: 191 | version "1.0.1" 192 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 193 | 194 | async-limiter@~1.0.0: 195 | version "1.0.0" 196 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 197 | 198 | axios@^0.18.0: 199 | version "0.18.0" 200 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" 201 | dependencies: 202 | follow-redirects "^1.3.0" 203 | is-buffer "^1.1.5" 204 | 205 | babel-code-frame@^6.22.0: 206 | version "6.26.0" 207 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 208 | dependencies: 209 | chalk "^1.1.3" 210 | esutils "^2.0.2" 211 | js-tokens "^3.0.2" 212 | 213 | backo2@1.0.2: 214 | version "1.0.2" 215 | resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 216 | 217 | balanced-match@^1.0.0: 218 | version "1.0.0" 219 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 220 | 221 | base64-arraybuffer@0.1.5: 222 | version "0.1.5" 223 | resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 224 | 225 | base64id@1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 228 | 229 | better-assert@~1.0.0: 230 | version "1.0.2" 231 | resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 232 | dependencies: 233 | callsite "1.0.0" 234 | 235 | blob@0.0.4: 236 | version "0.0.4" 237 | resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" 238 | 239 | brace-expansion@^1.1.7: 240 | version "1.1.11" 241 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 242 | dependencies: 243 | balanced-match "^1.0.0" 244 | concat-map "0.0.1" 245 | 246 | buffer-from@^1.0.0, buffer-from@^1.1.0: 247 | version "1.1.0" 248 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" 249 | 250 | bytes@^2.5.0: 251 | version "2.5.0" 252 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" 253 | 254 | caller-path@^0.1.0: 255 | version "0.1.0" 256 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 257 | dependencies: 258 | callsites "^0.2.0" 259 | 260 | callsite@1.0.0: 261 | version "1.0.0" 262 | resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 263 | 264 | callsites@^0.2.0: 265 | version "0.2.0" 266 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 267 | 268 | chalk@^1.1.3: 269 | version "1.1.3" 270 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 271 | dependencies: 272 | ansi-styles "^2.2.1" 273 | escape-string-regexp "^1.0.2" 274 | has-ansi "^2.0.0" 275 | strip-ansi "^3.0.0" 276 | supports-color "^2.0.0" 277 | 278 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1: 279 | version "2.4.1" 280 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 281 | dependencies: 282 | ansi-styles "^3.2.1" 283 | escape-string-regexp "^1.0.5" 284 | supports-color "^5.3.0" 285 | 286 | chardet@^0.4.0: 287 | version "0.4.2" 288 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 289 | 290 | circular-json@^0.3.1: 291 | version "0.3.3" 292 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 293 | 294 | cli-cursor@^2.1.0: 295 | version "2.1.0" 296 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 297 | dependencies: 298 | restore-cursor "^2.0.0" 299 | 300 | cli-width@^2.0.0: 301 | version "2.2.0" 302 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 303 | 304 | co@^4.6.0: 305 | version "4.6.0" 306 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 307 | 308 | color-convert@^1.9.0: 309 | version "1.9.2" 310 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 311 | dependencies: 312 | color-name "1.1.1" 313 | 314 | color-name@1.1.1: 315 | version "1.1.1" 316 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 317 | 318 | component-bind@1.0.0: 319 | version "1.0.0" 320 | resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 321 | 322 | component-emitter@1.2.1: 323 | version "1.2.1" 324 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 325 | 326 | component-inherit@0.0.3: 327 | version "0.0.3" 328 | resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 329 | 330 | concat-map@0.0.1: 331 | version "0.0.1" 332 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 333 | 334 | concat-stream@^1.6.0: 335 | version "1.6.2" 336 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 337 | dependencies: 338 | buffer-from "^1.0.0" 339 | inherits "^2.0.3" 340 | readable-stream "^2.2.2" 341 | typedarray "^0.0.6" 342 | 343 | config@^1.30.0: 344 | version "1.30.0" 345 | resolved "https://registry.yarnpkg.com/config/-/config-1.30.0.tgz#1d60a9f35348a13c175798d384e81a5a16c3ba6e" 346 | dependencies: 347 | json5 "0.4.0" 348 | os-homedir "1.0.2" 349 | 350 | content-disposition@~0.5.0: 351 | version "0.5.2" 352 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 353 | 354 | content-type@^1.0.0: 355 | version "1.0.4" 356 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 357 | 358 | cookie@0.3.1: 359 | version "0.3.1" 360 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 361 | 362 | cookies@~0.7.0: 363 | version "0.7.1" 364 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" 365 | dependencies: 366 | depd "~1.1.1" 367 | keygrip "~1.0.2" 368 | 369 | core-util-is@~1.0.0: 370 | version "1.0.2" 371 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 372 | 373 | cross-spawn@^5.1.0: 374 | version "5.1.0" 375 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 376 | dependencies: 377 | lru-cache "^4.0.1" 378 | shebang-command "^1.2.0" 379 | which "^1.2.9" 380 | 381 | debug@*, debug@^3.1.0, debug@~3.1.0: 382 | version "3.1.0" 383 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 384 | dependencies: 385 | ms "2.0.0" 386 | 387 | debug@^2.1.3: 388 | version "2.6.9" 389 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 390 | dependencies: 391 | ms "2.0.0" 392 | 393 | deep-equal@~1.0.1: 394 | version "1.0.1" 395 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 396 | 397 | deep-is@~0.1.3: 398 | version "0.1.3" 399 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 400 | 401 | del@^2.0.2: 402 | version "2.2.2" 403 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 404 | dependencies: 405 | globby "^5.0.0" 406 | is-path-cwd "^1.0.0" 407 | is-path-in-cwd "^1.0.0" 408 | object-assign "^4.0.1" 409 | pify "^2.0.0" 410 | pinkie-promise "^2.0.0" 411 | rimraf "^2.2.8" 412 | 413 | delegates@^1.0.0: 414 | version "1.0.0" 415 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 416 | 417 | depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: 418 | version "1.1.2" 419 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 420 | 421 | destroy@^1.0.3: 422 | version "1.0.4" 423 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 424 | 425 | diff@^3.1.0: 426 | version "3.5.0" 427 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 428 | 429 | doctrine@^2.1.0: 430 | version "2.1.0" 431 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 432 | dependencies: 433 | esutils "^2.0.2" 434 | 435 | ee-first@1.1.1: 436 | version "1.1.1" 437 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 438 | 439 | engine.io-client@~3.2.0: 440 | version "3.2.1" 441 | resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" 442 | dependencies: 443 | component-emitter "1.2.1" 444 | component-inherit "0.0.3" 445 | debug "~3.1.0" 446 | engine.io-parser "~2.1.1" 447 | has-cors "1.1.0" 448 | indexof "0.0.1" 449 | parseqs "0.0.5" 450 | parseuri "0.0.5" 451 | ws "~3.3.1" 452 | xmlhttprequest-ssl "~1.5.4" 453 | yeast "0.1.2" 454 | 455 | engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: 456 | version "2.1.2" 457 | resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" 458 | dependencies: 459 | after "0.8.2" 460 | arraybuffer.slice "~0.0.7" 461 | base64-arraybuffer "0.1.5" 462 | blob "0.0.4" 463 | has-binary2 "~1.0.2" 464 | 465 | engine.io@~3.2.0: 466 | version "3.2.0" 467 | resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" 468 | dependencies: 469 | accepts "~1.3.4" 470 | base64id "1.0.0" 471 | cookie "0.3.1" 472 | debug "~3.1.0" 473 | engine.io-parser "~2.1.0" 474 | ws "~3.3.1" 475 | 476 | error-inject@~1.0.0: 477 | version "1.0.0" 478 | resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 479 | 480 | escape-html@~1.0.1: 481 | version "1.0.3" 482 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 483 | 484 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 485 | version "1.0.5" 486 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 487 | 488 | eslint-scope@^3.7.1: 489 | version "3.7.1" 490 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 491 | dependencies: 492 | esrecurse "^4.1.0" 493 | estraverse "^4.1.1" 494 | 495 | eslint-visitor-keys@^1.0.0: 496 | version "1.0.0" 497 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 498 | 499 | eslint@^4.19.1: 500 | version "4.19.1" 501 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 502 | dependencies: 503 | ajv "^5.3.0" 504 | babel-code-frame "^6.22.0" 505 | chalk "^2.1.0" 506 | concat-stream "^1.6.0" 507 | cross-spawn "^5.1.0" 508 | debug "^3.1.0" 509 | doctrine "^2.1.0" 510 | eslint-scope "^3.7.1" 511 | eslint-visitor-keys "^1.0.0" 512 | espree "^3.5.4" 513 | esquery "^1.0.0" 514 | esutils "^2.0.2" 515 | file-entry-cache "^2.0.0" 516 | functional-red-black-tree "^1.0.1" 517 | glob "^7.1.2" 518 | globals "^11.0.1" 519 | ignore "^3.3.3" 520 | imurmurhash "^0.1.4" 521 | inquirer "^3.0.6" 522 | is-resolvable "^1.0.0" 523 | js-yaml "^3.9.1" 524 | json-stable-stringify-without-jsonify "^1.0.1" 525 | levn "^0.3.0" 526 | lodash "^4.17.4" 527 | minimatch "^3.0.2" 528 | mkdirp "^0.5.1" 529 | natural-compare "^1.4.0" 530 | optionator "^0.8.2" 531 | path-is-inside "^1.0.2" 532 | pluralize "^7.0.0" 533 | progress "^2.0.0" 534 | regexpp "^1.0.1" 535 | require-uncached "^1.0.3" 536 | semver "^5.3.0" 537 | strip-ansi "^4.0.0" 538 | strip-json-comments "~2.0.1" 539 | table "4.0.2" 540 | text-table "~0.2.0" 541 | 542 | espree@^3.5.4: 543 | version "3.5.4" 544 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 545 | dependencies: 546 | acorn "^5.5.0" 547 | acorn-jsx "^3.0.0" 548 | 549 | esprima@^4.0.0: 550 | version "4.0.0" 551 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 552 | 553 | esquery@^1.0.0: 554 | version "1.0.1" 555 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 556 | dependencies: 557 | estraverse "^4.0.0" 558 | 559 | esrecurse@^4.1.0: 560 | version "4.2.1" 561 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 562 | dependencies: 563 | estraverse "^4.1.0" 564 | 565 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 566 | version "4.2.0" 567 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 568 | 569 | esutils@^2.0.2: 570 | version "2.0.2" 571 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 572 | 573 | external-editor@^2.0.4: 574 | version "2.2.0" 575 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 576 | dependencies: 577 | chardet "^0.4.0" 578 | iconv-lite "^0.4.17" 579 | tmp "^0.0.33" 580 | 581 | fast-deep-equal@^1.0.0: 582 | version "1.1.0" 583 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 584 | 585 | fast-json-stable-stringify@^2.0.0: 586 | version "2.0.0" 587 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 588 | 589 | fast-levenshtein@~2.0.4: 590 | version "2.0.6" 591 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 592 | 593 | figures@^2.0.0: 594 | version "2.0.0" 595 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 596 | dependencies: 597 | escape-string-regexp "^1.0.5" 598 | 599 | file-entry-cache@^2.0.0: 600 | version "2.0.0" 601 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 602 | dependencies: 603 | flat-cache "^1.2.1" 604 | object-assign "^4.0.1" 605 | 606 | flat-cache@^1.2.1: 607 | version "1.3.0" 608 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 609 | dependencies: 610 | circular-json "^0.3.1" 611 | del "^2.0.2" 612 | graceful-fs "^4.1.2" 613 | write "^0.2.1" 614 | 615 | follow-redirects@^1.3.0: 616 | version "1.5.0" 617 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.0.tgz#234f49cf770b7f35b40e790f636ceba0c3a0ab77" 618 | dependencies: 619 | debug "^3.1.0" 620 | 621 | fresh@^0.5.2: 622 | version "0.5.2" 623 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 624 | 625 | fs.realpath@^1.0.0: 626 | version "1.0.0" 627 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 628 | 629 | functional-red-black-tree@^1.0.1: 630 | version "1.0.1" 631 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 632 | 633 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 634 | version "7.1.2" 635 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 636 | dependencies: 637 | fs.realpath "^1.0.0" 638 | inflight "^1.0.4" 639 | inherits "2" 640 | minimatch "^3.0.4" 641 | once "^1.3.0" 642 | path-is-absolute "^1.0.0" 643 | 644 | globals@^11.0.1: 645 | version "11.5.0" 646 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" 647 | 648 | globby@^5.0.0: 649 | version "5.0.0" 650 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 651 | dependencies: 652 | array-union "^1.0.1" 653 | arrify "^1.0.0" 654 | glob "^7.0.3" 655 | object-assign "^4.0.1" 656 | pify "^2.0.0" 657 | pinkie-promise "^2.0.0" 658 | 659 | graceful-fs@^4.1.2: 660 | version "4.1.11" 661 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 662 | 663 | has-ansi@^2.0.0: 664 | version "2.0.0" 665 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 666 | dependencies: 667 | ansi-regex "^2.0.0" 668 | 669 | has-binary2@~1.0.2: 670 | version "1.0.3" 671 | resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" 672 | dependencies: 673 | isarray "2.0.1" 674 | 675 | has-cors@1.1.0: 676 | version "1.1.0" 677 | resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 678 | 679 | has-flag@^3.0.0: 680 | version "3.0.0" 681 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 682 | 683 | http-assert@^1.1.0: 684 | version "1.3.0" 685 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" 686 | dependencies: 687 | deep-equal "~1.0.1" 688 | http-errors "~1.6.1" 689 | 690 | http-errors@^1.2.8, http-errors@~1.6.1: 691 | version "1.6.3" 692 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 693 | dependencies: 694 | depd "~1.1.2" 695 | inherits "2.0.3" 696 | setprototypeof "1.1.0" 697 | statuses ">= 1.4.0 < 2" 698 | 699 | humanize-number@0.0.2: 700 | version "0.0.2" 701 | resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" 702 | 703 | iconv-lite@^0.4.17: 704 | version "0.4.23" 705 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 706 | dependencies: 707 | safer-buffer ">= 2.1.2 < 3" 708 | 709 | ignore@^3.3.3: 710 | version "3.3.8" 711 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" 712 | 713 | imurmurhash@^0.1.4: 714 | version "0.1.4" 715 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 716 | 717 | indexof@0.0.1: 718 | version "0.0.1" 719 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 720 | 721 | inflight@^1.0.4: 722 | version "1.0.6" 723 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 724 | dependencies: 725 | once "^1.3.0" 726 | wrappy "1" 727 | 728 | inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.3: 729 | version "2.0.3" 730 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 731 | 732 | inquirer@^3.0.6: 733 | version "3.3.0" 734 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 735 | dependencies: 736 | ansi-escapes "^3.0.0" 737 | chalk "^2.0.0" 738 | cli-cursor "^2.1.0" 739 | cli-width "^2.0.0" 740 | external-editor "^2.0.4" 741 | figures "^2.0.0" 742 | lodash "^4.3.0" 743 | mute-stream "0.0.7" 744 | run-async "^2.2.0" 745 | rx-lite "^4.0.8" 746 | rx-lite-aggregates "^4.0.8" 747 | string-width "^2.1.0" 748 | strip-ansi "^4.0.0" 749 | through "^2.3.6" 750 | 751 | is-buffer@^1.1.5: 752 | version "1.1.6" 753 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 754 | 755 | is-fullwidth-code-point@^2.0.0: 756 | version "2.0.0" 757 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 758 | 759 | is-generator-function@^1.0.3: 760 | version "1.0.7" 761 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 762 | 763 | is-path-cwd@^1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 766 | 767 | is-path-in-cwd@^1.0.0: 768 | version "1.0.1" 769 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 770 | dependencies: 771 | is-path-inside "^1.0.0" 772 | 773 | is-path-inside@^1.0.0: 774 | version "1.0.1" 775 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 776 | dependencies: 777 | path-is-inside "^1.0.1" 778 | 779 | is-promise@^2.1.0: 780 | version "2.1.0" 781 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 782 | 783 | is-resolvable@^1.0.0: 784 | version "1.1.0" 785 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 786 | 787 | isarray@2.0.1: 788 | version "2.0.1" 789 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 790 | 791 | isarray@~1.0.0: 792 | version "1.0.0" 793 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 794 | 795 | isexe@^2.0.0: 796 | version "2.0.0" 797 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 798 | 799 | js-tokens@^3.0.2: 800 | version "3.0.2" 801 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 802 | 803 | js-yaml@^3.9.1: 804 | version "3.12.0" 805 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 806 | dependencies: 807 | argparse "^1.0.7" 808 | esprima "^4.0.0" 809 | 810 | json-schema-traverse@^0.3.0: 811 | version "0.3.1" 812 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 813 | 814 | json-stable-stringify-without-jsonify@^1.0.1: 815 | version "1.0.1" 816 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 817 | 818 | json5@0.4.0: 819 | version "0.4.0" 820 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" 821 | 822 | keygrip@~1.0.2: 823 | version "1.0.2" 824 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" 825 | 826 | koa-compose@^3.0.0: 827 | version "3.2.1" 828 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 829 | dependencies: 830 | any-promise "^1.1.0" 831 | 832 | koa-compose@^4.0.0: 833 | version "4.1.0" 834 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 835 | 836 | koa-convert@^1.2.0: 837 | version "1.2.0" 838 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 839 | dependencies: 840 | co "^4.6.0" 841 | koa-compose "^3.0.0" 842 | 843 | koa-is-json@^1.0.0: 844 | version "1.0.0" 845 | resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" 846 | 847 | koa-logger@^3.2.0: 848 | version "3.2.0" 849 | resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.0.tgz#8aef64d8b848fb6253a9b31aa708d0e05141f0e6" 850 | dependencies: 851 | bytes "^2.5.0" 852 | chalk "^1.1.3" 853 | humanize-number "0.0.2" 854 | passthrough-counter "^1.0.0" 855 | 856 | koa@^2.5.1: 857 | version "2.5.1" 858 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.1.tgz#79f8b95f8d72d04fe9a58a8da5ebd6d341103f9c" 859 | dependencies: 860 | accepts "^1.2.2" 861 | content-disposition "~0.5.0" 862 | content-type "^1.0.0" 863 | cookies "~0.7.0" 864 | debug "*" 865 | delegates "^1.0.0" 866 | depd "^1.1.0" 867 | destroy "^1.0.3" 868 | error-inject "~1.0.0" 869 | escape-html "~1.0.1" 870 | fresh "^0.5.2" 871 | http-assert "^1.1.0" 872 | http-errors "^1.2.8" 873 | is-generator-function "^1.0.3" 874 | koa-compose "^4.0.0" 875 | koa-convert "^1.2.0" 876 | koa-is-json "^1.0.0" 877 | mime-types "^2.0.7" 878 | on-finished "^2.1.0" 879 | only "0.0.2" 880 | parseurl "^1.3.0" 881 | statuses "^1.2.0" 882 | type-is "^1.5.5" 883 | vary "^1.0.0" 884 | 885 | levn@^0.3.0, levn@~0.3.0: 886 | version "0.3.0" 887 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 888 | dependencies: 889 | prelude-ls "~1.1.2" 890 | type-check "~0.3.2" 891 | 892 | lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: 893 | version "4.17.10" 894 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 895 | 896 | lru-cache@^4.0.1: 897 | version "4.1.3" 898 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 899 | dependencies: 900 | pseudomap "^1.0.2" 901 | yallist "^2.1.2" 902 | 903 | make-error@^1.1.1: 904 | version "1.3.4" 905 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" 906 | 907 | media-typer@0.3.0: 908 | version "0.3.0" 909 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 910 | 911 | mime-db@~1.33.0: 912 | version "1.33.0" 913 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 914 | 915 | mime-types@^2.0.7, mime-types@~2.1.18: 916 | version "2.1.18" 917 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 918 | dependencies: 919 | mime-db "~1.33.0" 920 | 921 | mimic-fn@^1.0.0: 922 | version "1.2.0" 923 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 924 | 925 | minimatch@^3.0.2, minimatch@^3.0.4: 926 | version "3.0.4" 927 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 928 | dependencies: 929 | brace-expansion "^1.1.7" 930 | 931 | minimist@0.0.8: 932 | version "0.0.8" 933 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 934 | 935 | minimist@^1.2.0: 936 | version "1.2.0" 937 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 938 | 939 | mkdirp@^0.5.1: 940 | version "0.5.1" 941 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 942 | dependencies: 943 | minimist "0.0.8" 944 | 945 | moment@^2.22.2: 946 | version "2.22.2" 947 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 948 | 949 | ms@2.0.0: 950 | version "2.0.0" 951 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 952 | 953 | mute-stream@0.0.7: 954 | version "0.0.7" 955 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 956 | 957 | natural-compare@^1.4.0: 958 | version "1.4.0" 959 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 960 | 961 | negotiator@0.6.1: 962 | version "0.6.1" 963 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 964 | 965 | object-assign@^4.0.1: 966 | version "4.1.1" 967 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 968 | 969 | object-component@0.0.3: 970 | version "0.0.3" 971 | resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 972 | 973 | on-finished@^2.1.0: 974 | version "2.3.0" 975 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 976 | dependencies: 977 | ee-first "1.1.1" 978 | 979 | once@^1.3.0: 980 | version "1.4.0" 981 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 982 | dependencies: 983 | wrappy "1" 984 | 985 | onetime@^2.0.0: 986 | version "2.0.1" 987 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 988 | dependencies: 989 | mimic-fn "^1.0.0" 990 | 991 | only@0.0.2: 992 | version "0.0.2" 993 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 994 | 995 | optionator@^0.8.2: 996 | version "0.8.2" 997 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 998 | dependencies: 999 | deep-is "~0.1.3" 1000 | fast-levenshtein "~2.0.4" 1001 | levn "~0.3.0" 1002 | prelude-ls "~1.1.2" 1003 | type-check "~0.3.2" 1004 | wordwrap "~1.0.0" 1005 | 1006 | os-homedir@1.0.2: 1007 | version "1.0.2" 1008 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1009 | 1010 | os-tmpdir@~1.0.2: 1011 | version "1.0.2" 1012 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1013 | 1014 | parseqs@0.0.5: 1015 | version "0.0.5" 1016 | resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 1017 | dependencies: 1018 | better-assert "~1.0.0" 1019 | 1020 | parseuri@0.0.5: 1021 | version "0.0.5" 1022 | resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 1023 | dependencies: 1024 | better-assert "~1.0.0" 1025 | 1026 | parseurl@^1.3.0: 1027 | version "1.3.2" 1028 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 1029 | 1030 | passthrough-counter@^1.0.0: 1031 | version "1.0.0" 1032 | resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa" 1033 | 1034 | path-is-absolute@^1.0.0: 1035 | version "1.0.1" 1036 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1037 | 1038 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1039 | version "1.0.2" 1040 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1041 | 1042 | pify@^2.0.0: 1043 | version "2.3.0" 1044 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1045 | 1046 | pinkie-promise@^2.0.0: 1047 | version "2.0.1" 1048 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1049 | dependencies: 1050 | pinkie "^2.0.0" 1051 | 1052 | pinkie@^2.0.0: 1053 | version "2.0.4" 1054 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1055 | 1056 | pluralize@^7.0.0: 1057 | version "7.0.0" 1058 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1059 | 1060 | prelude-ls@~1.1.2: 1061 | version "1.1.2" 1062 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1063 | 1064 | process-nextick-args@~2.0.0: 1065 | version "2.0.0" 1066 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1067 | 1068 | progress@^2.0.0: 1069 | version "2.0.0" 1070 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1071 | 1072 | pseudomap@^1.0.2: 1073 | version "1.0.2" 1074 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1075 | 1076 | readable-stream@^2.2.2: 1077 | version "2.3.6" 1078 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1079 | dependencies: 1080 | core-util-is "~1.0.0" 1081 | inherits "~2.0.3" 1082 | isarray "~1.0.0" 1083 | process-nextick-args "~2.0.0" 1084 | safe-buffer "~5.1.1" 1085 | string_decoder "~1.1.1" 1086 | util-deprecate "~1.0.1" 1087 | 1088 | regexpp@^1.0.1: 1089 | version "1.1.0" 1090 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 1091 | 1092 | require-uncached@^1.0.3: 1093 | version "1.0.3" 1094 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1095 | dependencies: 1096 | caller-path "^0.1.0" 1097 | resolve-from "^1.0.0" 1098 | 1099 | resolve-from@^1.0.0: 1100 | version "1.0.1" 1101 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1102 | 1103 | restore-cursor@^2.0.0: 1104 | version "2.0.0" 1105 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1106 | dependencies: 1107 | onetime "^2.0.0" 1108 | signal-exit "^3.0.2" 1109 | 1110 | rimraf@^2.2.8: 1111 | version "2.6.2" 1112 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1113 | dependencies: 1114 | glob "^7.0.5" 1115 | 1116 | run-async@^2.2.0: 1117 | version "2.3.0" 1118 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1119 | dependencies: 1120 | is-promise "^2.1.0" 1121 | 1122 | rx-lite-aggregates@^4.0.8: 1123 | version "4.0.8" 1124 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1125 | dependencies: 1126 | rx-lite "*" 1127 | 1128 | rx-lite@*, rx-lite@^4.0.8: 1129 | version "4.0.8" 1130 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1131 | 1132 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1133 | version "5.1.2" 1134 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1135 | 1136 | "safer-buffer@>= 2.1.2 < 3": 1137 | version "2.1.2" 1138 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1139 | 1140 | semver@^5.3.0: 1141 | version "5.5.0" 1142 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1143 | 1144 | setprototypeof@1.1.0: 1145 | version "1.1.0" 1146 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 1147 | 1148 | shebang-command@^1.2.0: 1149 | version "1.2.0" 1150 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1151 | dependencies: 1152 | shebang-regex "^1.0.0" 1153 | 1154 | shebang-regex@^1.0.0: 1155 | version "1.0.0" 1156 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1157 | 1158 | signal-exit@^3.0.2: 1159 | version "3.0.2" 1160 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1161 | 1162 | slice-ansi@1.0.0: 1163 | version "1.0.0" 1164 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 1165 | dependencies: 1166 | is-fullwidth-code-point "^2.0.0" 1167 | 1168 | socket.io-adapter@~1.1.0: 1169 | version "1.1.1" 1170 | resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" 1171 | 1172 | socket.io-client@2.1.1: 1173 | version "2.1.1" 1174 | resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" 1175 | dependencies: 1176 | backo2 "1.0.2" 1177 | base64-arraybuffer "0.1.5" 1178 | component-bind "1.0.0" 1179 | component-emitter "1.2.1" 1180 | debug "~3.1.0" 1181 | engine.io-client "~3.2.0" 1182 | has-binary2 "~1.0.2" 1183 | has-cors "1.1.0" 1184 | indexof "0.0.1" 1185 | object-component "0.0.3" 1186 | parseqs "0.0.5" 1187 | parseuri "0.0.5" 1188 | socket.io-parser "~3.2.0" 1189 | to-array "0.1.4" 1190 | 1191 | socket.io-parser@~3.2.0: 1192 | version "3.2.0" 1193 | resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" 1194 | dependencies: 1195 | component-emitter "1.2.1" 1196 | debug "~3.1.0" 1197 | isarray "2.0.1" 1198 | 1199 | socket.io@^2.1.1: 1200 | version "2.1.1" 1201 | resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" 1202 | dependencies: 1203 | debug "~3.1.0" 1204 | engine.io "~3.2.0" 1205 | has-binary2 "~1.0.2" 1206 | socket.io-adapter "~1.1.0" 1207 | socket.io-client "2.1.1" 1208 | socket.io-parser "~3.2.0" 1209 | 1210 | socketio-auth@^0.1.1: 1211 | version "0.1.1" 1212 | resolved "https://registry.yarnpkg.com/socketio-auth/-/socketio-auth-0.1.1.tgz#03f1fdd9d9b5e10f0a0ea9502abadbc580015d71" 1213 | dependencies: 1214 | debug "^2.1.3" 1215 | lodash "^4.17.5" 1216 | 1217 | source-map-support@^0.5.6: 1218 | version "0.5.6" 1219 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" 1220 | dependencies: 1221 | buffer-from "^1.0.0" 1222 | source-map "^0.6.0" 1223 | 1224 | source-map@^0.6.0: 1225 | version "0.6.1" 1226 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1227 | 1228 | sprintf-js@~1.0.2: 1229 | version "1.0.3" 1230 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1231 | 1232 | "statuses@>= 1.4.0 < 2", statuses@^1.2.0: 1233 | version "1.5.0" 1234 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1235 | 1236 | string-width@^2.1.0, string-width@^2.1.1: 1237 | version "2.1.1" 1238 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1239 | dependencies: 1240 | is-fullwidth-code-point "^2.0.0" 1241 | strip-ansi "^4.0.0" 1242 | 1243 | string_decoder@~1.1.1: 1244 | version "1.1.1" 1245 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1246 | dependencies: 1247 | safe-buffer "~5.1.0" 1248 | 1249 | strip-ansi@^3.0.0: 1250 | version "3.0.1" 1251 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1252 | dependencies: 1253 | ansi-regex "^2.0.0" 1254 | 1255 | strip-ansi@^4.0.0: 1256 | version "4.0.0" 1257 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1258 | dependencies: 1259 | ansi-regex "^3.0.0" 1260 | 1261 | strip-json-comments@~2.0.1: 1262 | version "2.0.1" 1263 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1264 | 1265 | supports-color@^2.0.0: 1266 | version "2.0.0" 1267 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1268 | 1269 | supports-color@^5.3.0: 1270 | version "5.4.0" 1271 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1272 | dependencies: 1273 | has-flag "^3.0.0" 1274 | 1275 | table@4.0.2: 1276 | version "4.0.2" 1277 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 1278 | dependencies: 1279 | ajv "^5.2.3" 1280 | ajv-keywords "^2.1.0" 1281 | chalk "^2.1.0" 1282 | lodash "^4.17.4" 1283 | slice-ansi "1.0.0" 1284 | string-width "^2.1.1" 1285 | 1286 | text-table@~0.2.0: 1287 | version "0.2.0" 1288 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1289 | 1290 | through@^2.3.6: 1291 | version "2.3.8" 1292 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1293 | 1294 | tmp@^0.0.33: 1295 | version "0.0.33" 1296 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1297 | dependencies: 1298 | os-tmpdir "~1.0.2" 1299 | 1300 | to-array@0.1.4: 1301 | version "0.1.4" 1302 | resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 1303 | 1304 | ts-node@^7.0.0: 1305 | version "7.0.0" 1306 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff" 1307 | dependencies: 1308 | arrify "^1.0.0" 1309 | buffer-from "^1.1.0" 1310 | diff "^3.1.0" 1311 | make-error "^1.1.1" 1312 | minimist "^1.2.0" 1313 | mkdirp "^0.5.1" 1314 | source-map-support "^0.5.6" 1315 | yn "^2.0.0" 1316 | 1317 | type-check@~0.3.2: 1318 | version "0.3.2" 1319 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1320 | dependencies: 1321 | prelude-ls "~1.1.2" 1322 | 1323 | type-is@^1.5.5: 1324 | version "1.6.16" 1325 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 1326 | dependencies: 1327 | media-typer "0.3.0" 1328 | mime-types "~2.1.18" 1329 | 1330 | typedarray@^0.0.6: 1331 | version "0.0.6" 1332 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1333 | 1334 | typescript@^2.9.2: 1335 | version "2.9.2" 1336 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" 1337 | 1338 | ultron@~1.1.0: 1339 | version "1.1.1" 1340 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" 1341 | 1342 | util-deprecate@~1.0.1: 1343 | version "1.0.2" 1344 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1345 | 1346 | vary@^1.0.0: 1347 | version "1.1.2" 1348 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1349 | 1350 | which@^1.2.9: 1351 | version "1.3.1" 1352 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1353 | dependencies: 1354 | isexe "^2.0.0" 1355 | 1356 | wordwrap@~1.0.0: 1357 | version "1.0.0" 1358 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1359 | 1360 | wrappy@1: 1361 | version "1.0.2" 1362 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1363 | 1364 | write@^0.2.1: 1365 | version "0.2.1" 1366 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1367 | dependencies: 1368 | mkdirp "^0.5.1" 1369 | 1370 | ws@~3.3.1: 1371 | version "3.3.3" 1372 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" 1373 | dependencies: 1374 | async-limiter "~1.0.0" 1375 | safe-buffer "~5.1.0" 1376 | ultron "~1.1.0" 1377 | 1378 | xmlhttprequest-ssl@~1.5.4: 1379 | version "1.5.5" 1380 | resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 1381 | 1382 | yallist@^2.1.2: 1383 | version "2.1.2" 1384 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1385 | 1386 | yeast@0.1.2: 1387 | version "0.1.2" 1388 | resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 1389 | 1390 | yn@^2.0.0: 1391 | version "2.0.0" 1392 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 1393 | --------------------------------------------------------------------------------