├── .gitignore ├── graphql ├── .env.sample ├── package.json ├── src │ ├── entities │ │ ├── product.ts │ │ └── user.ts │ ├── index.ts │ ├── products │ │ ├── product-resolver.ts │ │ └── types │ │ │ ├── create-product-input.ts │ │ │ ├── delete-product-response.ts │ │ │ └── find-products-input.ts │ ├── types │ │ ├── app-context.ts │ │ ├── pagination-input.ts │ │ └── tokens.ts │ ├── users │ │ ├── types │ │ │ ├── login-input.ts │ │ │ ├── login-response.ts │ │ │ ├── register-input.ts │ │ │ └── user-role.ts │ │ └── user-resolver.ts │ └── utils │ │ ├── auth-checker.ts │ │ ├── create-tokens.ts │ │ ├── refresh-tokens.ts │ │ └── verify-tokens.ts ├── tsconfig.json └── yarn.lock └── nestjs ├── .env.example ├── .prettierrc ├── nest-cli.json ├── package.json ├── src ├── app.controller.spec.ts ├── app.controller.ts ├── app.module.ts ├── app.service.ts ├── config │ └── mysqlDB.config.ts ├── main.ts └── module │ ├── auth │ ├── auth.controller.ts │ ├── auth.module.ts │ ├── auth.service.ts │ ├── decorator │ │ └── roles.decorator.ts │ ├── dto │ │ ├── loginUser.dto.ts │ │ └── registerUser.dto.ts │ ├── guard │ │ └── role.guard.ts │ ├── interceptor │ │ └── cookie.interceptor.ts │ ├── middleware │ │ └── auth.middleware.ts │ └── type │ │ ├── jwtPayload.ts │ │ └── loginResponse.ts │ ├── product │ ├── dto │ │ ├── createProduct.dto.ts │ │ └── updateProduct.dto.ts │ ├── product.controller.ts │ ├── product.entity.ts │ ├── product.module.ts │ ├── product.repository.ts │ └── product.service.ts │ └── user │ ├── type │ └── userResponse.ts │ ├── user.controller.ts │ ├── user.entity.ts │ ├── user.module.ts │ ├── user.repository.ts │ └── user.service.ts ├── test ├── app.e2e-spec.ts └── jest-e2e.json ├── tsconfig.build.json ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | .DS_Store 4 | */dist -------------------------------------------------------------------------------- /graphql/.env.sample: -------------------------------------------------------------------------------- 1 | TYPEORM_NAME=default 2 | TYPEORM_CONNECTION=mysql 3 | TYPEORM_HOST=localhost 4 | TYPEORM_USERNAME=your_user_name 5 | TYPEORM_PASSWORD=your_password 6 | TYPEORM_DATABASE=your_db_name 7 | TYPEORM_PORT=3306 8 | TYPEORM_SYNCHRONIZE=true 9 | TYPEORM_LOGGING=true 10 | TYPEORM_ENTITIES=src/entities/**/*.* -------------------------------------------------------------------------------- /graphql/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jwt-auth-graphql-example", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "ts-node-dev --respawn src/index.ts" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "MIT", 12 | "dependencies": { 13 | "apollo-server-express": "^2.14.5", 14 | "bcryptjs": "^2.4.3", 15 | "class-validator": "^0.12.2", 16 | "cookie-parser": "^1.4.5", 17 | "cors": "^2.8.5", 18 | "express": "^4.17.1", 19 | "graphql": "^15.1.0", 20 | "jsonwebtoken": "^8.5.1", 21 | "mysql": "^2.18.1", 22 | "reflect-metadata": "^0.1.13", 23 | "type-graphql": "^1.0.0-rc.2", 24 | "typeorm": "^0.2.25" 25 | }, 26 | "devDependencies": { 27 | "@types/bcryptjs": "^2.4.2", 28 | "@types/cookie-parser": "^1.4.2", 29 | "@types/cors": "^2.8.6", 30 | "@types/express": "^4.17.6", 31 | "@types/graphql": "^14.5.0", 32 | "@types/jsonwebtoken": "^8.5.0", 33 | "@types/node": "^14.0.13", 34 | "ts-node": "^8.10.2", 35 | "ts-node-dev": "^1.0.0-pre.49", 36 | "typescript": "^3.9.5" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /graphql/src/entities/product.ts: -------------------------------------------------------------------------------- 1 | import { ObjectType, Field, ID } from 'type-graphql'; 2 | import { Entity, BaseEntity, PrimaryGeneratedColumn, Column } from 'typeorm'; 3 | 4 | @ObjectType() 5 | @Entity() 6 | export class Product extends BaseEntity { 7 | @Field(() => ID) 8 | @PrimaryGeneratedColumn('uuid') 9 | id: string; 10 | 11 | @Field() 12 | @Column('varchar', { length: 100 }) 13 | title: string; 14 | 15 | @Field() 16 | @Column('varchar', { length: 500 }) 17 | description: string; 18 | 19 | // precision represents total length of value including decimal places 20 | // scale represents the number of digits after decimal point 21 | @Field() 22 | @Column('decimal', { precision: 13, scale: 2, default: 0 }) 23 | price: number; 24 | 25 | // integer between -8388608 and 8388607 26 | @Field() 27 | @Column('mediumint') 28 | count: number; 29 | } 30 | -------------------------------------------------------------------------------- /graphql/src/entities/user.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Entity, 3 | PrimaryGeneratedColumn, 4 | Column, 5 | BaseEntity, 6 | CreateDateColumn, 7 | UpdateDateColumn, 8 | } from 'typeorm'; 9 | import { ObjectType, Field, ID, Root } from 'type-graphql'; 10 | import { UserRole } from '../users/types/user-role'; 11 | 12 | @ObjectType() 13 | @Entity() 14 | export class User extends BaseEntity { 15 | @Field(() => ID) 16 | @PrimaryGeneratedColumn() 17 | id: number; 18 | 19 | @Field() 20 | @Column() 21 | firstName: string; 22 | 23 | @Field() 24 | @Column() 25 | lastName: string; 26 | 27 | // GraphQL schema 28 | // Resolve the `name` field for the User type 29 | @Field() 30 | name(@Root() parent: User): string { 31 | return `${parent.firstName} ${parent.lastName}`; 32 | } 33 | 34 | @Field() 35 | @Column({ unique: true, length: 255 }) 36 | email: string; 37 | 38 | @Field() 39 | @Column({ 40 | type: 'enum', 41 | enum: UserRole, 42 | default: UserRole.GUEST, 43 | }) 44 | role: UserRole; 45 | 46 | @Field() 47 | @CreateDateColumn({ name: 'created_at' }) 48 | createdAt: Date; 49 | 50 | @Field() 51 | @UpdateDateColumn({ name: 'updated_at' }) 52 | updatedAt: Date; 53 | 54 | // Database column 55 | // Cannot be queried by client 56 | @Column() 57 | password: string; 58 | 59 | // Current version of the refresh token 60 | @Column({ 61 | type: 'int', 62 | default: 0, 63 | }) 64 | tokenVersion: number; 65 | } 66 | -------------------------------------------------------------------------------- /graphql/src/index.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; 2 | import { ApolloServer } from 'apollo-server-express'; 3 | import * as express from 'express'; 4 | import * as cookieParser from 'cookie-parser'; 5 | import * as cors from 'cors'; 6 | import { buildSchema } from 'type-graphql'; 7 | import { createConnection } from 'typeorm'; 8 | import { UserResolver } from './users/user-resolver'; 9 | import { ProductResolver } from './products/product-resolver'; 10 | import { ExpressContext } from 'apollo-server-express/dist/ApolloServer'; 11 | import { authChecker } from './utils/auth-checker'; 12 | import { verifyAccessToken } from './utils/verify-tokens'; 13 | import { refreshTokens } from './utils/refresh-tokens'; 14 | 15 | // Initialize an apollo server instance 16 | const bootstrap = async () => { 17 | try { 18 | // Create typeorm connection using setup configured in .env 19 | await createConnection(); 20 | 21 | // Build TypeGraphQL executable schema 22 | const schema = await buildSchema({ 23 | resolvers: [UserResolver, ProductResolver], 24 | authChecker, // register auth checking function 25 | }); 26 | 27 | // Create GraphQL server 28 | const apolloServer = new ApolloServer({ 29 | schema, 30 | formatError: (error) => { 31 | return error; 32 | }, 33 | playground: { 34 | settings: { 35 | 'request.credentials': 'include', 36 | }, 37 | }, 38 | context: async ({ req, res }: ExpressContext) => { 39 | const tokenPayload = await verifyAccessToken( 40 | req, 41 | process.env.ACCESS_TOKEN_SECRET 42 | ); 43 | 44 | return { 45 | ...tokenPayload, 46 | req, 47 | res, 48 | }; 49 | }, 50 | }); 51 | 52 | const app = express(); 53 | 54 | app.use(cookieParser()); 55 | 56 | app.get('/refresh-token', async (req, res) => { 57 | const token = req.cookies['refreshToken']; 58 | const decodedResult = await refreshTokens( 59 | token, 60 | process.env.ACCESS_TOKEN_SECRET, 61 | process.env.REFRESH_TOKEN_SECRET 62 | ); 63 | const { accessToken, user } = decodedResult; 64 | 65 | if (accessToken && user) { 66 | return res.send({ accessToken }); 67 | } else { 68 | return res.send({ 69 | accessToken: null, 70 | }); 71 | } 72 | }); 73 | 74 | apolloServer.applyMiddleware({ 75 | app, 76 | cors: { origin: 'http://localhost:4200', credentials: true }, 77 | }); 78 | 79 | app.listen(4001, () => { 80 | console.log('Server is starting on http://localhost:4001/graphql'); 81 | }); 82 | } catch (err) { 83 | console.error(err); 84 | } 85 | }; 86 | 87 | bootstrap(); 88 | -------------------------------------------------------------------------------- /graphql/src/products/product-resolver.ts: -------------------------------------------------------------------------------- 1 | import { Query, Arg, Mutation, Resolver, Authorized } from 'type-graphql'; 2 | import { Product } from '../entities/product'; 3 | import { ApolloError } from 'apollo-server-express'; 4 | import { CreateProductInput } from './types/create-product-input'; 5 | import { FindProductsInput } from './types/find-products-input'; 6 | import { PaginationInput } from '../types/pagination-input'; 7 | import { Like } from 'typeorm'; 8 | import { DeleteProductResponse } from './types/delete-product-response'; 9 | 10 | @Resolver() 11 | export class ProductResolver { 12 | @Query(() => Product) 13 | async product(@Arg('id') id: string): Promise { 14 | const selectedProduct = await Product.findOne(id); 15 | if (!selectedProduct) { 16 | throw new ApolloError('Product not found.', 'NOT FOUND'); 17 | } 18 | return selectedProduct; 19 | } 20 | 21 | // Filter products with keyword 22 | // Paginate product list 23 | @Query(() => [Product]) 24 | async products( 25 | @Arg('input') 26 | { filter }: FindProductsInput, 27 | @Arg('pagination', { defaultValue: { skip: 0, take: 5 } }) 28 | { skip, take }: PaginationInput 29 | ): Promise { 30 | const where = filter 31 | ? [{ title: Like(`%${filter}%`) }, { description: Like(`%${filter}%`) }] 32 | : []; 33 | const products = await Product.find({ 34 | where, 35 | take, 36 | skip, 37 | }); 38 | if (products.length === 0) { 39 | throw new ApolloError('No product found.', 'NOT FOUND'); 40 | } 41 | return products; 42 | } 43 | 44 | @Mutation(() => Product) 45 | @Authorized('admin', 'manager') // only manager and admin and add new products 46 | async createProduct( 47 | @Arg('input') 48 | { title, description, price, count }: CreateProductInput 49 | ): Promise { 50 | const newProduct = await Product.create({ 51 | title, 52 | description, 53 | price, 54 | count, 55 | }).save(); 56 | 57 | if (!newProduct) { 58 | throw new ApolloError('Failed to create user.', 'FAILED TO CREATE'); 59 | } 60 | return newProduct; 61 | } 62 | 63 | @Mutation(() => DeleteProductResponse) 64 | @Authorized('admin', 'manager') // only manager and admin and delete products 65 | async deleteProduct(@Arg('id') id: string): Promise { 66 | const product = await Product.findOne(id); 67 | 68 | if (!product) { 69 | throw new ApolloError(`Product ${id} does not exist`, 'FAILED TO DELETE'); 70 | } 71 | 72 | try { 73 | await Product.delete(id); 74 | } catch (error) { 75 | throw new ApolloError( 76 | `Failed to delete product ${id}`, 77 | 'FAILED TO DELETE' 78 | ); 79 | } 80 | 81 | return { 82 | message: 'Product deleted', 83 | id, 84 | }; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /graphql/src/products/types/create-product-input.ts: -------------------------------------------------------------------------------- 1 | import { InputType, Field } from 'type-graphql'; 2 | import { Product } from '../../entities/product'; 3 | import { Length } from 'class-validator'; 4 | 5 | @InputType() 6 | export class CreateProductInput implements Partial { 7 | @Field() 8 | @Length(1, 100) 9 | title: string; 10 | 11 | @Field() 12 | @Length(1, 500) 13 | description: string; 14 | 15 | @Field() 16 | price: number; 17 | 18 | @Field() 19 | count: number; 20 | } 21 | -------------------------------------------------------------------------------- /graphql/src/products/types/delete-product-response.ts: -------------------------------------------------------------------------------- 1 | import { ObjectType, Field } from 'type-graphql'; 2 | 3 | @ObjectType({}) 4 | export class DeleteProductResponse { 5 | @Field() 6 | message: string; 7 | 8 | @Field() 9 | id: string; 10 | } 11 | -------------------------------------------------------------------------------- /graphql/src/products/types/find-products-input.ts: -------------------------------------------------------------------------------- 1 | import { InputType, Field } from 'type-graphql'; 2 | 3 | @InputType() 4 | export class FindProductsInput { 5 | @Field({ nullable: true }) 6 | filter?: string; 7 | } 8 | -------------------------------------------------------------------------------- /graphql/src/types/app-context.ts: -------------------------------------------------------------------------------- 1 | import { UserRole } from '../users/types/user-role'; 2 | 3 | export interface AppContext { 4 | userId: string; 5 | role: UserRole; 6 | req: Request; 7 | res: Response; 8 | } 9 | -------------------------------------------------------------------------------- /graphql/src/types/pagination-input.ts: -------------------------------------------------------------------------------- 1 | import { InputType, Field } from 'type-graphql'; 2 | 3 | @InputType() 4 | export class PaginationInput { 5 | @Field() 6 | skip: number; 7 | 8 | @Field() 9 | take: number; 10 | } 11 | -------------------------------------------------------------------------------- /graphql/src/types/tokens.ts: -------------------------------------------------------------------------------- 1 | import { UserRole } from '../users/types/user-role'; 2 | 3 | export interface AccessTokenPayload { 4 | userId: string; 5 | role: UserRole; 6 | } 7 | 8 | export interface RefreshTokenPayload { 9 | userId: string; 10 | tokenVersion: string; 11 | } 12 | -------------------------------------------------------------------------------- /graphql/src/users/types/login-input.ts: -------------------------------------------------------------------------------- 1 | import { InputType, Field } from 'type-graphql'; 2 | import { IsEmail } from 'class-validator'; 3 | import { User } from '../../entities/User'; 4 | 5 | @InputType() 6 | export class LoginInput implements Partial { 7 | @Field() 8 | @IsEmail() 9 | email: string; 10 | 11 | @Field() 12 | password: string; 13 | } 14 | -------------------------------------------------------------------------------- /graphql/src/users/types/login-response.ts: -------------------------------------------------------------------------------- 1 | import { ObjectType, Field } from 'type-graphql'; 2 | import { User } from '../../entities/user'; 3 | 4 | @ObjectType({}) 5 | export class LoginResponse { 6 | @Field() 7 | user: User; 8 | 9 | @Field() 10 | accessToken: string; 11 | } 12 | -------------------------------------------------------------------------------- /graphql/src/users/types/register-input.ts: -------------------------------------------------------------------------------- 1 | import { InputType, Field } from 'type-graphql'; 2 | import { Length, IsEmail } from 'class-validator'; 3 | import { User } from '../../entities/user'; 4 | import { UserRole } from './user-role'; 5 | 6 | @InputType() 7 | export class RegisterInput implements Partial { 8 | @Field() 9 | @Length(1, 15) 10 | firstName: string; 11 | 12 | @Field() 13 | @Length(1, 15) 14 | lastName: string; 15 | 16 | @Field() 17 | @IsEmail() 18 | email: string; 19 | 20 | @Field() 21 | password: string; 22 | 23 | @Field() 24 | role: UserRole; 25 | } 26 | -------------------------------------------------------------------------------- /graphql/src/users/types/user-role.ts: -------------------------------------------------------------------------------- 1 | import { registerEnumType } from 'type-graphql'; 2 | 3 | export enum UserRole { 4 | ADMIN = 'admin', 5 | MANAGER = 'manager', 6 | CUSTOMER = 'customer', 7 | GUEST = 'guest', 8 | } 9 | -------------------------------------------------------------------------------- /graphql/src/users/user-resolver.ts: -------------------------------------------------------------------------------- 1 | import { Resolver, Query, Mutation, Arg, Ctx } from 'type-graphql'; 2 | import * as bcrypt from 'bcryptjs'; 3 | import { User } from '../entities/user'; 4 | import { RegisterInput } from './types/register-input'; 5 | import { ApolloError, AuthenticationError } from 'apollo-server-express'; 6 | import { LoginResponse } from './types/login-response'; 7 | import { LoginInput } from './types/login-input'; 8 | import { createAccessToken, createRefreshToken } from '../utils/create-tokens'; 9 | import { ExpressContext } from 'apollo-server-express/dist/ApolloServer'; 10 | 11 | @Resolver() 12 | export class UserResolver { 13 | @Query(() => User) 14 | async user(@Arg('id') id: number) { 15 | const selectedUser = await User.findOne(id); 16 | if (!selectedUser) { 17 | throw new ApolloError('User not found.', 'NOT FOUND'); 18 | } 19 | return selectedUser; 20 | } 21 | 22 | @Query(() => [User]) 23 | async allUsers() { 24 | const allUsers = await User.find(); 25 | if (!allUsers) { 26 | throw new ApolloError('No user found.', 'NOT FOUND'); 27 | } 28 | return allUsers; 29 | } 30 | 31 | @Mutation(() => User) 32 | async registerUser( 33 | @Arg('user') { firstName, lastName, email, password, role }: RegisterInput 34 | ): Promise { 35 | const existingUser = await User.findOne({ email }); 36 | if (existingUser) { 37 | throw new ApolloError('User already exists.', 'RESOURCE EXISTS'); 38 | } 39 | // Hash user password 40 | const saltRounds = 12; 41 | const hashedPassword = await bcrypt.hash(password, saltRounds); 42 | 43 | // Create and save a new user entity in the database 44 | // If entity does not exist in the database then inserts, otherwise updates. 45 | const user = await User.create({ 46 | firstName, 47 | lastName, 48 | email, 49 | role, 50 | password: hashedPassword, 51 | }).save(); 52 | 53 | if (!user || !hashedPassword) { 54 | throw new ApolloError('Failed to create user.', 'FAILED TO CREATE'); 55 | } 56 | return user; 57 | } 58 | 59 | @Mutation(() => LoginResponse) 60 | async loginUser( 61 | @Arg('input') { email, password }: LoginInput, 62 | @Ctx() ctx: ExpressContext 63 | ): Promise { 64 | const existingUser = await User.findOne({ email }); 65 | 66 | if (!existingUser) { 67 | throw new AuthenticationError('Username or password is invalid'); 68 | } 69 | 70 | const isValid = await bcrypt.compare(password, existingUser.password); 71 | 72 | if (!isValid) { 73 | throw new AuthenticationError('Username or password is invalid'); 74 | } 75 | 76 | const { id, role, tokenVersion } = existingUser; 77 | 78 | const accessToken = createAccessToken( 79 | id, 80 | role, 81 | process.env.ACCESS_TOKEN_SECRET 82 | ); 83 | 84 | const refreshToken = createRefreshToken( 85 | id, 86 | tokenVersion, 87 | process.env.REFRESH_TOKEN_SECRET 88 | ); 89 | 90 | ctx.res.cookie('refreshToken', refreshToken, { 91 | httpOnly: true, 92 | maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days - express accepts token maxAge in ms, therefore multiply by 1000 93 | path: '/refresh-token', // attach the refreshToken only to this endpoint 94 | }); 95 | 96 | return { 97 | user: existingUser, 98 | accessToken, 99 | }; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /graphql/src/utils/auth-checker.ts: -------------------------------------------------------------------------------- 1 | import { AuthChecker } from 'type-graphql'; 2 | import { AppContext } from '../types/app-context'; 3 | 4 | export const authChecker: AuthChecker = ( 5 | { context: { userId, role } }, 6 | roles 7 | ) => { 8 | if (roles.length === 0) { 9 | // if `@Authorized()`, check only is user exist 10 | return userId !== undefined; 11 | } 12 | if (!userId) { 13 | // and if no user, restrict access 14 | return false; 15 | } 16 | if (roles.includes(role)) { 17 | // grant access if the roles overlap 18 | return true; 19 | } 20 | 21 | // no roles matched, restrict access 22 | return false; 23 | }; 24 | -------------------------------------------------------------------------------- /graphql/src/utils/create-tokens.ts: -------------------------------------------------------------------------------- 1 | import { sign } from 'jsonwebtoken'; 2 | 3 | export const createAccessToken = ( 4 | userId: number, 5 | role: string, 6 | secret: string 7 | ) => { 8 | return sign({ userId, role }, secret, { expiresIn: '15m' }); 9 | }; 10 | 11 | export const createRefreshToken = ( 12 | userId: number, 13 | tokenVersion: number, 14 | secret: string 15 | ) => { 16 | return sign({ userId, tokenVersion }, secret, { expiresIn: '7d' }); 17 | }; 18 | -------------------------------------------------------------------------------- /graphql/src/utils/refresh-tokens.ts: -------------------------------------------------------------------------------- 1 | import { verify } from 'jsonwebtoken'; 2 | import { User } from '../entities/user'; 3 | import { createAccessToken, createRefreshToken } from './create-tokens'; 4 | import { RefreshTokenPayload } from '../types/tokens'; 5 | 6 | /** If refresh token is not expired, re-assign new access token and refresh token */ 7 | export const refreshTokens = async ( 8 | refreshToken: string, 9 | accessTokenSecret: string, 10 | refreshTokenSecret: string 11 | ) => { 12 | let decodedRefreshToken; 13 | const guestPayload = { 14 | accessToken: null, 15 | refreshToken: null, 16 | user: null, 17 | }; 18 | 19 | try { 20 | decodedRefreshToken = verify( 21 | refreshToken, 22 | refreshTokenSecret 23 | ) as RefreshTokenPayload; 24 | } catch (error) { 25 | return guestPayload; 26 | } 27 | 28 | const { userId, tokenVersion } = decodedRefreshToken; 29 | const user = await User.findOne(userId); 30 | 31 | // If user is not found or the refresh token version doesn't match, return guestPayload 32 | if (!user || user.tokenVersion !== parseInt(tokenVersion, 10)) { 33 | return guestPayload; 34 | } 35 | 36 | const updatedUser = await user.save(); 37 | 38 | if (!updatedUser) { 39 | return guestPayload; 40 | } 41 | 42 | const newAccessToken = await createAccessToken( 43 | user.id, 44 | user.role, 45 | accessTokenSecret 46 | ); 47 | 48 | return { 49 | accessToken: newAccessToken, 50 | user: updatedUser, 51 | }; 52 | }; 53 | -------------------------------------------------------------------------------- /graphql/src/utils/verify-tokens.ts: -------------------------------------------------------------------------------- 1 | import { verify } from 'jsonwebtoken'; 2 | import { Request } from 'express'; 3 | import { UserRole } from '../users/types/user-role'; 4 | import { AccessTokenPayload } from '../types/tokens'; 5 | 6 | export const verifyAccessToken = async (req: Request, accessSecret: string) => { 7 | const bearerHeader = req.headers.authorization; 8 | 9 | let guestPayload = { 10 | userId: null, 11 | role: UserRole.GUEST, 12 | }; 13 | 14 | if (!bearerHeader) { 15 | return guestPayload; 16 | } 17 | 18 | const accessToken = bearerHeader.split(' ')[1]; 19 | 20 | const decodedToken = verify(accessToken, accessSecret) as AccessTokenPayload; 21 | 22 | if (decodedToken) { 23 | return { 24 | userId: decodedToken?.userId, 25 | role: decodedToken?.role, 26 | }; 27 | } else { 28 | return guestPayload; 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /graphql/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "lib": ["dom", "es6", "es2017", "esnext.asynciterable"], 6 | "sourceMap": true, 7 | "outDir": "./dist", 8 | "moduleResolution": "node", 9 | "declaration": false, 10 | "composite": false, 11 | "removeComments": true, 12 | "noImplicitAny": true, 13 | "strictNullChecks": true, 14 | "strictFunctionTypes": true, 15 | "noImplicitThis": true, 16 | "noImplicitReturns": true, 17 | "noFallthroughCasesInSwitch": true, 18 | "allowSyntheticDefaultImports": false, 19 | "emitDecoratorMetadata": true, 20 | "experimentalDecorators": true, 21 | "skipLibCheck": true, 22 | "baseUrl": ".", 23 | "rootDir": "src" 24 | }, 25 | "exclude": ["node_modules"], 26 | "include": ["./src/**/*.tsx", "./src/**/*.ts"] 27 | } 28 | -------------------------------------------------------------------------------- /graphql/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@apollo/protobufjs@^1.0.3": 6 | version "1.0.4" 7 | resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.4.tgz#cf01747a55359066341f31b5ce8db17df44244e0" 8 | integrity sha512-EE3zx+/D/wur/JiLp6VCiw1iYdyy1lCJMf8CGPkLeDt5QJrN4N8tKFx33Ah4V30AUQzMk7Uz4IXKZ1LOj124gA== 9 | dependencies: 10 | "@protobufjs/aspromise" "^1.1.2" 11 | "@protobufjs/base64" "^1.1.2" 12 | "@protobufjs/codegen" "^2.0.4" 13 | "@protobufjs/eventemitter" "^1.1.0" 14 | "@protobufjs/fetch" "^1.1.0" 15 | "@protobufjs/float" "^1.0.2" 16 | "@protobufjs/inquire" "^1.1.0" 17 | "@protobufjs/path" "^1.1.2" 18 | "@protobufjs/pool" "^1.1.0" 19 | "@protobufjs/utf8" "^1.1.0" 20 | "@types/long" "^4.0.0" 21 | "@types/node" "^10.1.0" 22 | long "^4.0.0" 23 | 24 | "@apollographql/apollo-tools@^0.4.3": 25 | version "0.4.8" 26 | resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz#d81da89ee880c2345eb86bddb92b35291f6135ed" 27 | integrity sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA== 28 | dependencies: 29 | apollo-env "^0.6.5" 30 | 31 | "@apollographql/graphql-playground-html@1.6.26": 32 | version "1.6.26" 33 | resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3" 34 | integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ== 35 | dependencies: 36 | xss "^1.0.6" 37 | 38 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 39 | version "1.1.2" 40 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 41 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 42 | 43 | "@protobufjs/base64@^1.1.2": 44 | version "1.1.2" 45 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 46 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 47 | 48 | "@protobufjs/codegen@^2.0.4": 49 | version "2.0.4" 50 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 51 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 52 | 53 | "@protobufjs/eventemitter@^1.1.0": 54 | version "1.1.0" 55 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 56 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 57 | 58 | "@protobufjs/fetch@^1.1.0": 59 | version "1.1.0" 60 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 61 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 62 | dependencies: 63 | "@protobufjs/aspromise" "^1.1.1" 64 | "@protobufjs/inquire" "^1.1.0" 65 | 66 | "@protobufjs/float@^1.0.2": 67 | version "1.0.2" 68 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 69 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 70 | 71 | "@protobufjs/inquire@^1.1.0": 72 | version "1.1.0" 73 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 74 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 75 | 76 | "@protobufjs/path@^1.1.2": 77 | version "1.1.2" 78 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 79 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 80 | 81 | "@protobufjs/pool@^1.1.0": 82 | version "1.1.0" 83 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 84 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 85 | 86 | "@protobufjs/utf8@^1.1.0": 87 | version "1.1.0" 88 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 89 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 90 | 91 | "@types/accepts@*", "@types/accepts@^1.3.5": 92 | version "1.3.5" 93 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 94 | integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== 95 | dependencies: 96 | "@types/node" "*" 97 | 98 | "@types/bcryptjs@^2.4.2": 99 | version "2.4.2" 100 | resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" 101 | integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== 102 | 103 | "@types/body-parser@*", "@types/body-parser@1.19.0": 104 | version "1.19.0" 105 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 106 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 107 | dependencies: 108 | "@types/connect" "*" 109 | "@types/node" "*" 110 | 111 | "@types/color-name@^1.1.1": 112 | version "1.1.1" 113 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 114 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 115 | 116 | "@types/connect@*": 117 | version "3.4.33" 118 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" 119 | integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== 120 | dependencies: 121 | "@types/node" "*" 122 | 123 | "@types/content-disposition@*": 124 | version "0.5.3" 125 | resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" 126 | integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== 127 | 128 | "@types/cookie-parser@^1.4.2": 129 | version "1.4.2" 130 | resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.2.tgz#e4d5c5ffda82b80672a88a4281aaceefb1bd9df5" 131 | integrity sha512-uwcY8m6SDQqciHsqcKDGbo10GdasYsPCYkH3hVegj9qAah6pX5HivOnOuI3WYmyQMnOATV39zv/Ybs0bC/6iVg== 132 | dependencies: 133 | "@types/express" "*" 134 | 135 | "@types/cookies@*": 136 | version "0.7.4" 137 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" 138 | integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== 139 | dependencies: 140 | "@types/connect" "*" 141 | "@types/express" "*" 142 | "@types/keygrip" "*" 143 | "@types/node" "*" 144 | 145 | "@types/cors@^2.8.4", "@types/cors@^2.8.6": 146 | version "2.8.6" 147 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.6.tgz#cfaab33c49c15b1ded32f235111ce9123009bd02" 148 | integrity sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg== 149 | dependencies: 150 | "@types/express" "*" 151 | 152 | "@types/express-serve-static-core@*": 153 | version "4.17.8" 154 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz#b8f7b714138536742da222839892e203df569d1c" 155 | integrity sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw== 156 | dependencies: 157 | "@types/node" "*" 158 | "@types/qs" "*" 159 | "@types/range-parser" "*" 160 | 161 | "@types/express@*", "@types/express@^4.17.6": 162 | version "4.17.6" 163 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e" 164 | integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w== 165 | dependencies: 166 | "@types/body-parser" "*" 167 | "@types/express-serve-static-core" "*" 168 | "@types/qs" "*" 169 | "@types/serve-static" "*" 170 | 171 | "@types/express@4.17.4": 172 | version "4.17.4" 173 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.4.tgz#e78bf09f3f530889575f4da8a94cd45384520aac" 174 | integrity sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w== 175 | dependencies: 176 | "@types/body-parser" "*" 177 | "@types/express-serve-static-core" "*" 178 | "@types/qs" "*" 179 | "@types/serve-static" "*" 180 | 181 | "@types/fs-capacitor@*": 182 | version "2.0.0" 183 | resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" 184 | integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== 185 | dependencies: 186 | "@types/node" "*" 187 | 188 | "@types/glob@^7.1.2": 189 | version "7.1.2" 190 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987" 191 | integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA== 192 | dependencies: 193 | "@types/minimatch" "*" 194 | "@types/node" "*" 195 | 196 | "@types/graphql-upload@^8.0.0": 197 | version "8.0.3" 198 | resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.3.tgz#b371edb5f305a2a1f7b7843a890a2a7adc55c3ec" 199 | integrity sha512-hmLg9pCU/GmxBscg8GCr1vmSoEmbItNNxdD5YH2TJkXm//8atjwuprB+xJBK714JG1dkxbbhp5RHX+Pz1KsCMA== 200 | dependencies: 201 | "@types/express" "*" 202 | "@types/fs-capacitor" "*" 203 | "@types/koa" "*" 204 | graphql "^14.5.3" 205 | 206 | "@types/graphql@^14.5.0": 207 | version "14.5.0" 208 | resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.5.0.tgz#a545fb3bc8013a3547cf2f07f5e13a33642b75d6" 209 | integrity sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA== 210 | dependencies: 211 | graphql "*" 212 | 213 | "@types/http-assert@*": 214 | version "1.5.1" 215 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" 216 | integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== 217 | 218 | "@types/jsonwebtoken@^8.5.0": 219 | version "8.5.0" 220 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5" 221 | integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg== 222 | dependencies: 223 | "@types/node" "*" 224 | 225 | "@types/keygrip@*": 226 | version "1.0.2" 227 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" 228 | integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== 229 | 230 | "@types/koa-compose@*": 231 | version "3.2.5" 232 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" 233 | integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== 234 | dependencies: 235 | "@types/koa" "*" 236 | 237 | "@types/koa@*": 238 | version "2.11.3" 239 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.3.tgz#540ece376581b12beadf9a417dd1731bc31c16ce" 240 | integrity sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q== 241 | dependencies: 242 | "@types/accepts" "*" 243 | "@types/content-disposition" "*" 244 | "@types/cookies" "*" 245 | "@types/http-assert" "*" 246 | "@types/keygrip" "*" 247 | "@types/koa-compose" "*" 248 | "@types/node" "*" 249 | 250 | "@types/long@^4.0.0": 251 | version "4.0.1" 252 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" 253 | integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== 254 | 255 | "@types/mime@*": 256 | version "2.0.2" 257 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5" 258 | integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q== 259 | 260 | "@types/minimatch@*": 261 | version "3.0.3" 262 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 263 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 264 | 265 | "@types/node-fetch@2.5.7": 266 | version "2.5.7" 267 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" 268 | integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== 269 | dependencies: 270 | "@types/node" "*" 271 | form-data "^3.0.0" 272 | 273 | "@types/node@*", "@types/node@^14.0.11", "@types/node@^14.0.13": 274 | version "14.0.14" 275 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" 276 | integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== 277 | 278 | "@types/node@^10.1.0": 279 | version "10.17.26" 280 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" 281 | integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== 282 | 283 | "@types/qs@*": 284 | version "6.9.3" 285 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03" 286 | integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== 287 | 288 | "@types/range-parser@*": 289 | version "1.2.3" 290 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 291 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 292 | 293 | "@types/semver@^7.2.0": 294 | version "7.3.1" 295 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.1.tgz#7a9a5d595b6d873f338c867dcef64df289468cfa" 296 | integrity sha512-ooD/FJ8EuwlDKOI6D9HWxgIgJjMg2cuziXm/42npDC8y4NjxplBUn9loewZiBNCt44450lHAU0OSb51/UqXeag== 297 | dependencies: 298 | "@types/node" "*" 299 | 300 | "@types/serve-static@*": 301 | version "1.13.4" 302 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c" 303 | integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug== 304 | dependencies: 305 | "@types/express-serve-static-core" "*" 306 | "@types/mime" "*" 307 | 308 | "@types/strip-bom@^3.0.0": 309 | version "3.0.0" 310 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 311 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 312 | 313 | "@types/strip-json-comments@0.0.30": 314 | version "0.0.30" 315 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 316 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 317 | 318 | "@types/validator@13.0.0": 319 | version "13.0.0" 320 | resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.0.0.tgz#365f1bf936aeaddd0856fc41aa1d6f82d88ee5b3" 321 | integrity sha512-WAy5txG7aFX8Vw3sloEKp5p/t/Xt8jD3GRD9DacnFv6Vo8ubudAsRTXgxpQwU0mpzY/H8U4db3roDuCMjShBmw== 322 | 323 | "@types/ws@^7.0.0": 324 | version "7.2.6" 325 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.6.tgz#516cbfb818310f87b43940460e065eb912a4178d" 326 | integrity sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ== 327 | dependencies: 328 | "@types/node" "*" 329 | 330 | "@wry/equality@^0.1.2": 331 | version "0.1.11" 332 | resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" 333 | integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== 334 | dependencies: 335 | tslib "^1.9.3" 336 | 337 | accepts@^1.3.5, accepts@~1.3.7: 338 | version "1.3.7" 339 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 340 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 341 | dependencies: 342 | mime-types "~2.1.24" 343 | negotiator "0.6.2" 344 | 345 | ansi-regex@^2.0.0: 346 | version "2.1.1" 347 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 348 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 349 | 350 | ansi-regex@^4.1.0: 351 | version "4.1.0" 352 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 353 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 354 | 355 | ansi-regex@^5.0.0: 356 | version "5.0.0" 357 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 358 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 359 | 360 | ansi-styles@^2.2.1: 361 | version "2.2.1" 362 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 363 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 364 | 365 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 366 | version "3.2.1" 367 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 368 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 369 | dependencies: 370 | color-convert "^1.9.0" 371 | 372 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 373 | version "4.2.1" 374 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 375 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 376 | dependencies: 377 | "@types/color-name" "^1.1.1" 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 | apollo-cache-control@^0.11.0: 394 | version "0.11.0" 395 | resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.0.tgz#7075492d04c5424e7c6769380b503e8f75b39d61" 396 | integrity sha512-dmRnQ9AXGw2SHahVGLzB/p4UW/taFBAJxifxubp8hqY5p9qdlSu4MPRq8zvV2ULMYf50rBtZyC4C+dZLqmHuHQ== 397 | dependencies: 398 | apollo-server-env "^2.4.4" 399 | apollo-server-plugin-base "^0.9.0" 400 | 401 | apollo-datasource@^0.7.1: 402 | version "0.7.1" 403 | resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.1.tgz#0b06da999ace50b7f5fe509f2a03f7de97974334" 404 | integrity sha512-h++/jQAY7GA+4TBM+7ezvctFmmGNLrAPf51KsagZj+NkT9qvxp585rdsuatynVbSl59toPK2EuVmc6ilmQHf+g== 405 | dependencies: 406 | apollo-server-caching "^0.5.1" 407 | apollo-server-env "^2.4.4" 408 | 409 | apollo-engine-reporting-protobuf@^0.5.1: 410 | version "0.5.1" 411 | resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz#b6e66e6e382f9bcdc2ac8ed168b047eb1470c1a8" 412 | integrity sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw== 413 | dependencies: 414 | "@apollo/protobufjs" "^1.0.3" 415 | 416 | apollo-engine-reporting@^2.2.0: 417 | version "2.2.0" 418 | resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-2.2.0.tgz#805399ee3d3909e01b72f1c34a3db1ad3fe16747" 419 | integrity sha512-FmfWTpyEATO392QHcot3PNMrxNhEJ4Kq+QiYY263vN/OBLZQ5zpkFY25iB6gVuiJoz3NUkByhxq5f/XjarJVvA== 420 | dependencies: 421 | apollo-engine-reporting-protobuf "^0.5.1" 422 | apollo-graphql "^0.4.0" 423 | apollo-server-caching "^0.5.1" 424 | apollo-server-env "^2.4.4" 425 | apollo-server-errors "^2.4.1" 426 | apollo-server-plugin-base "^0.9.0" 427 | apollo-server-types "^0.5.0" 428 | async-retry "^1.2.1" 429 | uuid "^8.0.0" 430 | 431 | apollo-env@^0.6.5: 432 | version "0.6.5" 433 | resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.5.tgz#5a36e699d39e2356381f7203493187260fded9f3" 434 | integrity sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg== 435 | dependencies: 436 | "@types/node-fetch" "2.5.7" 437 | core-js "^3.0.1" 438 | node-fetch "^2.2.0" 439 | sha.js "^2.4.11" 440 | 441 | apollo-graphql@^0.4.0: 442 | version "0.4.5" 443 | resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.4.5.tgz#936529335010f9be9e239619b82fb9060c70521d" 444 | integrity sha512-0qa7UOoq7E71kBYE7idi6mNQhHLVdMEDInWk6TNw3KsSWZE2/I68gARP84Mj+paFTO5NYuw1Dht66PVX76Cc2w== 445 | dependencies: 446 | apollo-env "^0.6.5" 447 | lodash.sortby "^4.7.0" 448 | 449 | apollo-link@^1.2.14: 450 | version "1.2.14" 451 | resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" 452 | integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== 453 | dependencies: 454 | apollo-utilities "^1.3.0" 455 | ts-invariant "^0.4.0" 456 | tslib "^1.9.3" 457 | zen-observable-ts "^0.8.21" 458 | 459 | apollo-server-caching@^0.5.1: 460 | version "0.5.1" 461 | resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz#5cd0536ad5473abb667cc82b59bc56b96fb35db6" 462 | integrity sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw== 463 | dependencies: 464 | lru-cache "^5.0.0" 465 | 466 | apollo-server-core@^2.15.0: 467 | version "2.15.0" 468 | resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.15.0.tgz#a9c19028b76e7ca90a759b4421556ba7625df1d9" 469 | integrity sha512-PwNm/G5IXReev7E0ZaRAekQ7pN9BTuXH8c2QVgfMGMno3XiN5Dj+1DXYQthpwNJch0y5zhhLcb/JbClijgSEsA== 470 | dependencies: 471 | "@apollographql/apollo-tools" "^0.4.3" 472 | "@apollographql/graphql-playground-html" "1.6.26" 473 | "@types/graphql-upload" "^8.0.0" 474 | "@types/ws" "^7.0.0" 475 | apollo-cache-control "^0.11.0" 476 | apollo-datasource "^0.7.1" 477 | apollo-engine-reporting "^2.2.0" 478 | apollo-server-caching "^0.5.1" 479 | apollo-server-env "^2.4.4" 480 | apollo-server-errors "^2.4.1" 481 | apollo-server-plugin-base "^0.9.0" 482 | apollo-server-types "^0.5.0" 483 | apollo-tracing "^0.11.0" 484 | fast-json-stable-stringify "^2.0.0" 485 | graphql-extensions "^0.12.3" 486 | graphql-tag "^2.9.2" 487 | graphql-tools "^4.0.0" 488 | graphql-upload "^8.0.2" 489 | loglevel "^1.6.7" 490 | sha.js "^2.4.11" 491 | subscriptions-transport-ws "^0.9.11" 492 | ws "^6.0.0" 493 | 494 | apollo-server-env@^2.4.4: 495 | version "2.4.4" 496 | resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.4.tgz#12d2d0896dcb184478cba066c7a683ab18689ca1" 497 | integrity sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg== 498 | dependencies: 499 | node-fetch "^2.1.2" 500 | util.promisify "^1.0.0" 501 | 502 | apollo-server-errors@^2.4.1: 503 | version "2.4.1" 504 | resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz#16ad49de6c9134bfb2b7dede9842e73bb239dbe2" 505 | integrity sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg== 506 | 507 | apollo-server-express@^2.14.5: 508 | version "2.15.0" 509 | resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.15.0.tgz#c0639fc92d5d5784f437735610355f4522e28625" 510 | integrity sha512-ECptVIrOVW2cmMWvqtpkZfyZrQL8yTSgbVvP4M8qcPV/3XxDJa6444zy7vxqN7lyYl8IJAsg/IwC0vodoXe//A== 511 | dependencies: 512 | "@apollographql/graphql-playground-html" "1.6.26" 513 | "@types/accepts" "^1.3.5" 514 | "@types/body-parser" "1.19.0" 515 | "@types/cors" "^2.8.4" 516 | "@types/express" "4.17.4" 517 | accepts "^1.3.5" 518 | apollo-server-core "^2.15.0" 519 | apollo-server-types "^0.5.0" 520 | body-parser "^1.18.3" 521 | cors "^2.8.4" 522 | express "^4.17.1" 523 | graphql-subscriptions "^1.0.0" 524 | graphql-tools "^4.0.0" 525 | parseurl "^1.3.2" 526 | subscriptions-transport-ws "^0.9.16" 527 | type-is "^1.6.16" 528 | 529 | apollo-server-plugin-base@^0.9.0: 530 | version "0.9.0" 531 | resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.0.tgz#777f720a1ee827a66b8c159073ca30645f8bc625" 532 | integrity sha512-LWcPrsy2+xqwlNseh/QaGa/MPNopS8c4qGgh0g0cAn0lZBRrJ9Yab7dq+iQ6vdUBwIhUWYN6s9dwUWCZw2SL8g== 533 | dependencies: 534 | apollo-server-types "^0.5.0" 535 | 536 | apollo-server-types@^0.5.0: 537 | version "0.5.0" 538 | resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.5.0.tgz#51f39c5fa610ece8b07f1fbcf63c47d4ac150340" 539 | integrity sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg== 540 | dependencies: 541 | apollo-engine-reporting-protobuf "^0.5.1" 542 | apollo-server-caching "^0.5.1" 543 | apollo-server-env "^2.4.4" 544 | 545 | apollo-tracing@^0.11.0: 546 | version "0.11.0" 547 | resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.11.0.tgz#8821eb60692f77c06660fb6bc147446f600aecfe" 548 | integrity sha512-I9IFb/8lkBW8ZwOAi4LEojfT7dMfUSkpnV8LHQI8Rcj0HtzL9HObQ3woBmzyGHdGHLFuD/6/VHyFD67SesSrJg== 549 | dependencies: 550 | apollo-server-env "^2.4.4" 551 | apollo-server-plugin-base "^0.9.0" 552 | 553 | apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: 554 | version "1.3.4" 555 | resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" 556 | integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== 557 | dependencies: 558 | "@wry/equality" "^0.1.2" 559 | fast-json-stable-stringify "^2.0.0" 560 | ts-invariant "^0.4.0" 561 | tslib "^1.10.0" 562 | 563 | app-root-path@^3.0.0: 564 | version "3.0.0" 565 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" 566 | integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== 567 | 568 | arg@^4.1.0: 569 | version "4.1.3" 570 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 571 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 572 | 573 | argparse@^1.0.7: 574 | version "1.0.10" 575 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 576 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 577 | dependencies: 578 | sprintf-js "~1.0.2" 579 | 580 | array-find-index@^1.0.1: 581 | version "1.0.2" 582 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 583 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 584 | 585 | array-flatten@1.1.1: 586 | version "1.1.1" 587 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 588 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 589 | 590 | async-limiter@~1.0.0: 591 | version "1.0.1" 592 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" 593 | integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 594 | 595 | async-retry@^1.2.1: 596 | version "1.3.1" 597 | resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" 598 | integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== 599 | dependencies: 600 | retry "0.12.0" 601 | 602 | asynckit@^0.4.0: 603 | version "0.4.0" 604 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 605 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 606 | 607 | backo2@^1.0.2: 608 | version "1.0.2" 609 | resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 610 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 611 | 612 | balanced-match@^1.0.0: 613 | version "1.0.0" 614 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 615 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 616 | 617 | base64-js@^1.0.2: 618 | version "1.3.1" 619 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 620 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 621 | 622 | bcryptjs@^2.4.3: 623 | version "2.4.3" 624 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 625 | integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= 626 | 627 | bignumber.js@9.0.0: 628 | version "9.0.0" 629 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" 630 | integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== 631 | 632 | binary-extensions@^2.0.0: 633 | version "2.1.0" 634 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 635 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 636 | 637 | body-parser@1.19.0, body-parser@^1.18.3: 638 | version "1.19.0" 639 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 640 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 641 | dependencies: 642 | bytes "3.1.0" 643 | content-type "~1.0.4" 644 | debug "2.6.9" 645 | depd "~1.1.2" 646 | http-errors "1.7.2" 647 | iconv-lite "0.4.24" 648 | on-finished "~2.3.0" 649 | qs "6.7.0" 650 | raw-body "2.4.0" 651 | type-is "~1.6.17" 652 | 653 | brace-expansion@^1.1.7: 654 | version "1.1.11" 655 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 656 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 657 | dependencies: 658 | balanced-match "^1.0.0" 659 | concat-map "0.0.1" 660 | 661 | braces@~3.0.2: 662 | version "3.0.2" 663 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 664 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 665 | dependencies: 666 | fill-range "^7.0.1" 667 | 668 | buffer-equal-constant-time@1.0.1: 669 | version "1.0.1" 670 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 671 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 672 | 673 | buffer-from@^1.0.0: 674 | version "1.1.1" 675 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 676 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 677 | 678 | buffer@^5.1.0: 679 | version "5.6.0" 680 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" 681 | integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== 682 | dependencies: 683 | base64-js "^1.0.2" 684 | ieee754 "^1.1.4" 685 | 686 | busboy@^0.3.1: 687 | version "0.3.1" 688 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" 689 | integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== 690 | dependencies: 691 | dicer "0.3.0" 692 | 693 | bytes@3.1.0: 694 | version "3.1.0" 695 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 696 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 697 | 698 | camelcase-keys@^2.0.0: 699 | version "2.1.0" 700 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 701 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 702 | dependencies: 703 | camelcase "^2.0.0" 704 | map-obj "^1.0.0" 705 | 706 | camelcase@^2.0.0: 707 | version "2.1.1" 708 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 709 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 710 | 711 | camelcase@^5.0.0: 712 | version "5.3.1" 713 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 714 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 715 | 716 | chalk@^1.1.1: 717 | version "1.1.3" 718 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 719 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 720 | dependencies: 721 | ansi-styles "^2.2.1" 722 | escape-string-regexp "^1.0.2" 723 | has-ansi "^2.0.0" 724 | strip-ansi "^3.0.0" 725 | supports-color "^2.0.0" 726 | 727 | chalk@^2.4.2: 728 | version "2.4.2" 729 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 730 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 731 | dependencies: 732 | ansi-styles "^3.2.1" 733 | escape-string-regexp "^1.0.5" 734 | supports-color "^5.3.0" 735 | 736 | chalk@^3.0.0: 737 | version "3.0.0" 738 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 739 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 740 | dependencies: 741 | ansi-styles "^4.1.0" 742 | supports-color "^7.1.0" 743 | 744 | chokidar@^3.4.0: 745 | version "3.4.0" 746 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" 747 | integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== 748 | dependencies: 749 | anymatch "~3.1.1" 750 | braces "~3.0.2" 751 | glob-parent "~5.1.0" 752 | is-binary-path "~2.1.0" 753 | is-glob "~4.0.1" 754 | normalize-path "~3.0.0" 755 | readdirp "~3.4.0" 756 | optionalDependencies: 757 | fsevents "~2.1.2" 758 | 759 | class-validator@^0.12.2: 760 | version "0.12.2" 761 | resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.12.2.tgz#2ceb72f88873e9c714cf5f9c278cbc71f6f6c8ef" 762 | integrity sha512-TDzPzp8BmpsbPhQpccB3jMUE/3pK0TyqamrK0kcx+ZeFytMA+O6q87JZZGObHHnoo9GM8vl/JppIyKWeEA/EVw== 763 | dependencies: 764 | "@types/validator" "13.0.0" 765 | google-libphonenumber "^3.2.8" 766 | tslib ">=1.9.0" 767 | validator "13.0.0" 768 | 769 | cli-highlight@^2.0.0: 770 | version "2.1.4" 771 | resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b" 772 | integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ== 773 | dependencies: 774 | chalk "^3.0.0" 775 | highlight.js "^9.6.0" 776 | mz "^2.4.0" 777 | parse5 "^5.1.1" 778 | parse5-htmlparser2-tree-adapter "^5.1.1" 779 | yargs "^15.0.0" 780 | 781 | cliui@^5.0.0: 782 | version "5.0.0" 783 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 784 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 785 | dependencies: 786 | string-width "^3.1.0" 787 | strip-ansi "^5.2.0" 788 | wrap-ansi "^5.1.0" 789 | 790 | cliui@^6.0.0: 791 | version "6.0.0" 792 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 793 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 794 | dependencies: 795 | string-width "^4.2.0" 796 | strip-ansi "^6.0.0" 797 | wrap-ansi "^6.2.0" 798 | 799 | color-convert@^1.9.0: 800 | version "1.9.3" 801 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 802 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 803 | dependencies: 804 | color-name "1.1.3" 805 | 806 | color-convert@^2.0.1: 807 | version "2.0.1" 808 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 809 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 810 | dependencies: 811 | color-name "~1.1.4" 812 | 813 | color-name@1.1.3: 814 | version "1.1.3" 815 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 816 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 817 | 818 | color-name@~1.1.4: 819 | version "1.1.4" 820 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 821 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 822 | 823 | combined-stream@^1.0.8: 824 | version "1.0.8" 825 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 826 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 827 | dependencies: 828 | delayed-stream "~1.0.0" 829 | 830 | commander@^2.20.3: 831 | version "2.20.3" 832 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 833 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 834 | 835 | concat-map@0.0.1: 836 | version "0.0.1" 837 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 838 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 839 | 840 | content-disposition@0.5.3: 841 | version "0.5.3" 842 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 843 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 844 | dependencies: 845 | safe-buffer "5.1.2" 846 | 847 | content-type@~1.0.4: 848 | version "1.0.4" 849 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 850 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 851 | 852 | cookie-parser@^1.4.5: 853 | version "1.4.5" 854 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" 855 | integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== 856 | dependencies: 857 | cookie "0.4.0" 858 | cookie-signature "1.0.6" 859 | 860 | cookie-signature@1.0.6: 861 | version "1.0.6" 862 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 863 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 864 | 865 | cookie@0.4.0: 866 | version "0.4.0" 867 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 868 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 869 | 870 | core-js@^3.0.1: 871 | version "3.6.5" 872 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" 873 | integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== 874 | 875 | core-util-is@~1.0.0: 876 | version "1.0.2" 877 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 878 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 879 | 880 | cors@^2.8.4, cors@^2.8.5: 881 | version "2.8.5" 882 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 883 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 884 | dependencies: 885 | object-assign "^4" 886 | vary "^1" 887 | 888 | cssfilter@0.0.10: 889 | version "0.0.10" 890 | resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" 891 | integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= 892 | 893 | currently-unhandled@^0.4.1: 894 | version "0.4.1" 895 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 896 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 897 | dependencies: 898 | array-find-index "^1.0.1" 899 | 900 | dateformat@~1.0.4-1.2.3: 901 | version "1.0.12" 902 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 903 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 904 | dependencies: 905 | get-stdin "^4.0.1" 906 | meow "^3.3.0" 907 | 908 | debug@2.6.9: 909 | version "2.6.9" 910 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 911 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 912 | dependencies: 913 | ms "2.0.0" 914 | 915 | debug@^4.1.1: 916 | version "4.1.1" 917 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 918 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 919 | dependencies: 920 | ms "^2.1.1" 921 | 922 | decamelize@^1.1.2, decamelize@^1.2.0: 923 | version "1.2.0" 924 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 925 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 926 | 927 | define-properties@^1.1.2, define-properties@^1.1.3: 928 | version "1.1.3" 929 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 930 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 931 | dependencies: 932 | object-keys "^1.0.12" 933 | 934 | delayed-stream@~1.0.0: 935 | version "1.0.0" 936 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 937 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 938 | 939 | depd@~1.1.2: 940 | version "1.1.2" 941 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 942 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 943 | 944 | deprecated-decorator@^0.1.6: 945 | version "0.1.6" 946 | resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" 947 | integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= 948 | 949 | destroy@~1.0.4: 950 | version "1.0.4" 951 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 952 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 953 | 954 | dicer@0.3.0: 955 | version "0.3.0" 956 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" 957 | integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== 958 | dependencies: 959 | streamsearch "0.1.2" 960 | 961 | diff@^4.0.1: 962 | version "4.0.2" 963 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 964 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 965 | 966 | dotenv@^6.2.0: 967 | version "6.2.0" 968 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" 969 | integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== 970 | 971 | dynamic-dedupe@^0.3.0: 972 | version "0.3.0" 973 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 974 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 975 | dependencies: 976 | xtend "^4.0.0" 977 | 978 | ecdsa-sig-formatter@1.0.11: 979 | version "1.0.11" 980 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 981 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 982 | dependencies: 983 | safe-buffer "^5.0.1" 984 | 985 | ee-first@1.1.1: 986 | version "1.1.1" 987 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 988 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 989 | 990 | emoji-regex@^7.0.1: 991 | version "7.0.3" 992 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 993 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 994 | 995 | emoji-regex@^8.0.0: 996 | version "8.0.0" 997 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 998 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 999 | 1000 | encodeurl@~1.0.2: 1001 | version "1.0.2" 1002 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 1003 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 1004 | 1005 | error-ex@^1.2.0: 1006 | version "1.3.2" 1007 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 1008 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 1009 | dependencies: 1010 | is-arrayish "^0.2.1" 1011 | 1012 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: 1013 | version "1.17.6" 1014 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 1015 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 1016 | dependencies: 1017 | es-to-primitive "^1.2.1" 1018 | function-bind "^1.1.1" 1019 | has "^1.0.3" 1020 | has-symbols "^1.0.1" 1021 | is-callable "^1.2.0" 1022 | is-regex "^1.1.0" 1023 | object-inspect "^1.7.0" 1024 | object-keys "^1.1.1" 1025 | object.assign "^4.1.0" 1026 | string.prototype.trimend "^1.0.1" 1027 | string.prototype.trimstart "^1.0.1" 1028 | 1029 | es-to-primitive@^1.2.1: 1030 | version "1.2.1" 1031 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 1032 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1033 | dependencies: 1034 | is-callable "^1.1.4" 1035 | is-date-object "^1.0.1" 1036 | is-symbol "^1.0.2" 1037 | 1038 | escape-html@~1.0.3: 1039 | version "1.0.3" 1040 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 1041 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 1042 | 1043 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 1044 | version "1.0.5" 1045 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1046 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1047 | 1048 | esprima@^4.0.0: 1049 | version "4.0.1" 1050 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1051 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1052 | 1053 | etag@~1.8.1: 1054 | version "1.8.1" 1055 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1056 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 1057 | 1058 | eventemitter3@^3.1.0: 1059 | version "3.1.2" 1060 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" 1061 | integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== 1062 | 1063 | express@^4.17.1: 1064 | version "4.17.1" 1065 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 1066 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 1067 | dependencies: 1068 | accepts "~1.3.7" 1069 | array-flatten "1.1.1" 1070 | body-parser "1.19.0" 1071 | content-disposition "0.5.3" 1072 | content-type "~1.0.4" 1073 | cookie "0.4.0" 1074 | cookie-signature "1.0.6" 1075 | debug "2.6.9" 1076 | depd "~1.1.2" 1077 | encodeurl "~1.0.2" 1078 | escape-html "~1.0.3" 1079 | etag "~1.8.1" 1080 | finalhandler "~1.1.2" 1081 | fresh "0.5.2" 1082 | merge-descriptors "1.0.1" 1083 | methods "~1.1.2" 1084 | on-finished "~2.3.0" 1085 | parseurl "~1.3.3" 1086 | path-to-regexp "0.1.7" 1087 | proxy-addr "~2.0.5" 1088 | qs "6.7.0" 1089 | range-parser "~1.2.1" 1090 | safe-buffer "5.1.2" 1091 | send "0.17.1" 1092 | serve-static "1.14.1" 1093 | setprototypeof "1.1.1" 1094 | statuses "~1.5.0" 1095 | type-is "~1.6.18" 1096 | utils-merge "1.0.1" 1097 | vary "~1.1.2" 1098 | 1099 | fast-json-stable-stringify@^2.0.0: 1100 | version "2.1.0" 1101 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1102 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1103 | 1104 | figlet@^1.1.1: 1105 | version "1.4.0" 1106 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.4.0.tgz#21c5878b3752a932ebdb8be400e2d10bbcddfd60" 1107 | integrity sha512-CxxIjEKHlqGosgXaIA+sikGDdV6KZOOlzPJnYuPgQlOSHZP5h9WIghYI30fyXnwEVeSH7Hedy72gC6zJrFC+SQ== 1108 | 1109 | fill-range@^7.0.1: 1110 | version "7.0.1" 1111 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1112 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1113 | dependencies: 1114 | to-regex-range "^5.0.1" 1115 | 1116 | finalhandler@~1.1.2: 1117 | version "1.1.2" 1118 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 1119 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 1120 | dependencies: 1121 | debug "2.6.9" 1122 | encodeurl "~1.0.2" 1123 | escape-html "~1.0.3" 1124 | on-finished "~2.3.0" 1125 | parseurl "~1.3.3" 1126 | statuses "~1.5.0" 1127 | unpipe "~1.0.0" 1128 | 1129 | find-up@^1.0.0: 1130 | version "1.1.2" 1131 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1132 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 1133 | dependencies: 1134 | path-exists "^2.0.0" 1135 | pinkie-promise "^2.0.0" 1136 | 1137 | find-up@^3.0.0: 1138 | version "3.0.0" 1139 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1140 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 1141 | dependencies: 1142 | locate-path "^3.0.0" 1143 | 1144 | find-up@^4.1.0: 1145 | version "4.1.0" 1146 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 1147 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1148 | dependencies: 1149 | locate-path "^5.0.0" 1150 | path-exists "^4.0.0" 1151 | 1152 | form-data@^3.0.0: 1153 | version "3.0.0" 1154 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" 1155 | integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== 1156 | dependencies: 1157 | asynckit "^0.4.0" 1158 | combined-stream "^1.0.8" 1159 | mime-types "^2.1.12" 1160 | 1161 | forwarded@~0.1.2: 1162 | version "0.1.2" 1163 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 1164 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 1165 | 1166 | fresh@0.5.2: 1167 | version "0.5.2" 1168 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1169 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 1170 | 1171 | fs-capacitor@^2.0.4: 1172 | version "2.0.4" 1173 | resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" 1174 | integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== 1175 | 1176 | fs.realpath@^1.0.0: 1177 | version "1.0.0" 1178 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1179 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1180 | 1181 | fsevents@~2.1.2: 1182 | version "2.1.3" 1183 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 1184 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 1185 | 1186 | function-bind@^1.1.1: 1187 | version "1.1.1" 1188 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1189 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1190 | 1191 | get-caller-file@^2.0.1: 1192 | version "2.0.5" 1193 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1194 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1195 | 1196 | get-stdin@^4.0.1: 1197 | version "4.0.1" 1198 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 1199 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 1200 | 1201 | glob-parent@~5.1.0: 1202 | version "5.1.1" 1203 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 1204 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 1205 | dependencies: 1206 | is-glob "^4.0.1" 1207 | 1208 | glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: 1209 | version "7.1.6" 1210 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1211 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1212 | dependencies: 1213 | fs.realpath "^1.0.0" 1214 | inflight "^1.0.4" 1215 | inherits "2" 1216 | minimatch "^3.0.4" 1217 | once "^1.3.0" 1218 | path-is-absolute "^1.0.0" 1219 | 1220 | google-libphonenumber@^3.2.8: 1221 | version "3.2.10" 1222 | resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.10.tgz#021a314652747d736a39e2e60dc670f0431425ad" 1223 | integrity sha512-TsckE9O8QgqaIeaOXPjcJa4/kX3BzFdO1oCbMfmUpRZckml4xJhjJVxaT9Mdt/VrZZkT9lX44eHAEWfJK1tHtw== 1224 | 1225 | graceful-fs@^4.1.2: 1226 | version "4.2.4" 1227 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 1228 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 1229 | 1230 | graphql-extensions@^0.12.3: 1231 | version "0.12.3" 1232 | resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.3.tgz#593b210d0c1ec79985056bea1b7d645e5eddfc31" 1233 | integrity sha512-W7iT0kzlwTiZU7fXfw9IgWnsqVj7EFLd0/wVcZZRAbR8L3f4+YsGls0oxKdsrvYBnbG347BXKQmIyo6GTEk4XA== 1234 | dependencies: 1235 | "@apollographql/apollo-tools" "^0.4.3" 1236 | apollo-server-env "^2.4.4" 1237 | apollo-server-types "^0.5.0" 1238 | 1239 | graphql-query-complexity@^0.6.0: 1240 | version "0.6.0" 1241 | resolved "https://registry.yarnpkg.com/graphql-query-complexity/-/graphql-query-complexity-0.6.0.tgz#522f452212eb0ffab66601097251bbf411c3cd11" 1242 | integrity sha512-xYLLvN7PSeSYtiQ2nR53B7B/C6iGOWVPBrzcpbheVxE78GYdiNZffDRNCoMvYGCOAY0eQTpsnTfwncVszQsOJw== 1243 | dependencies: 1244 | lodash.get "^4.4.2" 1245 | 1246 | graphql-subscriptions@^1.0.0, graphql-subscriptions@^1.1.0: 1247 | version "1.1.0" 1248 | resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11" 1249 | integrity sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA== 1250 | dependencies: 1251 | iterall "^1.2.1" 1252 | 1253 | graphql-tag@^2.9.2: 1254 | version "2.10.3" 1255 | resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" 1256 | integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== 1257 | 1258 | graphql-tools@^4.0.0: 1259 | version "4.0.8" 1260 | resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" 1261 | integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== 1262 | dependencies: 1263 | apollo-link "^1.2.14" 1264 | apollo-utilities "^1.0.1" 1265 | deprecated-decorator "^0.1.6" 1266 | iterall "^1.1.3" 1267 | uuid "^3.1.0" 1268 | 1269 | graphql-upload@^8.0.2: 1270 | version "8.1.0" 1271 | resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" 1272 | integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== 1273 | dependencies: 1274 | busboy "^0.3.1" 1275 | fs-capacitor "^2.0.4" 1276 | http-errors "^1.7.3" 1277 | object-path "^0.11.4" 1278 | 1279 | graphql@*, graphql@^15.1.0: 1280 | version "15.2.0" 1281 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.2.0.tgz#d9c655a523a3196d4b23657ec6ec5963b3bd4970" 1282 | integrity sha512-tsceRyHfgzZo+ee0YK3o8f0CR0cXAXxRlxoORWFo/CoM1bVy3UXGWeyzBcf+Y6oqPvO27BDmOEVATcunOO/MrQ== 1283 | 1284 | graphql@^14.5.3: 1285 | version "14.6.0" 1286 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49" 1287 | integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg== 1288 | dependencies: 1289 | iterall "^1.2.2" 1290 | 1291 | growly@^1.3.0: 1292 | version "1.3.0" 1293 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 1294 | integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= 1295 | 1296 | has-ansi@^2.0.0: 1297 | version "2.0.0" 1298 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1299 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 1300 | dependencies: 1301 | ansi-regex "^2.0.0" 1302 | 1303 | has-flag@^3.0.0: 1304 | version "3.0.0" 1305 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1306 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1307 | 1308 | has-flag@^4.0.0: 1309 | version "4.0.0" 1310 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1311 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1312 | 1313 | has-symbols@^1.0.0, has-symbols@^1.0.1: 1314 | version "1.0.1" 1315 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1316 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 1317 | 1318 | has@^1.0.3: 1319 | version "1.0.3" 1320 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1321 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1322 | dependencies: 1323 | function-bind "^1.1.1" 1324 | 1325 | highlight.js@^9.6.0: 1326 | version "9.18.1" 1327 | resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" 1328 | integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== 1329 | 1330 | hosted-git-info@^2.1.4: 1331 | version "2.8.8" 1332 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 1333 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 1334 | 1335 | http-errors@1.7.2: 1336 | version "1.7.2" 1337 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1338 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1339 | dependencies: 1340 | depd "~1.1.2" 1341 | inherits "2.0.3" 1342 | setprototypeof "1.1.1" 1343 | statuses ">= 1.5.0 < 2" 1344 | toidentifier "1.0.0" 1345 | 1346 | http-errors@^1.7.3: 1347 | version "1.8.0" 1348 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" 1349 | integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== 1350 | dependencies: 1351 | depd "~1.1.2" 1352 | inherits "2.0.4" 1353 | setprototypeof "1.2.0" 1354 | statuses ">= 1.5.0 < 2" 1355 | toidentifier "1.0.0" 1356 | 1357 | http-errors@~1.7.2: 1358 | version "1.7.3" 1359 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 1360 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 1361 | dependencies: 1362 | depd "~1.1.2" 1363 | inherits "2.0.4" 1364 | setprototypeof "1.1.1" 1365 | statuses ">= 1.5.0 < 2" 1366 | toidentifier "1.0.0" 1367 | 1368 | iconv-lite@0.4.24: 1369 | version "0.4.24" 1370 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1371 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1372 | dependencies: 1373 | safer-buffer ">= 2.1.2 < 3" 1374 | 1375 | ieee754@^1.1.4: 1376 | version "1.1.13" 1377 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 1378 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 1379 | 1380 | indent-string@^2.1.0: 1381 | version "2.1.0" 1382 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1383 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 1384 | dependencies: 1385 | repeating "^2.0.0" 1386 | 1387 | inflight@^1.0.4: 1388 | version "1.0.6" 1389 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1390 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1391 | dependencies: 1392 | once "^1.3.0" 1393 | wrappy "1" 1394 | 1395 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@~2.0.3: 1396 | version "2.0.4" 1397 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1398 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1399 | 1400 | inherits@2.0.3: 1401 | version "2.0.3" 1402 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1403 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1404 | 1405 | ipaddr.js@1.9.1: 1406 | version "1.9.1" 1407 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1408 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1409 | 1410 | is-arrayish@^0.2.1: 1411 | version "0.2.1" 1412 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1413 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1414 | 1415 | is-binary-path@~2.1.0: 1416 | version "2.1.0" 1417 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1418 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1419 | dependencies: 1420 | binary-extensions "^2.0.0" 1421 | 1422 | is-callable@^1.1.4, is-callable@^1.2.0: 1423 | version "1.2.0" 1424 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 1425 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 1426 | 1427 | is-date-object@^1.0.1: 1428 | version "1.0.2" 1429 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1430 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1431 | 1432 | is-extglob@^2.1.1: 1433 | version "2.1.1" 1434 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1435 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1436 | 1437 | is-finite@^1.0.0: 1438 | version "1.1.0" 1439 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1440 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 1441 | 1442 | is-fullwidth-code-point@^2.0.0: 1443 | version "2.0.0" 1444 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1445 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1446 | 1447 | is-fullwidth-code-point@^3.0.0: 1448 | version "3.0.0" 1449 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1450 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1451 | 1452 | is-glob@^4.0.1, is-glob@~4.0.1: 1453 | version "4.0.1" 1454 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1455 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1456 | dependencies: 1457 | is-extglob "^2.1.1" 1458 | 1459 | is-number@^7.0.0: 1460 | version "7.0.0" 1461 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1462 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1463 | 1464 | is-regex@^1.1.0: 1465 | version "1.1.0" 1466 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 1467 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 1468 | dependencies: 1469 | has-symbols "^1.0.1" 1470 | 1471 | is-symbol@^1.0.2: 1472 | version "1.0.3" 1473 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1474 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1475 | dependencies: 1476 | has-symbols "^1.0.1" 1477 | 1478 | is-utf8@^0.2.0: 1479 | version "0.2.1" 1480 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1481 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1482 | 1483 | is-wsl@^1.1.0: 1484 | version "1.1.0" 1485 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 1486 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 1487 | 1488 | isarray@~1.0.0: 1489 | version "1.0.0" 1490 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1491 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1492 | 1493 | isexe@^2.0.0: 1494 | version "2.0.0" 1495 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1496 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1497 | 1498 | iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2: 1499 | version "1.3.0" 1500 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" 1501 | integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== 1502 | 1503 | js-yaml@^3.13.1: 1504 | version "3.14.0" 1505 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 1506 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 1507 | dependencies: 1508 | argparse "^1.0.7" 1509 | esprima "^4.0.0" 1510 | 1511 | jsonwebtoken@^8.5.1: 1512 | version "8.5.1" 1513 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 1514 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 1515 | dependencies: 1516 | jws "^3.2.2" 1517 | lodash.includes "^4.3.0" 1518 | lodash.isboolean "^3.0.3" 1519 | lodash.isinteger "^4.0.4" 1520 | lodash.isnumber "^3.0.3" 1521 | lodash.isplainobject "^4.0.6" 1522 | lodash.isstring "^4.0.1" 1523 | lodash.once "^4.0.0" 1524 | ms "^2.1.1" 1525 | semver "^5.6.0" 1526 | 1527 | jwa@^1.4.1: 1528 | version "1.4.1" 1529 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1530 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1531 | dependencies: 1532 | buffer-equal-constant-time "1.0.1" 1533 | ecdsa-sig-formatter "1.0.11" 1534 | safe-buffer "^5.0.1" 1535 | 1536 | jws@^3.2.2: 1537 | version "3.2.2" 1538 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1539 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1540 | dependencies: 1541 | jwa "^1.4.1" 1542 | safe-buffer "^5.0.1" 1543 | 1544 | load-json-file@^1.0.0: 1545 | version "1.1.0" 1546 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1547 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1548 | dependencies: 1549 | graceful-fs "^4.1.2" 1550 | parse-json "^2.2.0" 1551 | pify "^2.0.0" 1552 | pinkie-promise "^2.0.0" 1553 | strip-bom "^2.0.0" 1554 | 1555 | locate-path@^3.0.0: 1556 | version "3.0.0" 1557 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1558 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1559 | dependencies: 1560 | p-locate "^3.0.0" 1561 | path-exists "^3.0.0" 1562 | 1563 | locate-path@^5.0.0: 1564 | version "5.0.0" 1565 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1566 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1567 | dependencies: 1568 | p-locate "^4.1.0" 1569 | 1570 | lodash.get@^4.4.2: 1571 | version "4.4.2" 1572 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1573 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1574 | 1575 | lodash.includes@^4.3.0: 1576 | version "4.3.0" 1577 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1578 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 1579 | 1580 | lodash.isboolean@^3.0.3: 1581 | version "3.0.3" 1582 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1583 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 1584 | 1585 | lodash.isinteger@^4.0.4: 1586 | version "4.0.4" 1587 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1588 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 1589 | 1590 | lodash.isnumber@^3.0.3: 1591 | version "3.0.3" 1592 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1593 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 1594 | 1595 | lodash.isplainobject@^4.0.6: 1596 | version "4.0.6" 1597 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1598 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 1599 | 1600 | lodash.isstring@^4.0.1: 1601 | version "4.0.1" 1602 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1603 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 1604 | 1605 | lodash.once@^4.0.0: 1606 | version "4.1.1" 1607 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1608 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 1609 | 1610 | lodash.sortby@^4.7.0: 1611 | version "4.7.0" 1612 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 1613 | integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= 1614 | 1615 | loglevel@^1.6.7: 1616 | version "1.6.8" 1617 | resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" 1618 | integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== 1619 | 1620 | long@^4.0.0: 1621 | version "4.0.0" 1622 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1623 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1624 | 1625 | loud-rejection@^1.0.0: 1626 | version "1.6.0" 1627 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1628 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1629 | dependencies: 1630 | currently-unhandled "^0.4.1" 1631 | signal-exit "^3.0.0" 1632 | 1633 | lru-cache@^5.0.0: 1634 | version "5.1.1" 1635 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1636 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1637 | dependencies: 1638 | yallist "^3.0.2" 1639 | 1640 | make-error@^1.1.1: 1641 | version "1.3.6" 1642 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1643 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1644 | 1645 | map-obj@^1.0.0, map-obj@^1.0.1: 1646 | version "1.0.1" 1647 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1648 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1649 | 1650 | media-typer@0.3.0: 1651 | version "0.3.0" 1652 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1653 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1654 | 1655 | meow@^3.3.0: 1656 | version "3.7.0" 1657 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1658 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1659 | dependencies: 1660 | camelcase-keys "^2.0.0" 1661 | decamelize "^1.1.2" 1662 | loud-rejection "^1.0.0" 1663 | map-obj "^1.0.1" 1664 | minimist "^1.1.3" 1665 | normalize-package-data "^2.3.4" 1666 | object-assign "^4.0.1" 1667 | read-pkg-up "^1.0.1" 1668 | redent "^1.0.0" 1669 | trim-newlines "^1.0.0" 1670 | 1671 | merge-descriptors@1.0.1: 1672 | version "1.0.1" 1673 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1674 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1675 | 1676 | methods@~1.1.2: 1677 | version "1.1.2" 1678 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1679 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1680 | 1681 | mime-db@1.44.0: 1682 | version "1.44.0" 1683 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1684 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1685 | 1686 | mime-types@^2.1.12, mime-types@~2.1.24: 1687 | version "2.1.27" 1688 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1689 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1690 | dependencies: 1691 | mime-db "1.44.0" 1692 | 1693 | mime@1.6.0: 1694 | version "1.6.0" 1695 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1696 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1697 | 1698 | minimatch@^3.0.4: 1699 | version "3.0.4" 1700 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1701 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1702 | dependencies: 1703 | brace-expansion "^1.1.7" 1704 | 1705 | minimist@^1.1.3, minimist@^1.2.5: 1706 | version "1.2.5" 1707 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1708 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1709 | 1710 | mkdirp@^1.0.3, mkdirp@^1.0.4: 1711 | version "1.0.4" 1712 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1713 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1714 | 1715 | ms@2.0.0: 1716 | version "2.0.0" 1717 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1718 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1719 | 1720 | ms@2.1.1: 1721 | version "2.1.1" 1722 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1723 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1724 | 1725 | ms@^2.1.1: 1726 | version "2.1.2" 1727 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1728 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1729 | 1730 | mysql@^2.18.1: 1731 | version "2.18.1" 1732 | resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" 1733 | integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== 1734 | dependencies: 1735 | bignumber.js "9.0.0" 1736 | readable-stream "2.3.7" 1737 | safe-buffer "5.1.2" 1738 | sqlstring "2.3.1" 1739 | 1740 | mz@^2.4.0: 1741 | version "2.7.0" 1742 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1743 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1744 | dependencies: 1745 | any-promise "^1.0.0" 1746 | object-assign "^4.0.1" 1747 | thenify-all "^1.0.0" 1748 | 1749 | negotiator@0.6.2: 1750 | version "0.6.2" 1751 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1752 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1753 | 1754 | node-fetch@^2.1.2, node-fetch@^2.2.0: 1755 | version "2.6.0" 1756 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 1757 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1758 | 1759 | node-notifier@^5.4.0: 1760 | version "5.4.3" 1761 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" 1762 | integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== 1763 | dependencies: 1764 | growly "^1.3.0" 1765 | is-wsl "^1.1.0" 1766 | semver "^5.5.0" 1767 | shellwords "^0.1.1" 1768 | which "^1.3.0" 1769 | 1770 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1771 | version "2.5.0" 1772 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1773 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1774 | dependencies: 1775 | hosted-git-info "^2.1.4" 1776 | resolve "^1.10.0" 1777 | semver "2 || 3 || 4 || 5" 1778 | validate-npm-package-license "^3.0.1" 1779 | 1780 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1781 | version "3.0.0" 1782 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1783 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1784 | 1785 | object-assign@^4, object-assign@^4.0.1: 1786 | version "4.1.1" 1787 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1788 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1789 | 1790 | object-inspect@^1.7.0: 1791 | version "1.8.0" 1792 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" 1793 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== 1794 | 1795 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1796 | version "1.1.1" 1797 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1798 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1799 | 1800 | object-path@^0.11.4: 1801 | version "0.11.4" 1802 | resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" 1803 | integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= 1804 | 1805 | object.assign@^4.1.0: 1806 | version "4.1.0" 1807 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1808 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1809 | dependencies: 1810 | define-properties "^1.1.2" 1811 | function-bind "^1.1.1" 1812 | has-symbols "^1.0.0" 1813 | object-keys "^1.0.11" 1814 | 1815 | object.getownpropertydescriptors@^2.1.0: 1816 | version "2.1.0" 1817 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 1818 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 1819 | dependencies: 1820 | define-properties "^1.1.3" 1821 | es-abstract "^1.17.0-next.1" 1822 | 1823 | on-finished@~2.3.0: 1824 | version "2.3.0" 1825 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1826 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1827 | dependencies: 1828 | ee-first "1.1.1" 1829 | 1830 | once@^1.3.0: 1831 | version "1.4.0" 1832 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1833 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1834 | dependencies: 1835 | wrappy "1" 1836 | 1837 | p-limit@^2.0.0, p-limit@^2.2.0: 1838 | version "2.3.0" 1839 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1840 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1841 | dependencies: 1842 | p-try "^2.0.0" 1843 | 1844 | p-locate@^3.0.0: 1845 | version "3.0.0" 1846 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1847 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1848 | dependencies: 1849 | p-limit "^2.0.0" 1850 | 1851 | p-locate@^4.1.0: 1852 | version "4.1.0" 1853 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1854 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1855 | dependencies: 1856 | p-limit "^2.2.0" 1857 | 1858 | p-try@^2.0.0: 1859 | version "2.2.0" 1860 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1861 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1862 | 1863 | parent-require@^1.0.0: 1864 | version "1.0.0" 1865 | resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" 1866 | integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= 1867 | 1868 | parse-json@^2.2.0: 1869 | version "2.2.0" 1870 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1871 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1872 | dependencies: 1873 | error-ex "^1.2.0" 1874 | 1875 | parse5-htmlparser2-tree-adapter@^5.1.1: 1876 | version "5.1.1" 1877 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc" 1878 | integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw== 1879 | dependencies: 1880 | parse5 "^5.1.1" 1881 | 1882 | parse5@^5.1.1: 1883 | version "5.1.1" 1884 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" 1885 | integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== 1886 | 1887 | parseurl@^1.3.2, parseurl@~1.3.3: 1888 | version "1.3.3" 1889 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1890 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1891 | 1892 | path-exists@^2.0.0: 1893 | version "2.1.0" 1894 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1895 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1896 | dependencies: 1897 | pinkie-promise "^2.0.0" 1898 | 1899 | path-exists@^3.0.0: 1900 | version "3.0.0" 1901 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1902 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1903 | 1904 | path-exists@^4.0.0: 1905 | version "4.0.0" 1906 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1907 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1908 | 1909 | path-is-absolute@^1.0.0: 1910 | version "1.0.1" 1911 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1912 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1913 | 1914 | path-parse@^1.0.6: 1915 | version "1.0.6" 1916 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1917 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1918 | 1919 | path-to-regexp@0.1.7: 1920 | version "0.1.7" 1921 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1922 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1923 | 1924 | path-type@^1.0.0: 1925 | version "1.1.0" 1926 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1927 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1928 | dependencies: 1929 | graceful-fs "^4.1.2" 1930 | pify "^2.0.0" 1931 | pinkie-promise "^2.0.0" 1932 | 1933 | picomatch@^2.0.4, picomatch@^2.2.1: 1934 | version "2.2.2" 1935 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1936 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1937 | 1938 | pify@^2.0.0: 1939 | version "2.3.0" 1940 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1941 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1942 | 1943 | pinkie-promise@^2.0.0: 1944 | version "2.0.1" 1945 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1946 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1947 | dependencies: 1948 | pinkie "^2.0.0" 1949 | 1950 | pinkie@^2.0.0: 1951 | version "2.0.4" 1952 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1953 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1954 | 1955 | process-nextick-args@~2.0.0: 1956 | version "2.0.1" 1957 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1958 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1959 | 1960 | proxy-addr@~2.0.5: 1961 | version "2.0.6" 1962 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1963 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1964 | dependencies: 1965 | forwarded "~0.1.2" 1966 | ipaddr.js "1.9.1" 1967 | 1968 | qs@6.7.0: 1969 | version "6.7.0" 1970 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1971 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1972 | 1973 | range-parser@~1.2.1: 1974 | version "1.2.1" 1975 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1976 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1977 | 1978 | raw-body@2.4.0: 1979 | version "2.4.0" 1980 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1981 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1982 | dependencies: 1983 | bytes "3.1.0" 1984 | http-errors "1.7.2" 1985 | iconv-lite "0.4.24" 1986 | unpipe "1.0.0" 1987 | 1988 | read-pkg-up@^1.0.1: 1989 | version "1.0.1" 1990 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1991 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1992 | dependencies: 1993 | find-up "^1.0.0" 1994 | read-pkg "^1.0.0" 1995 | 1996 | read-pkg@^1.0.0: 1997 | version "1.1.0" 1998 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1999 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 2000 | dependencies: 2001 | load-json-file "^1.0.0" 2002 | normalize-package-data "^2.3.2" 2003 | path-type "^1.0.0" 2004 | 2005 | readable-stream@2.3.7: 2006 | version "2.3.7" 2007 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 2008 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 2009 | dependencies: 2010 | core-util-is "~1.0.0" 2011 | inherits "~2.0.3" 2012 | isarray "~1.0.0" 2013 | process-nextick-args "~2.0.0" 2014 | safe-buffer "~5.1.1" 2015 | string_decoder "~1.1.1" 2016 | util-deprecate "~1.0.1" 2017 | 2018 | readdirp@~3.4.0: 2019 | version "3.4.0" 2020 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 2021 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 2022 | dependencies: 2023 | picomatch "^2.2.1" 2024 | 2025 | redent@^1.0.0: 2026 | version "1.0.0" 2027 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 2028 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 2029 | dependencies: 2030 | indent-string "^2.1.0" 2031 | strip-indent "^1.0.1" 2032 | 2033 | reflect-metadata@^0.1.13: 2034 | version "0.1.13" 2035 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 2036 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 2037 | 2038 | repeating@^2.0.0: 2039 | version "2.0.1" 2040 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2041 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 2042 | dependencies: 2043 | is-finite "^1.0.0" 2044 | 2045 | require-directory@^2.1.1: 2046 | version "2.1.1" 2047 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2048 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 2049 | 2050 | require-main-filename@^2.0.0: 2051 | version "2.0.0" 2052 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 2053 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 2054 | 2055 | resolve@^1.0.0, resolve@^1.10.0: 2056 | version "1.17.0" 2057 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 2058 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 2059 | dependencies: 2060 | path-parse "^1.0.6" 2061 | 2062 | retry@0.12.0: 2063 | version "0.12.0" 2064 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 2065 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 2066 | 2067 | rimraf@^2.6.1: 2068 | version "2.7.1" 2069 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 2070 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 2071 | dependencies: 2072 | glob "^7.1.3" 2073 | 2074 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2075 | version "5.1.2" 2076 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2077 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2078 | 2079 | safe-buffer@^5.0.1: 2080 | version "5.2.1" 2081 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2082 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2083 | 2084 | "safer-buffer@>= 2.1.2 < 3": 2085 | version "2.1.2" 2086 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2087 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2088 | 2089 | sax@>=0.6.0: 2090 | version "1.2.4" 2091 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2092 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 2093 | 2094 | "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: 2095 | version "5.7.1" 2096 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2097 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2098 | 2099 | semver@^7.3.2: 2100 | version "7.3.2" 2101 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" 2102 | integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== 2103 | 2104 | send@0.17.1: 2105 | version "0.17.1" 2106 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 2107 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 2108 | dependencies: 2109 | debug "2.6.9" 2110 | depd "~1.1.2" 2111 | destroy "~1.0.4" 2112 | encodeurl "~1.0.2" 2113 | escape-html "~1.0.3" 2114 | etag "~1.8.1" 2115 | fresh "0.5.2" 2116 | http-errors "~1.7.2" 2117 | mime "1.6.0" 2118 | ms "2.1.1" 2119 | on-finished "~2.3.0" 2120 | range-parser "~1.2.1" 2121 | statuses "~1.5.0" 2122 | 2123 | serve-static@1.14.1: 2124 | version "1.14.1" 2125 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 2126 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 2127 | dependencies: 2128 | encodeurl "~1.0.2" 2129 | escape-html "~1.0.3" 2130 | parseurl "~1.3.3" 2131 | send "0.17.1" 2132 | 2133 | set-blocking@^2.0.0: 2134 | version "2.0.0" 2135 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2136 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 2137 | 2138 | setprototypeof@1.1.1: 2139 | version "1.1.1" 2140 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 2141 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 2142 | 2143 | setprototypeof@1.2.0: 2144 | version "1.2.0" 2145 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 2146 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 2147 | 2148 | sha.js@^2.4.11: 2149 | version "2.4.11" 2150 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 2151 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 2152 | dependencies: 2153 | inherits "^2.0.1" 2154 | safe-buffer "^5.0.1" 2155 | 2156 | shellwords@^0.1.1: 2157 | version "0.1.1" 2158 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 2159 | integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== 2160 | 2161 | signal-exit@^3.0.0: 2162 | version "3.0.3" 2163 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 2164 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 2165 | 2166 | source-map-support@^0.5.12, source-map-support@^0.5.17: 2167 | version "0.5.19" 2168 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 2169 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 2170 | dependencies: 2171 | buffer-from "^1.0.0" 2172 | source-map "^0.6.0" 2173 | 2174 | source-map@^0.6.0: 2175 | version "0.6.1" 2176 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2177 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2178 | 2179 | spdx-correct@^3.0.0: 2180 | version "3.1.1" 2181 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 2182 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 2183 | dependencies: 2184 | spdx-expression-parse "^3.0.0" 2185 | spdx-license-ids "^3.0.0" 2186 | 2187 | spdx-exceptions@^2.1.0: 2188 | version "2.3.0" 2189 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 2190 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 2191 | 2192 | spdx-expression-parse@^3.0.0: 2193 | version "3.0.1" 2194 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 2195 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 2196 | dependencies: 2197 | spdx-exceptions "^2.1.0" 2198 | spdx-license-ids "^3.0.0" 2199 | 2200 | spdx-license-ids@^3.0.0: 2201 | version "3.0.5" 2202 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 2203 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 2204 | 2205 | sprintf-js@~1.0.2: 2206 | version "1.0.3" 2207 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2208 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2209 | 2210 | sqlstring@2.3.1: 2211 | version "2.3.1" 2212 | resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" 2213 | integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A= 2214 | 2215 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 2216 | version "1.5.0" 2217 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 2218 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2219 | 2220 | streamsearch@0.1.2: 2221 | version "0.1.2" 2222 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 2223 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 2224 | 2225 | string-width@^3.0.0, string-width@^3.1.0: 2226 | version "3.1.0" 2227 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2228 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2229 | dependencies: 2230 | emoji-regex "^7.0.1" 2231 | is-fullwidth-code-point "^2.0.0" 2232 | strip-ansi "^5.1.0" 2233 | 2234 | string-width@^4.1.0, string-width@^4.2.0: 2235 | version "4.2.0" 2236 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 2237 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 2238 | dependencies: 2239 | emoji-regex "^8.0.0" 2240 | is-fullwidth-code-point "^3.0.0" 2241 | strip-ansi "^6.0.0" 2242 | 2243 | string.prototype.trimend@^1.0.1: 2244 | version "1.0.1" 2245 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 2246 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 2247 | dependencies: 2248 | define-properties "^1.1.3" 2249 | es-abstract "^1.17.5" 2250 | 2251 | string.prototype.trimstart@^1.0.1: 2252 | version "1.0.1" 2253 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 2254 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 2255 | dependencies: 2256 | define-properties "^1.1.3" 2257 | es-abstract "^1.17.5" 2258 | 2259 | string_decoder@~1.1.1: 2260 | version "1.1.1" 2261 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2262 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2263 | dependencies: 2264 | safe-buffer "~5.1.0" 2265 | 2266 | strip-ansi@^3.0.0: 2267 | version "3.0.1" 2268 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2269 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2270 | dependencies: 2271 | ansi-regex "^2.0.0" 2272 | 2273 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 2274 | version "5.2.0" 2275 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2276 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2277 | dependencies: 2278 | ansi-regex "^4.1.0" 2279 | 2280 | strip-ansi@^6.0.0: 2281 | version "6.0.0" 2282 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 2283 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 2284 | dependencies: 2285 | ansi-regex "^5.0.0" 2286 | 2287 | strip-bom@^2.0.0: 2288 | version "2.0.0" 2289 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2290 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 2291 | dependencies: 2292 | is-utf8 "^0.2.0" 2293 | 2294 | strip-bom@^3.0.0: 2295 | version "3.0.0" 2296 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2297 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 2298 | 2299 | strip-indent@^1.0.1: 2300 | version "1.0.1" 2301 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2302 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 2303 | dependencies: 2304 | get-stdin "^4.0.1" 2305 | 2306 | strip-json-comments@^2.0.0: 2307 | version "2.0.1" 2308 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2309 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2310 | 2311 | subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16: 2312 | version "0.9.16" 2313 | resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec" 2314 | integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw== 2315 | dependencies: 2316 | backo2 "^1.0.2" 2317 | eventemitter3 "^3.1.0" 2318 | iterall "^1.2.1" 2319 | symbol-observable "^1.0.4" 2320 | ws "^5.2.0" 2321 | 2322 | supports-color@^2.0.0: 2323 | version "2.0.0" 2324 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2325 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2326 | 2327 | supports-color@^5.3.0: 2328 | version "5.5.0" 2329 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2330 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2331 | dependencies: 2332 | has-flag "^3.0.0" 2333 | 2334 | supports-color@^7.1.0: 2335 | version "7.1.0" 2336 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 2337 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 2338 | dependencies: 2339 | has-flag "^4.0.0" 2340 | 2341 | symbol-observable@^1.0.4: 2342 | version "1.2.0" 2343 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 2344 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 2345 | 2346 | thenify-all@^1.0.0: 2347 | version "1.6.0" 2348 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 2349 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 2350 | dependencies: 2351 | thenify ">= 3.1.0 < 4" 2352 | 2353 | "thenify@>= 3.1.0 < 4": 2354 | version "3.3.1" 2355 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 2356 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 2357 | dependencies: 2358 | any-promise "^1.0.0" 2359 | 2360 | to-regex-range@^5.0.1: 2361 | version "5.0.1" 2362 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2363 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2364 | dependencies: 2365 | is-number "^7.0.0" 2366 | 2367 | toidentifier@1.0.0: 2368 | version "1.0.0" 2369 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 2370 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 2371 | 2372 | tree-kill@^1.2.2: 2373 | version "1.2.2" 2374 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2375 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 2376 | 2377 | trim-newlines@^1.0.0: 2378 | version "1.0.0" 2379 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2380 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 2381 | 2382 | ts-invariant@^0.4.0: 2383 | version "0.4.4" 2384 | resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" 2385 | integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== 2386 | dependencies: 2387 | tslib "^1.9.3" 2388 | 2389 | ts-node-dev@^1.0.0-pre.49: 2390 | version "1.0.0-pre.49" 2391 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.49.tgz#28836f73fe9513f339ccb1c0bebdb2e2e25c52f0" 2392 | integrity sha512-iJd4QPPOaCAByl/WuEdmDX8xDR2GmoWYu6aKvGudGUcfP1sJRjpaHb7oFDuvBspQF1xhxUdbjfHuvEtZPwKZFQ== 2393 | dependencies: 2394 | chokidar "^3.4.0" 2395 | dateformat "~1.0.4-1.2.3" 2396 | dynamic-dedupe "^0.3.0" 2397 | minimist "^1.2.5" 2398 | mkdirp "^1.0.4" 2399 | node-notifier "^5.4.0" 2400 | resolve "^1.0.0" 2401 | rimraf "^2.6.1" 2402 | source-map-support "^0.5.12" 2403 | tree-kill "^1.2.2" 2404 | ts-node "^8.10.2" 2405 | tsconfig "^7.0.0" 2406 | 2407 | ts-node@^8.10.2: 2408 | version "8.10.2" 2409 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" 2410 | integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== 2411 | dependencies: 2412 | arg "^4.1.0" 2413 | diff "^4.0.1" 2414 | make-error "^1.1.1" 2415 | source-map-support "^0.5.17" 2416 | yn "3.1.1" 2417 | 2418 | tsconfig@^7.0.0: 2419 | version "7.0.0" 2420 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 2421 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 2422 | dependencies: 2423 | "@types/strip-bom" "^3.0.0" 2424 | "@types/strip-json-comments" "0.0.30" 2425 | strip-bom "^3.0.0" 2426 | strip-json-comments "^2.0.0" 2427 | 2428 | tslib@>=1.9.0, tslib@^2.0.0: 2429 | version "2.0.0" 2430 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" 2431 | integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== 2432 | 2433 | tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: 2434 | version "1.13.0" 2435 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 2436 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 2437 | 2438 | type-graphql@^1.0.0-rc.2: 2439 | version "1.0.0-rc.3" 2440 | resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-1.0.0-rc.3.tgz#fa5bfb91f6e11b0a223598d71dffc22c4206fd78" 2441 | integrity sha512-klfYIlnmwvYbBQh5CHDfDzbaN3/v6y4ZSfdz9K96QNBvf9+7iE3jMG0weKWFqv5aY1iI3ZMiQznxIpbbGaKQmA== 2442 | dependencies: 2443 | "@types/glob" "^7.1.2" 2444 | "@types/node" "^14.0.11" 2445 | "@types/semver" "^7.2.0" 2446 | glob "^7.1.6" 2447 | graphql-query-complexity "^0.6.0" 2448 | graphql-subscriptions "^1.1.0" 2449 | semver "^7.3.2" 2450 | tslib "^2.0.0" 2451 | 2452 | type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: 2453 | version "1.6.18" 2454 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2455 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2456 | dependencies: 2457 | media-typer "0.3.0" 2458 | mime-types "~2.1.24" 2459 | 2460 | typeorm@^0.2.25: 2461 | version "0.2.25" 2462 | resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.25.tgz#1a33513b375b78cc7740d2405202208b918d7dde" 2463 | integrity sha512-yzQ995fyDy5wolSLK9cmjUNcmQdixaeEm2TnXB5HN++uKbs9TiR6Y7eYAHpDlAE8s9J1uniDBgytecCZVFergQ== 2464 | dependencies: 2465 | app-root-path "^3.0.0" 2466 | buffer "^5.1.0" 2467 | chalk "^2.4.2" 2468 | cli-highlight "^2.0.0" 2469 | debug "^4.1.1" 2470 | dotenv "^6.2.0" 2471 | glob "^7.1.2" 2472 | js-yaml "^3.13.1" 2473 | mkdirp "^1.0.3" 2474 | reflect-metadata "^0.1.13" 2475 | sha.js "^2.4.11" 2476 | tslib "^1.9.0" 2477 | xml2js "^0.4.17" 2478 | yargonaut "^1.1.2" 2479 | yargs "^13.2.1" 2480 | 2481 | typescript@^3.9.5: 2482 | version "3.9.5" 2483 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" 2484 | integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== 2485 | 2486 | unpipe@1.0.0, unpipe@~1.0.0: 2487 | version "1.0.0" 2488 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2489 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2490 | 2491 | util-deprecate@~1.0.1: 2492 | version "1.0.2" 2493 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2494 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2495 | 2496 | util.promisify@^1.0.0: 2497 | version "1.0.1" 2498 | resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" 2499 | integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== 2500 | dependencies: 2501 | define-properties "^1.1.3" 2502 | es-abstract "^1.17.2" 2503 | has-symbols "^1.0.1" 2504 | object.getownpropertydescriptors "^2.1.0" 2505 | 2506 | utils-merge@1.0.1: 2507 | version "1.0.1" 2508 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2509 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2510 | 2511 | uuid@^3.1.0: 2512 | version "3.4.0" 2513 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2514 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 2515 | 2516 | uuid@^8.0.0: 2517 | version "8.2.0" 2518 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" 2519 | integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== 2520 | 2521 | validate-npm-package-license@^3.0.1: 2522 | version "3.0.4" 2523 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2524 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2525 | dependencies: 2526 | spdx-correct "^3.0.0" 2527 | spdx-expression-parse "^3.0.0" 2528 | 2529 | validator@13.0.0: 2530 | version "13.0.0" 2531 | resolved "https://registry.yarnpkg.com/validator/-/validator-13.0.0.tgz#0fb6c6bb5218ea23d368a8347e6d0f5a70e3bcab" 2532 | integrity sha512-anYx5fURbgF04lQV18nEQWZ/3wHGnxiKdG4aL8J+jEDsm98n/sU/bey+tYk6tnGJzm7ioh5FoqrAiQ6m03IgaA== 2533 | 2534 | vary@^1, vary@~1.1.2: 2535 | version "1.1.2" 2536 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2537 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2538 | 2539 | which-module@^2.0.0: 2540 | version "2.0.0" 2541 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2542 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2543 | 2544 | which@^1.3.0: 2545 | version "1.3.1" 2546 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2547 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2548 | dependencies: 2549 | isexe "^2.0.0" 2550 | 2551 | wrap-ansi@^5.1.0: 2552 | version "5.1.0" 2553 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 2554 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 2555 | dependencies: 2556 | ansi-styles "^3.2.0" 2557 | string-width "^3.0.0" 2558 | strip-ansi "^5.0.0" 2559 | 2560 | wrap-ansi@^6.2.0: 2561 | version "6.2.0" 2562 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 2563 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 2564 | dependencies: 2565 | ansi-styles "^4.0.0" 2566 | string-width "^4.1.0" 2567 | strip-ansi "^6.0.0" 2568 | 2569 | wrappy@1: 2570 | version "1.0.2" 2571 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2572 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2573 | 2574 | ws@^5.2.0: 2575 | version "5.2.2" 2576 | resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 2577 | integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== 2578 | dependencies: 2579 | async-limiter "~1.0.0" 2580 | 2581 | ws@^6.0.0: 2582 | version "6.2.1" 2583 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 2584 | integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== 2585 | dependencies: 2586 | async-limiter "~1.0.0" 2587 | 2588 | xml2js@^0.4.17: 2589 | version "0.4.23" 2590 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" 2591 | integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 2592 | dependencies: 2593 | sax ">=0.6.0" 2594 | xmlbuilder "~11.0.0" 2595 | 2596 | xmlbuilder@~11.0.0: 2597 | version "11.0.1" 2598 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 2599 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 2600 | 2601 | xss@^1.0.6: 2602 | version "1.0.7" 2603 | resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.7.tgz#a554cbd5e909324bd6893fb47fff441ad54e2a95" 2604 | integrity sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w== 2605 | dependencies: 2606 | commander "^2.20.3" 2607 | cssfilter "0.0.10" 2608 | 2609 | xtend@^4.0.0: 2610 | version "4.0.2" 2611 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2612 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2613 | 2614 | y18n@^4.0.0: 2615 | version "4.0.0" 2616 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2617 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2618 | 2619 | yallist@^3.0.2: 2620 | version "3.1.1" 2621 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2622 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2623 | 2624 | yargonaut@^1.1.2: 2625 | version "1.1.4" 2626 | resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" 2627 | integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== 2628 | dependencies: 2629 | chalk "^1.1.1" 2630 | figlet "^1.1.1" 2631 | parent-require "^1.0.0" 2632 | 2633 | yargs-parser@^13.1.2: 2634 | version "13.1.2" 2635 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 2636 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 2637 | dependencies: 2638 | camelcase "^5.0.0" 2639 | decamelize "^1.2.0" 2640 | 2641 | yargs-parser@^18.1.1: 2642 | version "18.1.3" 2643 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 2644 | integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== 2645 | dependencies: 2646 | camelcase "^5.0.0" 2647 | decamelize "^1.2.0" 2648 | 2649 | yargs@^13.2.1: 2650 | version "13.3.2" 2651 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 2652 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 2653 | dependencies: 2654 | cliui "^5.0.0" 2655 | find-up "^3.0.0" 2656 | get-caller-file "^2.0.1" 2657 | require-directory "^2.1.1" 2658 | require-main-filename "^2.0.0" 2659 | set-blocking "^2.0.0" 2660 | string-width "^3.0.0" 2661 | which-module "^2.0.0" 2662 | y18n "^4.0.0" 2663 | yargs-parser "^13.1.2" 2664 | 2665 | yargs@^15.0.0: 2666 | version "15.3.1" 2667 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" 2668 | integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== 2669 | dependencies: 2670 | cliui "^6.0.0" 2671 | decamelize "^1.2.0" 2672 | find-up "^4.1.0" 2673 | get-caller-file "^2.0.1" 2674 | require-directory "^2.1.1" 2675 | require-main-filename "^2.0.0" 2676 | set-blocking "^2.0.0" 2677 | string-width "^4.2.0" 2678 | which-module "^2.0.0" 2679 | y18n "^4.0.0" 2680 | yargs-parser "^18.1.1" 2681 | 2682 | yn@3.1.1: 2683 | version "3.1.1" 2684 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2685 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2686 | 2687 | zen-observable-ts@^0.8.21: 2688 | version "0.8.21" 2689 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" 2690 | integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== 2691 | dependencies: 2692 | tslib "^1.9.3" 2693 | zen-observable "^0.8.0" 2694 | 2695 | zen-observable@^0.8.0: 2696 | version "0.8.15" 2697 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" 2698 | integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== 2699 | -------------------------------------------------------------------------------- /nestjs/.env.example: -------------------------------------------------------------------------------- 1 | DB_HOST=localhost 2 | DB_USERNAME=your_db_username 3 | DB_PASSWORD=your_db_password 4 | DB_NAME=your_db_name 5 | DB_PORT=3306 6 | DB_LOGGING=true 7 | DB_SYNC=true -------------------------------------------------------------------------------- /nestjs/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /nestjs/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "collection": "@nestjs/schematics", 3 | "sourceRoot": "src" 4 | } 5 | -------------------------------------------------------------------------------- /nestjs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jwt-auth-nestjs-example", 3 | "version": "0.0.1", 4 | "description": "", 5 | "author": "", 6 | "license": "MIT", 7 | "scripts": { 8 | "prebuild": "rimraf dist", 9 | "build": "nest build", 10 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", 11 | "start": "nest start", 12 | "start:dev": "nest start --watch", 13 | "start:debug": "nest start --debug --watch", 14 | "start:prod": "node dist/main", 15 | "lint": "tslint -p tsconfig.json -c tslint.json", 16 | "test": "jest", 17 | "test:watch": "jest --watch", 18 | "test:cov": "jest --coverage", 19 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", 20 | "test:e2e": "jest --config ./test/jest-e2e.json" 21 | }, 22 | "dependencies": { 23 | "@nestjs/common": "^6.7.2", 24 | "@nestjs/config": "^0.5.0", 25 | "@nestjs/core": "^6.7.2", 26 | "@nestjs/platform-express": "^6.7.2", 27 | "@nestjs/typeorm": "^7.1.0", 28 | "bcryptjs": "^2.4.3", 29 | "cookie-parser": "^1.4.5", 30 | "helmet": "^3.23.3", 31 | "jsonwebtoken": "^8.5.1", 32 | "mysql": "^2.18.1", 33 | "reflect-metadata": "^0.1.13", 34 | "rimraf": "^3.0.0", 35 | "rxjs": "^6.5.3", 36 | "typeorm": "^0.2.25" 37 | }, 38 | "devDependencies": { 39 | "@nestjs/cli": "^6.9.0", 40 | "@nestjs/schematics": "^6.7.0", 41 | "@nestjs/testing": "^6.7.1", 42 | "@types/express": "^4.17.1", 43 | "@types/jest": "^24.0.18", 44 | "@types/node": "^12.7.5", 45 | "@types/supertest": "^2.0.8", 46 | "jest": "^24.9.0", 47 | "prettier": "^1.18.2", 48 | "supertest": "^4.0.2", 49 | "ts-jest": "^24.1.0", 50 | "ts-loader": "^6.1.1", 51 | "ts-node": "^8.4.1", 52 | "tsconfig-paths": "^3.9.0", 53 | "tslint": "^5.20.0", 54 | "typescript": "^3.6.3" 55 | }, 56 | "jest": { 57 | "moduleFileExtensions": [ 58 | "js", 59 | "json", 60 | "ts" 61 | ], 62 | "rootDir": "src", 63 | "testRegex": ".spec.ts$", 64 | "transform": { 65 | "^.+\\.(t|j)s$": "ts-jest" 66 | }, 67 | "coverageDirectory": "../coverage", 68 | "testEnvironment": "node" 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /nestjs/src/app.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | 5 | describe('AppController', () => { 6 | let appController: AppController; 7 | 8 | beforeEach(async () => { 9 | const app: TestingModule = await Test.createTestingModule({ 10 | controllers: [AppController], 11 | providers: [AppService], 12 | }).compile(); 13 | 14 | appController = app.get(AppController); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /nestjs/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | import { AppService } from './app.service'; 3 | 4 | @Controller() 5 | export class AppController { 6 | constructor(private readonly appService: AppService) {} 7 | } 8 | -------------------------------------------------------------------------------- /nestjs/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Module, 3 | NestModule, 4 | MiddlewareConsumer, 5 | RequestMethod, 6 | } from '@nestjs/common'; 7 | import { AppController } from './app.controller'; 8 | import { ConfigModule, ConfigService } from '@nestjs/config'; 9 | import { TypeOrmModule } from '@nestjs/typeorm'; 10 | import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions'; 11 | import mysqlDB from 'src/config/mysqlDB.config'; 12 | import { AppService } from './app.service'; 13 | import { ProductModule } from './module/product/product.module'; 14 | import { UserModule } from './module/user/user.module'; 15 | import { AuthModule } from './module/auth/auth.module'; 16 | import { AuthMiddleware } from './module/auth/middleware/auth.middleware'; 17 | import { APP_GUARD } from '@nestjs/core'; 18 | import { RolesGuard } from './module/auth/guard/role.guard'; 19 | 20 | @Module({ 21 | imports: [ 22 | /** Load and parse .env files from the environments directory */ 23 | ConfigModule.forRoot({ 24 | envFilePath: '.env', 25 | load: [mysqlDB], 26 | isGlobal: true, 27 | }), 28 | /** Configure TypeOrm asynchronously. */ 29 | TypeOrmModule.forRootAsync({ 30 | useFactory: async ( 31 | configService: ConfigService, 32 | ): Promise => configService.get('mysqlDatabase'), 33 | inject: [ConfigService], 34 | }), 35 | ProductModule, 36 | UserModule, 37 | AuthModule, 38 | ], 39 | controllers: [AppController], 40 | providers: [ 41 | AppService, 42 | { 43 | provide: APP_GUARD, 44 | useClass: RolesGuard, 45 | }, 46 | ], 47 | }) 48 | export class AppModule implements NestModule { 49 | configure(consumer: MiddlewareConsumer) { 50 | consumer 51 | .apply(AuthMiddleware) 52 | .forRoutes({ path: '*', method: RequestMethod.ALL }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /nestjs/src/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService {} 5 | -------------------------------------------------------------------------------- /nestjs/src/config/mysqlDB.config.ts: -------------------------------------------------------------------------------- 1 | import { registerAs } from '@nestjs/config'; 2 | import { Product } from 'src/module/product/product.entity'; 3 | import { User } from 'src/module/user/user.entity'; 4 | 5 | export default registerAs('mysqlDatabase', () => ({ 6 | type: 'mysql', 7 | host: process.env.DB_HOST, 8 | username: process.env.DB_USERNAME, 9 | password: process.env.DB_PASSWORD, 10 | database: process.env.DB_NAME, 11 | logging: process.env.DB_LOGGING === 'true', 12 | synchronize: process.env.DB_SYNC === 'true', 13 | entities: [Product, User], 14 | port: parseInt(process.env.DB_PORT, 10), 15 | })); 16 | -------------------------------------------------------------------------------- /nestjs/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | 4 | import * as helmet from 'helmet'; 5 | import * as cookieParser from 'cookie-parser'; 6 | import { RolesGuard } from './module/auth/guard/role.guard'; 7 | 8 | const PORT = process.env.PORT || 3000; 9 | 10 | async function bootstrap() { 11 | const app = await NestFactory.create(AppModule, { 12 | cors: { origin: process.env.CLIENT_ORIGIN }, 13 | }); 14 | 15 | app.use(helmet()); 16 | app.use(cookieParser()); 17 | 18 | await app.listen(PORT); 19 | } 20 | bootstrap(); 21 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/auth.controller.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Controller, 3 | Post, 4 | Req, 5 | Body, 6 | BadRequestException, 7 | ForbiddenException, 8 | UseInterceptors, 9 | } from '@nestjs/common'; 10 | import { AuthService } from './auth.service'; 11 | import { RegisterUserDto } from './dto/registerUser.dto'; 12 | import { LoginResponse } from './type/loginResponse'; 13 | import * as bcrypt from 'bcryptjs'; 14 | import { LoginUserDto } from './dto/loginUser.dto'; 15 | import { User } from '../user/user.entity'; 16 | import { UserService } from '../user/user.service'; 17 | import { CookieInterceptor } from './interceptor/cookie.interceptor'; 18 | 19 | @UseInterceptors(CookieInterceptor) 20 | @Controller('/api/auth') 21 | export class AuthController { 22 | constructor( 23 | private readonly authService: AuthService, 24 | private readonly userService: UserService, 25 | ) {} 26 | 27 | @Post('register') 28 | async registerUser( 29 | @Body() registerUserDto: RegisterUserDto, 30 | ): Promise { 31 | const { email, password, ...rest } = registerUserDto; 32 | 33 | const existingUser = await this.userService.findOneByEmail(email); 34 | 35 | if (existingUser) { 36 | throw new BadRequestException('User already exists.'); 37 | } 38 | 39 | try { 40 | // Hash user password 41 | const saltRounds = 12; 42 | const hashedPassword = await bcrypt.hash(password, saltRounds); 43 | 44 | // Create and save a new user entity in the database 45 | // If entity does not exist in the database then inserts, otherwise updates. 46 | const user = await this.userService.create({ 47 | ...registerUserDto, 48 | password: hashedPassword, 49 | }); 50 | const { id, role, tokenVersion } = user; 51 | const tokens = this.authService.assignTokens(id, role, tokenVersion); 52 | 53 | return tokens; 54 | } catch (error) { 55 | throw new BadRequestException('Failed to register user.'); 56 | } 57 | } 58 | 59 | @Post('login') 60 | async loginUser(@Body() loginUserDto: LoginUserDto): Promise { 61 | const { email, password: loginPassword } = loginUserDto; 62 | let existingUser: Omit; 63 | let isValid: boolean; 64 | 65 | try { 66 | existingUser = await this.userService.findUserWithPassword(email); 67 | isValid = await bcrypt.compare(loginPassword, existingUser.password); 68 | } catch (error) { 69 | throw new ForbiddenException('Username or password is invalid'); 70 | } 71 | 72 | if (!isValid) { 73 | throw new ForbiddenException('Username or password is invalid'); 74 | } 75 | 76 | const { id, role, tokenVersion } = existingUser; 77 | const { password, ...user } = existingUser; 78 | 79 | const tokens = this.authService.assignTokens(id, role, tokenVersion); 80 | 81 | return tokens; 82 | } 83 | 84 | @Post('refresh-token') 85 | async getTokens(@Req() req): Promise { 86 | const token = req.cookies['refreshToken']; 87 | 88 | try { 89 | const { 90 | accessToken, 91 | refreshToken, 92 | user, 93 | } = await this.authService.refreshTokens(token); 94 | if (accessToken && user) { 95 | return { accessToken, refreshToken }; 96 | } 97 | } catch (error) { 98 | throw new ForbiddenException(error.message); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, forwardRef } from '@nestjs/common'; 2 | import { AuthService } from './auth.service'; 3 | import { AuthController } from './auth.controller'; 4 | import { UserModule } from '../user/user.module'; 5 | 6 | @Module({ 7 | imports: [forwardRef(() => UserModule)], 8 | providers: [AuthService], 9 | controllers: [AuthController], 10 | exports: [AuthService], 11 | }) 12 | export class AuthModule {} 13 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, ForbiddenException } from '@nestjs/common'; 2 | import { sign, verify } from 'jsonwebtoken'; 3 | import { UserService } from '../user/user.service'; 4 | import { AccessTokenPayload, RefreshTokenPayload } from './type/jwtPayload'; 5 | import { UserRole } from '../user/user.entity'; 6 | import { UserResponse } from '../user/type/userResponse'; 7 | 8 | @Injectable() 9 | export class AuthService { 10 | constructor(private readonly userService: UserService) {} 11 | 12 | createAccessToken({ userId, role }: AccessTokenPayload): string { 13 | return sign({ userId, role }, process.env.ACCESS_TOKEN_SECRET, { 14 | expiresIn: '15m', 15 | }); 16 | } 17 | 18 | createRefreshToken({ userId, tokenVersion }: RefreshTokenPayload): string { 19 | return sign({ userId, tokenVersion }, process.env.REFRESH_TOKEN_SECRET, { 20 | expiresIn: '7d', 21 | }); 22 | } 23 | 24 | assignTokens(userId: number, role: UserRole, tokenVersion: number) { 25 | return { 26 | accessToken: this.createAccessToken({ userId, role }), 27 | refreshToken: this.createRefreshToken({ userId, tokenVersion }), 28 | }; 29 | } 30 | 31 | /** If refresh token is not expired, re-assign new access token and refresh token */ 32 | async refreshTokens(refreshToken: string) { 33 | // let decodedRefreshToken: RefreshTokenPayload; 34 | // let user: UserResponse; 35 | 36 | const decodedRefreshToken = verify( 37 | refreshToken, 38 | process.env.REFRESH_TOKEN_SECRET, 39 | ); 40 | const user = await this.userService.findOneById(decodedRefreshToken.userId); 41 | 42 | // If user is not found or the refresh token version doesn't match, throw error 43 | if (!user || user.tokenVersion !== decodedRefreshToken.tokenVersion) { 44 | throw new Error('Please register or sign in.'); 45 | } 46 | 47 | const { id, role, tokenVersion } = user; 48 | 49 | const tokens = await this.assignTokens(id, role, tokenVersion); 50 | return { 51 | user, 52 | ...tokens, 53 | }; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/decorator/roles.decorator.ts: -------------------------------------------------------------------------------- 1 | import { SetMetadata } from '@nestjs/common'; 2 | 3 | export const Roles = (...roles: string[]) => SetMetadata('roles', roles); 4 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/dto/loginUser.dto.ts: -------------------------------------------------------------------------------- 1 | export class LoginUserDto { 2 | email: string; 3 | password: string; 4 | } 5 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/dto/registerUser.dto.ts: -------------------------------------------------------------------------------- 1 | import { UserRole } from '../../user/user.entity'; 2 | 3 | export class RegisterUserDto { 4 | firstName: string; 5 | lastName: string; 6 | email: string; 7 | password: string; 8 | role: UserRole; 9 | } 10 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/guard/role.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; 2 | import { Reflector } from '@nestjs/core'; 3 | 4 | const matchRoles = (roles, userRoles) => { 5 | return roles.some(role => role === userRoles); 6 | }; 7 | 8 | @Injectable() 9 | export class RolesGuard implements CanActivate { 10 | constructor(private reflector: Reflector) {} 11 | 12 | canActivate(context: ExecutionContext): boolean { 13 | const roles = this.reflector.get('roles', context.getHandler()); 14 | if (!roles) { 15 | return true; 16 | } 17 | const req = context.switchToHttp().getRequest() as any; 18 | const user = req.user; 19 | return matchRoles(roles, user.role); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/interceptor/cookie.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Injectable, 3 | NestInterceptor, 4 | ExecutionContext, 5 | CallHandler, 6 | } from '@nestjs/common'; 7 | import { Observable } from 'rxjs'; 8 | import { map } from 'rxjs/operators'; 9 | 10 | /** Set refreshToken to cookie and remove refreshToken from payload */ 11 | @Injectable() 12 | export class CookieInterceptor implements NestInterceptor { 13 | intercept(context: ExecutionContext, next: CallHandler): Observable { 14 | return next.handle().pipe( 15 | map(data => { 16 | const res = context.switchToHttp().getResponse(); 17 | const { accessToken, refreshToken } = data; 18 | 19 | res.cookie('refreshToken', refreshToken, { 20 | httpOnly: true, 21 | maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days - express accepts token maxAge in ms, therefore multiply by 1000 22 | path: '/api/auth/refresh-token', // attach the refreshToken only to this endpoint 23 | }); 24 | 25 | return { accessToken }; 26 | }), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/middleware/auth.middleware.ts: -------------------------------------------------------------------------------- 1 | import { verify } from 'jsonwebtoken'; 2 | import { NestMiddleware, Injectable, ForbiddenException } from '@nestjs/common'; 3 | import { Request, Response } from 'express'; 4 | import { UserService } from 'src/module/user/user.service'; 5 | import { AccessTokenPayload } from '../type/jwtPayload'; 6 | 7 | /** The AuthMiddleware is used to 8 | * (1) read the request header bearer token/user access token 9 | * (2) decrypt the access token to get the user object 10 | */ 11 | @Injectable() 12 | export class AuthMiddleware implements NestMiddleware { 13 | constructor(private readonly userService: UserService) {} 14 | 15 | async use(req: Request | any, res: Response, next: () => void) { 16 | const bearerHeader = req.headers.authorization; 17 | const accessToken = bearerHeader && bearerHeader.split(' ')[1]; 18 | let user; 19 | 20 | if (!bearerHeader || !accessToken) { 21 | return next(); 22 | } 23 | 24 | try { 25 | const { userId: id, role }: AccessTokenPayload = verify( 26 | accessToken, 27 | process.env.ACCESS_TOKEN_SECRET, 28 | ); 29 | user = await this.userService.findOneById(id); 30 | } catch (error) { 31 | throw new ForbiddenException('Please register or sign in.'); 32 | } 33 | 34 | if (user) { 35 | req.user = user; 36 | } 37 | next(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/type/jwtPayload.ts: -------------------------------------------------------------------------------- 1 | import { User, UserRole } from 'src/module/user/user.entity'; 2 | 3 | export interface AccessTokenPayload { 4 | userId: number; 5 | role: UserRole; 6 | } 7 | 8 | export interface RefreshTokenPayload { 9 | userId: number; 10 | tokenVersion: number; 11 | } 12 | -------------------------------------------------------------------------------- /nestjs/src/module/auth/type/loginResponse.ts: -------------------------------------------------------------------------------- 1 | export interface LoginResponse { 2 | accessToken: string; 3 | refreshToken?: string; 4 | } 5 | -------------------------------------------------------------------------------- /nestjs/src/module/product/dto/createProduct.dto.ts: -------------------------------------------------------------------------------- 1 | export class CreateProductDto { 2 | title: string; 3 | description: string; 4 | price: number; 5 | count: number; 6 | } 7 | -------------------------------------------------------------------------------- /nestjs/src/module/product/dto/updateProduct.dto.ts: -------------------------------------------------------------------------------- 1 | export class UpdateProductDto { 2 | id: string; 3 | title: string; 4 | description: string; 5 | price: number; 6 | count: number; 7 | } 8 | -------------------------------------------------------------------------------- /nestjs/src/module/product/product.controller.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Controller, 3 | Get, 4 | Param, 5 | NotFoundException, 6 | Body, 7 | Post, 8 | Delete, 9 | Put, 10 | BadRequestException, 11 | SetMetadata, 12 | Req, 13 | } from '@nestjs/common'; 14 | import { ProductService } from './product.service'; 15 | import { Product } from './product.entity'; 16 | import { CreateProductDto } from './dto/createProduct.dto'; 17 | import { UpdateProductDto } from './dto/updateProduct.dto'; 18 | import { Roles } from '../auth/decorator/roles.decorator'; 19 | 20 | @Controller('/api/products') 21 | export class ProductController { 22 | constructor(private readonly productService: ProductService) {} 23 | 24 | @Get() 25 | async findAll(): Promise { 26 | try { 27 | return await this.productService.findAll(); 28 | } catch (error) { 29 | throw new NotFoundException(`Cannot find products`); 30 | } 31 | } 32 | 33 | @Get(':id') 34 | async findProductById(@Param() params): Promise { 35 | const { id } = params; 36 | try { 37 | return await this.productService.findById(id); 38 | } catch (error) { 39 | throw new NotFoundException(`Cannot find product #${id}`); 40 | } 41 | } 42 | 43 | @Post() 44 | @Roles('admin', 'manager') 45 | async create(@Body() createProductDto: CreateProductDto): Promise { 46 | try { 47 | return await this.productService.create(createProductDto); 48 | } catch (error) { 49 | throw new BadRequestException(`Failed to create product`); 50 | } 51 | } 52 | 53 | @Put() 54 | @Roles('admin', 'manager') 55 | async update(@Body() product: UpdateProductDto): Promise { 56 | try { 57 | return await this.productService.update(product); 58 | } catch (error) { 59 | throw new BadRequestException(`Failed to update product`); 60 | } 61 | } 62 | 63 | @Delete(':id') 64 | @Roles('admin') 65 | async deleteProductById(@Param() params): Promise { 66 | const { id } = params; 67 | try { 68 | return await this.productService.removeById(id); 69 | } catch (error) { 70 | throw new BadRequestException(`Failed to remove product #${id}`); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /nestjs/src/module/product/product.entity.ts: -------------------------------------------------------------------------------- 1 | import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; 2 | 3 | @Entity({ name: 'product' }) 4 | export class Product { 5 | @PrimaryGeneratedColumn('uuid') 6 | id: string; 7 | 8 | @Column('varchar', { length: 100 }) 9 | title: string; 10 | 11 | @Column('varchar', { length: 500 }) 12 | description: string; 13 | 14 | // precision represents total length of value including decimal places 15 | // scale represents the number of digits after decimal point 16 | @Column('decimal', { precision: 13, scale: 2, default: 0 }) 17 | price: number; 18 | 19 | // integer between -8388608 and 8388607 20 | @Column('mediumint') 21 | count: number; 22 | } 23 | -------------------------------------------------------------------------------- /nestjs/src/module/product/product.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { ProductController } from './product.controller'; 3 | import { ProductService } from './product.service'; 4 | import { TypeOrmModule } from '@nestjs/typeorm'; 5 | import { Product } from './product.entity'; 6 | import { ProductRepository } from './product.repository'; 7 | 8 | @Module({ 9 | imports: [TypeOrmModule.forFeature([Product, ProductRepository])], 10 | providers: [ProductService], 11 | controllers: [ProductController], 12 | exports: [ProductService], 13 | }) 14 | export class ProductModule {} 15 | -------------------------------------------------------------------------------- /nestjs/src/module/product/product.repository.ts: -------------------------------------------------------------------------------- 1 | import { Product } from './product.entity'; 2 | import { EntityRepository, Repository } from 'typeorm'; 3 | 4 | @EntityRepository(Product) 5 | export class ProductRepository extends Repository {} 6 | -------------------------------------------------------------------------------- /nestjs/src/module/product/product.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { InjectRepository } from '@nestjs/typeorm'; 3 | import { ProductRepository } from './product.repository'; 4 | import { Product } from './product.entity'; 5 | import { CreateProductDto } from './dto/createProduct.dto'; 6 | import { UpdateProductDto } from './dto/updateProduct.dto'; 7 | 8 | @Injectable() 9 | export class ProductService { 10 | constructor( 11 | @InjectRepository(ProductRepository) 12 | private readonly productRepository: ProductRepository, 13 | ) {} 14 | 15 | async findAll(): Promise { 16 | return await this.productRepository.find(); 17 | } 18 | 19 | async findById(id: string): Promise { 20 | return await this.productRepository.findOne(id); 21 | } 22 | 23 | async create(product: CreateProductDto): Promise { 24 | const newProduct = await this.productRepository.create(product); 25 | return await this.productRepository.save(newProduct); 26 | } 27 | 28 | async update(product: UpdateProductDto): Promise { 29 | const { id } = product; 30 | const productToUpdate = await this.productRepository.findOne(id); 31 | return await this.productRepository.save({ 32 | ...productToUpdate, 33 | ...product, 34 | }); 35 | } 36 | 37 | async removeById(id: string): Promise { 38 | const product = await this.productRepository.findOne(id); 39 | return await this.productRepository.remove(product); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /nestjs/src/module/user/type/userResponse.ts: -------------------------------------------------------------------------------- 1 | import { User } from '../user.entity'; 2 | 3 | export type UserResponse = Omit; 4 | -------------------------------------------------------------------------------- /nestjs/src/module/user/user.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, NotFoundException, Param } from '@nestjs/common'; 2 | import { UserService } from './user.service'; 3 | import { User } from './user.entity'; 4 | import { UserResponse } from './type/userResponse'; 5 | import { Roles } from '../auth/decorator/roles.decorator'; 6 | 7 | @Controller('/api/users') 8 | export class UserController { 9 | constructor(private readonly userService: UserService) {} 10 | 11 | @Get() 12 | @Roles('admin', 'manager') 13 | async findAll(): Promise { 14 | try { 15 | return await this.userService.findAll(); 16 | } catch (error) { 17 | throw new NotFoundException(`Cannot find products`); 18 | } 19 | } 20 | 21 | @Get(':id') 22 | @Roles('admin', 'manager', 'customer') 23 | async findUserById(@Param('id') userId: string): Promise { 24 | const id = parseInt(userId, 10); 25 | try { 26 | return await this.userService.findOneById(id); 27 | } catch (error) { 28 | throw new NotFoundException(`Cannot find user #${id}`); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /nestjs/src/module/user/user.entity.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Entity, 3 | Column, 4 | PrimaryGeneratedColumn, 5 | CreateDateColumn, 6 | } from 'typeorm'; 7 | 8 | export enum UserRole { 9 | ADMIN = 'admin', 10 | MANAGER = 'manager', 11 | CUSTOMER = 'customer', 12 | GUEST = 'guest', 13 | } 14 | 15 | @Entity({ name: 'user' }) 16 | export class User { 17 | @PrimaryGeneratedColumn() 18 | id: number; 19 | 20 | @Column() 21 | firstName: string; 22 | 23 | @Column() 24 | lastName: string; 25 | 26 | @Column({ unique: true, length: 255 }) 27 | email: string; 28 | 29 | @Column({ 30 | type: 'enum', 31 | enum: UserRole, 32 | default: UserRole.GUEST, 33 | }) 34 | role: UserRole; 35 | 36 | @CreateDateColumn({ name: 'created_at', select: false }) 37 | createdAt: Date; 38 | 39 | @CreateDateColumn({ name: 'updated_at', select: false }) 40 | updatedAt: Date; 41 | 42 | @Column({ select: false }) 43 | password: string; 44 | 45 | @Column({ 46 | default: 0, 47 | }) 48 | tokenVersion: number; 49 | } 50 | -------------------------------------------------------------------------------- /nestjs/src/module/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, forwardRef } from '@nestjs/common'; 2 | import { UserController } from './user.controller'; 3 | import { UserService } from './user.service'; 4 | import { TypeOrmModule } from '@nestjs/typeorm'; 5 | import { User } from './user.entity'; 6 | import { UserRepository } from './user.repository'; 7 | import { AuthModule } from '../auth/auth.module'; 8 | import { AuthService } from '../auth/auth.service'; 9 | 10 | @Module({ 11 | imports: [ 12 | TypeOrmModule.forFeature([User, UserRepository]), 13 | forwardRef(() => AuthModule), 14 | ], 15 | providers: [UserService, AuthService], 16 | controllers: [UserController], 17 | exports: [UserService], 18 | }) 19 | export class UserModule {} 20 | -------------------------------------------------------------------------------- /nestjs/src/module/user/user.repository.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user.entity'; 2 | import { EntityRepository, Repository } from 'typeorm'; 3 | 4 | @EntityRepository(User) 5 | export class UserRepository extends Repository {} 6 | -------------------------------------------------------------------------------- /nestjs/src/module/user/user.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { InjectRepository } from '@nestjs/typeorm'; 3 | import { User } from './user.entity'; 4 | import { UserRepository } from './user.repository'; 5 | import { RegisterUserDto } from '../auth/dto/registerUser.dto'; 6 | import { UserResponse } from './type/userResponse'; 7 | 8 | @Injectable() 9 | export class UserService { 10 | constructor( 11 | @InjectRepository(UserRepository) 12 | private readonly userRepository: UserRepository, 13 | ) {} 14 | 15 | async findAll(): Promise { 16 | return await this.userRepository.find(); 17 | } 18 | 19 | async findOneByEmail(email: string): Promise { 20 | return await this.userRepository.findOne({ 21 | where: { email }, 22 | }); 23 | } 24 | 25 | async findUserWithPassword(email: string): Promise { 26 | return await this.userRepository.findOne({ 27 | select: [ 28 | 'id', 29 | 'firstName', 30 | 'lastName', 31 | 'email', 32 | 'role', 33 | 'tokenVersion', 34 | 'password', 35 | ], 36 | where: { email }, 37 | }); 38 | } 39 | 40 | async findOneById(id: number): Promise { 41 | return await this.userRepository.findOne({ 42 | where: { id }, 43 | }); 44 | } 45 | 46 | async create(user: RegisterUserDto): Promise { 47 | const newUser = await this.userRepository.create(user); 48 | await this.userRepository.save(newUser); 49 | const { password, createdAt, updatedAt, ...userResult } = newUser; 50 | return userResult; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /nestjs/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from '../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /nestjs/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /nestjs/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /nestjs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "target": "es2017", 9 | "sourceMap": true, 10 | "outDir": "./dist", 11 | "baseUrl": "./", 12 | "incremental": true 13 | }, 14 | "exclude": ["node_modules", "dist"] 15 | } 16 | -------------------------------------------------------------------------------- /nestjs/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "quotemark": [true, "single"], 9 | "member-access": [false], 10 | "ordered-imports": [false], 11 | "max-line-length": [true, 150], 12 | "member-ordering": [false], 13 | "interface-name": [false], 14 | "arrow-parens": false, 15 | "object-literal-sort-keys": false 16 | }, 17 | "rulesDirectory": [] 18 | } 19 | --------------------------------------------------------------------------------