├── .env.example ├── .gcloudignore ├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── LICENSE ├── README.md ├── ormconfig.json ├── package.json ├── src ├── constants.ts ├── createTokens.ts ├── entities │ ├── Favorite.ts │ ├── GifStory.ts │ ├── Like.ts │ ├── TextStory.ts │ └── User.ts ├── env.d.ts ├── index.ts ├── isAuth.ts ├── migrations │ ├── 1604009152019-Unique.ts │ ├── 1604191287503-User.ts │ ├── 1604191761018-UserNoRefresh.ts │ ├── 1604235820090-Like.ts │ ├── 1604255812965-DisplayNameNullable.ts │ ├── 1604262290025-Filename.ts │ ├── 1604271193905-RecordingSteps.ts │ ├── 1604279137902-Cascades.ts │ ├── 1611959599837-GifStory.ts │ └── 1617748572112-Favorite.ts └── queryBuilder.ts ├── tsconfig.json ├── yarn-error.log └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | # node 2 | NODE_ENV=development 3 | 4 | # jwt 5 | TOKEN_SECRET=jqowd0qwe012jjje21dojdol2io1dj12o 6 | 7 | # db 8 | DB_HOST= 9 | DB_PORT= 10 | DB_PASSWORD= 11 | DB_USER= 12 | 13 | # github 14 | GITHUB_CLIENT_ID= 15 | GITHUB_CLIENT_SECRET= 16 | 17 | # server 18 | SERVER_URL=http://localhost:8080 19 | LATENCY_ON=false 20 | LATENCY_MS=1500 21 | 22 | # auth 23 | REFRESH_TOKEN_SECRET=wqoikdjq90d210381jdwq0oe0192803e12ejmsakldjqowei12 24 | ACCESS_TOKEN_SECRET=woqieod12u09e8120eusaoidcnasjo0923810ued9j1n2oijaqwe 25 | 26 | # cloud storage 27 | STORAGE_CRED_FILE= 28 | STORAGE_PROJ_ID= 29 | STORAGE_BUCKET= 30 | ORIGIN_URL= -------------------------------------------------------------------------------- /.gcloudignore: -------------------------------------------------------------------------------- 1 | # This file specifies files that are *not* uploaded to Google Cloud Platform 2 | # using gcloud. It follows the same syntax as .gitignore, with the addition of 3 | # "#!include" directives (which insert the entries of the given .gitignore-style 4 | # file at that point). 5 | # 6 | # For more information, run: 7 | # $ gcloud topic gcloudignore 8 | # 9 | .gcloudignore 10 | # If you would like to upload your .git directory, .gitignore file or files 11 | # from your .gitignore file, remove the corresponding line 12 | # below: 13 | .git 14 | .gitignore 15 | 16 | # Node.js dependencies: 17 | node_modules/ -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Issue tracker is **ONLY** used for reporting bugs. New features should be discussed on our [Discordserver](https://discord.gg/ABpGdRxvaA) Please use [stackoverflow](https://stackoverflow.com) for supporting issues. 2 | 3 | 4 | 5 | ## Expected Behavior 6 | 7 | 8 | 9 | ## Current Behavior 10 | 11 | 12 | 13 | ## Possible Solution 14 | 15 | 16 | 17 | ## Steps to Reproduce 18 | 19 | 20 | 21 | 22 | 1. 23 | 2. 24 | 3. 25 | 4. 26 | 27 | ## Screenshots 28 | 29 | 30 | 31 | ## Context (Environment) 32 | 33 | 34 | 35 | 36 | 37 | 38 | ## Detailed Description 39 | 40 | 41 | 42 | ## Possible Implementation 43 | 44 | 45 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | IF YOU ARE ADDING A NEW FEATURE PLEASE DISCUSS IT IN OUR [Discordserver](https://discord.gg/ABpGdRxvaA) BEFORE MAKING A PR 2 | 3 | 4 | 5 | ## Description 6 | 7 | 8 | 9 | ## Related Issue 10 | 11 | 12 | 13 | 14 | 15 | 16 | ## Motivation and Context 17 | 18 | 19 | 20 | 21 | ## How Has This Been Tested? 22 | 23 | 24 | 25 | 26 | 27 | ## Screenshots (if appropriate): 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .env 4 | .vscode 5 | .deployment 6 | .log 7 | app.yaml 8 | package-lock.json 9 | pnpm* 10 | vscode-stories.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Ben Awad 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vscode-stories-api 2 | 3 | https://github.com/ide-stories/vscode-stories 4 | 5 | - [Discord](https://discord.gg/ABpGdRxvaA) 6 | 7 | # How to run on your computer 8 | 9 | 1. Have PostgreSQL running on your computer 10 | 2. Create a database called `stories` 11 | 3. Copy `.env.example` to `.env` and fill in `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` (you will have to register a GitHub OAuth account and set the callback url to: http://localhost:8080/auth/github/callback) 12 | 4. Fill in database credentials to `.env` ([typeorm docs options](https://typeorm.io/#/connection-options/postgres--cockroachdb-connection-options)) 13 | 5. Don't forget to run `yarn` 14 | 6. `yarn dev` to startup server 15 | -------------------------------------------------------------------------------- /ormconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "postgres", 3 | "host": "localhost", 4 | "port": 5432, 5 | "database": "stories", 6 | "entities": ["src/entities/**/*.ts"], 7 | "migrations": ["src/migrations/**/*.ts"], 8 | "subscribers": ["src/subscriber/**/*.ts"], 9 | "cli": { 10 | "entities": ["src/entities"], 11 | "migrations": ["src/migrations"], 12 | "subscribers": ["src/subscriber"] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-stories-api", 3 | "version": "1.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "postinstall": "tsc", 8 | "start": "node dist/index.js", 9 | "dev": "ts-node-dev --files src/index.ts" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "@google-cloud/storage": "^5.7.2", 16 | "@octokit/rest": "^18.0.12", 17 | "@types/cors": "^2.8.8", 18 | "@types/express": "^4.17.8", 19 | "@types/express-rate-limit": "^5.1.0", 20 | "@types/is-url": "^1.2.28", 21 | "@types/is-uuid": "^1.0.0", 22 | "@types/jsonwebtoken": "^8.5.0", 23 | "@types/koa": "^2.11.6", 24 | "@types/koa-bodyparser": "^4.3.0", 25 | "@types/koa-helmet": "^6.0.1", 26 | "@types/koa-ratelimit": "^4.2.2", 27 | "@types/koa__cors": "^3.0.2", 28 | "@types/koa__router": "^8.0.3", 29 | "@types/lru-cache": "^5.1.0", 30 | "@types/memory-cache": "^0.2.1", 31 | "@types/node": "^14.14.2", 32 | "@types/passport-github": "^1.1.5", 33 | "body-parser": "^1.19.0", 34 | "cors": "^2.8.5", 35 | "dotenv-safe": "^8.2.0", 36 | "express": "^4.17.1", 37 | "express-rate-limit": "^5.1.3", 38 | "http-errors": "^1.8.0", 39 | "is-url": "^1.2.4", 40 | "is-uuid": "^1.0.2", 41 | "jsonwebtoken": "^8.5.1", 42 | "lru-cache": "^6.0.0", 43 | "memory-cache": "^0.2.0", 44 | "passport": "^0.4.1", 45 | "passport-github": "^1.1.0", 46 | "pg": "^8.4.1", 47 | "reflect-metadata": "^0.1.13", 48 | "ts-node": "^9.0.0", 49 | "ts-node-dev": "^1.0.0", 50 | "typeorm": "^0.2.28", 51 | "typescript": "^4.0.5" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const __prod__ = process.env.NODE_ENV === "production"; 2 | export const gifUploadLimit = 33554432; //32MB 3 | -------------------------------------------------------------------------------- /src/createTokens.ts: -------------------------------------------------------------------------------- 1 | import { sign } from "jsonwebtoken"; 2 | import { User } from "./entities/User"; 3 | 4 | export const createTokens = (user: User) => { 5 | const refreshToken = sign( 6 | { userId: user.id, tokenVersion: user.tokenVersion }, 7 | process.env.REFRESH_TOKEN_SECRET, 8 | { 9 | expiresIn: "14d", 10 | } 11 | ); 12 | const accessToken = sign( 13 | { userId: user.id }, 14 | process.env.ACCESS_TOKEN_SECRET, 15 | { 16 | expiresIn: "15min", 17 | } 18 | ); 19 | 20 | return { refreshToken, accessToken }; 21 | }; 22 | -------------------------------------------------------------------------------- /src/entities/Favorite.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseEntity, 3 | Entity, 4 | JoinColumn, 5 | ManyToOne, 6 | PrimaryColumn, 7 | } from "typeorm"; 8 | import { GifStory } from "./GifStory"; 9 | import { User } from "./User"; 10 | 11 | @Entity() 12 | export class Favorite extends BaseEntity { 13 | @PrimaryColumn() 14 | gifStoryId: number; 15 | 16 | @ManyToOne(() => GifStory, (s) => s.favorites, { 17 | primary: true, 18 | onDelete: "CASCADE", 19 | }) 20 | @JoinColumn({ name: "gifStoryId" }) 21 | gifStory: Promise; 22 | 23 | @PrimaryColumn() 24 | userId: number; 25 | 26 | @ManyToOne(() => User, (u) => u.favorites, { 27 | primary: true, 28 | onDelete: "CASCADE", 29 | }) 30 | @JoinColumn({ name: "userId" }) 31 | user: Promise; 32 | } 33 | -------------------------------------------------------------------------------- /src/entities/GifStory.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseEntity, 3 | Column, 4 | CreateDateColumn, 5 | Entity, 6 | JoinColumn, 7 | ManyToOne, 8 | OneToMany, 9 | PrimaryGeneratedColumn, 10 | UpdateDateColumn, 11 | } from "typeorm"; 12 | import { Favorite } from "./Favorite"; 13 | import { User } from "./User"; 14 | 15 | @Entity() 16 | export class GifStory extends BaseEntity { 17 | @PrimaryGeneratedColumn("uuid") 18 | id: string; 19 | 20 | @Column("text", { nullable: true }) 21 | flagged: "adult" | "racy" | "gore" | null; 22 | 23 | @Column("text", { default: "untitled" }) 24 | filename: string; 25 | 26 | @Column("text") 27 | mediaId: string; 28 | 29 | @Column("text", { nullable: true }) 30 | programmingLanguageId: string | null; 31 | 32 | @Column("int", { default: 0 }) 33 | numLikes: number; 34 | 35 | @Column("text") 36 | creatorId: string; 37 | 38 | @ManyToOne(() => User, (u) => u.textStories, { onDelete: "CASCADE" }) 39 | @JoinColumn({ name: "creatorId" }) 40 | creator: Promise; 41 | 42 | @OneToMany(() => Favorite, (s) => s.gifStory) 43 | favorites: Promise; 44 | 45 | @CreateDateColumn({ type: "timestamp with time zone" }) 46 | createdAt: Date; 47 | 48 | @UpdateDateColumn({ type: "timestamp with time zone" }) 49 | updatedAt: Date; 50 | } 51 | -------------------------------------------------------------------------------- /src/entities/Like.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseEntity, 3 | Entity, 4 | JoinColumn, 5 | ManyToOne, 6 | PrimaryColumn, 7 | } from "typeorm"; 8 | import { TextStory } from "./TextStory"; 9 | import { User } from "./User"; 10 | 11 | @Entity() 12 | export class Like extends BaseEntity { 13 | @PrimaryColumn() 14 | textStoryId: number; 15 | 16 | @ManyToOne(() => TextStory, (s) => s.likes, { 17 | primary: true, 18 | onDelete: "CASCADE", 19 | }) 20 | @JoinColumn({ name: "textStoryId" }) 21 | textStory: Promise; 22 | 23 | @PrimaryColumn() 24 | userId: number; 25 | 26 | @ManyToOne(() => User, (u) => u.likes, { 27 | primary: true, 28 | onDelete: "CASCADE", 29 | }) 30 | @JoinColumn({ name: "userId" }) 31 | user: Promise; 32 | } 33 | -------------------------------------------------------------------------------- /src/entities/TextStory.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseEntity, 3 | Column, 4 | CreateDateColumn, 5 | Entity, 6 | JoinColumn, 7 | ManyToOne, 8 | OneToMany, 9 | PrimaryGeneratedColumn, 10 | UpdateDateColumn, 11 | } from "typeorm"; 12 | import { Like } from "./Like"; 13 | import { User } from "./User"; 14 | 15 | @Entity() 16 | export class TextStory extends BaseEntity { 17 | @PrimaryGeneratedColumn("uuid") 18 | id: string; 19 | 20 | @Column("text", { default: "untitled" }) 21 | filename: string; 22 | 23 | @Column("jsonb", { nullable: true }) 24 | recordingSteps: any; 25 | 26 | @Column("text") 27 | text: string; 28 | 29 | @Column("text", { nullable: true }) 30 | programmingLanguageId: string | null; 31 | 32 | @Column("int", { default: 0 }) 33 | numLikes: number; 34 | 35 | @Column("text") 36 | creatorId: string; 37 | 38 | @ManyToOne(() => User, (u) => u.textStories, { onDelete: "CASCADE" }) 39 | @JoinColumn({ name: "creatorId" }) 40 | creator: Promise; 41 | 42 | @OneToMany(() => Like, (s) => s.textStory) 43 | likes: Promise; 44 | 45 | @CreateDateColumn({ type: "timestamp with time zone" }) 46 | createdAt: Date; 47 | 48 | @UpdateDateColumn({ type: "timestamp with time zone" }) 49 | updatedAt: Date; 50 | } 51 | -------------------------------------------------------------------------------- /src/entities/User.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseEntity, 3 | Column, 4 | CreateDateColumn, 5 | Entity, 6 | OneToMany, 7 | PrimaryGeneratedColumn, 8 | UpdateDateColumn, 9 | } from "typeorm"; 10 | import { Favorite } from "./Favorite"; 11 | import { GifStory } from "./GifStory"; 12 | import { Like } from "./Like"; 13 | import { TextStory } from "./TextStory"; 14 | 15 | @Entity() 16 | export class User extends BaseEntity { 17 | @PrimaryGeneratedColumn("uuid") 18 | id: string; 19 | 20 | @Column("text", { unique: true }) 21 | githubId: string; 22 | 23 | @Column("text", { unique: true }) 24 | username: string; 25 | 26 | @Column("text", { nullable: true }) 27 | displayName: string | null; 28 | 29 | @Column("text") 30 | profileUrl: string; 31 | 32 | @Column("text") 33 | photoUrl: string; 34 | 35 | @Column("text") 36 | githubAccessToken: string; 37 | 38 | @Column("text", { nullable: true }) 39 | flair: string; 40 | 41 | @Column("jsonb") 42 | other: any; 43 | 44 | @Column("int", { default: 1 }) 45 | tokenVersion: number; 46 | 47 | @OneToMany(() => GifStory, (s) => s.creator) 48 | gifStories: Promise; 49 | 50 | @OneToMany(() => TextStory, (s) => s.creator) 51 | textStories: Promise; 52 | 53 | @OneToMany(() => Favorite, (s) => s.user) 54 | favorites: Promise; 55 | 56 | @OneToMany(() => Like, (s) => s.user) 57 | likes: Promise; 58 | 59 | @OneToMany(() => User, (s) => s) 60 | friends: Promise; 61 | 62 | @CreateDateColumn({ type: "timestamp with time zone" }) 63 | createdAt: Date; 64 | 65 | @UpdateDateColumn({ type: "timestamp with time zone" }) 66 | updatedAt: Date; 67 | } 68 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace NodeJS { 2 | export interface ProcessEnv { 3 | TOKEN_SECRET: string; 4 | GITHUB_CLIENT_ID: string; 5 | GITHUB_CLIENT_SECRET: string; 6 | SERVER_URL: string; 7 | REFRESH_TOKEN_SECRET: string; 8 | ACCESS_TOKEN_SECRET: string; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | require("dotenv-safe").config(); 2 | import bodyParser from "body-parser"; 3 | import cors from "cors"; 4 | import express from "express"; 5 | import rateLimit from "express-rate-limit"; 6 | import helmet from "helmet"; 7 | import createError from "http-errors"; 8 | import isUUID from "is-uuid"; 9 | import jwt from "jsonwebtoken"; 10 | import passport from "passport"; 11 | import { Strategy as GitHubStrategy } from "passport-github"; 12 | import { join } from "path"; 13 | import "reflect-metadata"; 14 | import { createConnection, getConnection } from "typeorm"; 15 | import { __prod__, gifUploadLimit } from "./constants"; 16 | import { createTokens } from "./createTokens"; 17 | import { Favorite } from "./entities/Favorite"; 18 | import { GifStory } from "./entities/GifStory"; 19 | import { Like } from "./entities/Like"; 20 | import { TextStory } from "./entities/TextStory"; 21 | import { User } from "./entities/User"; 22 | import { isAuth } from "./isAuth"; 23 | import { Octokit } from "@octokit/rest"; 24 | import { fetchGifStories, fetchStories, fetchUserGifStories, fetchUserStories } from "./queryBuilder"; 25 | import { Bucket, GetSignedUrlConfig, Storage } from "@google-cloud/storage"; 26 | import path from "path"; 27 | const octokit = new Octokit(); 28 | 29 | const upgradeMessage = 30 | "Upgrade the VSCode Stories extension, I fixed it and changed the API."; 31 | 32 | const main = async () => { 33 | const credentials = { 34 | host: process.env.SOCKET_PATH 35 | ? process.env.SOCKET_PATH 36 | : process.env.DB_HOST, 37 | port: Number(process.env.DB_PORT), 38 | username: process.env.DB_USER, 39 | password: process.env.DB_PASSWORD, 40 | }; 41 | console.log("about to connect to db, host: ", credentials.host); 42 | 43 | const conn = await createConnection({ 44 | type: "postgres", 45 | database: "stories", 46 | entities: [join(__dirname, "./entities/*")], 47 | migrations: [join(__dirname, "./migrations/*")], 48 | // synchronize: !__prod__, 49 | logging: !__prod__, 50 | ...credentials, 51 | }); 52 | console.log("connected, running migrations now"); 53 | await conn.runMigrations(); 54 | console.log("migrations ran"); 55 | 56 | // google cloud 57 | const storage = new Storage({ 58 | keyFilename: path.join(__dirname, `../${process.env.STORAGE_CRED_FILE}`), 59 | projectId: process.env.STORAGE_PROJ_ID, 60 | }); 61 | 62 | const gifStoriesBucket = storage.bucket(`${process.env.STORAGE_BUCKET}`); 63 | 64 | // https://cloud.google.com/storage/docs/xml-api/reference-headers#xgoogcontentlengthrange 65 | async function configureBucketCors() { 66 | await gifStoriesBucket.setCorsConfiguration([ 67 | { 68 | maxAgeSeconds: 3600, 69 | method: ["PUT", "GET"], 70 | origin: [`${process.env.ORIGIN_URL}`], 71 | responseHeader: ["x-goog-content-length-range"], 72 | }, 73 | ]); 74 | } 75 | 76 | configureBucketCors(); 77 | 78 | // action.types read, write, delete 79 | const gcsSignedUrl = async ( 80 | bucket: Bucket, 81 | filename: string, 82 | minutesToExpiration: number, 83 | action: GetSignedUrlConfig["action"] 84 | ) => { 85 | const options: GetSignedUrlConfig = { 86 | version: "v4", 87 | action: action, 88 | expires: Date.now() + minutesToExpiration * 60 * 1000, 89 | extensionHeaders: { 90 | "x-goog-content-length-range": `1,${gifUploadLimit}`, 91 | }, 92 | }; 93 | const [url] = await bucket.file(filename).getSignedUrl(options); 94 | return url; 95 | }; 96 | 97 | passport.use( 98 | new GitHubStrategy( 99 | { 100 | scope: "user:follow", 101 | clientID: process.env.GITHUB_CLIENT_ID, 102 | clientSecret: process.env.GITHUB_CLIENT_SECRET, 103 | callbackURL: `${process.env.SERVER_URL}/auth/github/callback`, 104 | }, 105 | async (githubAccessToken, _, profile, cb) => { 106 | if (profile.id === "32990164") { 107 | cb(new Error("you are banned")); 108 | return; 109 | } 110 | try { 111 | let user = await User.findOne({ githubId: profile.id }); 112 | const data = { 113 | githubAccessToken, 114 | displayName: profile.displayName, 115 | githubId: profile.id, 116 | photoUrl: 117 | profile.photos?.[0].value || 118 | (profile._json as any).avatar_url || 119 | "", 120 | other: profile._json, 121 | profileUrl: profile.profileUrl, 122 | username: profile.username, 123 | }; 124 | if (user) { 125 | await User.update(user.id, data); 126 | } else { 127 | user = await User.create(data).save(); 128 | } 129 | 130 | cb(undefined, createTokens(user)); 131 | } catch (err) { 132 | console.log(err); 133 | cb(new Error("internal error")); 134 | } 135 | } 136 | ) 137 | ); 138 | passport.serializeUser((user: any, done) => { 139 | done(null, user.accessToken); 140 | }); 141 | 142 | const app = express(); 143 | app.set("trust proxy", 1); 144 | app.use(helmet()); 145 | app.use(cors({ origin: "*", maxAge: 86400 })); 146 | app.use(bodyParser.json()); 147 | app.use(passport.initialize()); 148 | 149 | app.get("/auth/github", passport.authenticate("github", { session: false })); 150 | 151 | app.get( 152 | "/auth/github/callback", 153 | passport.authenticate("github"), 154 | (req: any, res) => { 155 | if (!req.user.accessToken || !req.user.refreshToken) { 156 | res.send(`something went wrong`); 157 | return; 158 | } 159 | res.redirect( 160 | `http://localhost:54321/callback/${req.user.accessToken}/${req.user.refreshToken}` 161 | ); 162 | } 163 | ); 164 | 165 | app.get("/user/username", isAuth(), async (req: any, res) => { 166 | res.send( 167 | await getConnection().query( 168 | `select u."username" from "user" u where u."id" = '${req.userId}';` 169 | ) 170 | ); 171 | }); 172 | 173 | app.get("/stories/user/:cursor?", isAuth(), async (req: any, res) => { 174 | let cursor = 0; 175 | if (req.params.cursor) { 176 | const nCursor = parseInt(req.params.cursor); 177 | if (!Number.isNaN(nCursor)) { 178 | cursor = nCursor; 179 | } 180 | } 181 | 182 | const limit = 5; 183 | const stories = await fetchUserStories(limit, cursor, req.userId); 184 | const gifStories = await fetchUserGifStories(limit, cursor, req.userId); 185 | 186 | const data = { 187 | stories: stories.slice(0, limit).concat(gifStories.slice(0, limit)), 188 | hasMore: (stories.length === limit + 1) ? true : gifStories.length === limit + 1, 189 | }; 190 | res.json(data); 191 | }); 192 | 193 | app.get( 194 | "/stories/friends/hot/:cursor?/:friendIds?", 195 | isAuth(), 196 | async (req: any, res) => { 197 | let friendIds: Array = req.params.friendIds 198 | ? req.params.friendIds.split(",") 199 | : []; 200 | 201 | if (friendIds.length === 0) { 202 | let user = await User.findOne({ id: req.userId }); 203 | 204 | // Get the user objects the user (username) is following 205 | let result = await octokit.request("GET /users{/username}/following", { 206 | username: user?.username, 207 | headers: { 208 | accept: `application/vnd.github.v3+json`, 209 | authorization: `token ${user?.githubAccessToken}`, 210 | }, 211 | }); 212 | // Take the data array from the result, which is basically all the users in an array 213 | const { data } = result; 214 | if (data.length === 0) { 215 | const d = { 216 | stories: [], 217 | friendIds: [], 218 | hasMore: false, 219 | }; 220 | res.json(d); 221 | return; 222 | } 223 | // Create a string of WHERE conditions 224 | let add = ``; 225 | for (var i = 0; i < data.length; i++) { 226 | if (i != 0) { 227 | add += ` OR `; 228 | } 229 | add += `u."githubId" LIKE '${data[i]?.id}'`; 230 | } 231 | // Create the query and add the WHERE conditions 232 | // Only return the ids of the users 233 | let query = `select u."id" from "user" u where ${add};`; 234 | // Execute query 235 | const arr = await getConnection().query(query); 236 | 237 | //let friendIds: Array = []; 238 | // Loop through all the id objects and add them to a list, 239 | // in order to have a clear json structure for the frontend 240 | arr.forEach((userId: { id: any }) => { 241 | friendIds.push(userId?.id); 242 | }); 243 | } 244 | 245 | if (friendIds.length === 0) { 246 | const d = { 247 | stories: [], 248 | friendIds: [], 249 | hasMore: false, 250 | }; 251 | res.json(d); 252 | return; 253 | } 254 | 255 | // Perform request to get friends stories 256 | let cursor = 0; 257 | if (req.params.cursor) { 258 | const nCursor = parseInt(req.params.cursor); 259 | if (!Number.isNaN(nCursor)) { 260 | cursor = nCursor; 261 | } 262 | } 263 | const limit = 11; 264 | const stories = await fetchStories(limit, cursor, friendIds); 265 | const gifStories = await fetchGifStories(limit, cursor, friendIds); 266 | 267 | const data = { 268 | stories: stories.slice(0, limit).concat(gifStories.slice(0, limit)), 269 | friendIds: friendIds, 270 | hasMore: (stories.length === limit + 1) ? true : gifStories.length === limit + 1, 271 | }; 272 | 273 | res.json(data); 274 | } 275 | ); 276 | 277 | if (process.env.LATENCY_ON === "true") { 278 | app.use(function (_req, _res, next) { 279 | setTimeout(next, Number(process.env.LATENCY_MS)); 280 | }); 281 | } 282 | 283 | app.get("/story/likes/:id", async (_req, _res, next) => { 284 | return next(createError(400, upgradeMessage)); 285 | }); 286 | 287 | app.get("/stories/hot/:cursor?", async (_, __, next) => { 288 | return next(createError(400, upgradeMessage)); 289 | }); 290 | 291 | app.get("/gif-story/:id", isAuth(false), async (req: any, res) => { 292 | const { id } = req.params; 293 | if (!id || !isUUID.v4(id)) { 294 | res.json({ story: null }); 295 | } else { 296 | const replacements = [id]; 297 | if (req.userId) { 298 | replacements.push(req.userId); 299 | } 300 | res.json({ 301 | story: ( 302 | await getConnection().query( 303 | ` 304 | select ts.*, l."gifStoryId" is not null "hasLiked" from gif_story ts 305 | left join "favorite" l on l."gifStoryId" = ts.id ${ 306 | req.userId ? `and l."userId" = $2` : "" 307 | } 308 | where id = $1 309 | `, 310 | replacements 311 | ) 312 | )[0], 313 | }); 314 | } 315 | }); 316 | 317 | app.get("/text-story/:id", isAuth(false), async (req: any, res) => { 318 | const { id } = req.params; 319 | if (!id || !isUUID.v4(id)) { 320 | res.json({ story: null }); 321 | } else { 322 | const replacements = [id]; 323 | if (req.userId) { 324 | replacements.push(req.userId); 325 | } 326 | res.json({ 327 | story: ( 328 | await getConnection().query( 329 | ` 330 | select ts.*, l."textStoryId" is not null "hasLiked" from text_story ts 331 | left join "like" l on l."textStoryId" = ts.id ${ 332 | req.userId ? `and l."userId" = $2` : "" 333 | } 334 | where id = $1 335 | `, 336 | replacements 337 | ) 338 | )[0], 339 | }); 340 | } 341 | }); 342 | 343 | app.get("/is-friend/:username", isAuth(), async (req: any, res) => { 344 | const { username } = req.params; 345 | 346 | let found: boolean = false; 347 | try { 348 | let user = await User.findOne({ id: req.userId }); 349 | 350 | let result = await octokit.request("GET /users{/username}/following", { 351 | username: user?.username, 352 | headers: { 353 | accept: `application/vnd.github.v3+json`, 354 | authorization: `token ${user?.githubAccessToken}`, 355 | }, 356 | }); 357 | 358 | const { data } = result; 359 | 360 | data.forEach((el: any) => { 361 | if (el.login === username) { 362 | found = true; 363 | } 364 | }); 365 | } catch (err) { 366 | console.log(err); 367 | } 368 | 369 | if (found) { 370 | res.send({ ok: true }); 371 | } else { 372 | res.send({ ok: false }); 373 | } 374 | }); 375 | 376 | app.get("/gif-stories/hot/:cursor?", async (req, res) => { 377 | let cursor = 0; 378 | if (req.params.cursor) { 379 | const nCursor = parseInt(req.params.cursor); 380 | if (!Number.isNaN(nCursor)) { 381 | cursor = nCursor; 382 | } 383 | } 384 | const limit = 21; 385 | 386 | const stories = await fetchGifStories(limit, cursor); 387 | 388 | const data = { 389 | stories: stories.slice(0, limit), 390 | hasMore: stories.length === limit + 1, 391 | }; 392 | res.json(data); 393 | }); 394 | 395 | app.get( 396 | "/text-stories/hot/:cursor?", 397 | isAuth(false), 398 | async (req: any, res) => { 399 | let cursor = 0; 400 | if (req.params.cursor) { 401 | const nCursor = parseInt(req.params.cursor); 402 | if (!Number.isNaN(nCursor)) { 403 | cursor = nCursor; 404 | } 405 | } 406 | const limit = 21; 407 | 408 | const stories = await fetchStories(limit, cursor); 409 | 410 | const data = { 411 | stories: stories.slice(0, limit), 412 | hasMore: stories.length === limit + 1, 413 | }; 414 | res.json(data); 415 | } 416 | ); 417 | 418 | app.get("/storage/write/:fileId", isAuth(), async (req: any, res) => { 419 | const fileId = req.params.fileId; 420 | 421 | try { 422 | const response = await gcsSignedUrl(gifStoriesBucket, fileId, 5, "write"); 423 | res.json(response).status(200); 424 | } catch (error) { 425 | res.send(error.message).status(404); 426 | } 427 | }); 428 | 429 | app.get("/storage/read/:fileId", isAuth(), async (req: any, res) => { 430 | const fileId = req.params.fileId; 431 | 432 | try { 433 | const response = await gcsSignedUrl(gifStoriesBucket, fileId, 5, "read"); 434 | res.json(response).status(200); 435 | } catch (error) { 436 | res.send(error.message).status(404); 437 | } 438 | }); 439 | 440 | app.post("/delete-gif-story/:id/:mediaId", isAuth(), async (req: any, res) => { 441 | const { id, mediaId } = req.params; 442 | if (!isUUID.v4(id)) { 443 | res.send({ ok: false }); 444 | return; 445 | } 446 | 447 | const criteria: Partial = { id }; 448 | 449 | if (req.userId !== "dac7eb0f-808b-4842-b193-5d68cc082609") { 450 | criteria.creatorId = req.userId; 451 | } 452 | 453 | await GifStory.delete(criteria); 454 | try { 455 | await gifStoriesBucket.file(`${mediaId}.gif`).delete(); 456 | } catch (error) { 457 | res.send(error.message).status(404); 458 | } 459 | 460 | res.send({ ok: true }); 461 | }); 462 | 463 | app.post("/delete-text-story/:id", isAuth(), async (req: any, res) => { 464 | const { id } = req.params; 465 | if (!isUUID.v4(id)) { 466 | res.send({ ok: false }); 467 | return; 468 | } 469 | 470 | const criteria: Partial = { id }; 471 | 472 | if (req.userId !== "dac7eb0f-808b-4842-b193-5d68cc082609") { 473 | criteria.creatorId = req.userId; 474 | } 475 | 476 | await TextStory.delete(criteria); 477 | res.send({ ok: true }); 478 | }); 479 | 480 | app.post( 481 | "/remove-friend/:username", 482 | isAuth(), 483 | async (req: any, res, next) => { 484 | const { username } = req.params; 485 | 486 | try { 487 | let user = await User.findOne({ id: req.userId }); 488 | 489 | await octokit.request(`DELETE /user/following{/username}`, { 490 | username: username, 491 | headers: { 492 | accept: `application/vnd.github.v3+json`, 493 | authorization: `token ${user?.githubAccessToken}`, 494 | }, 495 | }); 496 | } catch (err) { 497 | console.log(err); 498 | if (err.status === 404) { 499 | return next( 500 | createError( 501 | 404, 502 | "You probably need to reauthenticate in order to follow people" 503 | ) 504 | ); 505 | } 506 | return next(createError(400, "There's no such user")); 507 | } 508 | 509 | res.send({ ok: true }); 510 | } 511 | ); 512 | 513 | app.post("/add-friend/:username", isAuth(), async (req: any, res, next) => { 514 | const { username } = req.params; 515 | 516 | try { 517 | let user = await User.findOne({ id: req.userId }); 518 | 519 | await octokit.request(`PUT /user/following{/username}`, { 520 | username: username, 521 | headers: { 522 | accept: `application/vnd.github.v3+json`, 523 | authorization: `token ${user?.githubAccessToken}`, 524 | }, 525 | }); 526 | } catch (err) { 527 | console.log(err); 528 | if (err.status === 404) { 529 | return next( 530 | createError( 531 | 404, 532 | "You probably need to reauthenticate in order to follow people" 533 | ) 534 | ); 535 | } 536 | return next(createError(400, "There's no such user")); 537 | } 538 | 539 | res.send({ ok: true }); 540 | }); 541 | 542 | app.post("/unlike-text-story/:id", isAuth(), async (req: any, res, next) => { 543 | const { id } = req.params; 544 | if (!isUUID.v4(id)) { 545 | res.send({ ok: false }); 546 | return; 547 | } 548 | try { 549 | const currentLike = await Like.find({ 550 | textStoryId: id, 551 | userId: req.userId, 552 | }); 553 | if (currentLike.length !== 1) return; 554 | const { affected } = await Like.delete({ 555 | textStoryId: id, 556 | userId: req.userId, 557 | }); 558 | if (affected) { 559 | await TextStory.update(id, { numLikes: () => '"numLikes" - 1' }); 560 | } 561 | } catch (err) { 562 | console.log(err); 563 | return next(createError(400, "You probably already unliked this")); 564 | } 565 | 566 | res.send({ ok: true }); 567 | }); 568 | 569 | app.post("/unlike-gif-story/:id", isAuth(), async (req: any, res, next) => { 570 | const { id } = req.params; 571 | if (!isUUID.v4(id)) { 572 | res.send({ ok: false }); 573 | return; 574 | } 575 | try { 576 | const currentFavorite = await Favorite.find({ 577 | gifStoryId: id, 578 | userId: req.userId, 579 | }); 580 | if (currentFavorite.length !== 1) return; 581 | const { affected } = await Favorite.delete({ 582 | gifStoryId: id, 583 | userId: req.userId, 584 | }); 585 | if (affected) { 586 | await GifStory.update(id, { numLikes: () => '"numLikes" - 1' }); 587 | } 588 | } catch (err) { 589 | console.log(err); 590 | return next(createError(400, "You probably already unliked this")); 591 | } 592 | 593 | res.send({ ok: true }); 594 | }); 595 | 596 | app.post("/like-text-story/:id", isAuth(), async (req: any, res, next) => { 597 | const { id } = req.params; 598 | if (!isUUID.v4(id)) { 599 | res.send({ ok: false }); 600 | return; 601 | } 602 | try { 603 | const currentLike = await Like.find({ 604 | textStoryId: id, 605 | userId: req.userId, 606 | }); 607 | if (currentLike.length !== 0) return; 608 | await Like.insert({ textStoryId: id, userId: req.userId }); 609 | } catch (err) { 610 | console.log(err); 611 | return next(createError(400, "You probably already liked this")); 612 | } 613 | 614 | await TextStory.update(id, { numLikes: () => '"numLikes" + 1' }); 615 | 616 | res.send({ ok: true }); 617 | }); 618 | 619 | app.post("/like-gif-story/:id", isAuth(), async (req: any, res, next) => { 620 | const { id } = req.params; 621 | if (!isUUID.v4(id)) { 622 | res.send({ ok: false }); 623 | return; 624 | } 625 | try { 626 | const currentFavorite = await Favorite.find({ 627 | gifStoryId: id, 628 | userId: req.userId, 629 | }); 630 | if (currentFavorite.length !== 0) return; 631 | await Favorite.insert({ gifStoryId: id, userId: req.userId }); 632 | } catch (err) { 633 | console.log(err); 634 | return next(createError(400, "You probably already liked this")); 635 | } 636 | 637 | await GifStory.update(id, { numLikes: () => '"numLikes" + 1' }); 638 | 639 | res.send({ ok: true }); 640 | }); 641 | 642 | app.post("/like-story/:id/:username", async (_req, _res, next) => { 643 | return next(createError(400, upgradeMessage)); 644 | }); 645 | 646 | const maxTextLength = 20000; 647 | app.post( 648 | "/new-text-story", 649 | isAuth(), 650 | rateLimit({ 651 | keyGenerator: (req: any) => req.userId, 652 | windowMs: 43200000, // 12 hours 653 | message: "Limit reached. You can only post 10 stories a day.", 654 | max: 10, 655 | headers: false, 656 | }), 657 | async (req, res) => { 658 | let { text, programmingLanguageId, filename, recordingSteps } = req.body; 659 | if (text.length > maxTextLength) { 660 | text = text.slice(0, maxTextLength); 661 | } 662 | if (programmingLanguageId.length > 40) { 663 | programmingLanguageId = null; 664 | } 665 | if (filename.length > 100) { 666 | filename = "untitled"; 667 | } 668 | const ts = await TextStory.create({ 669 | text, 670 | filename, 671 | recordingSteps, 672 | programmingLanguageId, 673 | creatorId: (req as any).userId, 674 | }).save(); 675 | const currentUser = await User.findOneOrFail((req as any).userId); 676 | 677 | res.send({ 678 | id: ts.id, 679 | creatorUsername: currentUser.username, 680 | creatorAvatarUrl: currentUser.photoUrl, 681 | flair: currentUser.flair, 682 | }); 683 | } 684 | ); 685 | 686 | app.post( 687 | "/new-gif-story", 688 | isAuth(), 689 | rateLimit({ 690 | keyGenerator: (req: any) => req.userId, 691 | windowMs: 43200000, // 12 hours 692 | message: "Limit reached. You can only post 10 stories a day.", 693 | max: 10, 694 | headers: false, 695 | }), 696 | async (req, res) => { 697 | //add next here for error 698 | let { programmingLanguageId, filename, mediaId } = req.body; 699 | if (programmingLanguageId.length > 40) { 700 | programmingLanguageId = null; 701 | } 702 | 703 | // Flagged was coming from vision ML which we don't have on serverless 704 | // We can update flag if user is reported through ban system 705 | 706 | let flagged = null; 707 | 708 | // @todo if flagged ping me on slack 709 | const gs = await GifStory.create({ 710 | mediaId, 711 | filename, 712 | flagged, 713 | programmingLanguageId, 714 | creatorId: (req as any).userId, 715 | }).save(); 716 | const currentUser = await User.findOneOrFail((req as any).userId); 717 | 718 | res.send({ 719 | id: gs.id, 720 | mediaId: mediaId, 721 | creatorAvatarUrl: currentUser.photoUrl, 722 | creatorUsername: currentUser.username, 723 | flair: currentUser.flair, 724 | }); 725 | } 726 | ); 727 | 728 | app.post("/new-story", async (_req, _res, next) => { 729 | return next(createError(400, upgradeMessage)); 730 | }); 731 | 732 | app.post("/update-flair", isAuth(), async (req, res) => { 733 | if ( 734 | !req.body.flair || 735 | typeof req.body.flair !== "string" || 736 | req.body.flair.length > 40 737 | ) { 738 | res.json({ ok: false }); 739 | return; 740 | } 741 | await User.update({ id: (req as any).userId }, { flair: req.body.flair }); 742 | res.json({ ok: true }); 743 | }); 744 | 745 | app.use((err: any, _: any, res: any, next: any) => { 746 | if (res.headersSent) { 747 | return next(err); 748 | } 749 | if (err.statusCode) { 750 | res.status(err.statusCode).send(err.message); 751 | } else { 752 | console.log(err); 753 | res.status(500).send("internal server error"); 754 | } 755 | }); 756 | 757 | app.listen(process.env.PORT || 8080, () => { 758 | console.log("server started"); 759 | }); 760 | }; 761 | 762 | main(); 763 | -------------------------------------------------------------------------------- /src/isAuth.ts: -------------------------------------------------------------------------------- 1 | import { RequestHandler } from "express"; 2 | import { verify } from "jsonwebtoken"; 3 | import createError from "http-errors"; 4 | import { User } from "./entities/User"; 5 | import { createTokens } from "./createTokens"; 6 | 7 | export const isAuth: (st?: boolean) => RequestHandler<{}, any, any, {}> = ( 8 | shouldThrow = true 9 | ) => async (req, res, next) => { 10 | const accessToken = req.headers["access-token"]; 11 | if (!accessToken || typeof accessToken !== "string") { 12 | return next( 13 | !shouldThrow ? undefined : createError(401, "not authenticated") 14 | ); 15 | } 16 | 17 | try { 18 | const data = verify(accessToken, process.env.ACCESS_TOKEN_SECRET) as any; 19 | (req as any).userId = data.userId; 20 | return next(); 21 | } catch {} 22 | 23 | const refreshToken = req.headers["refresh-token"]; 24 | if (!refreshToken || typeof refreshToken !== "string") { 25 | return next( 26 | !shouldThrow ? undefined : createError(401, "not authenticated") 27 | ); 28 | } 29 | 30 | let data; 31 | try { 32 | data = verify(refreshToken, process.env.REFRESH_TOKEN_SECRET) as any; 33 | } catch { 34 | return next( 35 | !shouldThrow ? undefined : createError(401, "not authenticated") 36 | ); 37 | } 38 | 39 | const user = await User.findOne(data.userId); 40 | // token has been invalidated or user deleted 41 | if (!user || user.tokenVersion !== data.tokenVersion) { 42 | return next( 43 | !shouldThrow ? undefined : createError(401, "not authenticated") 44 | ); 45 | } 46 | 47 | const tokens = createTokens(user); 48 | 49 | res.setHeader("refresh-token", tokens.refreshToken); 50 | res.setHeader("access-token", tokens.accessToken); 51 | (req as any).userId = data.userId; 52 | 53 | next(); 54 | }; 55 | -------------------------------------------------------------------------------- /src/migrations/1604009152019-Unique.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class Unique1604009152019 implements MigrationInterface { 4 | name = 'Unique1604009152019' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`ALTER TABLE "story" ADD CONSTRAINT "UQ_30be622de69279f913ca062de3d" UNIQUE ("mediaId")`); 8 | } 9 | 10 | public async down(queryRunner: QueryRunner): Promise { 11 | await queryRunner.query(`ALTER TABLE "story" DROP CONSTRAINT "UQ_30be622de69279f913ca062de3d"`); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/migrations/1604191287503-User.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class User1604191287503 implements MigrationInterface { 4 | name = 'User1604191287503' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`CREATE TABLE "user" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "githubId" text NOT NULL, "username" text NOT NULL, "displayName" text NOT NULL, "profileUrl" text NOT NULL, "photoUrl" text NOT NULL, "githubAccessToken" text NOT NULL, "githubRefreshToken" text NOT NULL, "other" jsonb NOT NULL, "tokenVersion" integer NOT NULL DEFAULT 1, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "UQ_0d84cc6a830f0e4ebbfcd6381dd" UNIQUE ("githubId"), CONSTRAINT "UQ_78a916df40e02a9deb1c4b75edb" UNIQUE ("username"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`); 8 | } 9 | 10 | public async down(queryRunner: QueryRunner): Promise { 11 | await queryRunner.query(`DROP TABLE "user"`); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/migrations/1604191761018-UserNoRefresh.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class UserNoRefresh1604191761018 implements MigrationInterface { 4 | name = 'UserNoRefresh1604191761018' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "githubRefreshToken"`); 8 | } 9 | 10 | public async down(queryRunner: QueryRunner): Promise { 11 | await queryRunner.query(`ALTER TABLE "user" ADD "githubRefreshToken" text NOT NULL`); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/migrations/1604235820090-Like.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class Like1604235820090 implements MigrationInterface { 4 | name = 'Like1604235820090' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`CREATE TABLE "text_story" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "text" text NOT NULL, "programmingLanguageId" text, "numLikes" integer NOT NULL DEFAULT 0, "creatorId" uuid NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "PK_7043094abc4acedc8c16f7eee1b" PRIMARY KEY ("id"))`); 8 | await queryRunner.query(`CREATE TABLE "like" ("textStoryId" uuid NOT NULL, "userId" uuid NOT NULL, CONSTRAINT "PK_c6b2f8cb0931bd5cf7006c9ff23" PRIMARY KEY ("textStoryId", "userId"))`); 9 | await queryRunner.query(`ALTER TABLE "user" ADD "flair" text`); 10 | await queryRunner.query(`ALTER TABLE "text_story" ADD CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 11 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_0c6cf745c30c53af97f80d48919" FOREIGN KEY ("textStoryId") REFERENCES "text_story"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 12 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_e8fb739f08d47955a39850fac23" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 13 | } 14 | 15 | public async down(queryRunner: QueryRunner): Promise { 16 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_e8fb739f08d47955a39850fac23"`); 17 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_0c6cf745c30c53af97f80d48919"`); 18 | await queryRunner.query(`ALTER TABLE "text_story" DROP CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1"`); 19 | await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "flair"`); 20 | await queryRunner.query(`DROP TABLE "like"`); 21 | await queryRunner.query(`DROP TABLE "text_story"`); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/migrations/1604255812965-DisplayNameNullable.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class DisplayNameNullable1604255812965 implements MigrationInterface { 4 | name = 'DisplayNameNullable1604255812965' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "displayName" DROP NOT NULL`); 8 | } 9 | 10 | public async down(queryRunner: QueryRunner): Promise { 11 | await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "displayName" SET NOT NULL`); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/migrations/1604262290025-Filename.ts: -------------------------------------------------------------------------------- 1 | import { MigrationInterface, QueryRunner } from "typeorm"; 2 | 3 | export class Filename1604262290025 implements MigrationInterface { 4 | name = "Filename1604262290025"; 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query( 8 | `ALTER TABLE "text_story" ADD "filename" text NOT NULL DEFAULT 'untitled'` 9 | ); 10 | } 11 | 12 | public async down(queryRunner: QueryRunner): Promise { 13 | await queryRunner.query(`ALTER TABLE "text_story" DROP COLUMN "filename"`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/migrations/1604271193905-RecordingSteps.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class RecordingSteps1604271193905 implements MigrationInterface { 4 | name = 'RecordingSteps1604271193905' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`ALTER TABLE "text_story" ADD "recordingSteps" jsonb`); 8 | } 9 | 10 | public async down(queryRunner: QueryRunner): Promise { 11 | await queryRunner.query(`ALTER TABLE "text_story" DROP COLUMN "recordingSteps"`); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/migrations/1604279137902-Cascades.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class Cascades1604279137902 implements MigrationInterface { 4 | name = 'Cascades1604279137902' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`ALTER TABLE "text_story" DROP CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1"`); 8 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_0c6cf745c30c53af97f80d48919"`); 9 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_e8fb739f08d47955a39850fac23"`); 10 | await queryRunner.query(`ALTER TABLE "text_story" ADD CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); 11 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_0c6cf745c30c53af97f80d48919" FOREIGN KEY ("textStoryId") REFERENCES "text_story"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); 12 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_e8fb739f08d47955a39850fac23" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); 13 | } 14 | 15 | public async down(queryRunner: QueryRunner): Promise { 16 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_e8fb739f08d47955a39850fac23"`); 17 | await queryRunner.query(`ALTER TABLE "like" DROP CONSTRAINT "FK_0c6cf745c30c53af97f80d48919"`); 18 | await queryRunner.query(`ALTER TABLE "text_story" DROP CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1"`); 19 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_e8fb739f08d47955a39850fac23" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 20 | await queryRunner.query(`ALTER TABLE "like" ADD CONSTRAINT "FK_0c6cf745c30c53af97f80d48919" FOREIGN KEY ("textStoryId") REFERENCES "text_story"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 21 | await queryRunner.query(`ALTER TABLE "text_story" ADD CONSTRAINT "FK_060dfe83d26f3826a1d829e3ac1" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/migrations/1611959599837-GifStory.ts: -------------------------------------------------------------------------------- 1 | import { MigrationInterface, QueryRunner } from "typeorm"; 2 | 3 | export class GifStory1611959599837 implements MigrationInterface { 4 | name = "GifStory1611959599837"; 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query( 8 | `CREATE TABLE "gif_story" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "flagged" text, "filename" text NOT NULL DEFAULT 'untitled', "mediaId" text NOT NULL, "programmingLanguageId" text, "numLikes" integer NOT NULL DEFAULT 0, "creatorId" uuid NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "PK_9db510e005acaa0d4e8ca0bafd0" PRIMARY KEY ("id"))` 9 | ); 10 | await queryRunner.query( 11 | `ALTER TABLE "gif_story" ADD CONSTRAINT "FK_a3e4fdf2a422a65b24361ce36d1" FOREIGN KEY ("creatorId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION` 12 | ); 13 | await queryRunner.query( 14 | `ALTER TABLE "friend" DROP CONSTRAINT "FK_e8fb739f08d47955a39850fac23"` 15 | ); 16 | await queryRunner.query( 17 | `ALTER TABLE "friend" DROP CONSTRAINT "FK_0c6cf745c30c53af97f80d48919"` 18 | ); 19 | await queryRunner.query(`DROP TABLE "friend"`); 20 | await queryRunner.query(`DROP TABLE "story"`); 21 | } 22 | 23 | public async down(queryRunner: QueryRunner): Promise { 24 | await queryRunner.query( 25 | `ALTER TABLE "gif_story" DROP CONSTRAINT "FK_a3e4fdf2a422a65b24361ce36d1"` 26 | ); 27 | await queryRunner.query(`DROP TABLE "gif_story"`); 28 | await queryRunner.query( 29 | `CREATE TABLE "friend" ("userId" uuid NOT NULL, "friendsUserId" uuid NOT NULL, CONSTRAINT "PK_c6b2f8cb0931bd5cf7006c9ff24" PRIMARY KEY ("userId", "friendsUserId"))` 30 | ); 31 | await queryRunner.query( 32 | `ALTER TABLE "friend" ADD CONSTRAINT "FK_0c6cf745c30c53af97f80d48919" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION` 33 | ); 34 | await queryRunner.query( 35 | `ALTER TABLE "friend" ADD CONSTRAINT "FK_e8fb739f08d47955a39850fac23" FOREIGN KEY ("friendsUserId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION` 36 | ); 37 | 38 | await queryRunner.query( 39 | `CREATE TABLE "story" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "mediaId" text NOT NULL, "numLikes" integer NOT NULL DEFAULT 0, "creatorUsername" text NOT NULL, "creatorAvatarUrl" text NOT NULL, "flair" text NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "PK_28fce6873d61e2cace70a0f3361" PRIMARY KEY ("id"))` 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/migrations/1617748572112-Favorite.ts: -------------------------------------------------------------------------------- 1 | import {MigrationInterface, QueryRunner} from "typeorm"; 2 | 3 | export class Favorite1617748572112 implements MigrationInterface { 4 | name = 'Favorite1617748572112' 5 | 6 | public async up(queryRunner: QueryRunner): Promise { 7 | await queryRunner.query(`CREATE TABLE "favorite" ("gifStoryId" uuid NOT NULL, "userId" uuid NOT NULL, CONSTRAINT "PK_43f32fcd289a552b04727dbe223" PRIMARY KEY ("gifStoryId", "userId"))`); 8 | await queryRunner.query(`ALTER TABLE "favorite" ADD CONSTRAINT "FK_71ca25fe85cc34f7e3ab66cfae7" FOREIGN KEY ("gifStoryId") REFERENCES "gif_story"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 9 | await queryRunner.query(`ALTER TABLE "favorite" ADD CONSTRAINT "FK_83b775fdebbe24c29b2b5831f2d" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); 10 | } 11 | 12 | public async down(queryRunner: QueryRunner): Promise { 13 | await queryRunner.query(`ALTER TABLE "favorite" DROP CONSTRAINT "FK_83b775fdebbe24c29b2b5831f2d"`); 14 | await queryRunner.query(`ALTER TABLE "favorite" DROP CONSTRAINT "FK_71ca25fe85cc34f7e3ab66cfae7"`); 15 | await queryRunner.query(`DROP TABLE "favorite"`); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/queryBuilder.ts: -------------------------------------------------------------------------------- 1 | import { getConnection } from "typeorm"; 2 | 3 | export async function fetchStories( 4 | limit: number, 5 | cursor: number, 6 | friendIds?: string[] 7 | ) { 8 | const queryString = ` 9 | select 10 | ts.id, 11 | ts."creatorId", 12 | u.username "creatorUsername", 13 | u."id" "creatorId", 14 | u."photoUrl" "creatorAvatarUrl", 15 | u.flair, 16 | 'text' "type" 17 | from text_story ts 18 | inner join "user" u on u.id = ts."creatorId" 19 | ${friendIds ? `WHERE u."id" IN ('${friendIds.join("', '")}')` : ``} 20 | order by (ts."numLikes"+1) / power(EXTRACT(EPOCH FROM current_timestamp-ts."createdAt")/3600,1.8) DESC 21 | limit ${limit + 1} 22 | ${cursor ? `offset ${limit * cursor}` : ""} 23 | `; 24 | 25 | const stories = await getConnection().query(queryString); 26 | 27 | return stories; 28 | } 29 | 30 | export async function fetchGifStories( 31 | limit: number, 32 | cursor: number, 33 | friendIds?: string[] 34 | ) { 35 | const queryString = ` 36 | select 37 | gs.id, 38 | u.username "creatorUsername", 39 | u."id" "creatorId", 40 | u."photoUrl" "creatorAvatarUrl", 41 | u.flair, 42 | 'gif' "type" 43 | from gif_story gs 44 | inner join "user" u on u.id = gs."creatorId" 45 | ${friendIds ? `WHERE u."id" IN ('${friendIds.join("', '")}')` : ``} 46 | order by (gs."numLikes"+1) / power(EXTRACT(EPOCH FROM current_timestamp-gs."createdAt")/3600,1.8) DESC 47 | limit ${limit + 1} 48 | ${cursor ? `offset ${limit * cursor}` : ""} 49 | `; 50 | 51 | const stories = await getConnection().query(queryString); 52 | 53 | return stories; 54 | } 55 | 56 | export async function fetchUserGifStories( 57 | limit: number, 58 | cursor: number, 59 | userId: string 60 | ) { 61 | const queryString = ` 62 | select 63 | gs.id, 64 | u.username "creatorUsername", 65 | u."id" "creatorId", 66 | u."photoUrl" "creatorAvatarUrl", 67 | u.flair, 68 | 'gif' "type" 69 | from gif_story gs 70 | inner join "user" u on u.id = gs."creatorId" 71 | where u.id = '${userId}' 72 | order by (gs."numLikes"+1) / power(EXTRACT(EPOCH FROM current_timestamp-gs."createdAt")/3600,1.8) DESC 73 | limit ${limit + 1} 74 | ${cursor ? `offset ${limit * cursor}` : ""} 75 | `; 76 | 77 | const stories = await getConnection().query(queryString); 78 | 79 | return stories; 80 | } 81 | 82 | export async function fetchUserStories( 83 | limit: number, 84 | cursor: number, 85 | userId: string 86 | ) { 87 | const queryString = ` 88 | select 89 | ts.id, 90 | u.username "creatorUsername", 91 | u."id" "creatorId", 92 | u."photoUrl" "creatorAvatarUrl", 93 | u.flair, 94 | 'text' "type" 95 | from text_story ts 96 | inner join "user" u on u.id = ts."creatorId" 97 | where u.id = '${userId}' 98 | order by (ts."numLikes"+1) / power(EXTRACT(EPOCH FROM current_timestamp-ts."createdAt")/3600,1.8) DESC 99 | limit ${limit + 1} 100 | ${cursor ? `offset ${limit * cursor}` : ""} 101 | `; 102 | 103 | const stories = await getConnection().query(queryString); 104 | 105 | return stories; 106 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "lib": [ 6 | "dom", 7 | "es6", 8 | "es2017", 9 | "esnext.asynciterable" 10 | ], 11 | "sourceMap": true, 12 | "outDir": "./dist", 13 | "moduleResolution": "node", 14 | "removeComments": true, 15 | "noImplicitAny": true, 16 | "strictNullChecks": true, 17 | "strictFunctionTypes": true, 18 | "noImplicitThis": true, 19 | "noUnusedLocals": false, 20 | "noUnusedParameters": true, 21 | "noImplicitReturns": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "allowSyntheticDefaultImports": true, 24 | "esModuleInterop": true, 25 | "emitDecoratorMetadata": true, 26 | "experimentalDecorators": true, 27 | "resolveJsonModule": true, 28 | "baseUrl": "." 29 | }, 30 | "exclude": [ 31 | "node_modules" 32 | ], 33 | "include": [ 34 | "./src/**/*.tsx", 35 | "./src/**/*.ts" 36 | ] 37 | } -------------------------------------------------------------------------------- /yarn-error.log: -------------------------------------------------------------------------------- 1 | Arguments: 2 | /Users/benawad/.config/nvm/12.19.0/bin/node /Users/benawad/.yarn/bin/yarn.js dev 3 | 4 | PATH: 5 | /Users/benawad/.cabal/bin:/Users/benawad/.ghcup/bin:/usr/local/opt/qt/bin:/Users/benawad/.config/nvm/12.19.0/bin:/Users/benawad/.config/nvm//bin:/Users/benawad/.yarn/bin:/Users/benawad/.pub-cache/bin:/Users/benawad/Library/Android/sdk:/Users/benawad/Library/Python/3.6/bin:/Users/benawad/Library/Python/3.7/bin:/Users/benawad/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Users/benawad/.cabal/bin:/Users/benawad/.ghcup/bin:/Users/benawad/Documents/google-cloud-sdk/bin:/Users/benawad/.pub-cache/bin:/Users/benawad/Library/Android/sdk:/Users/benawad/Library/Python/3.6/bin:/Users/benawad/Library/Python/3.7/bin:/Users/benawad/bin 6 | 7 | Yarn version: 8 | 1.21.1 9 | 10 | Node version: 11 | 12.19.0 12 | 13 | Platform: 14 | darwin x64 15 | 16 | Trace: 17 | Error: write EIO 18 | at afterWriteDispatched (internal/stream_base_commons.js:156:25) 19 | at writeGeneric (internal/stream_base_commons.js:147:3) 20 | at WriteStream.Socket._writeGeneric (net.js:788:11) 21 | at WriteStream.Socket._write (net.js:800:8) 22 | at doWrite (_stream_writable.js:403:12) 23 | at writeOrBuffer (_stream_writable.js:387:5) 24 | at WriteStream.Writable.write (_stream_writable.js:318:11) 25 | at Object.clearLine (readline.js:1251:17) 26 | at clearLine (/Users/benawad/.yarn/lib/cli.js:49657:12) 27 | at ConsoleReporter._log (/Users/benawad/.yarn/lib/cli.js:96690:43) 28 | 29 | npm manifest: 30 | { 31 | "name": "vscode-stories-api", 32 | "version": "1.0.0", 33 | "description": "", 34 | "main": "index.js", 35 | "scripts": { 36 | "postinstall": "tsc", 37 | "start": "node dist/index.js", 38 | "dev": "ts-node-dev --files src/index.ts" 39 | }, 40 | "keywords": [], 41 | "author": "", 42 | "license": "ISC", 43 | "dependencies": { 44 | "@types/cors": "^2.8.8", 45 | "@types/express-rate-limit": "^5.1.0", 46 | "@types/is-url": "^1.2.28", 47 | "@types/is-uuid": "^1.0.0", 48 | "@types/jsonwebtoken": "^8.5.0", 49 | "@types/koa": "^2.11.6", 50 | "@types/koa-bodyparser": "^4.3.0", 51 | "@types/koa-helmet": "^6.0.1", 52 | "@types/koa-ratelimit": "^4.2.2", 53 | "@types/koa__cors": "^3.0.2", 54 | "@types/koa__router": "^8.0.3", 55 | "@types/lru-cache": "^5.1.0", 56 | "@types/memory-cache": "^0.2.1", 57 | "@types/node": "^14.14.2", 58 | "@types/passport-github": "^1.1.5", 59 | "body-parser": "^1.19.0", 60 | "cors": "^2.8.5", 61 | "dotenv-safe": "^8.2.0", 62 | "express": "^4.17.1", 63 | "express-rate-limit": "^5.1.3", 64 | "http-errors": "^1.8.0", 65 | "is-url": "^1.2.4", 66 | "is-uuid": "^1.0.2", 67 | "jsonwebtoken": "^8.5.1", 68 | "lru-cache": "^6.0.0", 69 | "memory-cache": "^0.2.0", 70 | "passport": "^0.4.1", 71 | "passport-github": "^1.1.0", 72 | "pg": "^8.4.1", 73 | "reflect-metadata": "^0.1.13", 74 | "ts-node": "^9.0.0", 75 | "ts-node-dev": "^1.0.0", 76 | "typeorm": "^0.2.28", 77 | "@types/express": "^4.17.8", 78 | "typescript": "^4.0.5" 79 | } 80 | } 81 | 82 | yarn manifest: 83 | No manifest 84 | 85 | Lockfile: 86 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 87 | # yarn lockfile v1 88 | 89 | 90 | "@sqltools/formatter@1.2.2": 91 | version "1.2.2" 92 | resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.2.tgz#9390a8127c0dcba61ebd7fdcc748655e191bdd68" 93 | integrity sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q== 94 | 95 | "@types/accepts@*": 96 | version "1.3.5" 97 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 98 | integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== 99 | dependencies: 100 | "@types/node" "*" 101 | 102 | "@types/body-parser@*": 103 | version "1.19.0" 104 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 105 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 106 | dependencies: 107 | "@types/connect" "*" 108 | "@types/node" "*" 109 | 110 | "@types/connect@*": 111 | version "3.4.33" 112 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" 113 | integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== 114 | dependencies: 115 | "@types/node" "*" 116 | 117 | "@types/content-disposition@*": 118 | version "0.5.3" 119 | resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" 120 | integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== 121 | 122 | "@types/cookies@*": 123 | version "0.7.4" 124 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" 125 | integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== 126 | dependencies: 127 | "@types/connect" "*" 128 | "@types/express" "*" 129 | "@types/keygrip" "*" 130 | "@types/node" "*" 131 | 132 | "@types/cors@^2.8.8": 133 | version "2.8.8" 134 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.8.tgz#317a8d8561995c60e35b9e0fcaa8d36660c98092" 135 | integrity sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w== 136 | dependencies: 137 | "@types/express" "*" 138 | 139 | "@types/express-rate-limit@^5.1.0": 140 | version "5.1.0" 141 | resolved "https://registry.yarnpkg.com/@types/express-rate-limit/-/express-rate-limit-5.1.0.tgz#c08e9b4957989fbe5ff8d5224f392359a264a597" 142 | integrity sha512-vmg7S3hUnfFmp06V01DrTB41mbQYXMV/F4aF5KKnfCIeSlnizatXaqO9UgR6LvNEEd3eMpuUTLxR6nv3d4hZ6g== 143 | dependencies: 144 | "@types/express" "*" 145 | 146 | "@types/express-serve-static-core@*": 147 | version "4.17.13" 148 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" 149 | integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== 150 | dependencies: 151 | "@types/node" "*" 152 | "@types/qs" "*" 153 | "@types/range-parser" "*" 154 | 155 | "@types/express@*", "@types/express@^4.17.8": 156 | version "4.17.8" 157 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a" 158 | integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ== 159 | dependencies: 160 | "@types/body-parser" "*" 161 | "@types/express-serve-static-core" "*" 162 | "@types/qs" "*" 163 | "@types/serve-static" "*" 164 | 165 | "@types/http-assert@*": 166 | version "1.5.1" 167 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" 168 | integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== 169 | 170 | "@types/http-errors@*": 171 | version "1.8.0" 172 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" 173 | integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== 174 | 175 | "@types/ioredis@*": 176 | version "4.17.6" 177 | resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.17.6.tgz#b3b8d6e9fed7f494da08d991d8110daab2e273b8" 178 | integrity sha512-Vg3vuhveOaQeiubzGpVU9Hn3UJCi7rPe2TOphc3m3Y2EniHmytHp/wj5ZtfqDGBhFJGaSwbJvGQhhqd/Nqfy4Q== 179 | dependencies: 180 | "@types/node" "*" 181 | 182 | "@types/is-url@^1.2.28": 183 | version "1.2.28" 184 | resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" 185 | integrity sha1-kU2r1QVG2bAUKAbkLHK8fCt+B4c= 186 | 187 | "@types/is-uuid@^1.0.0": 188 | version "1.0.0" 189 | resolved "https://registry.yarnpkg.com/@types/is-uuid/-/is-uuid-1.0.0.tgz#6d359d80c5a9f8f7ef5a23c685b14ffcb96d622c" 190 | integrity sha512-FaiSi54J9lp09vZqlgHcbJaeq/G4h0dHqCxOXqCWzzjCaS2yVIx6xjZs7rnkTKu+C6xec+Ud1xtaONqaPHxApQ== 191 | 192 | "@types/jsonwebtoken@^8.5.0": 193 | version "8.5.0" 194 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5" 195 | integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg== 196 | dependencies: 197 | "@types/node" "*" 198 | 199 | "@types/keygrip@*": 200 | version "1.0.2" 201 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" 202 | integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== 203 | 204 | "@types/koa-bodyparser@^4.3.0": 205 | version "4.3.0" 206 | resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#54ecd662c45f3a4fa9de849528de5fc8ab269ba5" 207 | integrity sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA== 208 | dependencies: 209 | "@types/koa" "*" 210 | 211 | "@types/koa-compose@*": 212 | version "3.2.5" 213 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" 214 | integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== 215 | dependencies: 216 | "@types/koa" "*" 217 | 218 | "@types/koa-helmet@^6.0.1": 219 | version "6.0.1" 220 | resolved "https://registry.yarnpkg.com/@types/koa-helmet/-/koa-helmet-6.0.1.tgz#05751bf0fa760ca85a7c9fe02f8b0d00a01571a2" 221 | integrity sha512-kPdPJFDfQbDqsp6/29yWnzoCz+Wo9MasY9AbaZnyS5AKqHFToviSQkzTl6SENbWem/yTwGER/gbc0Y+/ptvd+w== 222 | dependencies: 223 | "@types/koa" "*" 224 | helmet "^4.0.0" 225 | 226 | "@types/koa-ratelimit@^4.2.2": 227 | version "4.2.2" 228 | resolved "https://registry.yarnpkg.com/@types/koa-ratelimit/-/koa-ratelimit-4.2.2.tgz#a36e1a521ca89ce521664df465be78d0adf2ddb9" 229 | integrity sha512-+qOsUZFZNYmSd1RqUMyD1uAn6bMmbGOM1GxoMsJ5kp35gTKptw/VtlPbR2VJ6lMgtS4oivVgije5X/yu8A5ONA== 230 | dependencies: 231 | "@types/ioredis" "*" 232 | "@types/koa" "*" 233 | "@types/redis" "*" 234 | 235 | "@types/koa@*", "@types/koa@^2.11.6": 236 | version "2.11.6" 237 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.6.tgz#b7030caa6b44af801c2aea13ba77d74aff7484d5" 238 | integrity sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A== 239 | dependencies: 240 | "@types/accepts" "*" 241 | "@types/content-disposition" "*" 242 | "@types/cookies" "*" 243 | "@types/http-assert" "*" 244 | "@types/http-errors" "*" 245 | "@types/keygrip" "*" 246 | "@types/koa-compose" "*" 247 | "@types/node" "*" 248 | 249 | "@types/koa__cors@^3.0.2": 250 | version "3.0.2" 251 | resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-3.0.2.tgz#578917ffca964e98f5e9849996ae1eeda7c15704" 252 | integrity sha512-gBetQR0DJ9JTG1YQoW33BADHCrDPJGiJUKUUcEPJwW1A2unzpIMhorEpXB6eMaaXTaqHLemcGnq3RmH9XaryRQ== 253 | dependencies: 254 | "@types/koa" "*" 255 | 256 | "@types/koa__router@^8.0.3": 257 | version "8.0.3" 258 | resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-8.0.3.tgz#f6a9ea3428d1025401f5fc21c47c18395ac44cdc" 259 | integrity sha512-eS8K49z1x6OaW1ha61kRksVo42L5DWdQUA3kVpH1Kz6TuKBlG0ri42ELA4zSh+xg+6fAqjfuWA7bfNvwVMNXQA== 260 | dependencies: 261 | "@types/koa" "*" 262 | 263 | "@types/lru-cache@^5.1.0": 264 | version "5.1.0" 265 | resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" 266 | integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== 267 | 268 | "@types/memory-cache@^0.2.1": 269 | version "0.2.1" 270 | resolved "https://registry.yarnpkg.com/@types/memory-cache/-/memory-cache-0.2.1.tgz#00caf5d737e4acc100f5b98152c635edabdb00d7" 271 | integrity sha512-6rmz3bMqJNkj0HIN3AMhOfRN+JhnxxTULeBkwgilfnspjABtKG6ig8mbIzkOjtmiRw+WG1B56z+BO6htGz3IBw== 272 | 273 | "@types/mime@*": 274 | version "2.0.3" 275 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" 276 | integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== 277 | 278 | "@types/node@*", "@types/node@^14.14.2": 279 | version "14.14.2" 280 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb" 281 | integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg== 282 | 283 | "@types/oauth@*": 284 | version "0.9.1" 285 | resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.1.tgz#e17221e7f7936b0459ae7d006255dff61adca305" 286 | integrity sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A== 287 | dependencies: 288 | "@types/node" "*" 289 | 290 | "@types/passport-github@^1.1.5": 291 | version "1.1.5" 292 | resolved "https://registry.yarnpkg.com/@types/passport-github/-/passport-github-1.1.5.tgz#57ea20d1de0789b98a7157603d76d87c271de6b2" 293 | integrity sha512-BeWDdLRWfPpJcmT1XofY5r1Av//TcxBEgllY4LnArcYdGqbIIVLyHwR+8bIG+ZC4PwJ6W1trnVEG3EQ+5J+Jmw== 294 | dependencies: 295 | "@types/express" "*" 296 | "@types/passport" "*" 297 | "@types/passport-oauth2" "*" 298 | 299 | "@types/passport-oauth2@*": 300 | version "1.4.9" 301 | resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.9.tgz#134007c4b505a82548c9cb19094c5baeb2205c92" 302 | integrity sha512-QP0q+NVQOaIu2r0e10QWkiUA0Ya5mOBHRJN0UrI+LolMLOP1/VN4EVIpJ3xVwFo+xqNFRoFvFwJhBvKnk7kpUA== 303 | dependencies: 304 | "@types/express" "*" 305 | "@types/oauth" "*" 306 | "@types/passport" "*" 307 | 308 | "@types/passport@*": 309 | version "1.0.4" 310 | resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.4.tgz#1b35c4e197560d3974fa5f71711b6e9cce0711f0" 311 | integrity sha512-h5OfAbfBBYSzjeU0GTuuqYEk9McTgWeGQql9g3gUw2/NNCfD7VgExVRYJVVeU13Twn202Mvk9BT0bUrl30sEgA== 312 | dependencies: 313 | "@types/express" "*" 314 | 315 | "@types/qs@*": 316 | version "6.9.5" 317 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" 318 | integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== 319 | 320 | "@types/range-parser@*": 321 | version "1.2.3" 322 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 323 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 324 | 325 | "@types/redis@*": 326 | version "2.8.28" 327 | resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.28.tgz#5862b2b64aa7f7cbc76dafd7e6f06992b52c55e3" 328 | integrity sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA== 329 | dependencies: 330 | "@types/node" "*" 331 | 332 | "@types/serve-static@*": 333 | version "1.13.6" 334 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.6.tgz#866b1b8dec41c36e28c7be40ac725b88be43c5c1" 335 | integrity sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA== 336 | dependencies: 337 | "@types/mime" "*" 338 | "@types/node" "*" 339 | 340 | "@types/strip-bom@^3.0.0": 341 | version "3.0.0" 342 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 343 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 344 | 345 | "@types/strip-json-comments@0.0.30": 346 | version "0.0.30" 347 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 348 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 349 | 350 | accepts@~1.3.7: 351 | version "1.3.7" 352 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 353 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 354 | dependencies: 355 | mime-types "~2.1.24" 356 | negotiator "0.6.2" 357 | 358 | ansi-regex@^2.0.0: 359 | version "2.1.1" 360 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 361 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 362 | 363 | ansi-regex@^5.0.0: 364 | version "5.0.0" 365 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 366 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 367 | 368 | ansi-styles@^2.2.1: 369 | version "2.2.1" 370 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 371 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 372 | 373 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 374 | version "4.3.0" 375 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 376 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 377 | dependencies: 378 | color-convert "^2.0.1" 379 | 380 | any-promise@^1.0.0: 381 | version "1.3.0" 382 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 383 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 384 | 385 | anymatch@~3.1.1: 386 | version "3.1.1" 387 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 388 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 389 | dependencies: 390 | normalize-path "^3.0.0" 391 | picomatch "^2.0.4" 392 | 393 | app-root-path@^3.0.0: 394 | version "3.0.0" 395 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" 396 | integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== 397 | 398 | arg@^4.1.0: 399 | version "4.1.3" 400 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 401 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 402 | 403 | argparse@^1.0.7: 404 | version "1.0.10" 405 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 406 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 407 | dependencies: 408 | sprintf-js "~1.0.2" 409 | 410 | array-find-index@^1.0.1: 411 | version "1.0.2" 412 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 413 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 414 | 415 | array-flatten@1.1.1: 416 | version "1.1.1" 417 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 418 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 419 | 420 | balanced-match@^1.0.0: 421 | version "1.0.0" 422 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 423 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 424 | 425 | base64-js@^1.3.1: 426 | version "1.3.1" 427 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 428 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 429 | 430 | base64url@3.x.x: 431 | version "3.0.1" 432 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" 433 | integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== 434 | 435 | binary-extensions@^2.0.0: 436 | version "2.1.0" 437 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 438 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 439 | 440 | body-parser@1.19.0, body-parser@^1.19.0: 441 | version "1.19.0" 442 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 443 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 444 | dependencies: 445 | bytes "3.1.0" 446 | content-type "~1.0.4" 447 | debug "2.6.9" 448 | depd "~1.1.2" 449 | http-errors "1.7.2" 450 | iconv-lite "0.4.24" 451 | on-finished "~2.3.0" 452 | qs "6.7.0" 453 | raw-body "2.4.0" 454 | type-is "~1.6.17" 455 | 456 | brace-expansion@^1.1.7: 457 | version "1.1.11" 458 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 459 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 460 | dependencies: 461 | balanced-match "^1.0.0" 462 | concat-map "0.0.1" 463 | 464 | braces@~3.0.2: 465 | version "3.0.2" 466 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 467 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 468 | dependencies: 469 | fill-range "^7.0.1" 470 | 471 | buffer-equal-constant-time@1.0.1: 472 | version "1.0.1" 473 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 474 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 475 | 476 | buffer-from@^1.0.0: 477 | version "1.1.1" 478 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 479 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 480 | 481 | buffer-writer@2.0.0: 482 | version "2.0.0" 483 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 484 | integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== 485 | 486 | buffer@^5.5.0: 487 | version "5.6.1" 488 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.1.tgz#b99419405f4290a7a1f20b51037cee9f1fbd7f6a" 489 | integrity sha512-2z15UUHpS9/3tk9mY/q+Rl3rydOi7yMp5XWNQnRvoz+mJwiv8brqYwp9a+nOCtma6dwuEIxljD8W3ysVBZ05Vg== 490 | dependencies: 491 | base64-js "^1.3.1" 492 | ieee754 "^1.1.13" 493 | 494 | bytes@3.1.0: 495 | version "3.1.0" 496 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 497 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 498 | 499 | camelcase-keys@^2.0.0: 500 | version "2.1.0" 501 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 502 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 503 | dependencies: 504 | camelcase "^2.0.0" 505 | map-obj "^1.0.0" 506 | 507 | camelcase@^2.0.0: 508 | version "2.1.1" 509 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 510 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 511 | 512 | camelcase@^5.0.0: 513 | version "5.3.1" 514 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 515 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 516 | 517 | chalk@^1.1.1: 518 | version "1.1.3" 519 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 520 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 521 | dependencies: 522 | ansi-styles "^2.2.1" 523 | escape-string-regexp "^1.0.2" 524 | has-ansi "^2.0.0" 525 | strip-ansi "^3.0.0" 526 | supports-color "^2.0.0" 527 | 528 | chalk@^3.0.0: 529 | version "3.0.0" 530 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 531 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 532 | dependencies: 533 | ansi-styles "^4.1.0" 534 | supports-color "^7.1.0" 535 | 536 | chalk@^4.1.0: 537 | version "4.1.0" 538 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 539 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 540 | dependencies: 541 | ansi-styles "^4.1.0" 542 | supports-color "^7.1.0" 543 | 544 | chokidar@^3.4.0: 545 | version "3.4.3" 546 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" 547 | integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== 548 | dependencies: 549 | anymatch "~3.1.1" 550 | braces "~3.0.2" 551 | glob-parent "~5.1.0" 552 | is-binary-path "~2.1.0" 553 | is-glob "~4.0.1" 554 | normalize-path "~3.0.0" 555 | readdirp "~3.5.0" 556 | optionalDependencies: 557 | fsevents "~2.1.2" 558 | 559 | cli-highlight@^2.1.4: 560 | version "2.1.4" 561 | resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b" 562 | integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ== 563 | dependencies: 564 | chalk "^3.0.0" 565 | highlight.js "^9.6.0" 566 | mz "^2.4.0" 567 | parse5 "^5.1.1" 568 | parse5-htmlparser2-tree-adapter "^5.1.1" 569 | yargs "^15.0.0" 570 | 571 | cliui@^6.0.0: 572 | version "6.0.0" 573 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 574 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 575 | dependencies: 576 | string-width "^4.2.0" 577 | strip-ansi "^6.0.0" 578 | wrap-ansi "^6.2.0" 579 | 580 | cliui@^7.0.2: 581 | version "7.0.3" 582 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.3.tgz#ef180f26c8d9bff3927ee52428bfec2090427981" 583 | integrity sha512-Gj3QHTkVMPKqwP3f7B4KPkBZRMR9r4rfi5bXFpg1a+Svvj8l7q5CnkBkVQzfxT5DFSsGk2+PascOgL0JYkL2kw== 584 | dependencies: 585 | string-width "^4.2.0" 586 | strip-ansi "^6.0.0" 587 | wrap-ansi "^7.0.0" 588 | 589 | color-convert@^2.0.1: 590 | version "2.0.1" 591 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 592 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 593 | dependencies: 594 | color-name "~1.1.4" 595 | 596 | color-name@~1.1.4: 597 | version "1.1.4" 598 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 599 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 600 | 601 | concat-map@0.0.1: 602 | version "0.0.1" 603 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 604 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 605 | 606 | content-disposition@0.5.3: 607 | version "0.5.3" 608 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 609 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 610 | dependencies: 611 | safe-buffer "5.1.2" 612 | 613 | content-type@~1.0.4: 614 | version "1.0.4" 615 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 616 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 617 | 618 | cookie-signature@1.0.6: 619 | version "1.0.6" 620 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 621 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 622 | 623 | cookie@0.4.0: 624 | version "0.4.0" 625 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 626 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 627 | 628 | cors@^2.8.5: 629 | version "2.8.5" 630 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 631 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 632 | dependencies: 633 | object-assign "^4" 634 | vary "^1" 635 | 636 | currently-unhandled@^0.4.1: 637 | version "0.4.1" 638 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 639 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 640 | dependencies: 641 | array-find-index "^1.0.1" 642 | 643 | dateformat@~1.0.4-1.2.3: 644 | version "1.0.12" 645 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 646 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 647 | dependencies: 648 | get-stdin "^4.0.1" 649 | meow "^3.3.0" 650 | 651 | debug@2.6.9: 652 | version "2.6.9" 653 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 654 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 655 | dependencies: 656 | ms "2.0.0" 657 | 658 | debug@^4.1.1: 659 | version "4.2.0" 660 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" 661 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== 662 | dependencies: 663 | ms "2.1.2" 664 | 665 | decamelize@^1.1.2, decamelize@^1.2.0: 666 | version "1.2.0" 667 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 668 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 669 | 670 | depd@~1.1.2: 671 | version "1.1.2" 672 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 673 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 674 | 675 | destroy@~1.0.4: 676 | version "1.0.4" 677 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 678 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 679 | 680 | diff@^4.0.1: 681 | version "4.0.2" 682 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 683 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 684 | 685 | dotenv-safe@^8.2.0: 686 | version "8.2.0" 687 | resolved "https://registry.yarnpkg.com/dotenv-safe/-/dotenv-safe-8.2.0.tgz#8d548c7318a62c09a66c4dc8c31864cc007c78ba" 688 | integrity sha512-uWwWWdUQkSs5a3mySDB22UtNwyEYi0JtEQu+vDzIqr9OjbDdC2Ip13PnSpi/fctqlYmzkxCeabiyCAOROuAIaA== 689 | dependencies: 690 | dotenv "^8.2.0" 691 | 692 | dotenv@^8.2.0: 693 | version "8.2.0" 694 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 695 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 696 | 697 | dynamic-dedupe@^0.3.0: 698 | version "0.3.0" 699 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 700 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 701 | dependencies: 702 | xtend "^4.0.0" 703 | 704 | ecdsa-sig-formatter@1.0.11: 705 | version "1.0.11" 706 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 707 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 708 | dependencies: 709 | safe-buffer "^5.0.1" 710 | 711 | ee-first@1.1.1: 712 | version "1.1.1" 713 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 714 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 715 | 716 | emoji-regex@^8.0.0: 717 | version "8.0.0" 718 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 719 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 720 | 721 | encodeurl@~1.0.2: 722 | version "1.0.2" 723 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 724 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 725 | 726 | error-ex@^1.2.0: 727 | version "1.3.2" 728 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 729 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 730 | dependencies: 731 | is-arrayish "^0.2.1" 732 | 733 | escalade@^3.1.1: 734 | version "3.1.1" 735 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 736 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 737 | 738 | escape-html@~1.0.3: 739 | version "1.0.3" 740 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 741 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 742 | 743 | escape-string-regexp@^1.0.2: 744 | version "1.0.5" 745 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 746 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 747 | 748 | esprima@^4.0.0: 749 | version "4.0.1" 750 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 751 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 752 | 753 | etag@~1.8.1: 754 | version "1.8.1" 755 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 756 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 757 | 758 | express-rate-limit@^5.1.3: 759 | version "5.1.3" 760 | resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.1.3.tgz#656bacce3f093034976346958a0f0199902c9174" 761 | integrity sha512-TINcxve5510pXj4n9/1AMupkj3iWxl3JuZaWhCdYDlZeoCPqweGZrxbrlqTCFb1CT5wli7s8e2SH/Qz2c9GorA== 762 | 763 | express@^4.17.1: 764 | version "4.17.1" 765 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 766 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 767 | dependencies: 768 | accepts "~1.3.7" 769 | array-flatten "1.1.1" 770 | body-parser "1.19.0" 771 | content-disposition "0.5.3" 772 | content-type "~1.0.4" 773 | cookie "0.4.0" 774 | cookie-signature "1.0.6" 775 | debug "2.6.9" 776 | depd "~1.1.2" 777 | encodeurl "~1.0.2" 778 | escape-html "~1.0.3" 779 | etag "~1.8.1" 780 | finalhandler "~1.1.2" 781 | fresh "0.5.2" 782 | merge-descriptors "1.0.1" 783 | methods "~1.1.2" 784 | on-finished "~2.3.0" 785 | parseurl "~1.3.3" 786 | path-to-regexp "0.1.7" 787 | proxy-addr "~2.0.5" 788 | qs "6.7.0" 789 | range-parser "~1.2.1" 790 | safe-buffer "5.1.2" 791 | send "0.17.1" 792 | serve-static "1.14.1" 793 | setprototypeof "1.1.1" 794 | statuses "~1.5.0" 795 | type-is "~1.6.18" 796 | utils-merge "1.0.1" 797 | vary "~1.1.2" 798 | 799 | figlet@^1.1.1: 800 | version "1.5.0" 801 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c" 802 | integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww== 803 | 804 | fill-range@^7.0.1: 805 | version "7.0.1" 806 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 807 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 808 | dependencies: 809 | to-regex-range "^5.0.1" 810 | 811 | finalhandler@~1.1.2: 812 | version "1.1.2" 813 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 814 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 815 | dependencies: 816 | debug "2.6.9" 817 | encodeurl "~1.0.2" 818 | escape-html "~1.0.3" 819 | on-finished "~2.3.0" 820 | parseurl "~1.3.3" 821 | statuses "~1.5.0" 822 | unpipe "~1.0.0" 823 | 824 | find-up@^1.0.0: 825 | version "1.1.2" 826 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 827 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 828 | dependencies: 829 | path-exists "^2.0.0" 830 | pinkie-promise "^2.0.0" 831 | 832 | find-up@^4.1.0: 833 | version "4.1.0" 834 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 835 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 836 | dependencies: 837 | locate-path "^5.0.0" 838 | path-exists "^4.0.0" 839 | 840 | forwarded@~0.1.2: 841 | version "0.1.2" 842 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 843 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 844 | 845 | fresh@0.5.2: 846 | version "0.5.2" 847 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 848 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 849 | 850 | fs.realpath@^1.0.0: 851 | version "1.0.0" 852 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 853 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 854 | 855 | fsevents@~2.1.2: 856 | version "2.1.3" 857 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 858 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 859 | 860 | function-bind@^1.1.1: 861 | version "1.1.1" 862 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 863 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 864 | 865 | get-caller-file@^2.0.1, get-caller-file@^2.0.5: 866 | version "2.0.5" 867 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 868 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 869 | 870 | get-stdin@^4.0.1: 871 | version "4.0.1" 872 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 873 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 874 | 875 | glob-parent@~5.1.0: 876 | version "5.1.1" 877 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 878 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 879 | dependencies: 880 | is-glob "^4.0.1" 881 | 882 | glob@^7.1.3, glob@^7.1.6: 883 | version "7.1.6" 884 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 885 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 886 | dependencies: 887 | fs.realpath "^1.0.0" 888 | inflight "^1.0.4" 889 | inherits "2" 890 | minimatch "^3.0.4" 891 | once "^1.3.0" 892 | path-is-absolute "^1.0.0" 893 | 894 | graceful-fs@^4.1.2: 895 | version "4.2.4" 896 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 897 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 898 | 899 | has-ansi@^2.0.0: 900 | version "2.0.0" 901 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 902 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 903 | dependencies: 904 | ansi-regex "^2.0.0" 905 | 906 | has-flag@^4.0.0: 907 | version "4.0.0" 908 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 909 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 910 | 911 | has@^1.0.3: 912 | version "1.0.3" 913 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 914 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 915 | dependencies: 916 | function-bind "^1.1.1" 917 | 918 | helmet@^4.0.0: 919 | version "4.1.1" 920 | resolved "https://registry.yarnpkg.com/helmet/-/helmet-4.1.1.tgz#751f0e273d809ace9c172073e0003bed27d27a4a" 921 | integrity sha512-Avg4XxSBrehD94mkRwEljnO+6RZx7AGfk8Wa6K1nxaU+hbXlFOhlOIMgPfFqOYQB/dBCsTpootTGuiOG+CHiQA== 922 | 923 | highlight.js@^9.6.0: 924 | version "9.18.3" 925 | resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.3.tgz#a1a0a2028d5e3149e2380f8a865ee8516703d634" 926 | integrity sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ== 927 | 928 | hosted-git-info@^2.1.4: 929 | version "2.8.8" 930 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 931 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 932 | 933 | http-errors@1.7.2: 934 | version "1.7.2" 935 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 936 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 937 | dependencies: 938 | depd "~1.1.2" 939 | inherits "2.0.3" 940 | setprototypeof "1.1.1" 941 | statuses ">= 1.5.0 < 2" 942 | toidentifier "1.0.0" 943 | 944 | http-errors@^1.8.0: 945 | version "1.8.0" 946 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" 947 | integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== 948 | dependencies: 949 | depd "~1.1.2" 950 | inherits "2.0.4" 951 | setprototypeof "1.2.0" 952 | statuses ">= 1.5.0 < 2" 953 | toidentifier "1.0.0" 954 | 955 | http-errors@~1.7.2: 956 | version "1.7.3" 957 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 958 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 959 | dependencies: 960 | depd "~1.1.2" 961 | inherits "2.0.4" 962 | setprototypeof "1.1.1" 963 | statuses ">= 1.5.0 < 2" 964 | toidentifier "1.0.0" 965 | 966 | iconv-lite@0.4.24: 967 | version "0.4.24" 968 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 969 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 970 | dependencies: 971 | safer-buffer ">= 2.1.2 < 3" 972 | 973 | ieee754@^1.1.13: 974 | version "1.1.13" 975 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 976 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 977 | 978 | indent-string@^2.1.0: 979 | version "2.1.0" 980 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 981 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 982 | dependencies: 983 | repeating "^2.0.0" 984 | 985 | inflight@^1.0.4: 986 | version "1.0.6" 987 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 988 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 989 | dependencies: 990 | once "^1.3.0" 991 | wrappy "1" 992 | 993 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3: 994 | version "2.0.4" 995 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 996 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 997 | 998 | inherits@2.0.3: 999 | version "2.0.3" 1000 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1001 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1002 | 1003 | ipaddr.js@1.9.1: 1004 | version "1.9.1" 1005 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1006 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1007 | 1008 | is-arrayish@^0.2.1: 1009 | version "0.2.1" 1010 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1011 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1012 | 1013 | is-binary-path@~2.1.0: 1014 | version "2.1.0" 1015 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1016 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1017 | dependencies: 1018 | binary-extensions "^2.0.0" 1019 | 1020 | is-core-module@^2.0.0: 1021 | version "2.0.0" 1022 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" 1023 | integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== 1024 | dependencies: 1025 | has "^1.0.3" 1026 | 1027 | is-extglob@^2.1.1: 1028 | version "2.1.1" 1029 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1030 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1031 | 1032 | is-finite@^1.0.0: 1033 | version "1.1.0" 1034 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1035 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 1036 | 1037 | is-fullwidth-code-point@^3.0.0: 1038 | version "3.0.0" 1039 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1040 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1041 | 1042 | is-glob@^4.0.1, is-glob@~4.0.1: 1043 | version "4.0.1" 1044 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1045 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1046 | dependencies: 1047 | is-extglob "^2.1.1" 1048 | 1049 | is-number@^7.0.0: 1050 | version "7.0.0" 1051 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1052 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1053 | 1054 | is-url@^1.2.4: 1055 | version "1.2.4" 1056 | resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" 1057 | integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== 1058 | 1059 | is-utf8@^0.2.0: 1060 | version "0.2.1" 1061 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1062 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1063 | 1064 | is-uuid@^1.0.2: 1065 | version "1.0.2" 1066 | resolved "https://registry.yarnpkg.com/is-uuid/-/is-uuid-1.0.2.tgz#ad1898ddf154947c25c8e54966f48604e9caecc4" 1067 | integrity sha1-rRiY3fFUlHwlyOVJZvSGBOnK7MQ= 1068 | 1069 | js-yaml@^3.14.0: 1070 | version "3.14.0" 1071 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 1072 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 1073 | dependencies: 1074 | argparse "^1.0.7" 1075 | esprima "^4.0.0" 1076 | 1077 | jsonwebtoken@^8.5.1: 1078 | version "8.5.1" 1079 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 1080 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 1081 | dependencies: 1082 | jws "^3.2.2" 1083 | lodash.includes "^4.3.0" 1084 | lodash.isboolean "^3.0.3" 1085 | lodash.isinteger "^4.0.4" 1086 | lodash.isnumber "^3.0.3" 1087 | lodash.isplainobject "^4.0.6" 1088 | lodash.isstring "^4.0.1" 1089 | lodash.once "^4.0.0" 1090 | ms "^2.1.1" 1091 | semver "^5.6.0" 1092 | 1093 | jwa@^1.4.1: 1094 | version "1.4.1" 1095 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1096 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1097 | dependencies: 1098 | buffer-equal-constant-time "1.0.1" 1099 | ecdsa-sig-formatter "1.0.11" 1100 | safe-buffer "^5.0.1" 1101 | 1102 | jws@^3.2.2: 1103 | version "3.2.2" 1104 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1105 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1106 | dependencies: 1107 | jwa "^1.4.1" 1108 | safe-buffer "^5.0.1" 1109 | 1110 | load-json-file@^1.0.0: 1111 | version "1.1.0" 1112 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1113 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1114 | dependencies: 1115 | graceful-fs "^4.1.2" 1116 | parse-json "^2.2.0" 1117 | pify "^2.0.0" 1118 | pinkie-promise "^2.0.0" 1119 | strip-bom "^2.0.0" 1120 | 1121 | locate-path@^5.0.0: 1122 | version "5.0.0" 1123 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1124 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1125 | dependencies: 1126 | p-locate "^4.1.0" 1127 | 1128 | lodash.includes@^4.3.0: 1129 | version "4.3.0" 1130 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1131 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 1132 | 1133 | lodash.isboolean@^3.0.3: 1134 | version "3.0.3" 1135 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1136 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 1137 | 1138 | lodash.isinteger@^4.0.4: 1139 | version "4.0.4" 1140 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1141 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 1142 | 1143 | lodash.isnumber@^3.0.3: 1144 | version "3.0.3" 1145 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1146 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 1147 | 1148 | lodash.isplainobject@^4.0.6: 1149 | version "4.0.6" 1150 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1151 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 1152 | 1153 | lodash.isstring@^4.0.1: 1154 | version "4.0.1" 1155 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1156 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 1157 | 1158 | lodash.once@^4.0.0: 1159 | version "4.1.1" 1160 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1161 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 1162 | 1163 | loud-rejection@^1.0.0: 1164 | version "1.6.0" 1165 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1166 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1167 | dependencies: 1168 | currently-unhandled "^0.4.1" 1169 | signal-exit "^3.0.0" 1170 | 1171 | lru-cache@^6.0.0: 1172 | version "6.0.0" 1173 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1174 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1175 | dependencies: 1176 | yallist "^4.0.0" 1177 | 1178 | make-error@^1.1.1: 1179 | version "1.3.6" 1180 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1181 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1182 | 1183 | map-obj@^1.0.0, map-obj@^1.0.1: 1184 | version "1.0.1" 1185 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1186 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1187 | 1188 | media-typer@0.3.0: 1189 | version "0.3.0" 1190 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1191 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1192 | 1193 | memory-cache@^0.2.0: 1194 | version "0.2.0" 1195 | resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" 1196 | integrity sha1-eJCwHVLADI68nVM+H46xfjA0hxo= 1197 | 1198 | meow@^3.3.0: 1199 | version "3.7.0" 1200 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1201 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1202 | dependencies: 1203 | camelcase-keys "^2.0.0" 1204 | decamelize "^1.1.2" 1205 | loud-rejection "^1.0.0" 1206 | map-obj "^1.0.1" 1207 | minimist "^1.1.3" 1208 | normalize-package-data "^2.3.4" 1209 | object-assign "^4.0.1" 1210 | read-pkg-up "^1.0.1" 1211 | redent "^1.0.0" 1212 | trim-newlines "^1.0.0" 1213 | 1214 | merge-descriptors@1.0.1: 1215 | version "1.0.1" 1216 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1217 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1218 | 1219 | methods@~1.1.2: 1220 | version "1.1.2" 1221 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1222 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1223 | 1224 | mime-db@1.44.0: 1225 | version "1.44.0" 1226 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1227 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1228 | 1229 | mime-types@~2.1.24: 1230 | version "2.1.27" 1231 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1232 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1233 | dependencies: 1234 | mime-db "1.44.0" 1235 | 1236 | mime@1.6.0: 1237 | version "1.6.0" 1238 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1239 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1240 | 1241 | minimatch@^3.0.4: 1242 | version "3.0.4" 1243 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1244 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1245 | dependencies: 1246 | brace-expansion "^1.1.7" 1247 | 1248 | minimist@^1.1.3, minimist@^1.2.5: 1249 | version "1.2.5" 1250 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1251 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1252 | 1253 | mkdirp@^1.0.4: 1254 | version "1.0.4" 1255 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1256 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1257 | 1258 | ms@2.0.0: 1259 | version "2.0.0" 1260 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1261 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1262 | 1263 | ms@2.1.1: 1264 | version "2.1.1" 1265 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1266 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1267 | 1268 | ms@2.1.2, ms@^2.1.1: 1269 | version "2.1.2" 1270 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1271 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1272 | 1273 | mz@^2.4.0: 1274 | version "2.7.0" 1275 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1276 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1277 | dependencies: 1278 | any-promise "^1.0.0" 1279 | object-assign "^4.0.1" 1280 | thenify-all "^1.0.0" 1281 | 1282 | negotiator@0.6.2: 1283 | version "0.6.2" 1284 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1285 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1286 | 1287 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1288 | version "2.5.0" 1289 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1290 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1291 | dependencies: 1292 | hosted-git-info "^2.1.4" 1293 | resolve "^1.10.0" 1294 | semver "2 || 3 || 4 || 5" 1295 | validate-npm-package-license "^3.0.1" 1296 | 1297 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1298 | version "3.0.0" 1299 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1300 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1301 | 1302 | oauth@0.9.x: 1303 | version "0.9.15" 1304 | resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" 1305 | integrity sha1-vR/vr2hslrdUda7VGWQS/2DPucE= 1306 | 1307 | object-assign@^4, object-assign@^4.0.1: 1308 | version "4.1.1" 1309 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1310 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1311 | 1312 | on-finished@~2.3.0: 1313 | version "2.3.0" 1314 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1315 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1316 | dependencies: 1317 | ee-first "1.1.1" 1318 | 1319 | once@^1.3.0: 1320 | version "1.4.0" 1321 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1322 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1323 | dependencies: 1324 | wrappy "1" 1325 | 1326 | p-limit@^2.2.0: 1327 | version "2.3.0" 1328 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1329 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1330 | dependencies: 1331 | p-try "^2.0.0" 1332 | 1333 | p-locate@^4.1.0: 1334 | version "4.1.0" 1335 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1336 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1337 | dependencies: 1338 | p-limit "^2.2.0" 1339 | 1340 | p-try@^2.0.0: 1341 | version "2.2.0" 1342 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1343 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1344 | 1345 | packet-reader@1.0.0: 1346 | version "1.0.0" 1347 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" 1348 | integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== 1349 | 1350 | parent-require@^1.0.0: 1351 | version "1.0.0" 1352 | resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" 1353 | integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= 1354 | 1355 | parse-json@^2.2.0: 1356 | version "2.2.0" 1357 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1358 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1359 | dependencies: 1360 | error-ex "^1.2.0" 1361 | 1362 | parse5-htmlparser2-tree-adapter@^5.1.1: 1363 | version "5.1.1" 1364 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc" 1365 | integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw== 1366 | dependencies: 1367 | parse5 "^5.1.1" 1368 | 1369 | parse5@^5.1.1: 1370 | version "5.1.1" 1371 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" 1372 | integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== 1373 | 1374 | parseurl@~1.3.3: 1375 | version "1.3.3" 1376 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1377 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1378 | 1379 | passport-github@^1.1.0: 1380 | version "1.1.0" 1381 | resolved "https://registry.yarnpkg.com/passport-github/-/passport-github-1.1.0.tgz#8ce1e3fcd61ad7578eb1df595839e4aea12355d4" 1382 | integrity sha1-jOHj/NYa11eOsd9ZWDnkrqEjVdQ= 1383 | dependencies: 1384 | passport-oauth2 "1.x.x" 1385 | 1386 | passport-oauth2@1.x.x: 1387 | version "1.5.0" 1388 | resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.5.0.tgz#64babbb54ac46a4dcab35e7f266ed5294e3c4108" 1389 | integrity sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ== 1390 | dependencies: 1391 | base64url "3.x.x" 1392 | oauth "0.9.x" 1393 | passport-strategy "1.x.x" 1394 | uid2 "0.0.x" 1395 | utils-merge "1.x.x" 1396 | 1397 | passport-strategy@1.x.x: 1398 | version "1.0.0" 1399 | resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" 1400 | integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= 1401 | 1402 | passport@^0.4.1: 1403 | version "0.4.1" 1404 | resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.1.tgz#941446a21cb92fc688d97a0861c38ce9f738f270" 1405 | integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg== 1406 | dependencies: 1407 | passport-strategy "1.x.x" 1408 | pause "0.0.1" 1409 | 1410 | path-exists@^2.0.0: 1411 | version "2.1.0" 1412 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1413 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1414 | dependencies: 1415 | pinkie-promise "^2.0.0" 1416 | 1417 | path-exists@^4.0.0: 1418 | version "4.0.0" 1419 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1420 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1421 | 1422 | path-is-absolute@^1.0.0: 1423 | version "1.0.1" 1424 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1425 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1426 | 1427 | path-parse@^1.0.6: 1428 | version "1.0.6" 1429 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1430 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1431 | 1432 | path-to-regexp@0.1.7: 1433 | version "0.1.7" 1434 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1435 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1436 | 1437 | path-type@^1.0.0: 1438 | version "1.1.0" 1439 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1440 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1441 | dependencies: 1442 | graceful-fs "^4.1.2" 1443 | pify "^2.0.0" 1444 | pinkie-promise "^2.0.0" 1445 | 1446 | pause@0.0.1: 1447 | version "0.0.1" 1448 | resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" 1449 | integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= 1450 | 1451 | pg-connection-string@^2.4.0: 1452 | version "2.4.0" 1453 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" 1454 | integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== 1455 | 1456 | pg-int8@1.0.1: 1457 | version "1.0.1" 1458 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" 1459 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 1460 | 1461 | pg-pool@^3.2.1: 1462 | version "3.2.1" 1463 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.1.tgz#5f4afc0f58063659aeefa952d36af49fa28b30e0" 1464 | integrity sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA== 1465 | 1466 | pg-protocol@^1.3.0: 1467 | version "1.3.0" 1468 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.3.0.tgz#3c8fb7ca34dbbfcc42776ce34ac5f537d6e34770" 1469 | integrity sha512-64/bYByMrhWULUaCd+6/72c9PMWhiVFs3EVxl9Ct6a3v/U8+rKgqP2w+kKg/BIGgMJyB+Bk/eNivT32Al+Jghw== 1470 | 1471 | pg-types@^2.1.0: 1472 | version "2.2.0" 1473 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" 1474 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 1475 | dependencies: 1476 | pg-int8 "1.0.1" 1477 | postgres-array "~2.0.0" 1478 | postgres-bytea "~1.0.0" 1479 | postgres-date "~1.0.4" 1480 | postgres-interval "^1.1.0" 1481 | 1482 | pg@^8.4.1: 1483 | version "8.4.1" 1484 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.4.1.tgz#06cfb6208ae787a869b2f0022da11b90d13d933e" 1485 | integrity sha512-NRsH0aGMXmX1z8Dd0iaPCxWUw4ffu+lIAmGm+sTCwuDDWkpEgRCAHZYDwqaNhC5hG5DRMOjSUFasMWhvcmLN1A== 1486 | dependencies: 1487 | buffer-writer "2.0.0" 1488 | packet-reader "1.0.0" 1489 | pg-connection-string "^2.4.0" 1490 | pg-pool "^3.2.1" 1491 | pg-protocol "^1.3.0" 1492 | pg-types "^2.1.0" 1493 | pgpass "1.x" 1494 | 1495 | pgpass@1.x: 1496 | version "1.0.4" 1497 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" 1498 | integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== 1499 | dependencies: 1500 | split2 "^3.1.1" 1501 | 1502 | picomatch@^2.0.4, picomatch@^2.2.1: 1503 | version "2.2.2" 1504 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1505 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1506 | 1507 | pify@^2.0.0: 1508 | version "2.3.0" 1509 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1510 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1511 | 1512 | pinkie-promise@^2.0.0: 1513 | version "2.0.1" 1514 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1515 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1516 | dependencies: 1517 | pinkie "^2.0.0" 1518 | 1519 | pinkie@^2.0.0: 1520 | version "2.0.4" 1521 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1522 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1523 | 1524 | postgres-array@~2.0.0: 1525 | version "2.0.0" 1526 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 1527 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 1528 | 1529 | postgres-bytea@~1.0.0: 1530 | version "1.0.0" 1531 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1532 | integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= 1533 | 1534 | postgres-date@~1.0.4: 1535 | version "1.0.7" 1536 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" 1537 | integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== 1538 | 1539 | postgres-interval@^1.1.0: 1540 | version "1.2.0" 1541 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" 1542 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 1543 | dependencies: 1544 | xtend "^4.0.0" 1545 | 1546 | proxy-addr@~2.0.5: 1547 | version "2.0.6" 1548 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1549 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1550 | dependencies: 1551 | forwarded "~0.1.2" 1552 | ipaddr.js "1.9.1" 1553 | 1554 | qs@6.7.0: 1555 | version "6.7.0" 1556 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1557 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1558 | 1559 | range-parser@~1.2.1: 1560 | version "1.2.1" 1561 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1562 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1563 | 1564 | raw-body@2.4.0: 1565 | version "2.4.0" 1566 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1567 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1568 | dependencies: 1569 | bytes "3.1.0" 1570 | http-errors "1.7.2" 1571 | iconv-lite "0.4.24" 1572 | unpipe "1.0.0" 1573 | 1574 | read-pkg-up@^1.0.1: 1575 | version "1.0.1" 1576 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1577 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1578 | dependencies: 1579 | find-up "^1.0.0" 1580 | read-pkg "^1.0.0" 1581 | 1582 | read-pkg@^1.0.0: 1583 | version "1.1.0" 1584 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1585 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1586 | dependencies: 1587 | load-json-file "^1.0.0" 1588 | normalize-package-data "^2.3.2" 1589 | path-type "^1.0.0" 1590 | 1591 | readable-stream@^3.0.0: 1592 | version "3.6.0" 1593 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1594 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1595 | dependencies: 1596 | inherits "^2.0.3" 1597 | string_decoder "^1.1.1" 1598 | util-deprecate "^1.0.1" 1599 | 1600 | readdirp@~3.5.0: 1601 | version "3.5.0" 1602 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 1603 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1604 | dependencies: 1605 | picomatch "^2.2.1" 1606 | 1607 | redent@^1.0.0: 1608 | version "1.0.0" 1609 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1610 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 1611 | dependencies: 1612 | indent-string "^2.1.0" 1613 | strip-indent "^1.0.1" 1614 | 1615 | reflect-metadata@^0.1.13: 1616 | version "0.1.13" 1617 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 1618 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1619 | 1620 | repeating@^2.0.0: 1621 | version "2.0.1" 1622 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1623 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 1624 | dependencies: 1625 | is-finite "^1.0.0" 1626 | 1627 | require-directory@^2.1.1: 1628 | version "2.1.1" 1629 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1630 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1631 | 1632 | require-main-filename@^2.0.0: 1633 | version "2.0.0" 1634 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1635 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1636 | 1637 | resolve@^1.0.0, resolve@^1.10.0: 1638 | version "1.18.1" 1639 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" 1640 | integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== 1641 | dependencies: 1642 | is-core-module "^2.0.0" 1643 | path-parse "^1.0.6" 1644 | 1645 | rimraf@^2.6.1: 1646 | version "2.7.1" 1647 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1648 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1649 | dependencies: 1650 | glob "^7.1.3" 1651 | 1652 | safe-buffer@5.1.2: 1653 | version "5.1.2" 1654 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1655 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1656 | 1657 | safe-buffer@^5.0.1, safe-buffer@~5.2.0: 1658 | version "5.2.1" 1659 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1660 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1661 | 1662 | "safer-buffer@>= 2.1.2 < 3": 1663 | version "2.1.2" 1664 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1665 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1666 | 1667 | sax@>=0.6.0: 1668 | version "1.2.4" 1669 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1670 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1671 | 1672 | "semver@2 || 3 || 4 || 5", semver@^5.6.0: 1673 | version "5.7.1" 1674 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1675 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1676 | 1677 | send@0.17.1: 1678 | version "0.17.1" 1679 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1680 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1681 | dependencies: 1682 | debug "2.6.9" 1683 | depd "~1.1.2" 1684 | destroy "~1.0.4" 1685 | encodeurl "~1.0.2" 1686 | escape-html "~1.0.3" 1687 | etag "~1.8.1" 1688 | fresh "0.5.2" 1689 | http-errors "~1.7.2" 1690 | mime "1.6.0" 1691 | ms "2.1.1" 1692 | on-finished "~2.3.0" 1693 | range-parser "~1.2.1" 1694 | statuses "~1.5.0" 1695 | 1696 | serve-static@1.14.1: 1697 | version "1.14.1" 1698 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1699 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1700 | dependencies: 1701 | encodeurl "~1.0.2" 1702 | escape-html "~1.0.3" 1703 | parseurl "~1.3.3" 1704 | send "0.17.1" 1705 | 1706 | set-blocking@^2.0.0: 1707 | version "2.0.0" 1708 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1709 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1710 | 1711 | setprototypeof@1.1.1: 1712 | version "1.1.1" 1713 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1714 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1715 | 1716 | setprototypeof@1.2.0: 1717 | version "1.2.0" 1718 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1719 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1720 | 1721 | sha.js@^2.4.11: 1722 | version "2.4.11" 1723 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1724 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1725 | dependencies: 1726 | inherits "^2.0.1" 1727 | safe-buffer "^5.0.1" 1728 | 1729 | signal-exit@^3.0.0: 1730 | version "3.0.3" 1731 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1732 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1733 | 1734 | source-map-support@^0.5.12, source-map-support@^0.5.17: 1735 | version "0.5.19" 1736 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1737 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1738 | dependencies: 1739 | buffer-from "^1.0.0" 1740 | source-map "^0.6.0" 1741 | 1742 | source-map@^0.6.0: 1743 | version "0.6.1" 1744 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1745 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1746 | 1747 | spdx-correct@^3.0.0: 1748 | version "3.1.1" 1749 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1750 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1751 | dependencies: 1752 | spdx-expression-parse "^3.0.0" 1753 | spdx-license-ids "^3.0.0" 1754 | 1755 | spdx-exceptions@^2.1.0: 1756 | version "2.3.0" 1757 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1758 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1759 | 1760 | spdx-expression-parse@^3.0.0: 1761 | version "3.0.1" 1762 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1763 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1764 | dependencies: 1765 | spdx-exceptions "^2.1.0" 1766 | spdx-license-ids "^3.0.0" 1767 | 1768 | spdx-license-ids@^3.0.0: 1769 | version "3.0.6" 1770 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" 1771 | integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== 1772 | 1773 | split2@^3.1.1: 1774 | version "3.2.2" 1775 | resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" 1776 | integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== 1777 | dependencies: 1778 | readable-stream "^3.0.0" 1779 | 1780 | sprintf-js@~1.0.2: 1781 | version "1.0.3" 1782 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1783 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1784 | 1785 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1786 | version "1.5.0" 1787 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1788 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1789 | 1790 | string-width@^4.1.0, string-width@^4.2.0: 1791 | version "4.2.0" 1792 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1793 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1794 | dependencies: 1795 | emoji-regex "^8.0.0" 1796 | is-fullwidth-code-point "^3.0.0" 1797 | strip-ansi "^6.0.0" 1798 | 1799 | string_decoder@^1.1.1: 1800 | version "1.3.0" 1801 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1802 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1803 | dependencies: 1804 | safe-buffer "~5.2.0" 1805 | 1806 | strip-ansi@^3.0.0: 1807 | version "3.0.1" 1808 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1809 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1810 | dependencies: 1811 | ansi-regex "^2.0.0" 1812 | 1813 | strip-ansi@^6.0.0: 1814 | version "6.0.0" 1815 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1816 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1817 | dependencies: 1818 | ansi-regex "^5.0.0" 1819 | 1820 | strip-bom@^2.0.0: 1821 | version "2.0.0" 1822 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1823 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 1824 | dependencies: 1825 | is-utf8 "^0.2.0" 1826 | 1827 | strip-bom@^3.0.0: 1828 | version "3.0.0" 1829 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1830 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1831 | 1832 | strip-indent@^1.0.1: 1833 | version "1.0.1" 1834 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1835 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 1836 | dependencies: 1837 | get-stdin "^4.0.1" 1838 | 1839 | strip-json-comments@^2.0.0: 1840 | version "2.0.1" 1841 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1842 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1843 | 1844 | supports-color@^2.0.0: 1845 | version "2.0.0" 1846 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1847 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 1848 | 1849 | supports-color@^7.1.0: 1850 | version "7.2.0" 1851 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1852 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1853 | dependencies: 1854 | has-flag "^4.0.0" 1855 | 1856 | thenify-all@^1.0.0: 1857 | version "1.6.0" 1858 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 1859 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 1860 | dependencies: 1861 | thenify ">= 3.1.0 < 4" 1862 | 1863 | "thenify@>= 3.1.0 < 4": 1864 | version "3.3.1" 1865 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 1866 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 1867 | dependencies: 1868 | any-promise "^1.0.0" 1869 | 1870 | to-regex-range@^5.0.1: 1871 | version "5.0.1" 1872 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1873 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1874 | dependencies: 1875 | is-number "^7.0.0" 1876 | 1877 | toidentifier@1.0.0: 1878 | version "1.0.0" 1879 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1880 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1881 | 1882 | tree-kill@^1.2.2: 1883 | version "1.2.2" 1884 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 1885 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 1886 | 1887 | trim-newlines@^1.0.0: 1888 | version "1.0.0" 1889 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1890 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 1891 | 1892 | ts-node-dev@^1.0.0: 1893 | version "1.0.0" 1894 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0.tgz#24a2270d225c29ce269de2a31f88b1b259fc84cb" 1895 | integrity sha512-leA/3TgGtnVU77fGngBwVZztqyDRXirytR7dMtMWZS5b2hGpLl+VDnB0F/gf3A+HEPSzS/KwxgXFP7/LtgX4MQ== 1896 | dependencies: 1897 | chokidar "^3.4.0" 1898 | dateformat "~1.0.4-1.2.3" 1899 | dynamic-dedupe "^0.3.0" 1900 | minimist "^1.2.5" 1901 | mkdirp "^1.0.4" 1902 | resolve "^1.0.0" 1903 | rimraf "^2.6.1" 1904 | source-map-support "^0.5.12" 1905 | tree-kill "^1.2.2" 1906 | ts-node "^9.0.0" 1907 | tsconfig "^7.0.0" 1908 | 1909 | ts-node@^9.0.0: 1910 | version "9.0.0" 1911 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" 1912 | integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== 1913 | dependencies: 1914 | arg "^4.1.0" 1915 | diff "^4.0.1" 1916 | make-error "^1.1.1" 1917 | source-map-support "^0.5.17" 1918 | yn "3.1.1" 1919 | 1920 | tsconfig@^7.0.0: 1921 | version "7.0.0" 1922 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 1923 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 1924 | dependencies: 1925 | "@types/strip-bom" "^3.0.0" 1926 | "@types/strip-json-comments" "0.0.30" 1927 | strip-bom "^3.0.0" 1928 | strip-json-comments "^2.0.0" 1929 | 1930 | tslib@^1.13.0: 1931 | version "1.14.1" 1932 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1933 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1934 | 1935 | type-is@~1.6.17, type-is@~1.6.18: 1936 | version "1.6.18" 1937 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1938 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1939 | dependencies: 1940 | media-typer "0.3.0" 1941 | mime-types "~2.1.24" 1942 | 1943 | typeorm@^0.2.28: 1944 | version "0.2.28" 1945 | resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.28.tgz#828df288d01ca75b38e990fa1628a7cd5a29f39f" 1946 | integrity sha512-BTtUBGwsFzODvHY+AlWL9pvJ2uEj8qpHwmo03z43RvZkG8BAryQJQ3lZ7HlGvI9IQU8y1IYGWe97HsVr8kXB9g== 1947 | dependencies: 1948 | "@sqltools/formatter" "1.2.2" 1949 | app-root-path "^3.0.0" 1950 | buffer "^5.5.0" 1951 | chalk "^4.1.0" 1952 | cli-highlight "^2.1.4" 1953 | debug "^4.1.1" 1954 | dotenv "^8.2.0" 1955 | glob "^7.1.6" 1956 | js-yaml "^3.14.0" 1957 | mkdirp "^1.0.4" 1958 | reflect-metadata "^0.1.13" 1959 | sha.js "^2.4.11" 1960 | tslib "^1.13.0" 1961 | xml2js "^0.4.23" 1962 | yargonaut "^1.1.2" 1963 | yargs "^16.0.3" 1964 | 1965 | typescript@^4.0.5: 1966 | version "4.0.5" 1967 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" 1968 | integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== 1969 | 1970 | uid2@0.0.x: 1971 | version "0.0.3" 1972 | resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" 1973 | integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= 1974 | 1975 | unpipe@1.0.0, unpipe@~1.0.0: 1976 | version "1.0.0" 1977 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1978 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1979 | 1980 | util-deprecate@^1.0.1: 1981 | version "1.0.2" 1982 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1983 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1984 | 1985 | utils-merge@1.0.1, utils-merge@1.x.x: 1986 | version "1.0.1" 1987 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1988 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1989 | 1990 | validate-npm-package-license@^3.0.1: 1991 | version "3.0.4" 1992 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1993 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1994 | dependencies: 1995 | spdx-correct "^3.0.0" 1996 | spdx-expression-parse "^3.0.0" 1997 | 1998 | vary@^1, vary@~1.1.2: 1999 | version "1.1.2" 2000 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2001 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2002 | 2003 | which-module@^2.0.0: 2004 | version "2.0.0" 2005 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2006 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2007 | 2008 | wrap-ansi@^6.2.0: 2009 | version "6.2.0" 2010 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 2011 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 2012 | dependencies: 2013 | ansi-styles "^4.0.0" 2014 | string-width "^4.1.0" 2015 | strip-ansi "^6.0.0" 2016 | 2017 | wrap-ansi@^7.0.0: 2018 | version "7.0.0" 2019 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2020 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2021 | dependencies: 2022 | ansi-styles "^4.0.0" 2023 | string-width "^4.1.0" 2024 | strip-ansi "^6.0.0" 2025 | 2026 | wrappy@1: 2027 | version "1.0.2" 2028 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2029 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2030 | 2031 | xml2js@^0.4.23: 2032 | version "0.4.23" 2033 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" 2034 | integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 2035 | dependencies: 2036 | sax ">=0.6.0" 2037 | xmlbuilder "~11.0.0" 2038 | 2039 | xmlbuilder@~11.0.0: 2040 | version "11.0.1" 2041 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 2042 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 2043 | 2044 | xtend@^4.0.0: 2045 | version "4.0.2" 2046 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2047 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2048 | 2049 | y18n@^4.0.0: 2050 | version "4.0.0" 2051 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2052 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2053 | 2054 | y18n@^5.0.2: 2055 | version "5.0.4" 2056 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.4.tgz#0ab2db89dd5873b5ec4682d8e703e833373ea897" 2057 | integrity sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ== 2058 | 2059 | yallist@^4.0.0: 2060 | version "4.0.0" 2061 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2062 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2063 | 2064 | yargonaut@^1.1.2: 2065 | version "1.1.4" 2066 | resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" 2067 | integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== 2068 | dependencies: 2069 | chalk "^1.1.1" 2070 | figlet "^1.1.1" 2071 | parent-require "^1.0.0" 2072 | 2073 | yargs-parser@^18.1.2: 2074 | version "18.1.3" 2075 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 2076 | integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== 2077 | dependencies: 2078 | camelcase "^5.0.0" 2079 | decamelize "^1.2.0" 2080 | 2081 | yargs-parser@^20.2.2: 2082 | version "20.2.3" 2083 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" 2084 | integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== 2085 | 2086 | yargs@^15.0.0: 2087 | version "15.4.1" 2088 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" 2089 | integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== 2090 | dependencies: 2091 | cliui "^6.0.0" 2092 | decamelize "^1.2.0" 2093 | find-up "^4.1.0" 2094 | get-caller-file "^2.0.1" 2095 | require-directory "^2.1.1" 2096 | require-main-filename "^2.0.0" 2097 | set-blocking "^2.0.0" 2098 | string-width "^4.2.0" 2099 | which-module "^2.0.0" 2100 | y18n "^4.0.0" 2101 | yargs-parser "^18.1.2" 2102 | 2103 | yargs@^16.0.3: 2104 | version "16.1.0" 2105 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.0.tgz#fc333fe4791660eace5a894b39d42f851cd48f2a" 2106 | integrity sha512-upWFJOmDdHN0syLuESuvXDmrRcWd1QafJolHskzaw79uZa7/x53gxQKiR07W59GWY1tFhhU/Th9DrtSfpS782g== 2107 | dependencies: 2108 | cliui "^7.0.2" 2109 | escalade "^3.1.1" 2110 | get-caller-file "^2.0.5" 2111 | require-directory "^2.1.1" 2112 | string-width "^4.2.0" 2113 | y18n "^5.0.2" 2114 | yargs-parser "^20.2.2" 2115 | 2116 | yn@3.1.1: 2117 | version "3.1.1" 2118 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2119 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2120 | --------------------------------------------------------------------------------