From 5bbb650acdfed6962bb45e4c7f48e5b0022c170b Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 00:08:04 +0700 Subject: [PATCH 001/135] add: import product in app module --- src/app.module.ts | 4 +++- src/main.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 94340fc..25df6d3 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -6,8 +6,9 @@ import { UsersModule } from './users/users.module'; import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; import { LoggerModule } from 'nestjs-pino'; import { TransactionModule } from './transaction/transaction.module'; -import configuration from './config/configuration'; +import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; +import configuration from './config/configuration'; @Module({ imports: [ @@ -49,6 +50,7 @@ import { ConfigurableModule } from './configurable/configurable.module'; UsersModule, TransactionModule, ConfigurableModule, + // ProductModule, ], }) export class AppModule {} diff --git a/src/main.ts b/src/main.ts index 1bb8975..f8a3c67 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { NestFastifyApplication, } from '@nestjs/platform-fastify'; import { AppModule } from './app.module'; -import {ValidationPipe, VersioningType} from '@nestjs/common'; +import { ValidationPipe, VersioningType} from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Logger } from 'nestjs-pino'; From 2b5abc7689a834b183357ac9cdab7888ec7715e8 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 09:12:52 +0700 Subject: [PATCH 002/135] add: progress authentication --- package.json | 3 ++ src/app.module.ts | 2 + src/auth/dto/input-login.dto.ts | 9 +++++ src/auth/dto/response-login.dto.ts | 9 +++++ src/configurable/configurable.controller.ts | 6 +-- src/configurable/configurable.service.ts | 10 ++++- src/helper/hash_password.ts | 10 +++++ src/helper/jwt.strategy.ts | 22 +++++++++++ .../entities/coa.entity.ts | 10 ++--- .../entities/transaction.entity.ts | 39 ++++++++++++++++++- .../entities/transaction_journal.entity.ts | 36 +++++++++++++++++ src/users/entities/user.entity.ts | 38 +++++------------- 12 files changed, 154 insertions(+), 40 deletions(-) create mode 100644 src/auth/dto/input-login.dto.ts create mode 100644 src/auth/dto/response-login.dto.ts create mode 100644 src/helper/hash_password.ts create mode 100644 src/helper/jwt.strategy.ts rename src/{ledger => transaction}/entities/coa.entity.ts (81%) create mode 100644 src/transaction/entities/transaction_journal.entity.ts diff --git a/package.json b/package.json index 637bced..105e35a 100644 --- a/package.json +++ b/package.json @@ -25,13 +25,16 @@ "@nestjs/config": "^1.0.1", "@nestjs/core": "^8.0.0", "@nestjs/mapped-types": "*", + "@nestjs/passport": "^8.0.1", "@nestjs/platform-express": "^8.0.0", "@nestjs/platform-fastify": "^8.0.8", "@nestjs/typeorm": "^8.0.2", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", + "crypto": "^1.0.1", "joi": "^17.4.2", "nestjs-pino": "^2.3.1", + "passport-jwt": "^4.0.0", "pg": "^8.7.1", "pino-http": "^6.3.0", "reflect-metadata": "^0.1.13", diff --git a/src/app.module.ts b/src/app.module.ts index 25df6d3..3bc5761 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,6 +8,7 @@ import { LoggerModule } from 'nestjs-pino'; import { TransactionModule } from './transaction/transaction.module'; import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; +import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; @Module({ @@ -50,6 +51,7 @@ import configuration from './config/configuration'; UsersModule, TransactionModule, ConfigurableModule, + AuthModule, // ProductModule, ], }) diff --git a/src/auth/dto/input-login.dto.ts b/src/auth/dto/input-login.dto.ts new file mode 100644 index 0000000..813ba07 --- /dev/null +++ b/src/auth/dto/input-login.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class InputLoginDto { + @IsNotEmpty() + username: string; + + @IsNotEmpty() + password: string; +} diff --git a/src/auth/dto/response-login.dto.ts b/src/auth/dto/response-login.dto.ts new file mode 100644 index 0000000..3132636 --- /dev/null +++ b/src/auth/dto/response-login.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class ResponseLoginDto { + @IsNotEmpty() + username: string; + + @IsNotEmpty() + jwt: string; +} diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index d1c99e6..21d4c01 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -7,7 +7,7 @@ import { Param, Delete, ParseUUIDPipe, - HttpStatus, + HttpStatus, Query, } from '@nestjs/common'; import { ConfigurableService } from './configurable.service'; @@ -19,8 +19,8 @@ export class ConfigurableController { constructor(private readonly usersService: ConfigurableService) {} @Get() - async findAll() { - const [data, count] = await this.usersService.findAll(); + async findAll(@Query('page') page: number) { + const [data, count] = await this.usersService.findAllRoles(page); return { data, diff --git a/src/configurable/configurable.service.ts b/src/configurable/configurable.service.ts index 5236a1b..109c824 100644 --- a/src/configurable/configurable.service.ts +++ b/src/configurable/configurable.service.ts @@ -10,8 +10,14 @@ export class ConfigurableService { private rolesRepository: Repository, ) {} - findAll() { - return this.rolesRepository.findAndCount(); + findAllRoles(page) { + return this.rolesRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); } async findOne(id: string) { diff --git a/src/helper/hash_password.ts b/src/helper/hash_password.ts new file mode 100644 index 0000000..1575fd6 --- /dev/null +++ b/src/helper/hash_password.ts @@ -0,0 +1,10 @@ +import * as crypto from 'crypto'; + +export function hashPassword(password, salt): Promise { + return new Promise((resolve, reject) => { + crypto.pbkdf2(password, salt, 50, 100, 'sha512', (err, values) => { + if (err) return reject(err); + resolve(values.toString('hex')); + }); + }); +} diff --git a/src/helper/jwt.strategy.ts b/src/helper/jwt.strategy.ts new file mode 100644 index 0000000..c5d278e --- /dev/null +++ b/src/helper/jwt.strategy.ts @@ -0,0 +1,22 @@ +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { Injectable } from '@nestjs/common'; +import { AuthService } from '../auth/auth.service'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor(private readonly authService: AuthService) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: process.env.SECRETKEY, + }); + } + + async validate(payload: JwtPayload): Promise { + const user = await this.authService.validateUser(payload); + if (!user) { + throw new HttpException('Invalid token', HttpStatus.UNAUTHORIZED); + } + return user; + } +} \ No newline at end of file diff --git a/src/ledger/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts similarity index 81% rename from src/ledger/entities/coa.entity.ts rename to src/transaction/entities/coa.entity.ts index a4dbaa0..cd95f70 100644 --- a/src/ledger/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -5,7 +5,10 @@ import { UpdateDateColumn, DeleteDateColumn, VersionColumn, - CreateDateColumn, ManyToOne, ManyToMany, JoinTable, + CreateDateColumn, + ManyToOne, + ManyToMany, + JoinTable, } from 'typeorm'; import { Product } from '../../product/entities/product.entity'; import { User } from '../../users/entities/user.entity'; @@ -22,10 +25,7 @@ enum balanceType { } @Entity() -export class Roles extends BaseModel{ - @PrimaryGeneratedColumn('uuid') - id: string; - +export class COA extends BaseModel { @Column() name: string; diff --git a/src/transaction/entities/transaction.entity.ts b/src/transaction/entities/transaction.entity.ts index 9d16154..4cf5e85 100644 --- a/src/transaction/entities/transaction.entity.ts +++ b/src/transaction/entities/transaction.entity.ts @@ -1 +1,38 @@ -export class Transaction {} +import { + Entity, + Column, + PrimaryGeneratedColumn, + UpdateDateColumn, + DeleteDateColumn, + VersionColumn, + CreateDateColumn, + ManyToOne, + ManyToMany, + JoinTable, +} from 'typeorm'; +import { Product } from '../../product/entities/product.entity'; +import { User } from '../../users/entities/user.entity'; +import { BaseModel } from '../../config/basemodel.entity'; +import { COA } from './coa.entity'; +import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; + +enum status { + PENDING, + SUCCESS, + FAILED, +} + +@Entity() +export class Transaction extends BaseModel { + @Column() + amount: number; + + @Column() + status: status; + + @ManyToOne(() => User, (user) => user.id) + user: User; + + @ManyToOne(() => ProductHistoryPrice, (productHistory) => productHistory.id) + product: ProductHistoryPrice; +} diff --git a/src/transaction/entities/transaction_journal.entity.ts b/src/transaction/entities/transaction_journal.entity.ts new file mode 100644 index 0000000..1333950 --- /dev/null +++ b/src/transaction/entities/transaction_journal.entity.ts @@ -0,0 +1,36 @@ +import { + Entity, + Column, + PrimaryGeneratedColumn, + UpdateDateColumn, + DeleteDateColumn, + VersionColumn, + CreateDateColumn, ManyToOne, ManyToMany, JoinTable, +} from 'typeorm'; +import { Product } from '../../product/entities/product.entity'; +import { User } from '../../users/entities/user.entity'; +import { BaseModel } from '../../config/basemodel.entity'; +import { ProductCategories } from '../../product/entities/product-category.entity'; +import { COA } from './coa.entity'; + +enum type { + SYSTEM_BANk, + INCOME, +} + +enum balanceType { + DEBIT, + CREDIT, +} + +@Entity() +export class TransactionJournal extends BaseModel { + @Column('text') + type: type; + + @Column() + amount: number; + + @ManyToOne(() => COA, (coa) => coa.id) + coa: COA; +} diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 417e96f..723e4a9 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,45 +1,25 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, + PrimaryGeneratedColumn, BeforeInsert, } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { hashPassword } from '../../helper/hash_password'; @Entity() -export class User { +export class User extends BaseModel { @PrimaryGeneratedColumn('uuid') id: string; @Column() - firstName: string; + username: string; @Column() - lastName: string; + password: string; + + @Column() + salt: string; @Column({ default: true }) isActive: boolean; - - @CreateDateColumn({ - type: 'timestamp with time zone', - nullable: false, - }) - createdAt: Date; - - @UpdateDateColumn({ - type: 'timestamp with time zone', - nullable: false, - }) - updatedAt: Date; - - @DeleteDateColumn({ - type: 'timestamp with time zone', - nullable: true, - }) - deletedAt: Date; - - @VersionColumn() - version: number; } From 74711e08233f8473345a33da3a1e7eeb0a62ef23 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Mon, 6 Dec 2021 05:07:07 +0700 Subject: [PATCH 003/135] fix user --- src/app.module.ts | 8 +++---- src/helper/jwt.strategy.ts | 40 ++++++++++++++++---------------- src/users/dto/create-user.dto.ts | 4 ++-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 3bc5761..23cd81c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,7 +8,7 @@ import { LoggerModule } from 'nestjs-pino'; import { TransactionModule } from './transaction/transaction.module'; import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; -import { AuthModule } from './auth/auth.module'; +// import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; @Module({ @@ -48,11 +48,11 @@ import configuration from './config/configuration'; }, inject: [ConfigService], }), - UsersModule, + // UsersModule, TransactionModule, ConfigurableModule, - AuthModule, - // ProductModule, + // AuthModule, + ProductModule, ], }) export class AppModule {} diff --git a/src/helper/jwt.strategy.ts b/src/helper/jwt.strategy.ts index c5d278e..2ec61b2 100644 --- a/src/helper/jwt.strategy.ts +++ b/src/helper/jwt.strategy.ts @@ -1,22 +1,22 @@ -import { PassportStrategy } from '@nestjs/passport'; -import { ExtractJwt, Strategy } from 'passport-jwt'; -import { Injectable } from '@nestjs/common'; -import { AuthService } from '../auth/auth.service'; +// import { PassportStrategy } from '@nestjs/passport'; +// import { ExtractJwt, Strategy } from 'passport-jwt'; +// import { Injectable } from '@nestjs/common'; +// import { AuthService } from '../auth/auth.service'; -@Injectable() -export class JwtStrategy extends PassportStrategy(Strategy) { - constructor(private readonly authService: AuthService) { - super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - secretOrKey: process.env.SECRETKEY, - }); - } +// @Injectable() +// export class JwtStrategy extends PassportStrategy(Strategy) { +// constructor(private readonly authService: AuthService) { +// super({ +// jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), +// secretOrKey: process.env.SECRETKEY, +// }); +// } - async validate(payload: JwtPayload): Promise { - const user = await this.authService.validateUser(payload); - if (!user) { - throw new HttpException('Invalid token', HttpStatus.UNAUTHORIZED); - } - return user; - } -} \ No newline at end of file +// async validate(payload: JwtPayload): Promise { +// const user = await this.authService.validateUser(payload); +// if (!user) { +// throw new HttpException('Invalid token', HttpStatus.UNAUTHORIZED); +// } +// return user; +// } +// } \ No newline at end of file diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 8b676ac..f6c8301 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -2,8 +2,8 @@ import { IsNotEmpty } from 'class-validator'; export class CreateUserDto { @IsNotEmpty() - firstName: string; + username: string; @IsNotEmpty() - lastName: string; + password: string; } From 5a401ec8629f32a99c04f0b096d50744680ae78b Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Mon, 6 Dec 2021 13:21:09 +0700 Subject: [PATCH 004/135] fix: register entities in module --- src/product/product.module.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/product/product.module.ts b/src/product/product.module.ts index 58e4c5a..139d849 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -2,8 +2,21 @@ import { Module } from '@nestjs/common'; import { ProductService } from './product.service'; import { ProductController } from './product.controller'; import { ProductCategoriesService } from './product-categories.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Product } from './entities/product.entity'; +import { ProductCategories } from './entities/product-category.entity'; +import { ProductHistoryPrice } from './entities/product-history-price.entity'; +import { ProductSubCategories } from './entities/product-sub-category.entity'; @Module({ + imports: [ + TypeOrmModule.forFeature([ + Product, + ProductCategories, + ProductHistoryPrice, + ProductSubCategories, + ]), + ], controllers: [ProductController], providers: [ProductService, ProductCategoriesService], }) From 659c7e4de8747f4b14f518b7b584eac489c9e1cd Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Mon, 6 Dec 2021 22:09:24 +0700 Subject: [PATCH 005/135] feat(wip): login --- package.json | 3 + src/app.module.ts | 11 ++- src/auth/auth.controller.spec.ts | 18 ++++ src/auth/auth.controller.ts | 11 +++ src/auth/auth.module.ts | 13 +++ src/auth/auth.service.spec.ts | 18 ++++ src/auth/auth.service.ts | 25 +++++ src/auth/local-auth.guard.ts | 5 + src/auth/local.strategy.ts | 28 ++++++ src/helper/hash_password.ts | 5 +- src/users/users.module.ts | 1 + src/users/users.service.ts | 17 +++- yarn.lock | 159 ++++++++++++++++++++++++++++++- 13 files changed, 306 insertions(+), 8 deletions(-) create mode 100644 src/auth/auth.controller.spec.ts create mode 100644 src/auth/auth.controller.ts create mode 100644 src/auth/auth.module.ts create mode 100644 src/auth/auth.service.spec.ts create mode 100644 src/auth/auth.service.ts create mode 100644 src/auth/local-auth.guard.ts create mode 100644 src/auth/local.strategy.ts diff --git a/package.json b/package.json index 105e35a..264ca45 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,9 @@ "crypto": "^1.0.1", "joi": "^17.4.2", "nestjs-pino": "^2.3.1", + "passport": "^0.5.0", "passport-jwt": "^4.0.0", + "passport-local": "^1.0.0", "pg": "^8.7.1", "pino-http": "^6.3.0", "reflect-metadata": "^0.1.13", @@ -50,6 +52,7 @@ "@types/express": "^4.17.13", "@types/jest": "^27.0.1", "@types/node": "^16.0.0", + "@types/passport-local": "^1.0.34", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^4.28.2", "@typescript-eslint/parser": "^4.28.2", diff --git a/src/app.module.ts b/src/app.module.ts index 23cd81c..a3b7114 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,6 +9,7 @@ import { TransactionModule } from './transaction/transaction.module'; import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; // import { AuthModule } from './auth/auth.module'; +import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; @Module({ @@ -48,11 +49,11 @@ import configuration from './config/configuration'; }, inject: [ConfigService], }), - // UsersModule, - TransactionModule, - ConfigurableModule, - // AuthModule, - ProductModule, + UsersModule, + // TransactionModule, + // ConfigurableModule, + // ProductModule, + AuthModule, ], }) export class AppModule {} diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts new file mode 100644 index 0000000..27a31e6 --- /dev/null +++ b/src/auth/auth.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AuthController } from './auth.controller'; + +describe('AuthController', () => { + let controller: AuthController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [AuthController], + }).compile(); + + controller = module.get(AuthController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts new file mode 100644 index 0000000..605fe1d --- /dev/null +++ b/src/auth/auth.controller.ts @@ -0,0 +1,11 @@ +import { Controller, Request, Post, UseGuards } from '@nestjs/common'; +import { LocalAuthGuard } from './local-auth.guard'; + +@Controller('auth') +export class AuthController { + @UseGuards(LocalAuthGuard) + @Post('login') + async login(@Request() req) { + return req.user; + } +} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts new file mode 100644 index 0000000..8d2d164 --- /dev/null +++ b/src/auth/auth.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { UsersModule } from '../users/users.module'; +import { PassportModule } from '@nestjs/passport'; +import { LocalStrategy } from './local.strategy'; +import { AuthController } from './auth.controller'; + +@Module({ + imports: [UsersModule, PassportModule], + providers: [AuthService, LocalStrategy], + controllers: [AuthController], +}) +export class AuthModule {} diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts new file mode 100644 index 0000000..800ab66 --- /dev/null +++ b/src/auth/auth.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [AuthService], + }).compile(); + + service = module.get(AuthService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts new file mode 100644 index 0000000..b8f30dc --- /dev/null +++ b/src/auth/auth.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@nestjs/common'; +import { UsersService } from '../users/users.service'; +import { InputLoginDto } from './dto/input-login.dto'; +import { hashPassword } from '../helper/hash_password'; +import { User } from '../users/entities/user.entity'; + +@Injectable() +export class AuthService { + constructor(private readonly usersService: UsersService) {} + + async validateUser({ + username, + password, + }: InputLoginDto): Promise> { + const user = await this.usersService.findOne(username); + + if (user && user.password === (await hashPassword(password, user.salt))) { + const { password, ...result } = user; + + return result; + } + + return null; + } +} diff --git a/src/auth/local-auth.guard.ts b/src/auth/local-auth.guard.ts new file mode 100644 index 0000000..ccf962b --- /dev/null +++ b/src/auth/local-auth.guard.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class LocalAuthGuard extends AuthGuard('local') {} diff --git a/src/auth/local.strategy.ts b/src/auth/local.strategy.ts new file mode 100644 index 0000000..9ab2e6f --- /dev/null +++ b/src/auth/local.strategy.ts @@ -0,0 +1,28 @@ +import { Strategy } from 'passport-local'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { User } from '../users/entities/user.entity'; + +@Injectable() +export class LocalStrategy extends PassportStrategy(Strategy) { + constructor(private authService: AuthService) { + super(); + } + + async validate( + username: string, + password: string, + ): Promise> { + const user = await this.authService.validateUser({ + username, + password, + }); + + if (!user) { + throw new UnauthorizedException(); + } + + return user; + } +} diff --git a/src/helper/hash_password.ts b/src/helper/hash_password.ts index 1575fd6..4a11e04 100644 --- a/src/helper/hash_password.ts +++ b/src/helper/hash_password.ts @@ -3,7 +3,10 @@ import * as crypto from 'crypto'; export function hashPassword(password, salt): Promise { return new Promise((resolve, reject) => { crypto.pbkdf2(password, salt, 50, 100, 'sha512', (err, values) => { - if (err) return reject(err); + if (err) { + return reject(err); + } + resolve(values.toString('hex')); }); }); diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 1c38291..9dfa3d2 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -8,5 +8,6 @@ import { User } from './entities/user.entity'; imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService], + exports: [UsersService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 0ea0727..3babecd 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -4,6 +4,8 @@ import { UpdateUserDto } from './dto/update-user.dto'; import { EntityNotFoundError, Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; +import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; +import { hashPassword } from '../helper/hash_password'; @Injectable() export class UsersService { @@ -13,7 +15,12 @@ export class UsersService { ) {} async create(createUserDto: CreateUserDto) { - const result = await this.usersRepository.insert(createUserDto); + const salt = randomStringGenerator(); + const result = await this.usersRepository.insert({ + username: createUserDto.username, + password: await hashPassword(createUserDto.password, salt), + salt, + }); return this.usersRepository.findOneOrFail(result.identifiers[0].id); } @@ -81,4 +88,12 @@ export class UsersService { await this.usersRepository.delete(id); } + + async findOneByUsername(username: string) { + return this.usersRepository.findOneOrFail({ + where: { + username, + }, + }); + } } diff --git a/yarn.lock b/yarn.lock index 80c017f..5581f74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -680,6 +680,11 @@ resolved "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.0.tgz" integrity sha512-26AW5jHadLXtvHs+M+Agd9KZ92dDlBrmD0rORlBlvn2KvsWs4JRaKl2mUsrW7YsdZeAu3Hc4ukqyYyDdyCmMWQ== +"@nestjs/passport@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-8.0.1.tgz#f1ed39a19489f794d1fe3fef592b4523bc48da68" + integrity sha512-vn/ZJLXQKvSf9D0BvEoNFJLfzl9AVqfGtDyQMfWDLbaNpoEB2FyeaHGxdiX6H71oLSrQV78c/yuhfantzwdjdg== + "@nestjs/platform-express@^8.0.0": version "8.2.3" resolved "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.2.3.tgz" @@ -904,7 +909,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@^4.17.13": +"@types/express@*", "@types/express@^4.17.13": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -973,6 +978,30 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/passport-local@^1.0.34": + version "1.0.34" + resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.34.tgz#84d3b35b2fd4d36295039ded17fe5f3eaa62f4f6" + integrity sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-strategy" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.7.tgz#85892f14932168158c86aecafd06b12f5439467a" + integrity sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw== + dependencies: + "@types/express" "*" + "@types/prettier@^2.1.5": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" @@ -1628,6 +1657,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -1996,6 +2030,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -2147,6 +2186,13 @@ duplexify@^4.1.2: readable-stream "^3.1.1" stream-shift "^1.0.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -3742,6 +3788,39 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonwebtoken@^8.2.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -3820,6 +3899,36 @@ lodash.has@4.5.2: resolved "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -3830,6 +3939,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash.set@4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz" @@ -4006,6 +4120,11 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multer@1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz" @@ -4266,6 +4385,34 @@ parseurl@~1.3.3: resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +passport-jwt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065" + integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg== + dependencies: + jsonwebtoken "^8.2.0" + passport-strategy "^1.0.0" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + integrity sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4= + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x, passport-strategy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= + +passport@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.0.tgz#7914aaa55844f9dce8c3aa28f7d6b73647ee0169" + integrity sha512-ln+ue5YaNDS+fes6O5PCzXKSseY5u8MYhX9H5Co4s+HfYI5oqvnHKoOORLYDUPh+8tHvrxugF2GFcUA1Q1Gqfg== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4306,6 +4453,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= + pg-connection-string@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz" @@ -4832,6 +4984,11 @@ semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" From 6622501b610878c0b298fbc319572074d08a6c6e Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 22:29:38 +0700 Subject: [PATCH 006/135] add: crud all product module --- .../dto/{ => product}/create-product.dto.ts | 0 src/product/dto/product/update-product.dto.ts | 4 + .../create-sub-categories-product.dto.ts | 3 + src/product/product-sub-categories.service.ts | 23 ++- src/product/product.controller.ts | 142 +++++++++++++++++- src/product/product.module.ts | 7 +- src/product/product.service.ts | 75 +++++++-- 7 files changed, 237 insertions(+), 17 deletions(-) rename src/product/dto/{ => product}/create-product.dto.ts (100%) create mode 100644 src/product/dto/product/update-product.dto.ts diff --git a/src/product/dto/create-product.dto.ts b/src/product/dto/product/create-product.dto.ts similarity index 100% rename from src/product/dto/create-product.dto.ts rename to src/product/dto/product/create-product.dto.ts diff --git a/src/product/dto/product/update-product.dto.ts b/src/product/dto/product/update-product.dto.ts new file mode 100644 index 0000000..e2d43fc --- /dev/null +++ b/src/product/dto/product/update-product.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateProductDto } from './create-product.dto'; + +export class UpdateProductDto extends PartialType(CreateProductDto) {} diff --git a/src/product/dto/sub-categories/create-sub-categories-product.dto.ts b/src/product/dto/sub-categories/create-sub-categories-product.dto.ts index 6fb097d..385db53 100644 --- a/src/product/dto/sub-categories/create-sub-categories-product.dto.ts +++ b/src/product/dto/sub-categories/create-sub-categories-product.dto.ts @@ -2,6 +2,9 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { CreateCategoriesProductDto } from '../categories/create-categories-product.dto'; export class CreateSubCategoriesProductDto extends CreateCategoriesProductDto { + @IsNotEmpty() + name: string; + @IsUUID() categoryId: string; } diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index 6674eb0..cd36294 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -4,19 +4,26 @@ import { ProductSubCategories } from './entities/product-sub-category.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; import { UpdateSubCategoriesProductDto } from './dto/sub-categories/update-sub-categories-product.dto'; +import { ProductCategoriesService } from './product-categories.service'; @Injectable() export class ProductSubCategoriesService { constructor( @InjectRepository(ProductSubCategories) private productSubCategoriesRepository: Repository, + private productCategoriesService: ProductCategoriesService, ) {} - async create(CreateCategoriesProductDto: CreateSubCategoriesProductDto) { - const result = await this.productSubCategoriesRepository.insert( - CreateCategoriesProductDto, + async create(createSubCategoriesProductDto: CreateSubCategoriesProductDto) { + const categories = await this.productCategoriesService.findOne( + createSubCategoriesProductDto.categoryId, ); + const result = await this.productSubCategoriesRepository.insert({ + name: createSubCategoriesProductDto.name, + category: categories, + }); + return this.productSubCategoriesRepository.findOneOrFail( result.identifiers[0].id, ); @@ -70,11 +77,15 @@ export class ProductSubCategoriesService { } } - const result = await this.productSubCategoriesRepository.update( - id, - updateCategoriesProductDto, + const categories = await this.productCategoriesService.findOne( + updateCategoriesProductDto.categoryId, ); + const result = await this.productSubCategoriesRepository.update(id, { + name: updateCategoriesProductDto.name, + category: categories, + }); + return this.productSubCategoriesRepository.findOneOrFail(id); } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index b00e6b2..2b20bde 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -7,11 +7,18 @@ import { Param, Delete, ParseUUIDPipe, - HttpStatus, Query, + HttpStatus, + Query, } from '@nestjs/common'; import { ProductService } from './product.service'; import { ProductCategoriesService } from './product-categories.service'; import { CreateCategoriesProductDto } from './dto/categories/create-categories-product.dto'; +import { UpdateCategoriesProductDto } from '../product/dto/categories/update-categories-product.dto'; +import { UpdateSubCategoriesProductDto } from '../product/dto/sub-categories/update-sub-categories-product.dto'; +import { ProductSubCategoriesService } from './product-sub-categories.service'; +import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; +import { CreateProductDto } from './dto/product/create-product.dto'; +import { UpdateProductDto } from './dto/product/update-product.dto'; @Controller({ path: 'product', @@ -21,8 +28,18 @@ export class ProductController { constructor( private readonly productService: ProductService, private readonly productCategoriesService: ProductCategoriesService, + private readonly productSubCategoriesService: ProductSubCategoriesService, ) {} + @Post() + async create(@Body() createProductDto: CreateProductDto) { + return { + data: await this.productService.create(createProductDto), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Post('categories') async createCategories( @Body() createCategoriesProductDto: CreateCategoriesProductDto, @@ -36,6 +53,19 @@ export class ProductController { }; } + @Post('sub-categories') + async createSubCategories( + @Body() createSubCategoriesProductDto: CreateSubCategoriesProductDto, + ) { + return { + data: await this.productSubCategoriesService.create( + createSubCategoriesProductDto, + ), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Get() async findAll(@Query('page') page: number) { const [data, count] = await this.productService.findAll(page); @@ -48,6 +78,30 @@ export class ProductController { }; } + @Get('categories') + async findAllCategories(@Query('page') page: number) { + const [data, count] = await this.productCategoriesService.findAll(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('sub-categories') + async findAllSubCategories(@Query('page') page: number) { + const [data, count] = await this.productSubCategoriesService.findAll(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { @@ -57,4 +111,90 @@ export class ProductController { }; } + @Get('categories/:id') + async findOneCategories(@Param('id', ParseUUIDPipe) id: string) { + return { + data: await this.productCategoriesService.findOne(id), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('sub-categories/:id') + async findOneSubCategories(@Param('id', ParseUUIDPipe) id: string) { + return { + data: await this.productSubCategoriesService.findOne(id), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Put(':id') + async update( + @Param('id', ParseUUIDPipe) id: string, + @Body() updateProductDto: UpdateProductDto, + ) { + return { + data: await this.productService.update(id, updateProductDto), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Put('categories/:id') + async updateCategories( + @Param('id', ParseUUIDPipe) id: string, + @Body() updateCategoriesDto: UpdateCategoriesProductDto, + ) { + return { + data: await this.productCategoriesService.update(id, updateCategoriesDto), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Put('sub-categories/:id') + async updateSubCategories( + @Param('id', ParseUUIDPipe) id: string, + @Body() updateSubCategoriesDto: UpdateSubCategoriesProductDto, + ) { + return { + data: await this.productSubCategoriesService.update( + id, + updateSubCategoriesDto, + ), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Delete(':id') + async remove(@Param('id', ParseUUIDPipe) id: string) { + await this.productService.remove(id); + + return { + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Delete('categories/:id') + async removeCategories(@Param('id', ParseUUIDPipe) id: string) { + await this.productCategoriesService.remove(id); + + return { + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Delete('sub-categories/:id') + async removeSubCategories(@Param('id', ParseUUIDPipe) id: string) { + await this.productSubCategoriesService.remove(id); + + return { + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/product/product.module.ts b/src/product/product.module.ts index 139d849..cf65094 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -7,6 +7,7 @@ import { Product } from './entities/product.entity'; import { ProductCategories } from './entities/product-category.entity'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { ProductSubCategories } from './entities/product-sub-category.entity'; +import { ProductSubCategoriesService } from './product-sub-categories.service'; @Module({ imports: [ @@ -18,6 +19,10 @@ import { ProductSubCategories } from './entities/product-sub-category.entity'; ]), ], controllers: [ProductController], - providers: [ProductService, ProductCategoriesService], + providers: [ + ProductService, + ProductCategoriesService, + ProductSubCategoriesService, + ], }) export class ProductModule {} diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 3b05d59..4056074 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,22 +1,29 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; -import { ProductCategories } from './entities/product-category.entity'; -import { ProductSubCategories } from './entities/product-sub-category.entity'; import { InjectRepository } from '@nestjs/typeorm'; -import { CreateProductDto } from '../product/dto/create-product.dto'; -import { CreateCategoriesProductDto } from './dto/categories/create-categories-product.dto'; -import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; +import { CreateProductDto } from '../product/dto/product/create-product.dto'; +import { ProductSubCategoriesService } from './product-sub-categories.service'; +import { UpdateProductDto } from './dto/product/update-product.dto'; -@Injectable() export class ProductService { constructor( @InjectRepository(Product) private productRepository: Repository, + private productSubCategoriesService: ProductSubCategoriesService, ) {} async create(createProductDto: CreateProductDto) { - const result = await this.productRepository.insert(createProductDto); + const subCategories = await this.productSubCategoriesService.findOne( + createProductDto.subCategoriesId, + ); + + const result = await this.productRepository.insert({ + name: createProductDto.name, + code: createProductDto.code, + status: createProductDto.status, + subCategories: subCategories, + }); return this.productRepository.findOneOrFail(result.identifiers[0].id); } @@ -31,9 +38,9 @@ export class ProductService { }); } - async findOne(id: string) { + async findOne(code: string) { try { - return await this.productRepository.findOneOrFail(id); + return await this.productRepository.findOneOrFail({ code: code }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -48,4 +55,54 @@ export class ProductService { } } } + + async update(id: string, updateProductDto: UpdateProductDto) { + try { + await this.productRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + const subCategories = await this.productSubCategoriesService.findOne( + updateProductDto.subCategoriesId, + ); + + const result = await this.productRepository.update(id, { + name: updateProductDto.name, + code: updateProductDto.code, + status: updateProductDto.status, + subCategories: subCategories, + }); + + return this.productRepository.findOneOrFail(id); + } + + async remove(id: string) { + try { + await this.productRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + + await this.productRepository.delete(id); + } } From f1594ebd9611ff0d09e838bd8b4fc33800e1fe3c Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 22:31:11 +0700 Subject: [PATCH 007/135] add:authentication --- src/auth/auth.controller.ts | 16 ++++++----- src/auth/auth.module.ts | 22 ++++++++++++--- src/auth/auth.service.ts | 53 ++++++++++++++++++++++++++----------- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 605fe1d..ea04269 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,11 +1,13 @@ -import { Controller, Request, Post, UseGuards } from '@nestjs/common'; -import { LocalAuthGuard } from './local-auth.guard'; +import { Controller, Post } from '@nestjs/common'; +import { InputLoginDto } from './dto/input-login.dto'; +import { AuthService } from './auth.service'; @Controller('auth') export class AuthController { - @UseGuards(LocalAuthGuard) - @Post('login') - async login(@Request() req) { - return req.user; - } + constructor(private readonly authService: AuthService) {} + + // @Post('login') + // public async login( @Body() loginUserDto: InputLoginDto): Promise { + // return await this.authService.findByLogin(loginUserDto); + // } } diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 8d2d164..7213c5d 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -2,12 +2,28 @@ import { Module } from '@nestjs/common'; import { AuthService } from './auth.service'; import { UsersModule } from '../users/users.module'; import { PassportModule } from '@nestjs/passport'; -import { LocalStrategy } from './local.strategy'; +import { JwtModule, JwtStrategy } from 'passport-jwt'; import { AuthController } from './auth.controller'; @Module({ - imports: [UsersModule, PassportModule], - providers: [AuthService, LocalStrategy], + imports: [ + UsersModule, + PassportModule.register({ + defaultStrategy: 'jwt', + property: 'user', + session: false, + }), + JwtModule.register({ + secret: process.env.SECRETKEY, signOptions: { + expiresIn: process.env.EXPIRESIN, + }, + }), + ], controllers: [AuthController], + providers: [AuthService, JwtStrategy], + exports: [ + PassportModule, + JwtModule + ], }) export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index b8f30dc..1216af8 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,25 +1,46 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { InputLoginDto } from './dto/input-login.dto'; -import { hashPassword } from '../helper/hash_password'; +import { InjectRepository } from '@nestjs/typeorm'; import { User } from '../users/entities/user.entity'; +import { Repository } from 'typeorm'; +import { hashPassword } from '../helper/hash_password'; +import { ResponseLoginDto } from './dto/response-login.dto'; @Injectable() export class AuthService { - constructor(private readonly usersService: UsersService) {} + constructor( + @InjectRepository(User) + private usersRepository: Repository, + ) {} - async validateUser({ - username, - password, - }: InputLoginDto): Promise> { - const user = await this.usersService.findOne(username); + // async findByLogin({ username, password }: InputLoginDto): Promise { + // const user = await this.usersRepository.findOne({ where: { username } }); + // + // if (!user) { + // throw new HttpException( + // { + // statusCode: HttpStatus.FORBIDDEN, + // error: 'Username not found', + // }, + // HttpStatus.FORBIDDEN, + // ); + // } + // + // // compare passwords + // const hashData = await hashPassword(password, user.salt); + // + // if( hashData != user.password ){ + // throw new HttpException( + // { + // statusCode: HttpStatus.FORBIDDEN, + // error: 'Password Not Match', + // }, + // HttpStatus.FORBIDDEN, + // ); + // } + // + // return ResponseLoginDto(user); + // } - if (user && user.password === (await hashPassword(password, user.salt))) { - const { password, ...result } = user; - - return result; - } - - return null; - } } From 77db83490f11d62d6594d14c046929fe6d836a72 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 23:15:26 +0700 Subject: [PATCH 008/135] add:product price --- src/app.module.ts | 7 ++-- src/auth/auth.module.ts | 10 +----- src/auth/local.strategy.ts | 30 ++++++++--------- src/product/dto/product/create-product.dto.ts | 3 ++ .../entities/product-history-price.entity.ts | 14 ++++---- src/product/entities/product.entity.ts | 3 ++ src/product/product.service.ts | 16 +++++++++ src/transaction/entities/coa-type.entity.ts | 33 +++++++++++++++++++ 8 files changed, 80 insertions(+), 36 deletions(-) create mode 100644 src/transaction/entities/coa-type.entity.ts diff --git a/src/app.module.ts b/src/app.module.ts index a3b7114..ce2cf6a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -50,10 +50,9 @@ import configuration from './config/configuration'; inject: [ConfigService], }), UsersModule, - // TransactionModule, - // ConfigurableModule, - // ProductModule, - AuthModule, + TransactionModule, + ConfigurableModule, + ProductModule, ], }) export class AppModule {} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 7213c5d..75cbc4f 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -13,17 +13,9 @@ import { AuthController } from './auth.controller'; property: 'user', session: false, }), - JwtModule.register({ - secret: process.env.SECRETKEY, signOptions: { - expiresIn: process.env.EXPIRESIN, - }, - }), ], controllers: [AuthController], providers: [AuthService, JwtStrategy], - exports: [ - PassportModule, - JwtModule - ], + exports: [PassportModule, JwtModule], }) export class AuthModule {} diff --git a/src/auth/local.strategy.ts b/src/auth/local.strategy.ts index 9ab2e6f..83541f4 100644 --- a/src/auth/local.strategy.ts +++ b/src/auth/local.strategy.ts @@ -10,19 +10,19 @@ export class LocalStrategy extends PassportStrategy(Strategy) { super(); } - async validate( - username: string, - password: string, - ): Promise> { - const user = await this.authService.validateUser({ - username, - password, - }); - - if (!user) { - throw new UnauthorizedException(); - } - - return user; - } + // async validate( + // username: string, + // password: string, + // ): Promise> { + // const user = await this.authService.validateUser({ + // username, + // password, + // }); + // + // if (!user) { + // throw new UnauthorizedException(); + // } + // + // return user; + // } } diff --git a/src/product/dto/product/create-product.dto.ts b/src/product/dto/product/create-product.dto.ts index ed442af..4c93970 100644 --- a/src/product/dto/product/create-product.dto.ts +++ b/src/product/dto/product/create-product.dto.ts @@ -10,6 +10,9 @@ export class CreateProductDto { @IsNotEmpty() status: string; + @IsNotEmpty() + price: number; + @IsUUID() subCategoriesId: string; } diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index c744910..99a5aca 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -2,11 +2,6 @@ import { Entity, Column, PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - OneToMany, ManyToOne, } from 'typeorm'; import { Product } from './product.entity'; @@ -23,13 +18,16 @@ export class ProductHistoryPrice extends BaseModel { id: string; @ManyToOne(() => Product, (product) => product.id) - productId: string; + product: Product; + + @Column() + price: number; @Column({ type: 'date' }) - startDate: string; + startDate: Date; @Column({ type: 'date' }) - endDate: string; + endDate: Date; @Column('text') type: Type; diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 78b9696..a139fe0 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -26,6 +26,9 @@ export class Product extends BaseModel{ @Column() status: string; + @Column() + price: number; + @ManyToOne( () => ProductSubCategories, (subCategories) => subCategories.category, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 4056074..d5df9b0 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -5,11 +5,18 @@ import { InjectRepository } from '@nestjs/typeorm'; import { CreateProductDto } from '../product/dto/product/create-product.dto'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UpdateProductDto } from './dto/product/update-product.dto'; +import { ProductHistoryPrice } from './entities/product-history-price.entity'; + +enum Type { + NORMAL, + PROMO, +} export class ProductService { constructor( @InjectRepository(Product) private productRepository: Repository, + private productHistoryPrice: Repository, private productSubCategoriesService: ProductSubCategoriesService, ) {} @@ -23,6 +30,14 @@ export class ProductService { code: createProductDto.code, status: createProductDto.status, subCategories: subCategories, + price: createProductDto.price, + }); + + await this.productHistoryPrice.insert({ + product: result.identifiers[0], + type: Type.NORMAL, + startDate: new Date(), + endDate: null, }); return this.productRepository.findOneOrFail(result.identifiers[0].id); @@ -81,6 +96,7 @@ export class ProductService { code: updateProductDto.code, status: updateProductDto.status, subCategories: subCategories, + price: updateProductDto.price, }); return this.productRepository.findOneOrFail(id); diff --git a/src/transaction/entities/coa-type.entity.ts b/src/transaction/entities/coa-type.entity.ts new file mode 100644 index 0000000..d2a86ef --- /dev/null +++ b/src/transaction/entities/coa-type.entity.ts @@ -0,0 +1,33 @@ +import { + Entity, + Column, + PrimaryGeneratedColumn, + UpdateDateColumn, + DeleteDateColumn, + VersionColumn, + CreateDateColumn, + ManyToOne, + ManyToMany, + JoinTable, +} from 'typeorm'; +import { Product } from '../../product/entities/product.entity'; +import { User } from '../../users/entities/user.entity'; +import { BaseModel } from '../../config/basemodel.entity'; + +enum balanceType { + DEBIT, + CREDIT, +} + +@Entity() +export class CoaType extends BaseModel { + @Column() + name: string; + + @Column('text') + normalBalance: balanceType; + + @ManyToMany(() => User) + @JoinTable() + user: User[]; +} From b1fa9175766cd41d8f3946a0276c7cbd0f630399 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 6 Dec 2021 23:45:57 +0700 Subject: [PATCH 009/135] add: progress transaction --- src/app.module.ts | 2 +- src/transaction/dto/create-transaction.dto.ts | 1 - .../dto/distribute-transaction.dto.ts | 9 +++++ src/transaction/dto/update-transaction.dto.ts | 4 +- ...ntity.ts => transaction-journal.entity.ts} | 10 ++++- .../entities/transaction-type.entity.ts | 23 +++++++++++ ...ction.entity.ts => transactions.entity.ts} | 5 +-- src/transaction/ppob_callback.controller.ts | 2 +- src/transaction/transaction.controller.ts | 4 +- src/transaction/transaction.module.ts | 15 ++++++++ src/transaction/transaction.service.ts | 38 +++++++++++++++++-- 11 files changed, 98 insertions(+), 15 deletions(-) delete mode 100644 src/transaction/dto/create-transaction.dto.ts create mode 100644 src/transaction/dto/distribute-transaction.dto.ts rename src/transaction/entities/{transaction_journal.entity.ts => transaction-journal.entity.ts} (65%) create mode 100644 src/transaction/entities/transaction-type.entity.ts rename src/transaction/entities/{transaction.entity.ts => transactions.entity.ts} (81%) diff --git a/src/app.module.ts b/src/app.module.ts index ce2cf6a..a0fd6d6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -52,7 +52,7 @@ import configuration from './config/configuration'; UsersModule, TransactionModule, ConfigurableModule, - ProductModule, + // ProductModule, ], }) export class AppModule {} diff --git a/src/transaction/dto/create-transaction.dto.ts b/src/transaction/dto/create-transaction.dto.ts deleted file mode 100644 index 6f59387..0000000 --- a/src/transaction/dto/create-transaction.dto.ts +++ /dev/null @@ -1 +0,0 @@ -export class CreateTransactionDto {} diff --git a/src/transaction/dto/distribute-transaction.dto.ts b/src/transaction/dto/distribute-transaction.dto.ts new file mode 100644 index 0000000..7d79186 --- /dev/null +++ b/src/transaction/dto/distribute-transaction.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; + +export class DistributeTransactionDto { + @IsNotEmpty() + amount: number; + + @IsNotEmpty() + destination: string; +} diff --git a/src/transaction/dto/update-transaction.dto.ts b/src/transaction/dto/update-transaction.dto.ts index bade684..6402c55 100644 --- a/src/transaction/dto/update-transaction.dto.ts +++ b/src/transaction/dto/update-transaction.dto.ts @@ -1,4 +1,4 @@ import { PartialType } from '@nestjs/mapped-types'; -import { CreateTransactionDto } from './create-transaction.dto'; +import { DistributeTransactionDto } from './distribute-transaction.dto'; -export class UpdateTransactionDto extends PartialType(CreateTransactionDto) {} +export class UpdateTransactionDto extends PartialType(DistributeTransactionDto) {} diff --git a/src/transaction/entities/transaction_journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts similarity index 65% rename from src/transaction/entities/transaction_journal.entity.ts rename to src/transaction/entities/transaction-journal.entity.ts index 1333950..4f99b5c 100644 --- a/src/transaction/entities/transaction_journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -5,13 +5,15 @@ import { UpdateDateColumn, DeleteDateColumn, VersionColumn, - CreateDateColumn, ManyToOne, ManyToMany, JoinTable, + CreateDateColumn, ManyToOne, ManyToMany, JoinTable, OneToOne, } from 'typeorm'; import { Product } from '../../product/entities/product.entity'; import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { ProductCategories } from '../../product/entities/product-category.entity'; import { COA } from './coa.entity'; +import { Transactions } from './transactions.entity'; +import { TransactionType } from './transaction-type.entity'; enum type { SYSTEM_BANk, @@ -31,6 +33,12 @@ export class TransactionJournal extends BaseModel { @Column() amount: number; + @OneToOne(() => Transactions, (trans) => trans.id) + transaction: Transactions; + @ManyToOne(() => COA, (coa) => coa.id) coa: COA; + + @ManyToOne(() => TransactionType, (transType) => transType.id) + transactionType: TransactionType; } diff --git a/src/transaction/entities/transaction-type.entity.ts b/src/transaction/entities/transaction-type.entity.ts new file mode 100644 index 0000000..3998378 --- /dev/null +++ b/src/transaction/entities/transaction-type.entity.ts @@ -0,0 +1,23 @@ +import { + Entity, + Column, + PrimaryGeneratedColumn, + UpdateDateColumn, + DeleteDateColumn, + VersionColumn, + CreateDateColumn, + ManyToOne, + ManyToMany, + JoinTable, +} from 'typeorm'; +import { Product } from '../../product/entities/product.entity'; +import { User } from '../../users/entities/user.entity'; +import { BaseModel } from '../../config/basemodel.entity'; +import { COA } from './coa.entity'; +import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; + +@Entity() +export class TransactionType extends BaseModel { + @Column() + name: string; +} diff --git a/src/transaction/entities/transaction.entity.ts b/src/transaction/entities/transactions.entity.ts similarity index 81% rename from src/transaction/entities/transaction.entity.ts rename to src/transaction/entities/transactions.entity.ts index 4cf5e85..bed1e84 100644 --- a/src/transaction/entities/transaction.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -23,7 +23,7 @@ enum status { } @Entity() -export class Transaction extends BaseModel { +export class Transactions extends BaseModel { @Column() amount: number; @@ -32,7 +32,4 @@ export class Transaction extends BaseModel { @ManyToOne(() => User, (user) => user.id) user: User; - - @ManyToOne(() => ProductHistoryPrice, (productHistory) => productHistory.id) - product: ProductHistoryPrice; } diff --git a/src/transaction/ppob_callback.controller.ts b/src/transaction/ppob_callback.controller.ts index a6cd453..0044656 100644 --- a/src/transaction/ppob_callback.controller.ts +++ b/src/transaction/ppob_callback.controller.ts @@ -11,7 +11,7 @@ import { Req, } from '@nestjs/common'; import { TransactionService } from './transaction.service'; -import { CreateTransactionDto } from './dto/create-transaction.dto'; +import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { FastifyRequest } from 'fastify'; @Controller({ diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index bf71aab..2b95bf8 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -8,7 +8,7 @@ import { Delete, } from '@nestjs/common'; import { TransactionService } from './transaction.service'; -import { CreateTransactionDto } from './dto/create-transaction.dto'; +import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; @Controller({ @@ -19,7 +19,7 @@ export class TransactionController { constructor(private readonly transactionService: TransactionService) {} @Post() - create(@Body() createTransactionDto: CreateTransactionDto) { + create(@Body() createTransactionDto: DistributeTransactionDto) { return this.transactionService.create(createTransactionDto); } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 7a8e1e8..329489d 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -2,8 +2,23 @@ import { Module } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { TransactionController } from './transaction.controller'; import { PpobCallbackController } from './ppob_callback.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { COA } from './entities/coa.entity'; +import { CoaType } from './entities/coa-type.entity'; +import { TransactionType } from './entities/transaction-type.entity'; +import { TransactionJournal } from './entities/transaction-journal.entity'; +import { Transaction } from './entities/transactions.entity'; @Module({ + imports: [ + TypeOrmModule.forFeature([ + CoaType, + TransactionType, + COA, + TransactionJournal, + Transaction, + ]), + ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService], }) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 0f49e43..917851b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,11 +1,43 @@ import { Injectable } from '@nestjs/common'; -import { CreateTransactionDto } from './dto/create-transaction.dto'; +import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Transactions } from './entities/transactions.entity'; +import { Repository } from 'typeorm'; +import { User } from '../users/entities/user.entity'; +import { TransactionType } from './entities/transaction-type.entity'; +import { TransactionJournal } from './entities/transaction-journal.entity'; @Injectable() export class TransactionService { - create(createTransactionDto: CreateTransactionDto) { - return 'This action adds a new transaction'; + constructor( + @InjectRepository(Transactions) + private transactionRepository: Repository, + @InjectRepository(TransactionType) + private transactionType: Repository, + @InjectRepository(TransactionJournal) + private transactionJournal: Repository, + @InjectRepository(User) + private userRepository: Repository, + ) {} + + async create(distributeTransactionDto: DistributeTransactionDto) { + // GET USER + // GET COA + // GET TYPE TRANSAKSI + + //ADD USER IN INSERT + const transactionSaved = await this.transactionRepository.insert({ + amount: distributeTransactionDto.amount, + }); + + //INSERT TRANSACTION JOURNAL + await this.transactionJournal.insert({ + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + }); + + return true; } findAll() { From a4cd9d0b92296a6ed98c6b87f0d5580e6e6c3baf Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Tue, 7 Dec 2021 11:19:20 +0700 Subject: [PATCH 010/135] fix bug --- package-lock.json | 7797 +++++++++++++++++ src/app.module.ts | 2 +- src/product/product.service.ts | 1 + .../entities/transaction-type.entity.ts | 12 - src/transaction/transaction.module.ts | 4 +- src/transaction/transaction.service.ts | 23 +- 6 files changed, 7818 insertions(+), 21 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6c5e34d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7797 @@ +{ + "name": "ppob-backend", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/core": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.3.tgz", + "integrity": "sha512-5yTYW6m4pkDPSYNxThm+47h+UZ6XVEfdfsXR3o+WlRG0hc18EuQ+sXZkzhvZrk5KMLlXFex4eO40RPq2vvWS/w==", + "dev": true, + "requires": { + "ajv": "8.6.3", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.3.tgz", + "integrity": "sha512-+Va1E0zJBCg5jqSfITusghoMJgPAwlU+WUs49fuGVCzfJPwfSjTKSrsbhanahMd27+Ys3rovGZq0F2JUdL801A==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.0.3", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics-cli": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.0.3.tgz", + "integrity": "sha512-iGEA3hEbHcmhAkGmrFXKWDnelzhSSJLaZPHr6SLPpztKEU8OFMZxv8NFATc/IpXknEhX3+Tm5DkrOpSc4rJlhA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.0.3", + "@angular-devkit/schematics": "13.0.3", + "ansi-colors": "4.1.1", + "inquirer": "8.2.0", + "minimist": "1.2.5", + "symbol-observable": "4.0.0" + }, + "dependencies": { + "inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + } + } + }, + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", + "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@fastify/ajv-compiler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", + "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", + "requires": { + "ajv": "^6.12.6" + } + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", + "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.4.2", + "jest-util": "^27.4.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.3.tgz", + "integrity": "sha512-V9ms3zSxUHxh1E/ZLAiXF7SLejsdFnjWTFizWotMOWvjho0lW5kSjZymhQSodNW0T0ZMQRiha7f8+NcFVm3hJQ==", + "dev": true, + "requires": { + "@jest/console": "^27.4.2", + "@jest/reporters": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.4.2", + "jest-config": "^27.4.3", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-resolve-dependencies": "^27.4.2", + "jest-runner": "^27.4.3", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "jest-watcher": "^27.4.2", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", + "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "jest-mock": "^27.4.2" + } + }, + "@jest/fake-timers": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", + "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" + } + }, + "@jest/globals": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", + "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "dev": true, + "requires": { + "@jest/environment": "^27.4.2", + "@jest/types": "^27.4.2", + "expect": "^27.4.2" + } + }, + "@jest/reporters": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", + "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/source-map": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", + "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", + "dev": true, + "requires": { + "@jest/console": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", + "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.4.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-runtime": "^27.4.2" + } + }, + "@jest/transform": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", + "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.4.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-util": "^27.4.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/types": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@nestjs/cli": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-8.1.5.tgz", + "integrity": "sha512-eGlSTCFf/M3ACSNpW3mx5raZ+qq7k/4v6nFuaGpKafQKSKNw7cRVqSeAtHzd7bcK0ik7tKTyhQ8oxnygMLm5Iw==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.0.3", + "@angular-devkit/schematics": "13.0.3", + "@angular-devkit/schematics-cli": "13.0.3", + "@nestjs/schematics": "^8.0.3", + "chalk": "3.0.0", + "chokidar": "3.5.2", + "cli-table3": "0.6.0", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "6.4.0", + "inquirer": "7.3.3", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "os-name": "4.0.1", + "rimraf": "3.0.2", + "shelljs": "0.8.4", + "source-map-support": "0.5.20", + "tree-kill": "1.2.2", + "tsconfig-paths": "3.11.0", + "tsconfig-paths-webpack-plugin": "3.5.2", + "typescript": "4.3.5", + "webpack": "5.64.1", + "webpack-node-externals": "3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true + } + } + }, + "@nestjs/common": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.2.3.tgz", + "integrity": "sha512-slXVVMc9tZG6ZaARXkTUsSqZbkEcc0hVKb4mPLxS9mjXmDspUleGQakZ5OzniiEWqzO299BVlEbm6TGyoGbpNg==", + "requires": { + "axios": "0.24.0", + "iterare": "1.2.1", + "tslib": "2.3.1", + "uuid": "8.3.2" + } + }, + "@nestjs/config": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-1.1.5.tgz", + "integrity": "sha512-xSpp/6TIHFhicuuwRu2fFGmClzN+YXtpVSLGX3LT9iAwtNDcccX3qVDOX1BLdFdBbqZTqT3KezsT+iE/czd/xg==", + "requires": { + "dotenv": "10.0.0", + "dotenv-expand": "5.1.0", + "lodash.get": "4.4.2", + "lodash.has": "4.5.2", + "lodash.set": "4.3.2", + "uuid": "8.3.2" + } + }, + "@nestjs/core": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.2.3.tgz", + "integrity": "sha512-CP/Z+uTEdblTZQXRf+xvZHvESZ6v2vxX/YaRcpJDv/ytgxxOafmOJ/RDKSzNOGBkt8kVwYNFpWXzzll4P5AJ0g==", + "requires": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "object-hash": "2.2.0", + "path-to-regexp": "3.2.0", + "tslib": "2.3.1", + "uuid": "8.3.2" + } + }, + "@nestjs/mapped-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", + "integrity": "sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==" + }, + "@nestjs/passport": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.0.1.tgz", + "integrity": "sha512-vn/ZJLXQKvSf9D0BvEoNFJLfzl9AVqfGtDyQMfWDLbaNpoEB2FyeaHGxdiX6H71oLSrQV78c/yuhfantzwdjdg==" + }, + "@nestjs/platform-express": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.2.3.tgz", + "integrity": "sha512-x8pyUpoKU8KUMYYwGiG17UXu818RUa6YCPu5Jvyq9P6G37ZfOAERYu3yveg9G5Q6YL6Z7jXAW9ojy+lWQXXhng==", + "requires": { + "body-parser": "1.19.0", + "cors": "2.8.5", + "express": "4.17.1", + "multer": "1.4.3", + "tslib": "2.3.1" + } + }, + "@nestjs/platform-fastify": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-8.2.3.tgz", + "integrity": "sha512-uZelasRb99Rgq6h7QLWXlFdx8lqf3M/ln+1XzVPaWbJza4eUSo1f3BvrO4r1V/OKZLgW7pyB1CM2P4lKLMK1cA==", + "requires": { + "fastify": "3.24.0", + "fastify-cors": "6.0.2", + "fastify-formbody": "5.2.0", + "light-my-request": "4.6.0", + "middie": "5.3.0", + "path-to-regexp": "3.2.0", + "tslib": "2.3.1" + } + }, + "@nestjs/schematics": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.5.tgz", + "integrity": "sha512-nK1hWQeLNbdhsiJDX/XJXLqq7nC6/xxC8CN+seFTQmly+H3gG2xaFnl6JPHURumuQaYJX8JEpC8m0+4tz+wvOg==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.0.2", + "@angular-devkit/schematics": "13.0.2", + "fs-extra": "10.0.0", + "jsonc-parser": "3.0.0", + "pluralize": "8.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.2.tgz", + "integrity": "sha512-I4co4GH+iu0tns+UXfMtjJISO+cLpaUuiEH6kf0wF5cqjaIeluA9UjIRnxuNbdTW8iE2xVj/UWhQfHe/Ncp76w==", + "dev": true, + "requires": { + "ajv": "8.6.3", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.2.tgz", + "integrity": "sha512-qrTe1teQptgP8gmVy6QX0T4dNfnNipEv+cM2cr7JXOmkPpwF+6oBDrTRIJ55t6rziqrXHJ3rxjKm1aHAxFrIEQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.0.2", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + } + }, + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@nestjs/testing": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.2.3.tgz", + "integrity": "sha512-5jDORCCfRXIWygf1/C9K9py2NGWE/5Bu+fsYQNEQyZlmGbDf2g7q/3O203hj2IVltMvrue7ea/eo1vI0fz1RsA==", + "dev": true, + "requires": { + "optional": "0.1.4", + "tslib": "2.3.1" + } + }, + "@nestjs/typeorm": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-8.0.2.tgz", + "integrity": "sha512-UHn4IsRkzm22eNDir/uI+x8gmgo66EO7SxWfVOiPpeLSdrTfZHKYz6q/P9KRgYbwXs8TrywVdIbJhp+4C0tzjQ==", + "requires": { + "uuid": "8.3.2" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + } + }, + "@sideway/address": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", + "integrity": "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sqltools/formatter": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", + "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "@types/eslint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", + "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.26", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz", + "integrity": "sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "dev": true, + "requires": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/passport": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.7.tgz", + "integrity": "sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/passport-local": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz", + "integrity": "sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "@types/prettier": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", + "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/superagent": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", + "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", + "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@types/zen-observable": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", + "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "avvio": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.2.tgz", + "integrity": "sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw==", + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1", + "queue-microtask": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "babel-jest": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", + "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "dev": true, + "requires": { + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.4.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", + "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", + "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.4.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001284", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", + "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" + }, + "class-validator": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", + "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "requires": { + "libphonenumber-js": "^1.9.43", + "validator": "^13.7.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", + "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "dependencies": { + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "esbuild": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", + "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.14.2", + "esbuild-darwin-64": "0.14.2", + "esbuild-darwin-arm64": "0.14.2", + "esbuild-freebsd-64": "0.14.2", + "esbuild-freebsd-arm64": "0.14.2", + "esbuild-linux-32": "0.14.2", + "esbuild-linux-64": "0.14.2", + "esbuild-linux-arm": "0.14.2", + "esbuild-linux-arm64": "0.14.2", + "esbuild-linux-mips64le": "0.14.2", + "esbuild-linux-ppc64le": "0.14.2", + "esbuild-netbsd-64": "0.14.2", + "esbuild-openbsd-64": "0.14.2", + "esbuild-sunos-64": "0.14.2", + "esbuild-windows-32": "0.14.2", + "esbuild-windows-64": "0.14.2", + "esbuild-windows-arm64": "0.14.2" + } + }, + "esbuild-android-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", + "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", + "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", + "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", + "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", + "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", + "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", + "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", + "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", + "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", + "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", + "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", + "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", + "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", + "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", + "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", + "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", + "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expect": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", + "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.4.0", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-regex-util": "^27.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-json-stringify": { + "version": "2.7.12", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.12.tgz", + "integrity": "sha512-4hjwZDPmgj/ZUKXhEWovGPciE/5mWtAIQQxN+2VBDFun7DRTk2oOItbu9ZZp6kqj+eZ/u7z+dgBgM74cfGRnBQ==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-redact": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", + "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "requires": { + "punycode": "^1.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "fastify": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.24.0.tgz", + "integrity": "sha512-fmRyrI25rzLGHDQ1FME02NsbP658mVa0EaSqfYUFwx2UOF+4/GcyNrsdWILSDOEiUbOsRYCD3sRCE9v7mvRLRQ==", + "requires": { + "@fastify/ajv-compiler": "^1.0.0", + "abstract-logging": "^2.0.0", + "avvio": "^7.1.2", + "fast-json-stringify": "^2.5.2", + "fastify-error": "^0.3.0", + "fastify-warning": "^0.2.0", + "find-my-way": "^4.1.0", + "flatstr": "^1.0.12", + "light-my-request": "^4.2.0", + "pino": "^6.13.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.1.4", + "secure-json-parse": "^2.0.0", + "semver": "^7.3.2", + "tiny-lru": "^7.0.0" + } + }, + "fastify-cors": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/fastify-cors/-/fastify-cors-6.0.2.tgz", + "integrity": "sha512-sE0AOyzmj5hLLRRVgenjA6G2iOGX35/1S3QGYB9rr9TXelMZB3lFrXy4CzwYVOMiujJeMiLgO4J7eRm8sQSv8Q==", + "requires": { + "fastify-plugin": "^3.0.0", + "vary": "^1.1.2" + } + }, + "fastify-error": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz", + "integrity": "sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ==" + }, + "fastify-formbody": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/fastify-formbody/-/fastify-formbody-5.2.0.tgz", + "integrity": "sha512-d8Y5hCL82akPyoFiXh2wYOm3es0pV9jqoPo3pO9OV2cNF0cQx39J5WAVXzCh4MSt9Z2qF4Fy5gHlvlyESwjtvg==", + "requires": { + "fastify-plugin": "^3.0.0" + } + }, + "fastify-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.0.tgz", + "integrity": "sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w==" + }, + "fastify-warning": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz", + "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-my-way": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.4.0.tgz", + "integrity": "sha512-hpntHvK0iOHp3pqWRRUEzioar4tp8euBD8DkPG3VauOriZLgwGZLTNp6yZSrdctJ8RCDS7zhZSR2V+yOaBbNow==", + "requires": { + "fast-decode-uri-component": "^1.0.1", + "fast-deep-equal": "^3.1.3", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.4.0.tgz", + "integrity": "sha512-3I3wFkc4DbzaUDPWEi96wdYGu4EKtxBafhZYm0o4mX51d9bphAY4P3mBl8K5mFXFJqVzHfmdbm9kLGnm7vwwBg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" + }, + "jest": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.3.tgz", + "integrity": "sha512-jwsfVABBzuN3Atm+6h6vIEpTs9+VApODLt4dk2qv1WMOpb1weI1IIZfuwpMiWZ62qvWj78MvdvMHIYdUfqrFaA==", + "dev": true, + "requires": { + "@jest/core": "^27.4.3", + "import-local": "^3.0.2", + "jest-cli": "^27.4.3" + }, + "dependencies": { + "jest-cli": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.3.tgz", + "integrity": "sha512-zZSJBXNC/i8UnJPwcKWsqnhGgIF3uoTYP7th32Zej7KNQJdxzOMj+wCfy2Ox3kU7nXErJ36DtYyXDhfiqaiDRw==", + "dev": true, + "requires": { + "@jest/core": "^27.4.3", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.4.3", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "jest-changed-files": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + } + } + }, + "jest-circus": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", + "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "dev": true, + "requires": { + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-config": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.3.tgz", + "integrity": "sha512-DQ10HTSqYtC2pO7s9j2jw+li4xUnm2wLYWH2o7K1ftB8NyvToHsXoLlXxtsGh3AW9gUQR6KY/4B7G+T/NswJBw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.4.2", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-circus": "^27.4.2", + "jest-environment-jsdom": "^27.4.3", + "jest-environment-node": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-jasmine2": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-runner": "^27.4.3", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0" + } + }, + "jest-diff": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", + "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.4.0", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + } + }, + "jest-docblock": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", + "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", + "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "jest-get-type": "^27.4.0", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2" + } + }, + "jest-environment-jsdom": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.3.tgz", + "integrity": "sha512-x1AUVz3G14LpEJs7KIFUaTINT2n0unOUmvdAby3s/sldUpJJetOJifHo1O/EUQC5fNBowggwJbVulko18y6OWw==", + "dev": true, + "requires": { + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", + "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "dev": true, + "requires": { + "@jest/environment": "^27.4.2", + "@jest/fake-timers": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "jest-mock": "^27.4.2", + "jest-util": "^27.4.2" + } + }, + "jest-get-type": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", + "dev": true + }, + "jest-haste-map": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", + "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.4.0", + "jest-serializer": "^27.4.0", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", + "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.2", + "throat": "^6.0.1" + } + }, + "jest-leak-detector": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", + "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", + "dev": true, + "requires": { + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + } + }, + "jest-matcher-utils": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", + "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.2" + } + }, + "jest-message-util": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", + "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.4.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", + "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", + "dev": true + }, + "jest-resolve": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", + "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", + "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-snapshot": "^27.4.2" + } + }, + "jest-runner": { + "version": "27.4.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.3.tgz", + "integrity": "sha512-JgR6Om/j22Fd6ZUUIGTWNcCtuZVYbNrecb4k89W4UyFJoRtHpo2zMKWkmFFFJoqwWGrfrcPLnVBIgkJiTV3cyA==", + "dev": true, + "requires": { + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.4.0", + "jest-environment-jsdom": "^27.4.3", + "jest-environment-node": "^27.4.2", + "jest-haste-map": "^27.4.2", + "jest-leak-detector": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-runtime": "^27.4.2", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.2", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", + "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "dev": true, + "requires": { + "@jest/console": "^27.4.2", + "@jest/environment": "^27.4.2", + "@jest/globals": "^27.4.2", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.2", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-mock": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.2", + "jest-snapshot": "^27.4.2", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "jest-serializer": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", + "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", + "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.4.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-haste-map": "^27.4.2", + "jest-matcher-utils": "^27.4.2", + "jest-message-util": "^27.4.2", + "jest-resolve": "^27.4.2", + "jest-util": "^27.4.2", + "natural-compare": "^1.4.0", + "pretty-format": "^27.4.2", + "semver": "^7.3.2" + } + }, + "jest-util": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", + "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.4", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", + "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.4.0", + "leven": "^3.1.0", + "pretty-format": "^27.4.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", + "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", + "dev": true, + "requires": { + "@jest/test-result": "^27.4.2", + "@jest/types": "^27.4.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.4.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", + "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.5.0.tgz", + "integrity": "sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libphonenumber-js": { + "version": "1.9.44", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.44.tgz", + "integrity": "sha512-zhw8nUMJuQf7jG1dZfEOKKOS6M3QYIv3HnvB/vGohNd0QfxIQcObH3a6Y6s350H+9xgBeOXClOJkS0hJ0yvS3g==" + }, + "light-my-request": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.6.0.tgz", + "integrity": "sha512-wQWGwMr7l7fzYPzzzutRoEI1vuREpIpJpTi3t8cHlGdsnBrOF5iR559Bkh+nkDGgnUJtNuuutjnqbxP7zPWKkA==", + "requires": { + "ajv": "^8.1.0", + "cookie": "^0.4.0", + "fastify-warning": "^0.2.0", + "set-cookie-parser": "^2.4.1" + }, + "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memfs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", + "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "middie": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/middie/-/middie-5.3.0.tgz", + "integrity": "sha512-uq6Ob4dmmHeT6rJpBDWVwSxBzxzKlBvnrZdLSRJeuhHzljvZ6ccgLP/HaShgfiYrQvekRH0KUe/G1WTu/IrXsQ==", + "requires": { + "fastify-plugin": "^3.0.0", + "path-to-regexp": "^6.1.0", + "reusify": "^1.0.4" + }, + "dependencies": { + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", + "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nestjs-pino": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-2.3.1.tgz", + "integrity": "sha512-FFDGs34LYv/MdFbtGPKz7PzrwLgtIrVnCPsjWDfW9ZEqAHwFz2v4X1DDM42tgeSiPgtvsF8+N6nA5GZQy3jzlQ==" + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.0.tgz", + "integrity": "sha512-ln+ue5YaNDS+fes6O5PCzXKSseY5u8MYhX9H5Co4s+HfYI5oqvnHKoOORLYDUPh+8tHvrxugF2GFcUA1Q1Gqfg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "requires": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pg": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz", + "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.4.1", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", + "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==" + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", + "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "requires": { + "split2": "^3.1.1" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pino": { + "version": "6.13.3", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.13.3.tgz", + "integrity": "sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "fastify-warning": "^0.2.0", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + } + }, + "pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "requires": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + }, + "dependencies": { + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + } + } + }, + "pino-http": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-6.3.3.tgz", + "integrity": "sha512-/TkDxOesPx4fGZRuOozYm1NdGbmkpqgGi00GY4ykM/1N3vlrisBmlnJ0PXU47xUPdMh/wt0GmkCtg8z2tBhwSA==", + "requires": { + "fast-url-parser": "^1.1.3", + "get-caller-file": "^2.0.5", + "pino": "^7.0.5", + "pino-std-serializers": "^5.0.0" + }, + "dependencies": { + "pino": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.5.1.tgz", + "integrity": "sha512-Wzo2G7CLaRHKOz3+Ex006LC5Xi0xEUm+mwm/h0NKzuKZONdekcbmjXg7vWDoO8hVTGX+1RuUy2fwlzvZ24EI5A==", + "requires": { + "fast-redact": "^3.0.0", + "fastify-warning": "^0.2.0", + "get-caller-file": "^2.0.5", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.13.0" + }, + "dependencies": { + "pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + } + } + }, + "pino-std-serializers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-5.0.0.tgz", + "integrity": "sha512-YC5Lv+nNxY51oicb/t8VX/sA3dnecCXeQ7heir+H+c4fbg3LD65NFdrfP3Y2ufR0Y/EYbEs5UDxHIB9NwCmYyQ==" + }, + "sonic-boom": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.4.1.tgz", + "integrity": "sha512-WgtVLfGl347/zS1oTuLaOAvVD5zijgjphAJHgbbnBJGgexnr+C1ULSj0j7ftoGxpuxR4PaV635NkwFemG8m/5w==", + "requires": { + "atomic-sleep": "^1.0.0" + } + } + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", + "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", + "dev": true, + "requires": { + "@jest/types": "^27.4.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "requires": { + "tslib": "~2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "requires": { + "ret": "~0.2.0" + } + }, + "safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "supertest": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", + "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", + "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", + "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-stream": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.0.tgz", + "integrity": "sha512-kTMZeX4Dzlb1zZ00/01aerGaTw2i8NE4sWF0TvF1uXewRhCiUjCvatQkvxIvFqauWG2ADFS2Wpd3qBeYL9i3dg==", + "requires": { + "real-require": "^0.1.0" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tiny-lru": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz", + "integrity": "sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-jest": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.0.tgz", + "integrity": "sha512-ZouWlP03JMtzfNHg0ZeDrxAESYGmVhWyHtIl2/01kBbXaMbTr4Vhv6/GeMxUed6GFg/4ycMo+yU6Eo9gI16xTQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "esbuild": "~0.14.0", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "ts-loader": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", + "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeorm": { + "version": "0.2.41", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.41.tgz", + "integrity": "sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw==", + "requires": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "debug": "^4.3.1", + "dotenv": "^8.2.0", + "glob": "^7.1.6", + "js-yaml": "^4.0.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.1.0", + "xml2js": "^0.4.23", + "yargs": "^17.0.1", + "zen-observable-ts": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "typeorm-naming-strategies": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typeorm-naming-strategies/-/typeorm-naming-strategies-2.0.0.tgz", + "integrity": "sha512-nsJ5jDjhBBEG6olFmxojkO4yrW7hEv38sH7ZXWWx9wnDoo9uaoH/mo2mBYAh/VKgwoFHBLu+CYxGmzXz2GUMcA==" + }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", + "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "webpack": { + "version": "5.64.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.1.tgz", + "integrity": "sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + } + } + }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, + "webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "requires": { + "execa": "^4.0.2" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", + "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "zen-observable-ts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", + "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", + "requires": { + "@types/zen-observable": "0.8.3", + "zen-observable": "0.8.15" + } + } + } +} diff --git a/src/app.module.ts b/src/app.module.ts index a0fd6d6..ce2cf6a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -52,7 +52,7 @@ import configuration from './config/configuration'; UsersModule, TransactionModule, ConfigurableModule, - // ProductModule, + ProductModule, ], }) export class AppModule {} diff --git a/src/product/product.service.ts b/src/product/product.service.ts index d5df9b0..b1b97c5 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -16,6 +16,7 @@ export class ProductService { constructor( @InjectRepository(Product) private productRepository: Repository, + @InjectRepository(ProductHistoryPrice) private productHistoryPrice: Repository, private productSubCategoriesService: ProductSubCategoriesService, ) {} diff --git a/src/transaction/entities/transaction-type.entity.ts b/src/transaction/entities/transaction-type.entity.ts index 3998378..c146c85 100644 --- a/src/transaction/entities/transaction-type.entity.ts +++ b/src/transaction/entities/transaction-type.entity.ts @@ -1,20 +1,8 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - ManyToOne, - ManyToMany, - JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; -import { COA } from './coa.entity'; -import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; @Entity() export class TransactionType extends BaseModel { diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 329489d..1f586ed 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -7,7 +7,7 @@ import { COA } from './entities/coa.entity'; import { CoaType } from './entities/coa-type.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; -import { Transaction } from './entities/transactions.entity'; +import { Transactions } from './entities/transactions.entity'; @Module({ imports: [ @@ -16,7 +16,7 @@ import { Transaction } from './entities/transactions.entity'; TransactionType, COA, TransactionJournal, - Transaction, + Transactions, ]), ], controllers: [TransactionController, PpobCallbackController], diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 917851b..3582afe 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -5,6 +5,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; import { Repository } from 'typeorm'; import { User } from '../users/entities/user.entity'; +import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; @@ -14,11 +15,11 @@ export class TransactionService { @InjectRepository(Transactions) private transactionRepository: Repository, @InjectRepository(TransactionType) - private transactionType: Repository, + private transactionTypeRepository: Repository, @InjectRepository(TransactionJournal) - private transactionJournal: Repository, - @InjectRepository(User) - private userRepository: Repository, + private transactionJournalRepository: Repository, + @InjectRepository(COA) + private coaRepository: Repository ) {} async create(distributeTransactionDto: DistributeTransactionDto) { @@ -31,12 +32,22 @@ export class TransactionService { amount: distributeTransactionDto.amount, }); - //INSERT TRANSACTION JOURNAL - await this.transactionJournal.insert({ + //INSERT TRANSACTION JOURNAL FOR SEND + await this.transactionJournalRepository.insert({ amount: distributeTransactionDto.amount, transaction: transactionSaved.identifiers[0], }); + //INSERT TRANSACTION JOURNAL FOR RECIEVE + await this.transactionJournalRepository.insert({ + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + }); + + + // await this.coaRepository.update({ + // amount:1 + // }) return true; } From 495ba88ef8369452961d671b32cd50ccc1c2238b Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 7 Dec 2021 20:23:26 +0700 Subject: [PATCH 011/135] add: change implement enum and distribution --- src/helper/enum-list.ts | 25 ++++++++ .../entities/product-history-price.entity.ts | 8 +-- src/product/product.service.ts | 8 +-- src/transaction/coa.service.ts | 29 +++++++++ src/transaction/entities/coa-type.entity.ts | 20 +------ src/transaction/entities/coa.entity.ts | 28 ++------- .../entities/transaction-journal.entity.ts | 52 +++++++++------- .../entities/transactions.entity.ts | 25 ++++---- src/transaction/transaction.module.ts | 3 +- src/transaction/transaction.service.ts | 60 ++++++++++++------- 10 files changed, 147 insertions(+), 111 deletions(-) create mode 100644 src/helper/enum-list.ts create mode 100644 src/transaction/coa.service.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts new file mode 100644 index 0000000..27b3276 --- /dev/null +++ b/src/helper/enum-list.ts @@ -0,0 +1,25 @@ +export enum statusTransaction { + PENDING, + SUCCESS, + FAILED, +} + +export enum typeTransaction { + DISTRIBUTION, + ORDER, +} + +export enum productType { + NORMAL, + PROMO, +} + +export enum coaType { + SYSTEM_BANk, + INCOME, +} + +export enum balanceType { + DEBIT, + CREDIT, +} \ No newline at end of file diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index 99a5aca..4107952 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -6,11 +6,7 @@ import { } from 'typeorm'; import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum Type { - NORMAL, - PROMO, -} +import { productType } from '../../helper/enum-list'; @Entity() export class ProductHistoryPrice extends BaseModel { @@ -30,5 +26,5 @@ export class ProductHistoryPrice extends BaseModel { endDate: Date; @Column('text') - type: Type; + type: productType; } diff --git a/src/product/product.service.ts b/src/product/product.service.ts index b1b97c5..aae809c 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -6,11 +6,7 @@ import { CreateProductDto } from '../product/dto/product/create-product.dto'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; - -enum Type { - NORMAL, - PROMO, -} +import { productType } from '../helper/enum-list'; export class ProductService { constructor( @@ -36,7 +32,7 @@ export class ProductService { await this.productHistoryPrice.insert({ product: result.identifiers[0], - type: Type.NORMAL, + type: productType.NORMAL, startDate: new Date(), endDate: null, }); diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts new file mode 100644 index 0000000..70abf8a --- /dev/null +++ b/src/transaction/coa.service.ts @@ -0,0 +1,29 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { EntityNotFoundError, Repository } from 'typeorm'; +import { InjectRepository } from '@nestjs/typeorm'; +import { COA } from './entities/coa.entity'; + +export class CoaService { + constructor( + @InjectRepository(COA) + private coaRepository: Repository, + ) {} + + async findByUser(id: string) { + try { + return await this.coaRepository.findOneOrFail({ user: id }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } +} diff --git a/src/transaction/entities/coa-type.entity.ts b/src/transaction/entities/coa-type.entity.ts index d2a86ef..bcbd19f 100644 --- a/src/transaction/entities/coa-type.entity.ts +++ b/src/transaction/entities/coa-type.entity.ts @@ -1,23 +1,9 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - ManyToOne, - ManyToMany, - JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum balanceType { - DEBIT, - CREDIT, -} +import { balanceType } from '../../helper/enum-list'; @Entity() export class CoaType extends BaseModel { @@ -26,8 +12,4 @@ export class CoaType extends BaseModel { @Column('text') normalBalance: balanceType; - - @ManyToMany(() => User) - @JoinTable() - user: User[]; } diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index cd95f70..937c84b 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -1,28 +1,9 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - ManyToOne, - ManyToMany, - JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum type { - SYSTEM_BANk, - INCOME, -} - -enum balanceType { - DEBIT, - CREDIT, -} +import { coaType, balanceType } from '../../helper/enum-list'; @Entity() export class COA extends BaseModel { @@ -30,7 +11,7 @@ export class COA extends BaseModel { name: string; @Column('text') - type: type; + type: coaType; @Column('text') balanceType: balanceType; @@ -38,7 +19,6 @@ export class COA extends BaseModel { @Column() amount: number; - @ManyToMany(() => User) - @JoinTable() - user: User[]; + @Column() + user: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index 4f99b5c..85a7e77 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -1,44 +1,52 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, ManyToOne, ManyToMany, JoinTable, OneToOne, + ManyToOne, + ManyToMany, + JoinTable, + OneToOne, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; -import { ProductCategories } from '../../product/entities/product-category.entity'; import { COA } from './coa.entity'; import { Transactions } from './transactions.entity'; import { TransactionType } from './transaction-type.entity'; - -enum type { - SYSTEM_BANk, - INCOME, -} - -enum balanceType { - DEBIT, - CREDIT, -} +import { balanceType } from '../../helper/enum-list'; @Entity() export class TransactionJournal extends BaseModel { @Column('text') - type: type; + type: balanceType; @Column() amount: number; - @OneToOne(() => Transactions, (trans) => trans.id) + @OneToOne( + () => { + return Transactions; + }, + (trans) => { + return trans.id; + }, + ) transaction: Transactions; - @ManyToOne(() => COA, (coa) => coa.id) + @ManyToOne( + () => { + return COA; + }, + (coa) => { + return coa.id; + }, + ) coa: COA; - @ManyToOne(() => TransactionType, (transType) => transType.id) + @ManyToOne( + () => { + return TransactionType; + }, + (transType) => { + return transType.id; + }, + ) transactionType: TransactionType; } diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index bed1e84..af235db 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -10,17 +10,8 @@ import { ManyToMany, JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; -import { COA } from './coa.entity'; -import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; - -enum status { - PENDING, - SUCCESS, - FAILED, -} +import { statusTransaction, typeTransaction } from '../../helper/enum-list'; @Entity() export class Transactions extends BaseModel { @@ -28,8 +19,16 @@ export class Transactions extends BaseModel { amount: number; @Column() - status: status; + status: statusTransaction; - @ManyToOne(() => User, (user) => user.id) - user: User; + @Column() + type: typeTransaction; + + @Column() + user: string; + + @Column({ + nullable: true, + }) + userDestination: string; } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 1f586ed..74dc84e 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -8,6 +8,7 @@ import { CoaType } from './entities/coa-type.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; +import { CoaService } from './coa.service'; @Module({ imports: [ @@ -20,6 +21,6 @@ import { Transactions } from './entities/transactions.entity'; ]), ], controllers: [TransactionController, PpobCallbackController], - providers: [TransactionService], + providers: [TransactionService, CoaService], }) export class TransactionModule {} diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 3582afe..24bc015 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,11 +3,12 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Repository } from 'typeorm'; -import { User } from '../users/entities/user.entity'; +import { Connection, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; +import { CoaService } from './coa.service'; +import { statusTransaction } from '../helper/enum-list'; @Injectable() export class TransactionService { @@ -19,31 +20,50 @@ export class TransactionService { @InjectRepository(TransactionJournal) private transactionJournalRepository: Repository, @InjectRepository(COA) - private coaRepository: Repository + private coaRepository: Repository, + private coaService: CoaService, + private connection: Connection, ) {} async create(distributeTransactionDto: DistributeTransactionDto) { - // GET USER // GET COA + const coaSender = await this.coaService.findByUser('id_user'); + const coaReciever = await this.coaService.findByUser('id_user'); + // GET TYPE TRANSAKSI + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + const transactionSaved = await manager.insert(Transactions, { + amount: distributeTransactionDto.amount, + user: 'id_user', + userDestination: distributeTransactionDto.destination, + status: statusTransaction.SUCCESS, + }); + + //INSERT TRANSACTION JOURNAL FOR SENDER + const journalSender = await manager.insert(TransactionJournal, { + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + coa: coaSender, + }); + + //INSERT TRANSACTION JOURNAL FOR RECEIVER + const journalReceiver = await manager.insert(TransactionJournal, { + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + coa: coaReciever, + }); + + //UPDATE AMOUNT COA SENDER + coaSender.amount = coaSender.amount - distributeTransactionDto.amount; + await manager.save(coaSender); + + coaReciever.amount = coaReciever.amount + distributeTransactionDto.amount; + await manager.save(coaReciever); + }); + //ADD USER IN INSERT - const transactionSaved = await this.transactionRepository.insert({ - amount: distributeTransactionDto.amount, - }); - - //INSERT TRANSACTION JOURNAL FOR SEND - await this.transactionJournalRepository.insert({ - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - }); - - //INSERT TRANSACTION JOURNAL FOR RECIEVE - await this.transactionJournalRepository.insert({ - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - }); - // await this.coaRepository.update({ // amount:1 From 321d296e5b91a6b182afbd6615fd6062dcaca499 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 7 Dec 2021 20:52:24 +0700 Subject: [PATCH 012/135] add: unfinish product export --- src/product/product.module.ts | 1 + src/transaction/dto/order-transaction.dto.ts | 6 ++++++ src/transaction/transaction.controller.ts | 9 +++++---- src/transaction/transaction.module.ts | 3 +++ src/transaction/transaction.service.ts | 17 +++++++++-------- 5 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 src/transaction/dto/order-transaction.dto.ts diff --git a/src/product/product.module.ts b/src/product/product.module.ts index cf65094..e514519 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -24,5 +24,6 @@ import { ProductSubCategoriesService } from './product-sub-categories.service'; ProductCategoriesService, ProductSubCategoriesService, ], + exports: [ProductService], }) export class ProductModule {} diff --git a/src/transaction/dto/order-transaction.dto.ts b/src/transaction/dto/order-transaction.dto.ts new file mode 100644 index 0000000..462682c --- /dev/null +++ b/src/transaction/dto/order-transaction.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; + +export class OrderTransactionDto { + @IsNotEmpty() + productCode: string; +} diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 2b95bf8..d3f09bd 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -9,6 +9,7 @@ import { } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; +import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; @Controller({ @@ -20,12 +21,12 @@ export class TransactionController { @Post() create(@Body() createTransactionDto: DistributeTransactionDto) { - return this.transactionService.create(createTransactionDto); + return this.transactionService.distributeDeposit(createTransactionDto); } - @Get() - findAll() { - return this.transactionService.findAll(); + @Post('order') + orderTransaction(@Body() orderTransactionDto: OrderTransactionDto) { + return this.transactionService.orderTransaction(orderTransactionDto); } @Get(':id') diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 74dc84e..73ead99 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -9,6 +9,8 @@ import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; +import { ProductService } from '../product/product.service'; +import { ProductSubCategoriesService } from '../product/product-sub-categories.service'; @Module({ imports: [ @@ -19,6 +21,7 @@ import { CoaService } from './coa.service'; TransactionJournal, Transactions, ]), + ProductService, ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 24bc015..0dc7fc2 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; +import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; @@ -9,6 +10,7 @@ import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import { statusTransaction } from '../helper/enum-list'; +import { ProductService } from '../product/product.service'; @Injectable() export class TransactionService { @@ -25,7 +27,7 @@ export class TransactionService { private connection: Connection, ) {} - async create(distributeTransactionDto: DistributeTransactionDto) { + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { // GET COA const coaSender = await this.coaService.findByUser('id_user'); const coaReciever = await this.coaService.findByUser('id_user'); @@ -63,16 +65,15 @@ export class TransactionService { await manager.save(coaReciever); }); - //ADD USER IN INSERT - - // await this.coaRepository.update({ - // amount:1 - // }) return true; } - findAll() { - return `This action returns all transaction`; + async orderTransaction(orderTransactionDto: OrderTransactionDto) { + // const product = await this.productService.findOne( + // orderTransactionDto.productCode, + // ); + + return true; } findOne(id: number) { From 37352567f1d2e9db3ae8a9623b774b7736b55598 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Tue, 7 Dec 2021 21:16:08 +0700 Subject: [PATCH 013/135] fix: product module --- src/product/product.service.ts | 2 +- src/transaction/transaction.module.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index aae809c..620f0b4 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -2,7 +2,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; -import { CreateProductDto } from '../product/dto/product/create-product.dto'; +import { CreateProductDto } from './dto/product/create-product.dto'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 73ead99..7a0c84f 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -11,6 +11,7 @@ import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; import { ProductService } from '../product/product.service'; import { ProductSubCategoriesService } from '../product/product-sub-categories.service'; +import { ProductModule } from '../product/product.module'; @Module({ imports: [ @@ -21,7 +22,7 @@ import { ProductSubCategoriesService } from '../product/product-sub-categories.s TransactionJournal, Transactions, ]), - ProductService, + ProductModule, ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], From 426c2ccec8bf058cf10406904eff22372a75cfcd Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 7 Dec 2021 23:07:29 +0700 Subject: [PATCH 014/135] add: transaction distribution and order --- package.json | 1 + src/helper/irs-service.ts | 25 ++++++ src/transaction/coa.service.ts | 5 +- src/transaction/dto/order-transaction.dto.ts | 3 + src/transaction/transaction.controller.ts | 2 +- src/transaction/transaction.module.ts | 2 - src/transaction/transaction.service.ts | 85 +++++++++++++++----- 7 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 src/helper/irs-service.ts diff --git a/package.json b/package.json index 264ca45..8782836 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@nestjs/platform-express": "^8.0.0", "@nestjs/platform-fastify": "^8.0.8", "@nestjs/typeorm": "^8.0.2", + "axios": "^0.24.0", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "crypto": "^1.0.1", diff --git a/src/helper/irs-service.ts b/src/helper/irs-service.ts new file mode 100644 index 0000000..4aea493 --- /dev/null +++ b/src/helper/irs-service.ts @@ -0,0 +1,25 @@ +import * as axios from 'axios'; + +export const createTransaction = async (kode, tujuan) => { + const codeTransaksi = generateRequestId(); + + return axios.default + .get( + `http://h2h.elangpangarep.com/api/h2h?id=PT0005&pin=04JFGC&user=D10BD0&pass=6251F3&kodeproduk=${kode}&tujuan=${tujuan}&counter=1&idtrx=${codeTransaksi}`, + ) + .then((response) => { + return response.data; + }); +}; + +export const generateRequestId = () => { + return `${new Date() + .toLocaleString('en-us', { + year: '2-digit', + month: '2-digit', + day: '2-digit', + }) + .replace(/(\d+)\/(\d+)\/(\d+)/, '$3$1$2')}${Math.random() + .toPrecision(3) + .replace('0.', '')}`; +}; diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 70abf8a..e51d36f 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -2,6 +2,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; +import { coaType } from '../helper/enum-list'; export class CoaService { constructor( @@ -9,9 +10,9 @@ export class CoaService { private coaRepository: Repository, ) {} - async findByUser(id: string) { + async findByUser(id: string, type: coaType) { try { - return await this.coaRepository.findOneOrFail({ user: id }); + return await this.coaRepository.findOneOrFail({ user: id, type: type }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/dto/order-transaction.dto.ts b/src/transaction/dto/order-transaction.dto.ts index 462682c..2081cba 100644 --- a/src/transaction/dto/order-transaction.dto.ts +++ b/src/transaction/dto/order-transaction.dto.ts @@ -3,4 +3,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class OrderTransactionDto { @IsNotEmpty() productCode: string; + + @IsNotEmpty() + destination: string; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index d3f09bd..93734f8 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -19,7 +19,7 @@ import { UpdateTransactionDto } from './dto/update-transaction.dto'; export class TransactionController { constructor(private readonly transactionService: TransactionService) {} - @Post() + @Post('distribute') create(@Body() createTransactionDto: DistributeTransactionDto) { return this.transactionService.distributeDeposit(createTransactionDto); } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 7a0c84f..3369cce 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -9,8 +9,6 @@ import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; -import { ProductService } from '../product/product.service'; -import { ProductSubCategoriesService } from '../product/product-sub-categories.service'; import { ProductModule } from '../product/product.module'; @Module({ diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 0dc7fc2..e5ced1f 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,16 +1,18 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Connection, Repository } from 'typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import { statusTransaction } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; +import * as irsService from '../helper/irs-service'; +import { balanceType, typeTransaction } from '../helper/enum-list'; @Injectable() export class TransactionService { @@ -24,6 +26,7 @@ export class TransactionService { @InjectRepository(COA) private coaRepository: Repository, private coaService: CoaService, + private productService: ProductService, private connection: Connection, ) {} @@ -32,8 +35,6 @@ export class TransactionService { const coaSender = await this.coaService.findByUser('id_user'); const coaReciever = await this.coaService.findByUser('id_user'); - // GET TYPE TRANSAKSI - await this.connection.transaction(async (manager) => { //INSERT TRANSACTION const transactionSaved = await manager.insert(Transactions, { @@ -41,6 +42,7 @@ export class TransactionService { user: 'id_user', userDestination: distributeTransactionDto.destination, status: statusTransaction.SUCCESS, + type: typeTransaction.DISTRIBUTION, }); //INSERT TRANSACTION JOURNAL FOR SENDER @@ -48,6 +50,7 @@ export class TransactionService { amount: distributeTransactionDto.amount, transaction: transactionSaved.identifiers[0], coa: coaSender, + type: balanceType.CREDIT, }); //INSERT TRANSACTION JOURNAL FOR RECEIVER @@ -55,6 +58,7 @@ export class TransactionService { amount: distributeTransactionDto.amount, transaction: transactionSaved.identifiers[0], coa: coaReciever, + type: balanceType.DEBIT, }); //UPDATE AMOUNT COA SENDER @@ -69,22 +73,65 @@ export class TransactionService { } async orderTransaction(orderTransactionDto: OrderTransactionDto) { - // const product = await this.productService.findOne( - // orderTransactionDto.productCode, - // ); + const coaAccount = await this.coaService.findByUser('id_user'); + + //GET PRODUCT + const product = await this.productService.findOne( + orderTransactionDto.productCode, + ); + + if (coaAccount.amount <= product.price) { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because saldo not enough`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + + try { + const orderIRS = await irsService.createTransaction( + orderTransactionDto.productCode, + orderTransactionDto.destination, + ); + + if (orderIRS.success) { + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + const transactionSaved = await manager.insert(Transactions, { + amount: product.price, + user: 'id_user', + status: statusTransaction.SUCCESS, + type: typeTransaction.ORDER, + }); + + //INSERT TRANSACTION JOURNAL + const journalSender = await manager.insert(TransactionJournal, { + amount: product.price, + transaction: transactionSaved.identifiers[0], + coa: coaAccount, + type: balanceType.CREDIT, + }); + + //UPDATE AMOUNT COA + coaAccount.amount = coaAccount.amount - product.price; + await manager.save(coaAccount); + }); + } else { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because ${orderIRS.msg}`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } catch (e) { + throw e; + } return true; } - - findOne(id: number) { - return `This action returns a #${id} transaction`; - } - - update(id: number, updateTransactionDto: UpdateTransactionDto) { - return `This action updates a #${id} transaction`; - } - - remove(id: number) { - return `This action removes a #${id} transaction`; - } } From 2e52ae494e3a38299cdad3afa1456430b549b3c1 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 8 Dec 2021 09:16:43 +0700 Subject: [PATCH 015/135] add: product price --- src/helper/enum-list.ts | 2 +- src/product/dto/product/create-product.dto.ts | 3 ++ .../dto/product/update-price-product.dto.ts | 17 +++++++++++ src/product/dto/product/update-product.dto.ts | 6 ++-- .../entities/product-history-price.entity.ts | 3 ++ src/product/product.service.ts | 23 ++++++++++++++- src/transaction/coa.service.ts | 4 +-- src/transaction/transaction.controller.ts | 18 ------------ src/transaction/transaction.service.ts | 29 +++++++++++++------ 9 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 src/product/dto/product/update-price-product.dto.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 27b3276..68e79ca 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -15,7 +15,7 @@ export enum productType { } export enum coaType { - SYSTEM_BANk, + WALLET, INCOME, } diff --git a/src/product/dto/product/create-product.dto.ts b/src/product/dto/product/create-product.dto.ts index 4c93970..be1ab0c 100644 --- a/src/product/dto/product/create-product.dto.ts +++ b/src/product/dto/product/create-product.dto.ts @@ -13,6 +13,9 @@ export class CreateProductDto { @IsNotEmpty() price: number; + @IsNotEmpty() + markUpPrice: number; + @IsUUID() subCategoriesId: string; } diff --git a/src/product/dto/product/update-price-product.dto.ts b/src/product/dto/product/update-price-product.dto.ts new file mode 100644 index 0000000..9a51190 --- /dev/null +++ b/src/product/dto/product/update-price-product.dto.ts @@ -0,0 +1,17 @@ +import { IsNotEmpty } from 'class-validator'; +import { productType } from '../../../helper/enum-list'; + +export class UpdatePriceProductDto { + @IsNotEmpty() + price: number; + + @IsNotEmpty() + markUpPrice: number; + + @IsNotEmpty() + type: productType; + + startDate: Date; + + endDate: Date; +} diff --git a/src/product/dto/product/update-product.dto.ts b/src/product/dto/product/update-product.dto.ts index e2d43fc..30534c5 100644 --- a/src/product/dto/product/update-product.dto.ts +++ b/src/product/dto/product/update-product.dto.ts @@ -1,4 +1,6 @@ -import { PartialType } from '@nestjs/mapped-types'; +import { OmitType, PartialType } from '@nestjs/mapped-types'; import { CreateProductDto } from './create-product.dto'; -export class UpdateProductDto extends PartialType(CreateProductDto) {} +export class UpdateProductDto extends PartialType( + OmitType(CreateProductDto, ['price'] as const), +) {} diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index 4107952..3b28ccb 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -19,6 +19,9 @@ export class ProductHistoryPrice extends BaseModel { @Column() price: number; + @Column() + markUpPrice: number; + @Column({ type: 'date' }) startDate: Date; diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 620f0b4..cf45007 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -7,6 +7,7 @@ import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { productType } from '../helper/enum-list'; +import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; export class ProductService { constructor( @@ -33,6 +34,8 @@ export class ProductService { await this.productHistoryPrice.insert({ product: result.identifiers[0], type: productType.NORMAL, + price: createProductDto.price, + markUpPrice: createProductDto.markUpPrice, startDate: new Date(), endDate: null, }); @@ -84,6 +87,7 @@ export class ProductService { throw e; } } + const subCategories = await this.productSubCategoriesService.findOne( updateProductDto.subCategoriesId, ); @@ -93,12 +97,29 @@ export class ProductService { code: updateProductDto.code, status: updateProductDto.status, subCategories: subCategories, - price: updateProductDto.price, }); return this.productRepository.findOneOrFail(id); } + async updatePrice( + code: string, + updatePriceProductDto: UpdatePriceProductDto, + ) { + const product = await this.findOne(code); + + await this.productHistoryPrice.insert({ + product: product, + type: updatePriceProductDto.type, + price: updatePriceProductDto.price, + markUpPrice: updatePriceProductDto.markUpPrice, + startDate: updatePriceProductDto.startDate, + endDate: updatePriceProductDto.endDate, + }); + + return + } + async remove(id: string) { try { await this.productRepository.findOneOrFail(id); diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index e51d36f..a5ce977 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -10,9 +10,9 @@ export class CoaService { private coaRepository: Repository, ) {} - async findByUser(id: string, type: coaType) { + async findByUser(id: string, typeOfCoa: coaType) { try { - return await this.coaRepository.findOneOrFail({ user: id, type: type }); + return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 93734f8..8822465 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -28,22 +28,4 @@ export class TransactionController { orderTransaction(@Body() orderTransactionDto: OrderTransactionDto) { return this.transactionService.orderTransaction(orderTransactionDto); } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.transactionService.findOne(+id); - } - - @Patch(':id') - update( - @Param('id') id: string, - @Body() updateTransactionDto: UpdateTransactionDto, - ) { - return this.transactionService.update(+id, updateTransactionDto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.transactionService.remove(+id); - } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index e5ced1f..a99e55a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,18 +1,21 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; -import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Connection, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; -import { statusTransaction } from '../helper/enum-list'; +import { + balanceType, + coaType, + statusTransaction, + typeTransaction, +} from '../helper/enum-list'; import { ProductService } from '../product/product.service'; import * as irsService from '../helper/irs-service'; -import { balanceType, typeTransaction } from '../helper/enum-list'; @Injectable() export class TransactionService { @@ -32,8 +35,14 @@ export class TransactionService { async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { // GET COA - const coaSender = await this.coaService.findByUser('id_user'); - const coaReciever = await this.coaService.findByUser('id_user'); + const coaSender = await this.coaService.findByUser( + 'id_user', + coaType.WALLET, + ); + const coaReciever = await this.coaService.findByUser( + 'id_user', + coaType.WALLET, + ); await this.connection.transaction(async (manager) => { //INSERT TRANSACTION @@ -73,7 +82,10 @@ export class TransactionService { } async orderTransaction(orderTransactionDto: OrderTransactionDto) { - const coaAccount = await this.coaService.findByUser('id_user'); + const coaAccount = await this.coaService.findByUser( + 'id_user', + coaType.WALLET, + ); //GET PRODUCT const product = await this.productService.findOne( @@ -90,8 +102,7 @@ export class TransactionService { ); } - - try { + try { const orderIRS = await irsService.createTransaction( orderTransactionDto.productCode, orderTransactionDto.destination, From 96d5089dc817cd730c38e4041d33247784eaf692 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 8 Dec 2021 03:27:07 +0700 Subject: [PATCH 016/135] add wallet in get user --- src/transaction/transaction.module.ts | 1 + src/users/users.module.ts | 3 ++- src/users/users.service.ts | 10 +++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 3369cce..97c15fd 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -24,5 +24,6 @@ import { ProductModule } from '../product/product.module'; ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], + exports:[CoaService] }) export class TransactionModule {} diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 9dfa3d2..2d718ca 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -3,9 +3,10 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; +import { TransactionModule } from 'src/transaction/transaction.module'; @Module({ - imports: [TypeOrmModule.forFeature([User])], + imports: [TypeOrmModule.forFeature([User]), TransactionModule], controllers: [UsersController], providers: [UsersService], exports: [UsersService], diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 3babecd..44242d3 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -6,12 +6,15 @@ import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { hashPassword } from '../helper/hash_password'; +import { CoaService } from 'src/transaction/coa.service'; +import { coaType } from 'src/helper/enum-list'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository, + private coaService: CoaService ) {} async create(createUserDto: CreateUserDto) { @@ -30,8 +33,13 @@ export class UsersService { } async findOne(id: string) { + const coa = await this.coaService.findByUser(id,coaType.WALLET); try { - return await this.usersRepository.findOneOrFail(id); + const userData = await this.usersRepository.findOneOrFail(id); + return { + ...userData, + wallet:coa.amount, + }; } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( From a418e74db597af797c575056ee6f0d40c6a38d5e Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 8 Dec 2021 10:46:39 +0700 Subject: [PATCH 017/135] add: paging in user and relation when get in user --- src/users/entities/user.entity.ts | 23 ++++++++++++++++++++++- src/users/users.controller.ts | 5 +++-- src/users/users.service.ts | 17 ++++++++++++++--- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 723e4a9..17cea15 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,7 +1,8 @@ +import { Roles } from 'src/configurable/entities/roles.entity'; import { Entity, Column, - PrimaryGeneratedColumn, BeforeInsert, + PrimaryGeneratedColumn, BeforeInsert, ManyToOne, } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; @@ -22,4 +23,24 @@ export class User extends BaseModel { @Column({ default: true }) isActive: boolean; + + @ManyToOne( + () => { + return User; + }, + (user) => { + return user.id; + }, + ) + superior: User; + + @ManyToOne( + () => { + return Roles; + }, + (roles) => { + return roles.id; + }, + ) + roles: Roles; } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 7e45858..f7a7c76 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -8,6 +8,7 @@ import { Delete, ParseUUIDPipe, HttpStatus, + Query, } from '@nestjs/common'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; @@ -30,8 +31,8 @@ export class UsersController { } @Get() - async findAll() { - const [data, count] = await this.usersService.findAll(); + async findAll(@Query('page') page: number) { + const [data, count] = await this.usersService.findAll(page); return { data, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 44242d3..5c01f87 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -28,14 +28,25 @@ export class UsersService { return this.usersRepository.findOneOrFail(result.identifiers[0].id); } - findAll() { - return this.usersRepository.findAndCount(); + findAll(page:number) { + return this.usersRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); } async findOne(id: string) { const coa = await this.coaService.findByUser(id,coaType.WALLET); try { - const userData = await this.usersRepository.findOneOrFail(id); + const userData = await this.usersRepository.findOneOrFail({ + where: { + id: id + }, + relations:["roles","superior"] + }); return { ...userData, wallet:coa.amount, From 10984f65a5b36b37f12faccc0ce1ddf6b4eed1d9 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 8 Dec 2021 11:06:26 +0700 Subject: [PATCH 018/135] add find user by roles --- src/users/dto/create-user.dto.ts | 8 +++++++- src/users/entities/user.entity.ts | 2 +- src/users/users.controller.ts | 12 ++++++++++++ src/users/users.service.ts | 15 ++++++++++++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index f6c8301..2147aed 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,4 +1,4 @@ -import { IsNotEmpty } from 'class-validator'; +import { IsNotEmpty, IsUUID } from 'class-validator'; export class CreateUserDto { @IsNotEmpty() @@ -6,4 +6,10 @@ export class CreateUserDto { @IsNotEmpty() password: string; + + @IsUUID() + roleId: string; + + @IsUUID() + superior: string; } diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 17cea15..e23355a 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -2,7 +2,7 @@ import { Roles } from 'src/configurable/entities/roles.entity'; import { Entity, Column, - PrimaryGeneratedColumn, BeforeInsert, ManyToOne, + PrimaryGeneratedColumn, ManyToOne, } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index f7a7c76..06e5902 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -42,6 +42,18 @@ export class UsersController { }; } + @Get('find-by-roles/:id') + async findByRoles( + @Param('id', ParseUUIDPipe) id: string, + @Query('page') page: number + ) { + return { + data: await this.usersService.findByRoles(id,page), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 5c01f87..af76258 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -38,6 +38,19 @@ export class UsersService { }); } + findByRoles(relationId:string,page:number) { + return this.usersRepository.findAndCount({ + skip: page * 10, + take: 10, + where:{ + roles:relationId + }, + order: { + updatedAt: 'DESC', + }, + }); + } + async findOne(id: string) { const coa = await this.coaService.findByUser(id,coaType.WALLET); try { @@ -83,7 +96,7 @@ export class UsersService { } } - const result = await this.usersRepository.update(id, updateUserDto); + // const result = await this.usersRepository.update(id, updateUserDto); return this.usersRepository.findOneOrFail(id); } From 988d545b6422a1a20cb81bb4eea7e662023bfd04 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 8 Dec 2021 11:14:12 +0700 Subject: [PATCH 019/135] create user --- .../configurable.controller.spec.ts | 4 +-- src/configurable/configurable.controller.ts | 4 +-- src/configurable/configurable.module.ts | 5 ++-- src/configurable/configurable.service.spec.ts | 10 +++---- ...nfigurable.service.ts => roles.service.ts} | 2 +- src/users/users.controller.ts | 2 ++ src/users/users.module.ts | 3 ++- src/users/users.service.ts | 27 ++++++++++++++++++- 8 files changed, 43 insertions(+), 14 deletions(-) rename src/configurable/{configurable.service.ts => roles.service.ts} (96%) diff --git a/src/configurable/configurable.controller.spec.ts b/src/configurable/configurable.controller.spec.ts index 579b37e..2d26cbd 100644 --- a/src/configurable/configurable.controller.spec.ts +++ b/src/configurable/configurable.controller.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ConfigurableController } from './configurable.controller'; -import { ConfigurableService } from './configurable.service'; +import { RoleService } from './roles.service'; describe('ConfigurableController', () => { let controller: ConfigurableController; @@ -8,7 +8,7 @@ describe('ConfigurableController', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [ConfigurableController], - providers: [ConfigurableService], + providers: [RoleService], }).compile(); controller = module.get(ConfigurableController); diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index 21d4c01..8d4d3ca 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -9,14 +9,14 @@ import { ParseUUIDPipe, HttpStatus, Query, } from '@nestjs/common'; -import { ConfigurableService } from './configurable.service'; +import { RoleService } from './roles.service'; @Controller({ path: 'config', version: '1', }) export class ConfigurableController { - constructor(private readonly usersService: ConfigurableService) {} + constructor(private readonly usersService: RoleService) {} @Get() async findAll(@Query('page') page: number) { diff --git a/src/configurable/configurable.module.ts b/src/configurable/configurable.module.ts index da4f11e..5325245 100644 --- a/src/configurable/configurable.module.ts +++ b/src/configurable/configurable.module.ts @@ -2,11 +2,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Roles } from './entities/roles.entity'; import { ConfigurableController } from './configurable.controller'; -import { ConfigurableService } from './configurable.service'; +import { RoleService } from './roles.service'; @Module({ imports: [TypeOrmModule.forFeature([Roles])], controllers: [ConfigurableController], - providers: [ConfigurableService], + providers: [RoleService], + exports: [RoleService] }) export class ConfigurableModule {} diff --git a/src/configurable/configurable.service.spec.ts b/src/configurable/configurable.service.spec.ts index be931a1..bced459 100644 --- a/src/configurable/configurable.service.spec.ts +++ b/src/configurable/configurable.service.spec.ts @@ -1,15 +1,15 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { ConfigurableService } from './configurable.service'; +import { RoleService } from './roles.service'; -describe('ConfigurableService', () => { - let service: ConfigurableService; +describe('RoleService', () => { + let service: RoleService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [ConfigurableService], + providers: [RoleService], }).compile(); - service = module.get(ConfigurableService); + service = module.get(RoleService); }); it('should be defined', () => { diff --git a/src/configurable/configurable.service.ts b/src/configurable/roles.service.ts similarity index 96% rename from src/configurable/configurable.service.ts rename to src/configurable/roles.service.ts index 109c824..9404376 100644 --- a/src/configurable/configurable.service.ts +++ b/src/configurable/roles.service.ts @@ -4,7 +4,7 @@ import { Roles } from './entities/roles.entity'; import { InjectRepository } from '@nestjs/typeorm'; @Injectable() -export class ConfigurableService { +export class RoleService { constructor( @InjectRepository(Roles) private rolesRepository: Repository, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 06e5902..f3389a6 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -23,6 +23,8 @@ export class UsersController { @Post() async create(@Body() createUserDto: CreateUserDto) { + + return { data: await this.usersService.create(createUserDto), statusCode: HttpStatus.CREATED, diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 2d718ca..fd4e301 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -4,9 +4,10 @@ import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; import { TransactionModule } from 'src/transaction/transaction.module'; +import { ConfigurableModule } from 'src/configurable/configurable.module'; @Module({ - imports: [TypeOrmModule.forFeature([User]), TransactionModule], + imports: [TypeOrmModule.forFeature([User]), TransactionModule, ConfigurableModule], controllers: [UsersController], providers: [UsersService], exports: [UsersService], diff --git a/src/users/users.service.ts b/src/users/users.service.ts index af76258..4e8ae5e 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -8,21 +8,28 @@ import { randomStringGenerator } from '@nestjs/common/utils/random-string-genera import { hashPassword } from '../helper/hash_password'; import { CoaService } from 'src/transaction/coa.service'; import { coaType } from 'src/helper/enum-list'; +import { RoleService } from 'src/configurable/roles.service'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository, - private coaService: CoaService + private coaService: CoaService, + private roleService: RoleService ) {} async create(createUserDto: CreateUserDto) { + const roles = await this.roleService.findOne(createUserDto.roleId); + const superior = await this.findExist(createUserDto.superior); + const salt = randomStringGenerator(); const result = await this.usersRepository.insert({ username: createUserDto.username, password: await hashPassword(createUserDto.password, salt), salt, + superior:superior, + roles:roles }); return this.usersRepository.findOneOrFail(result.identifiers[0].id); @@ -51,6 +58,24 @@ export class UsersService { }); } + async findExist(id: string) { + try { + return await this.usersRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findOne(id: string) { const coa = await this.coaService.findByUser(id,coaType.WALLET); try { From 141f3e0e5ce2841d9b719dce4a300b9036439077 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Wed, 8 Dec 2021 15:49:13 +0700 Subject: [PATCH 020/135] feat: basic login --- src/app.module.ts | 2 +- src/auth/auth.module.ts | 14 +++----------- src/auth/dto/input-login.dto.ts | 9 --------- src/auth/dto/response-login.dto.ts | 9 --------- src/auth/local.strategy.ts | 25 +++++++++---------------- src/users/dto/create-user.dto.ts | 5 ++++- yarn.lock | 2 +- 7 files changed, 18 insertions(+), 48 deletions(-) delete mode 100644 src/auth/dto/input-login.dto.ts delete mode 100644 src/auth/dto/response-login.dto.ts diff --git a/src/app.module.ts b/src/app.module.ts index ce2cf6a..463420d 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,7 +8,6 @@ import { LoggerModule } from 'nestjs-pino'; import { TransactionModule } from './transaction/transaction.module'; import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; -// import { AuthModule } from './auth/auth.module'; import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; @@ -53,6 +52,7 @@ import configuration from './config/configuration'; TransactionModule, ConfigurableModule, ProductModule, + AuthModule, ], }) export class AppModule {} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 75cbc4f..8d2d164 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -2,20 +2,12 @@ import { Module } from '@nestjs/common'; import { AuthService } from './auth.service'; import { UsersModule } from '../users/users.module'; import { PassportModule } from '@nestjs/passport'; -import { JwtModule, JwtStrategy } from 'passport-jwt'; +import { LocalStrategy } from './local.strategy'; import { AuthController } from './auth.controller'; @Module({ - imports: [ - UsersModule, - PassportModule.register({ - defaultStrategy: 'jwt', - property: 'user', - session: false, - }), - ], + imports: [UsersModule, PassportModule], + providers: [AuthService, LocalStrategy], controllers: [AuthController], - providers: [AuthService, JwtStrategy], - exports: [PassportModule, JwtModule], }) export class AuthModule {} diff --git a/src/auth/dto/input-login.dto.ts b/src/auth/dto/input-login.dto.ts deleted file mode 100644 index 813ba07..0000000 --- a/src/auth/dto/input-login.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IsNotEmpty } from 'class-validator'; - -export class InputLoginDto { - @IsNotEmpty() - username: string; - - @IsNotEmpty() - password: string; -} diff --git a/src/auth/dto/response-login.dto.ts b/src/auth/dto/response-login.dto.ts deleted file mode 100644 index 3132636..0000000 --- a/src/auth/dto/response-login.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IsNotEmpty } from 'class-validator'; - -export class ResponseLoginDto { - @IsNotEmpty() - username: string; - - @IsNotEmpty() - jwt: string; -} diff --git a/src/auth/local.strategy.ts b/src/auth/local.strategy.ts index 83541f4..b43a0aa 100644 --- a/src/auth/local.strategy.ts +++ b/src/auth/local.strategy.ts @@ -2,7 +2,6 @@ import { Strategy } from 'passport-local'; import { PassportStrategy } from '@nestjs/passport'; import { Injectable, UnauthorizedException } from '@nestjs/common'; import { AuthService } from './auth.service'; -import { User } from '../users/entities/user.entity'; @Injectable() export class LocalStrategy extends PassportStrategy(Strategy) { @@ -10,19 +9,13 @@ export class LocalStrategy extends PassportStrategy(Strategy) { super(); } - // async validate( - // username: string, - // password: string, - // ): Promise> { - // const user = await this.authService.validateUser({ - // username, - // password, - // }); - // - // if (!user) { - // throw new UnauthorizedException(); - // } - // - // return user; - // } + async validate(username: string, password: string): Promise { + const user = await this.authService.validateUser(username, password); + + if (!user) { + throw new UnauthorizedException(); + } + + return user; + } } diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 2147aed..0f42d58 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,4 +1,4 @@ -import { IsNotEmpty, IsUUID } from 'class-validator'; +import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator'; export class CreateUserDto { @IsNotEmpty() @@ -10,6 +10,9 @@ export class CreateUserDto { @IsUUID() roleId: string; + @ValidateIf((o) => { + return !!o.superior; + }) @IsUUID() superior: string; } diff --git a/yarn.lock b/yarn.lock index 5581f74..4400fb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1504,7 +1504,7 @@ avvio@^7.1.2: fastq "^1.6.1" queue-microtask "^1.1.2" -axios@0.24.0: +axios@0.24.0, axios@^0.24.0: version "0.24.0" resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz" integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== From 8b9c43f0f85e1d5054e185915846dce600bc1335 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Wed, 8 Dec 2021 16:28:13 +0700 Subject: [PATCH 021/135] feat: basic login --- src/auth/auth.controller.ts | 21 ++++++++-------- src/auth/auth.service.ts | 50 +++++++++---------------------------- 2 files changed, 23 insertions(+), 48 deletions(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index ea04269..ca340e3 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,13 +1,14 @@ -import { Controller, Post } from '@nestjs/common'; -import { InputLoginDto } from './dto/input-login.dto'; -import { AuthService } from './auth.service'; +import { Controller, Post, UseGuards, Request } from '@nestjs/common'; +import { LocalAuthGuard } from './local-auth.guard'; -@Controller('auth') +@Controller({ + path: 'auth', + version: '1', +}) export class AuthController { - constructor(private readonly authService: AuthService) {} - - // @Post('login') - // public async login( @Body() loginUserDto: InputLoginDto): Promise { - // return await this.authService.findByLogin(loginUserDto); - // } + @UseGuards(LocalAuthGuard) + @Post('login') + async login(@Request() req) { + return req.user; + } } diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 1216af8..0e1ffd9 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,46 +1,20 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; -import { InputLoginDto } from './dto/input-login.dto'; -import { InjectRepository } from '@nestjs/typeorm'; -import { User } from '../users/entities/user.entity'; -import { Repository } from 'typeorm'; import { hashPassword } from '../helper/hash_password'; -import { ResponseLoginDto } from './dto/response-login.dto'; @Injectable() export class AuthService { - constructor( - @InjectRepository(User) - private usersRepository: Repository, - ) {} + constructor(private usersService: UsersService) {} - // async findByLogin({ username, password }: InputLoginDto): Promise { - // const user = await this.usersRepository.findOne({ where: { username } }); - // - // if (!user) { - // throw new HttpException( - // { - // statusCode: HttpStatus.FORBIDDEN, - // error: 'Username not found', - // }, - // HttpStatus.FORBIDDEN, - // ); - // } - // - // // compare passwords - // const hashData = await hashPassword(password, user.salt); - // - // if( hashData != user.password ){ - // throw new HttpException( - // { - // statusCode: HttpStatus.FORBIDDEN, - // error: 'Password Not Match', - // }, - // HttpStatus.FORBIDDEN, - // ); - // } - // - // return ResponseLoginDto(user); - // } + async validateUser(username: string, pass: string): Promise { + const user = await this.usersService.findOneByUsername(username); + if (user && user.password === (await hashPassword(pass, user.salt))) { + const { password, ...result } = user; + + return result; + } + + return null; + } } From 5ff23abda5544d3764a7e90dfdca755dc217c2d8 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Wed, 8 Dec 2021 17:15:02 +0700 Subject: [PATCH 022/135] feat: generate jwt on login --- package.json | 2 ++ src/app.module.ts | 9 +++++---- src/auth/auth.controller.ts | 5 ++++- src/auth/auth.module.ts | 17 ++++++++++++++++- src/auth/auth.service.ts | 17 ++++++++++++++++- src/config/configuration.ts | 1 + yarn.lock | 33 ++++++++++++++++++++++++++++++++- 7 files changed, 76 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 8782836..12187a9 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@nestjs/common": "^8.0.0", "@nestjs/config": "^1.0.1", "@nestjs/core": "^8.0.0", + "@nestjs/jwt": "^8.0.0", "@nestjs/mapped-types": "*", "@nestjs/passport": "^8.0.1", "@nestjs/platform-express": "^8.0.0", @@ -53,6 +54,7 @@ "@types/express": "^4.17.13", "@types/jest": "^27.0.1", "@types/node": "^16.0.0", + "@types/passport-jwt": "^3.0.6", "@types/passport-local": "^1.0.34", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^4.28.2", diff --git a/src/app.module.ts b/src/app.module.ts index 463420d..22dd095 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -21,10 +21,11 @@ import configuration from './config/configuration'; .valid('development', 'production', 'test', 'provision') .default('development'), PORT: Joi.number().default(3000), - DATABASE_CLIENT: Joi.valid('mysql', 'postgres'), - DATABASE_HOST: Joi.string(), - DATABASE_NAME: Joi.string(), - DATABASE_USERNAME: Joi.string(), + SECRET: Joi.string().required(), + DATABASE_CLIENT: Joi.valid('mysql', 'postgres').required(), + DATABASE_HOST: Joi.string().required(), + DATABASE_NAME: Joi.string().required(), + DATABASE_USERNAME: Joi.string().required(), DATABASE_PASSWORD: Joi.string().empty('').default(''), DATABASE_PORT: Joi.number().default(5432), }), diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index ca340e3..34ab9da 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,14 +1,17 @@ import { Controller, Post, UseGuards, Request } from '@nestjs/common'; import { LocalAuthGuard } from './local-auth.guard'; +import { AuthService } from './auth.service'; @Controller({ path: 'auth', version: '1', }) export class AuthController { + constructor(private authService: AuthService) {} + @UseGuards(LocalAuthGuard) @Post('login') async login(@Request() req) { - return req.user; + return this.authService.login(req.user); } } diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 8d2d164..5df33e9 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -4,9 +4,24 @@ import { UsersModule } from '../users/users.module'; import { PassportModule } from '@nestjs/passport'; import { LocalStrategy } from './local.strategy'; import { AuthController } from './auth.controller'; +import { JwtModule } from '@nestjs/jwt'; +import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ - imports: [UsersModule, PassportModule], + imports: [ + UsersModule, + PassportModule, + JwtModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + return { + secret: configService.get('secret'), + signOptions: { expiresIn: '1d' }, + }; + }, + }), + ], providers: [AuthService, LocalStrategy], controllers: [AuthController], }) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 0e1ffd9..5e6ab4b 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,10 +1,14 @@ import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { hashPassword } from '../helper/hash_password'; +import { JwtService } from '@nestjs/jwt'; @Injectable() export class AuthService { - constructor(private usersService: UsersService) {} + constructor( + private usersService: UsersService, + private jwtService: JwtService, + ) {} async validateUser(username: string, pass: string): Promise { const user = await this.usersService.findOneByUsername(username); @@ -17,4 +21,15 @@ export class AuthService { return null; } + + async login(user: any) { + const payload = { + username: user.username, + sub: user.userId, + }; + + return { + access_token: this.jwtService.sign(payload), + }; + } } diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 17bbed2..1b088c3 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -1,6 +1,7 @@ export default () => { return { port: parseInt(process.env.PORT, 10) || 3000, + secret: process.env.SECRET, database: { client: process.env.DATABASE_CLIENT, host: process.env.DATABASE_HOST, diff --git a/yarn.lock b/yarn.lock index 4400fb7..64ac2a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -675,6 +675,14 @@ tslib "2.3.1" uuid "8.3.2" +"@nestjs/jwt@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/jwt/-/jwt-8.0.0.tgz#6c811c17634252dd1dcd5dabf409dbd692b812da" + integrity sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ== + dependencies: + "@types/jsonwebtoken" "8.5.4" + jsonwebtoken "8.5.1" + "@nestjs/mapped-types@*": version "1.0.0" resolved "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.0.tgz" @@ -963,6 +971,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/jsonwebtoken@*": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz#1913e5a61e70a192c5a444623da4901a7b1a9d42" + integrity sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ== + dependencies: + "@types/node" "*" + +"@types/jsonwebtoken@8.5.4": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz#50ccaf0aa6f5d7b9956e70fe323b76e582991913" + integrity sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg== + dependencies: + "@types/node" "*" + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -978,6 +1000,15 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/passport-jwt@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/passport-jwt/-/passport-jwt-3.0.6.tgz#41cc8b5803d5f5f06eb33e19c453b42716def4f1" + integrity sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ== + dependencies: + "@types/express" "*" + "@types/jsonwebtoken" "*" + "@types/passport-strategy" "*" + "@types/passport-local@^1.0.34": version "1.0.34" resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.34.tgz#84d3b35b2fd4d36295039ded17fe5f3eaa62f4f6" @@ -3788,7 +3819,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonwebtoken@^8.2.0: +jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== From 9510a39d5bb3755aee750af0e0f0c75e1e863cdc Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Wed, 8 Dec 2021 18:08:24 +0700 Subject: [PATCH 023/135] feat: jwt authentication --- src/auth/auth.controller.ts | 11 ++++++++++- src/auth/auth.module.ts | 15 ++++++++++++++- src/auth/jwt-auth.guard.ts | 24 ++++++++++++++++++++++++ src/auth/jwt.strategy.ts | 19 +++++++++++++++++++ src/auth/public.decorator.ts | 4 ++++ src/users/users.controller.ts | 2 ++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/auth/jwt-auth.guard.ts create mode 100644 src/auth/jwt.strategy.ts create mode 100644 src/auth/public.decorator.ts diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 34ab9da..b3eb1bb 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,6 +1,8 @@ -import { Controller, Post, UseGuards, Request } from '@nestjs/common'; +import { Controller, Post, UseGuards, Request, Get } from '@nestjs/common'; import { LocalAuthGuard } from './local-auth.guard'; import { AuthService } from './auth.service'; +import { JwtAuthGuard } from './jwt-auth.guard'; +import {Public} from "./public.decorator"; @Controller({ path: 'auth', @@ -9,9 +11,16 @@ import { AuthService } from './auth.service'; export class AuthController { constructor(private authService: AuthService) {} + @Public() @UseGuards(LocalAuthGuard) @Post('login') async login(@Request() req) { return this.authService.login(req.user); } + + @UseGuards(JwtAuthGuard) + @Get('profile') + getProfile(@Request() req) { + return req.user; + } } diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 5df33e9..4ffd567 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -6,11 +6,15 @@ import { LocalStrategy } from './local.strategy'; import { AuthController } from './auth.controller'; import { JwtModule } from '@nestjs/jwt'; import { ConfigModule, ConfigService } from '@nestjs/config'; +import { JwtStrategy } from './jwt.strategy'; +import { APP_GUARD } from '@nestjs/core'; +import { JwtAuthGuard } from './jwt-auth.guard'; @Module({ imports: [ UsersModule, PassportModule, + ConfigModule, JwtModule.registerAsync({ imports: [ConfigModule], inject: [ConfigService], @@ -22,7 +26,16 @@ import { ConfigModule, ConfigService } from '@nestjs/config'; }, }), ], - providers: [AuthService, LocalStrategy], + providers: [ + AuthService, + LocalStrategy, + JwtStrategy, + { + provide: APP_GUARD, + useClass: JwtAuthGuard, + }, + ], controllers: [AuthController], + exports: [AuthService], }) export class AuthModule {} diff --git a/src/auth/jwt-auth.guard.ts b/src/auth/jwt-auth.guard.ts new file mode 100644 index 0000000..9388eae --- /dev/null +++ b/src/auth/jwt-auth.guard.ts @@ -0,0 +1,24 @@ +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { Reflector } from '@nestjs/core'; +import { IS_PUBLIC_KEY } from './public.decorator'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') { + constructor(private reflector: Reflector) { + super(); + } + + canActivate(context: ExecutionContext) { + const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ + context.getHandler(), + context.getClass(), + ]); + + if (isPublic) { + return true; + } + + return super.canActivate(context); + } +} diff --git a/src/auth/jwt.strategy.ts b/src/auth/jwt.strategy.ts new file mode 100644 index 0000000..08eccd1 --- /dev/null +++ b/src/auth/jwt.strategy.ts @@ -0,0 +1,19 @@ +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; +import {ConfigService} from "@nestjs/config"; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor(configService: ConfigService) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: configService.get('secret'), + }); + } + + async validate(payload: any) { + return { userId: payload.sub, username: payload.username }; + } +} diff --git a/src/auth/public.decorator.ts b/src/auth/public.decorator.ts new file mode 100644 index 0000000..b3845e1 --- /dev/null +++ b/src/auth/public.decorator.ts @@ -0,0 +1,4 @@ +import { SetMetadata } from '@nestjs/common'; + +export const IS_PUBLIC_KEY = 'isPublic'; +export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 06e5902..558b8fd 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -13,6 +13,7 @@ import { import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; +import {Public} from "../auth/public.decorator"; @Controller({ path: 'users', @@ -30,6 +31,7 @@ export class UsersController { }; } + @Public() @Get() async findAll(@Query('page') page: number) { const [data, count] = await this.usersService.findAll(page); From d65af44a52a880cfbbc63bae7c0e4e9dae78e1bf Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 8 Dec 2021 21:01:31 +0700 Subject: [PATCH 024/135] journaling --- package-lock.json | 31 +++++++- src/helper/enum-list.ts | 7 ++ src/transaction/coa.service.ts | 21 +++++- src/transaction/dto/create-journal.dto.ts | 35 +++++++++ src/transaction/dto/input-coa.dto.ts | 13 ++++ src/transaction/transaction.module.ts | 4 +- src/transaction/transaction.service.ts | 89 ++++++++++++++++++++++- src/users/users.module.ts | 4 +- src/users/users.service.ts | 25 ++++++- 9 files changed, 220 insertions(+), 9 deletions(-) create mode 100644 src/transaction/dto/create-journal.dto.ts create mode 100644 src/transaction/dto/input-coa.dto.ts diff --git a/package-lock.json b/package-lock.json index 6c5e34d..3947f09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1108,6 +1108,15 @@ "uuid": "8.3.2" } }, + "@nestjs/jwt": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz", + "integrity": "sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==", + "requires": { + "@types/jsonwebtoken": "8.5.4", + "jsonwebtoken": "8.5.1" + } + }, "@nestjs/mapped-types": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", @@ -1514,6 +1523,14 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/jsonwebtoken": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz", + "integrity": "sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==", + "requires": { + "@types/node": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -1523,8 +1540,7 @@ "@types/node": { "version": "16.11.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", - "dev": true + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" }, "@types/parse-json": { "version": "4.0.0", @@ -1541,6 +1557,17 @@ "@types/express": "*" } }, + "@types/passport-jwt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.6.tgz", + "integrity": "sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, "@types/passport-local": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz", diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 68e79ca..aa0600c 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -17,6 +17,13 @@ export enum productType { export enum coaType { WALLET, INCOME, + INVENTORY, + COST_OF_SALES, + SALES, + BANK, + EXPENSE, + ACCOUNT_RECEIVABLE, + ACCOUNT_PAYABLE } export enum balanceType { diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index a5ce977..679ae12 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -1,15 +1,34 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; import { coaType } from '../helper/enum-list'; +import { InputCoaDto } from './dto/input-coa.dto'; +import { UsersService } from 'src/users/users.service'; export class CoaService { constructor( @InjectRepository(COA) private coaRepository: Repository, + @Inject(forwardRef(() => UsersService)) + private userService: UsersService, ) {} + async create(inputCoaDto: InputCoaDto) { + const user = await this.userService.findExist(inputCoaDto.userId) + + const result = await this.coaRepository.insert({ + user:user.id, + name: inputCoaDto.balanceType + '-' + user.username, + balanceType:inputCoaDto.balanceType, + type:inputCoaDto.type + }); + + return this.coaRepository.findOneOrFail( + result.identifiers[0].id, + ); + } + async findByUser(id: string, typeOfCoa: coaType) { try { return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa }); diff --git a/src/transaction/dto/create-journal.dto.ts b/src/transaction/dto/create-journal.dto.ts new file mode 100644 index 0000000..fd218c2 --- /dev/null +++ b/src/transaction/dto/create-journal.dto.ts @@ -0,0 +1,35 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; +import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; +import { EntityManager } from 'typeorm'; + +interface JournalEntry { + coa_id: string; + debit?: number; + credit?: number; +} + +export class CreateJournalDto { + @IsNotEmpty() + transactionalEntityManager: EntityManager; + + @IsNotEmpty() + createTransaction?: boolean; + + @IsNotEmpty() + userId?: string; + + @IsNotEmpty() + transactionId?: string; + + @IsNotEmpty() + type?: typeTransaction; + + @IsNotEmpty() + amount?: number; + + @IsNotEmpty() + transactionStatus?: statusTransaction; + + @IsNotEmpty() + journals: JournalEntry[] +} diff --git a/src/transaction/dto/input-coa.dto.ts b/src/transaction/dto/input-coa.dto.ts new file mode 100644 index 0000000..40b70ae --- /dev/null +++ b/src/transaction/dto/input-coa.dto.ts @@ -0,0 +1,13 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; +import { balanceType, coaType } from 'src/helper/enum-list'; + +export class InputCoaDto { + @IsUUID() + userId: string; + + @IsNotEmpty() + type: coaType; + + @IsNotEmpty() + balanceType: balanceType; +} diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 97c15fd..d9cef39 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { TransactionController } from './transaction.controller'; import { PpobCallbackController } from './ppob_callback.controller'; @@ -10,6 +10,7 @@ import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; import { ProductModule } from '../product/product.module'; +import { UsersModule } from 'src/users/users.module'; @Module({ imports: [ @@ -21,6 +22,7 @@ import { ProductModule } from '../product/product.module'; Transactions, ]), ProductModule, + forwardRef(() => UsersModule), ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index a99e55a..77f6ab5 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,11 +3,14 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Connection, Repository } from 'typeorm'; +import { Connection, EntityManager, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; +import * as uuid from "uuid"; +import { uniq } from "lodash"; +import {Decimal} from 'decimal.js'; import { balanceType, coaType, @@ -16,6 +19,14 @@ import { } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; import * as irsService from '../helper/irs-service'; +import { CreateJournalDto } from './dto/create-journal.dto'; + +interface JournalEntry { + coa_id: string; + debit?: string; + credit?: string; +} + @Injectable() export class TransactionService { @@ -145,4 +156,80 @@ export class TransactionService { return true; } + + async accountingTransaction(createJournalDto: CreateJournalDto ) { + + createJournalDto.transactionId = createJournalDto.transactionId ?? uuid.v4(); + + let creditSum = createJournalDto.journals.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); + let debitSum = createJournalDto.journals.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); + let coaIds = uniq(createJournalDto.journals.map(it => it.coa_id)); + + if (!creditSum.equals(debitSum)) { + throw new Error(`credit and debit doesn't match`); + } + + const coas = await this.coaRepository.findByIds(coaIds); + + let transaction: Transactions; + + if(createJournalDto.createTransaction) { + transaction = new Transactions(); + transaction.id = createJournalDto.transactionId; + transaction.type = createJournalDto.type; + transaction.amount = createJournalDto.amount; + transaction.user = createJournalDto.userId; + transaction.status = createJournalDto.transactionStatus; + + await this.transactionRepository.save(transaction); + } else { + transaction = await this.transactionRepository.findOneOrFail(createJournalDto.transactionId); + } + + await Promise.all(createJournalDto.journals.map(journal => { + const coa = coas.find(it => it.id === journal.coa_id); + + if (!coa) { + throw new Error(`coa ${journal.coa_id} not found`); + } + + const journalEntry = new TransactionJournal(); + journalEntry.coa = coa; + journalEntry.type = journal.debit ? balanceType.DEBIT : balanceType.CREDIT; + journalEntry.amount = (journal.debit) ? journal.debit : journal.credit; + journalEntry.transaction = transaction; + + return this.transactionJournalRepository.save(journalEntry); + })); + + await Promise.all(coaIds.map(coaId => { + let journalPerCoa = createJournalDto.journals.filter(journal => journal.coa_id == coaId); + + let creditSum = journalPerCoa.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); + let debitSum = journalPerCoa.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); + + let coa = coas.find(it => it.id.toLowerCase() === coaId.toLowerCase()); + + let balance = new Decimal(coa.amount); + + if (coa.balanceType === balanceType.DEBIT) { + balance = balance.plus(debitSum.minus(creditSum)); + } else if (coa.balanceType === balanceType.CREDIT) { + balance = balance.plus(creditSum.minus(debitSum)); + } + + const diff = balance.minus(new Decimal(coa.amount)); + + return createJournalDto.transactionalEntityManager + .createQueryBuilder() + .update(COA) + .set({ + amount: () => "amount + " + diff.toString() + }) + .where("id = :id", { id: coa.id }) + .execute(); + })); + + return transaction; + } } diff --git a/src/users/users.module.ts b/src/users/users.module.ts index fd4e301..c9ef16d 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; @@ -7,7 +7,7 @@ import { TransactionModule } from 'src/transaction/transaction.module'; import { ConfigurableModule } from 'src/configurable/configurable.module'; @Module({ - imports: [TypeOrmModule.forFeature([User]), TransactionModule, ConfigurableModule], + imports: [TypeOrmModule.forFeature([User]), forwardRef(() => TransactionModule), ConfigurableModule], controllers: [UsersController], providers: [UsersService], exports: [UsersService], diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 4e8ae5e..c8a33da 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,4 +1,4 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { EntityNotFoundError, Repository } from 'typeorm'; @@ -7,14 +7,16 @@ import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; import { hashPassword } from '../helper/hash_password'; import { CoaService } from 'src/transaction/coa.service'; -import { coaType } from 'src/helper/enum-list'; +import { balanceType, coaType } from 'src/helper/enum-list'; import { RoleService } from 'src/configurable/roles.service'; +import { InputCoaDto } from 'src/transaction/dto/input-coa.dto'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository, + @Inject(forwardRef(() => CoaService)) private coaService: CoaService, private roleService: RoleService ) {} @@ -32,6 +34,25 @@ export class UsersService { roles:roles }); + let dataCoaWallet = new InputCoaDto(); + dataCoaWallet.userId = result.identifiers[0].id; + dataCoaWallet.balanceType = balanceType.CREDIT; + dataCoaWallet.type = coaType.WALLET; + + let dataCoaAR = new InputCoaDto(); + dataCoaAR.userId = result.identifiers[0].id; + dataCoaAR.balanceType = balanceType.CREDIT; + dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; + + let dataCoaPayable = new InputCoaDto(); + dataCoaPayable.userId = result.identifiers[0].id; + dataCoaPayable.balanceType = balanceType.CREDIT; + dataCoaPayable.type = coaType.ACCOUNT_PAYABLE; + + await this.coaService.create(dataCoaWallet); + await this.coaService.create(dataCoaAR); + await this.coaService.create(dataCoaPayable); + return this.usersRepository.findOneOrFail(result.identifiers[0].id); } From d030624765d11ecf62951ce51cdd404de99ed652 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 01:52:44 +0700 Subject: [PATCH 025/135] fix create membership --- src/helper/enum-list.ts | 2 + .../entities/product-history-price.entity.ts | 5 +- src/transaction/coa.service.ts | 18 +++++-- src/transaction/dto/input-coa.dto.ts | 3 ++ src/transaction/entities/coa-type.entity.ts | 15 ------ src/transaction/entities/coa.entity.ts | 5 ++ src/transaction/transaction.module.ts | 2 - src/users/dto/create-user.dto.ts | 13 +++-- src/users/users.controller.ts | 10 ++-- src/users/users.service.ts | 49 ++++++++++++++----- 10 files changed, 78 insertions(+), 44 deletions(-) delete mode 100644 src/transaction/entities/coa-type.entity.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index aa0600c..7477e13 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -7,6 +7,8 @@ export enum statusTransaction { export enum typeTransaction { DISTRIBUTION, ORDER, + DEPOSIT_IRS, + } export enum productType { diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index 3b28ccb..e7d7d16 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -25,7 +25,10 @@ export class ProductHistoryPrice extends BaseModel { @Column({ type: 'date' }) startDate: Date; - @Column({ type: 'date' }) + @Column({ + type: 'date', + nullable:true + }) endDate: Date; @Column('text') diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 679ae12..fcfda29 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -2,7 +2,7 @@ import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nest import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; -import { coaType } from '../helper/enum-list'; +import { balanceType, coaType } from '../helper/enum-list'; import { InputCoaDto } from './dto/input-coa.dto'; import { UsersService } from 'src/users/users.service'; @@ -16,17 +16,25 @@ export class CoaService { async create(inputCoaDto: InputCoaDto) { const user = await this.userService.findExist(inputCoaDto.userId) - + console.log(coaType[inputCoaDto.type]) + console.log(inputCoaDto.type) const result = await this.coaRepository.insert({ user:user.id, - name: inputCoaDto.balanceType + '-' + user.username, + name: coaType[inputCoaDto.type] + '-' + user.username, balanceType:inputCoaDto.balanceType, - type:inputCoaDto.type + type:inputCoaDto.type, + amount:0 }); - return this.coaRepository.findOneOrFail( + const coaData = await this.coaRepository.findOneOrFail( result.identifiers[0].id, ); + if(inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || inputCoaDto.type == coaType.ACCOUNT_PAYABLE){ + coaData.relatedUser = inputCoaDto.relatedUserId; + await this.coaRepository.save(coaData) + } + + return coaData; } async findByUser(id: string, typeOfCoa: coaType) { diff --git a/src/transaction/dto/input-coa.dto.ts b/src/transaction/dto/input-coa.dto.ts index 40b70ae..217ec2d 100644 --- a/src/transaction/dto/input-coa.dto.ts +++ b/src/transaction/dto/input-coa.dto.ts @@ -10,4 +10,7 @@ export class InputCoaDto { @IsNotEmpty() balanceType: balanceType; + + @IsUUID() + relatedUserId: string; } diff --git a/src/transaction/entities/coa-type.entity.ts b/src/transaction/entities/coa-type.entity.ts deleted file mode 100644 index bcbd19f..0000000 --- a/src/transaction/entities/coa-type.entity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - Entity, - Column, -} from 'typeorm'; -import { BaseModel } from '../../config/basemodel.entity'; -import { balanceType } from '../../helper/enum-list'; - -@Entity() -export class CoaType extends BaseModel { - @Column() - name: string; - - @Column('text') - normalBalance: balanceType; -} diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index 937c84b..a463b68 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -21,4 +21,9 @@ export class COA extends BaseModel { @Column() user: string; + + @Column({ + nullable:true + }) + relatedUser: string; } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index d9cef39..8b1f631 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -4,7 +4,6 @@ import { TransactionController } from './transaction.controller'; import { PpobCallbackController } from './ppob_callback.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; -import { CoaType } from './entities/coa-type.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; @@ -15,7 +14,6 @@ import { UsersModule } from 'src/users/users.module'; @Module({ imports: [ TypeOrmModule.forFeature([ - CoaType, TransactionType, COA, TransactionJournal, diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 0f42d58..d9f00b8 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -10,9 +10,12 @@ export class CreateUserDto { @IsUUID() roleId: string; - @ValidateIf((o) => { - return !!o.superior; - }) - @IsUUID() - superior: string; + @IsNotEmpty() + superior: boolean; + + // @ValidateIf((o) => { + // return !!o.superior; + // }) + // @IsUUID() + // superior: string; } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 3bd249e..4b64e5f 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -9,6 +9,7 @@ import { ParseUUIDPipe, HttpStatus, Query, + Request } from '@nestjs/common'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; @@ -23,11 +24,12 @@ export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() - async create(@Body() createUserDto: CreateUserDto) { - - + async create( + @Request() req, + @Body() createUserDto: CreateUserDto + ) { return { - data: await this.usersService.create(createUserDto), + data: await this.usersService.create(createUserDto,req.user), statusCode: HttpStatus.CREATED, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index c8a33da..845f3a7 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -21,9 +21,9 @@ export class UsersService { private roleService: RoleService ) {} - async create(createUserDto: CreateUserDto) { + async create(createUserDto: CreateUserDto, currentUser: any) { const roles = await this.roleService.findOne(createUserDto.roleId); - const superior = await this.findExist(createUserDto.superior); + const superior = await this.findByUsername(currentUser.username); const salt = randomStringGenerator(); const result = await this.usersRepository.insert({ @@ -39,19 +39,24 @@ export class UsersService { dataCoaWallet.balanceType = balanceType.CREDIT; dataCoaWallet.type = coaType.WALLET; - let dataCoaAR = new InputCoaDto(); - dataCoaAR.userId = result.identifiers[0].id; - dataCoaAR.balanceType = balanceType.CREDIT; - dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; + if(createUserDto.superior){ + let dataCoaAP = new InputCoaDto(); + dataCoaAP.userId = result.identifiers[0].id; + dataCoaAP.balanceType = balanceType.CREDIT; + dataCoaAP.relatedUserId = superior.id; + dataCoaAP.type = coaType.ACCOUNT_PAYABLE; - let dataCoaPayable = new InputCoaDto(); - dataCoaPayable.userId = result.identifiers[0].id; - dataCoaPayable.balanceType = balanceType.CREDIT; - dataCoaPayable.type = coaType.ACCOUNT_PAYABLE; + let dataCoaAR = new InputCoaDto(); + dataCoaAR.userId = result.identifiers[0].id; + dataCoaAR.balanceType = balanceType.DEBIT; + dataCoaAR.relatedUserId = superior.id; + dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; + + await this.coaService.create(dataCoaAP); + await this.coaService.create(dataCoaAR); + } await this.coaService.create(dataCoaWallet); - await this.coaService.create(dataCoaAR); - await this.coaService.create(dataCoaPayable); return this.usersRepository.findOneOrFail(result.identifiers[0].id); } @@ -97,6 +102,26 @@ export class UsersService { } } + async findByUsername(username: string) { + try { + return await this.usersRepository.findOneOrFail({ + username:username + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findOne(id: string) { const coa = await this.coaService.findByUser(id,coaType.WALLET); try { From 84fda27e2d8877a2d5b471134432cb7558b0eef6 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 02:18:02 +0700 Subject: [PATCH 026/135] fix user input --- src/transaction/coa.service.ts | 24 ++++----- src/transaction/dto/input-coa.dto.ts | 7 ++- src/users/users.service.ts | 76 ++++++++++++++++------------ 3 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index fcfda29..aad3b45 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -15,23 +15,19 @@ export class CoaService { ) {} async create(inputCoaDto: InputCoaDto) { - const user = await this.userService.findExist(inputCoaDto.userId) - console.log(coaType[inputCoaDto.type]) - console.log(inputCoaDto.type) - const result = await this.coaRepository.insert({ - user:user.id, - name: coaType[inputCoaDto.type] + '-' + user.username, - balanceType:inputCoaDto.balanceType, - type:inputCoaDto.type, - amount:0 - }); + const user = inputCoaDto.user + let coaData = new COA(); + coaData.user = user.id; + coaData.name = coaType[inputCoaDto.type] + '-' + user.username; + coaData.balanceType = inputCoaDto.balanceType; + coaData.type = inputCoaDto.type; + coaData.amount = 0; + + const result = await inputCoaDto.coaEntityManager.insert(COA,coaData); - const coaData = await this.coaRepository.findOneOrFail( - result.identifiers[0].id, - ); if(inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || inputCoaDto.type == coaType.ACCOUNT_PAYABLE){ coaData.relatedUser = inputCoaDto.relatedUserId; - await this.coaRepository.save(coaData) + await inputCoaDto.coaEntityManager.save(coaData) } return coaData; diff --git a/src/transaction/dto/input-coa.dto.ts b/src/transaction/dto/input-coa.dto.ts index 217ec2d..5e068dc 100644 --- a/src/transaction/dto/input-coa.dto.ts +++ b/src/transaction/dto/input-coa.dto.ts @@ -1,9 +1,11 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { balanceType, coaType } from 'src/helper/enum-list'; +import { User } from 'src/users/entities/user.entity'; +import { EntityManager } from 'typeorm'; export class InputCoaDto { @IsUUID() - userId: string; + user: User; @IsNotEmpty() type: coaType; @@ -13,4 +15,7 @@ export class InputCoaDto { @IsUUID() relatedUserId: string; + + @IsNotEmpty() + coaEntityManager: EntityManager; } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 845f3a7..6cf326e 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,7 +1,7 @@ import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { EntityNotFoundError, Repository } from 'typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; @@ -10,6 +10,7 @@ import { CoaService } from 'src/transaction/coa.service'; import { balanceType, coaType } from 'src/helper/enum-list'; import { RoleService } from 'src/configurable/roles.service'; import { InputCoaDto } from 'src/transaction/dto/input-coa.dto'; +import * as uuid from "uuid"; @Injectable() export class UsersService { @@ -18,47 +19,56 @@ export class UsersService { private usersRepository: Repository, @Inject(forwardRef(() => CoaService)) private coaService: CoaService, - private roleService: RoleService + private roleService: RoleService, + private connection: Connection, ) {} async create(createUserDto: CreateUserDto, currentUser: any) { const roles = await this.roleService.findOne(createUserDto.roleId); const superior = await this.findByUsername(currentUser.username); - const salt = randomStringGenerator(); - const result = await this.usersRepository.insert({ - username: createUserDto.username, - password: await hashPassword(createUserDto.password, salt), - salt, - superior:superior, - roles:roles - }); + + let userData = new User(); + userData.id = uuid.v4(); + userData.username = createUserDto.username, + userData.password = await hashPassword(createUserDto.password, salt), + userData.salt = salt, + userData.superior = superior, + userData.roles = roles - let dataCoaWallet = new InputCoaDto(); - dataCoaWallet.userId = result.identifiers[0].id; - dataCoaWallet.balanceType = balanceType.CREDIT; - dataCoaWallet.type = coaType.WALLET; + await this.connection.transaction(async (manager) => { + const result = await manager.insert(User,userData); + + let dataCoaWallet = new InputCoaDto(); + dataCoaWallet.user = userData; + dataCoaWallet.balanceType = balanceType.CREDIT; + dataCoaWallet.type = coaType.WALLET; + dataCoaWallet.coaEntityManager = manager; + + if(createUserDto.superior){ + let dataCoaAP = new InputCoaDto(); + dataCoaAP.user = userData; + dataCoaAP.balanceType = balanceType.CREDIT; + dataCoaAP.relatedUserId = superior.id; + dataCoaAP.type = coaType.ACCOUNT_PAYABLE; + dataCoaAP.coaEntityManager = manager; + + let dataCoaAR = new InputCoaDto(); + dataCoaAR.user = userData; + dataCoaAR.balanceType = balanceType.DEBIT; + dataCoaAR.relatedUserId = superior.id; + dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; + dataCoaAR.coaEntityManager = manager; + + await this.coaService.create(dataCoaAP); + await this.coaService.create(dataCoaAR); + } + + await this.coaService.create(dataCoaWallet); - if(createUserDto.superior){ - let dataCoaAP = new InputCoaDto(); - dataCoaAP.userId = result.identifiers[0].id; - dataCoaAP.balanceType = balanceType.CREDIT; - dataCoaAP.relatedUserId = superior.id; - dataCoaAP.type = coaType.ACCOUNT_PAYABLE; + }) - let dataCoaAR = new InputCoaDto(); - dataCoaAR.userId = result.identifiers[0].id; - dataCoaAR.balanceType = balanceType.DEBIT; - dataCoaAR.relatedUserId = superior.id; - dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; - - await this.coaService.create(dataCoaAP); - await this.coaService.create(dataCoaAR); - } - - await this.coaService.create(dataCoaWallet); - - return this.usersRepository.findOneOrFail(result.identifiers[0].id); + return userData; } findAll(page:number) { From 1f44cf484cf387579ec68b3090cbc0c910978c46 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 03:22:52 +0700 Subject: [PATCH 027/135] add saldo IRS --- .vscode/launch.json | 15 +++++ src/helper/enum-list.ts | 1 - src/transaction/coa.service.ts | 18 +++++ src/transaction/dto/add-saldo-supplier.dto.ts | 12 ++++ src/transaction/dto/create-journal.dto.ts | 3 +- src/transaction/transaction.controller.ts | 17 +++++ src/transaction/transaction.service.ts | 67 ++++++++++++++----- 7 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 src/transaction/dto/add-saldo-supplier.dto.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7a9dfa0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 7477e13..303ff60 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -8,7 +8,6 @@ export enum typeTransaction { DISTRIBUTION, ORDER, DEPOSIT_IRS, - } export enum productType { diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index aad3b45..10222a9 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -50,4 +50,22 @@ export class CoaService { } } } + + async findByName(name: string) { + try { + return await this.coaRepository.findOneOrFail({ name: name }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'COA Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } diff --git a/src/transaction/dto/add-saldo-supplier.dto.ts b/src/transaction/dto/add-saldo-supplier.dto.ts new file mode 100644 index 0000000..6f27f52 --- /dev/null +++ b/src/transaction/dto/add-saldo-supplier.dto.ts @@ -0,0 +1,12 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; +import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; +import { EntityManager } from 'typeorm'; + + +export class AddSaldoSupplier { + @IsNotEmpty() + supplier?: string; + + @IsNotEmpty() + amount?: number; +} diff --git a/src/transaction/dto/create-journal.dto.ts b/src/transaction/dto/create-journal.dto.ts index fd218c2..0cbf949 100644 --- a/src/transaction/dto/create-journal.dto.ts +++ b/src/transaction/dto/create-journal.dto.ts @@ -1,6 +1,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; import { EntityManager } from 'typeorm'; +import { Transactions } from '../entities/transactions.entity'; interface JournalEntry { coa_id: string; @@ -19,7 +20,7 @@ export class CreateJournalDto { userId?: string; @IsNotEmpty() - transactionId?: string; + transaction?: Transactions; @IsNotEmpty() type?: typeTransaction; diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 8822465..e0f5ccd 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -6,11 +6,14 @@ import { Patch, Param, Delete, + Request, + HttpStatus } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; +import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; @Controller({ path: 'transaction', @@ -24,6 +27,20 @@ export class TransactionController { return this.transactionService.distributeDeposit(createTransactionDto); } + @Post('add-saldo-supplier') + async addSaldoSupplier( + @Body() addSaldoSupplier: AddSaldoSupplier, + @Request() req + ) { + + return { + data: await this.transactionService.addIRSWallet(addSaldoSupplier,req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + + @Post('order') orderTransaction(@Body() orderTransactionDto: OrderTransactionDto) { return this.transactionService.orderTransaction(orderTransactionDto); diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 77f6ab5..379d78a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -20,6 +20,8 @@ import { import { ProductService } from '../product/product.service'; import * as irsService from '../helper/irs-service'; import { CreateJournalDto } from './dto/create-journal.dto'; +import { UsersService } from 'src/users/users.service'; +import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; interface JournalEntry { coa_id: string; @@ -27,7 +29,6 @@ interface JournalEntry { credit?: string; } - @Injectable() export class TransactionService { constructor( @@ -41,9 +42,55 @@ export class TransactionService { private coaRepository: Repository, private coaService: CoaService, private productService: ProductService, + private userService: UsersService, private connection: Connection, ) {} + async addIRSWallet(addSaldoSupplier: AddSaldoSupplier,currentUser:any) { + // GET COA + const coaBank = await this.coaService.findByName( + coaType[coaType.BANK]+'-SYSTEM', + ); + + const coaInventory = await this.coaService.findByName( + coaType[coaType.INVENTORY]+'-'+addSaldoSupplier.supplier, + ); + console.log(coaInventory); + + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + + + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = addSaldoSupplier.amount, + transactionData.user = userData.id, + transactionData.status = statusTransaction.SUCCESS, + transactionData.type = typeTransaction.DISTRIBUTION, + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager:manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [{ + coa_id: coaBank.id, + debit: transactionData.amount + }, { + coa_id: coaInventory.id, + credit: transactionData.amount + }] + }); + + }); + + return true; + } + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { // GET COA const coaSender = await this.coaService.findByUser( @@ -158,9 +205,6 @@ export class TransactionService { } async accountingTransaction(createJournalDto: CreateJournalDto ) { - - createJournalDto.transactionId = createJournalDto.transactionId ?? uuid.v4(); - let creditSum = createJournalDto.journals.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); let debitSum = createJournalDto.journals.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); let coaIds = uniq(createJournalDto.journals.map(it => it.coa_id)); @@ -171,20 +215,9 @@ export class TransactionService { const coas = await this.coaRepository.findByIds(coaIds); - let transaction: Transactions; + console.log("berhasil") - if(createJournalDto.createTransaction) { - transaction = new Transactions(); - transaction.id = createJournalDto.transactionId; - transaction.type = createJournalDto.type; - transaction.amount = createJournalDto.amount; - transaction.user = createJournalDto.userId; - transaction.status = createJournalDto.transactionStatus; - - await this.transactionRepository.save(transaction); - } else { - transaction = await this.transactionRepository.findOneOrFail(createJournalDto.transactionId); - } + const transaction = createJournalDto.transaction await Promise.all(createJournalDto.journals.map(journal => { const coa = coas.find(it => it.id === journal.coa_id); From e25f97ee9c6b0018161ce5248679488607a2ae02 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 03:40:12 +0700 Subject: [PATCH 028/135] add distribute from admin to supervisor --- .../entities/transaction-journal.entity.ts | 10 ---- src/transaction/transaction.controller.ts | 12 +++++ src/transaction/transaction.service.ts | 46 ++++++++++++++++++- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index 85a7e77..ad5ba0a 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -39,14 +39,4 @@ export class TransactionJournal extends BaseModel { }, ) coa: COA; - - @ManyToOne( - () => { - return TransactionType; - }, - (transType) => { - return transType.id; - }, - ) - transactionType: TransactionType; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index e0f5ccd..87aa3d7 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -27,6 +27,18 @@ export class TransactionController { return this.transactionService.distributeDeposit(createTransactionDto); } + @Post('distribute-admin') + distributeAdmin( + @Body() createTransactionDto: DistributeTransactionDto, + @Request() req + ) { + return { + data: this.transactionService.distributeFromAdmin(createTransactionDto,req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Post('add-saldo-supplier') async addSaldoSupplier( @Body() addSaldoSupplier: AddSaldoSupplier, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 379d78a..b5590db 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -68,7 +68,7 @@ export class TransactionService { transactionData.amount = addSaldoSupplier.amount, transactionData.user = userData.id, transactionData.status = statusTransaction.SUCCESS, - transactionData.type = typeTransaction.DISTRIBUTION, + transactionData.type = typeTransaction.DEPOSIT_IRS, await manager.insert(Transactions, transactionData); @@ -91,6 +91,50 @@ export class TransactionService { return true; } + async distributeFromAdmin(distributeTransactionDto: DistributeTransactionDto,currentUser:any) { + // GET COA + const coaAR = await this.coaService.findByUser( + distributeTransactionDto.destination, + coaType.ACCOUNT_RECEIVABLE, + ); + const coaWallet = await this.coaService.findByUser( + distributeTransactionDto.destination, + coaType.WALLET, + ); + + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = distributeTransactionDto.amount, + transactionData.user = userData.id, + transactionData.status = statusTransaction.SUCCESS, + transactionData.type = typeTransaction.DISTRIBUTION, + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager:manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [{ + coa_id: coaAR.id, + debit: transactionData.amount + }, { + coa_id: coaWallet.id, + credit: transactionData.amount + }] + }); + + }); + + return true; + } + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { // GET COA const coaSender = await this.coaService.findByUser( From 78a2cadb5e5aa42c440d6c6e1067217a99c45250 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 03:57:34 +0700 Subject: [PATCH 029/135] distribute saldo --- src/transaction/coa.service.ts | 18 +++++ src/transaction/transaction.controller.ts | 7 +- src/transaction/transaction.service.ts | 84 +++++++++++++---------- 3 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 10222a9..d828f5f 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -51,6 +51,24 @@ export class CoaService { } } + async findByUserWithRelated(id: string, relatedId: string, typeOfCoa: coaType) { + try { + return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa, relatedUser:relatedId }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Coa Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findByName(name: string) { try { return await this.coaRepository.findOneOrFail({ name: name }); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 87aa3d7..801fcc7 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -23,8 +23,11 @@ export class TransactionController { constructor(private readonly transactionService: TransactionService) {} @Post('distribute') - create(@Body() createTransactionDto: DistributeTransactionDto) { - return this.transactionService.distributeDeposit(createTransactionDto); + create( + @Body() createTransactionDto: DistributeTransactionDto, + @Request() req + ) { + return this.transactionService.distributeDeposit(createTransactionDto,req.user); } @Post('distribute-admin') diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index b5590db..0313d0f 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -85,7 +85,6 @@ export class TransactionService { credit: transactionData.amount }] }); - }); return true; @@ -135,49 +134,62 @@ export class TransactionService { return true; } - async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto,currentUser:any) { + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + // GET COA - const coaSender = await this.coaService.findByUser( - 'id_user', + const coaSenderWallet = await this.coaService.findByUser( + userData.id, coaType.WALLET, ); - const coaReciever = await this.coaService.findByUser( - 'id_user', + + const coaAP = await this.coaService.findByUserWithRelated( + distributeTransactionDto.destination, + userData.id, + coaType.ACCOUNT_PAYABLE, + ); + + const coaReceiverWallet = await this.coaService.findByUser( + distributeTransactionDto.destination, coaType.WALLET, ); + const coaAR = await this.coaService.findByUserWithRelated( + distributeTransactionDto.destination, + userData.id, + coaType.ACCOUNT_RECEIVABLE, + ); + await this.connection.transaction(async (manager) => { - //INSERT TRANSACTION - const transactionSaved = await manager.insert(Transactions, { - amount: distributeTransactionDto.amount, - user: 'id_user', - userDestination: distributeTransactionDto.destination, - status: statusTransaction.SUCCESS, - type: typeTransaction.DISTRIBUTION, + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = distributeTransactionDto.amount, + transactionData.user = userData.id, + transactionData.status = statusTransaction.SUCCESS, + transactionData.type = typeTransaction.DISTRIBUTION, + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager:manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [{ + coa_id: coaSenderWallet.id, + debit: transactionData.amount + }, { + coa_id: coaReceiverWallet.id, + credit: transactionData.amount + }, { + coa_id: coaAR.id, + debit: transactionData.amount + }, { + coa_id: coaAP.id, + credit: transactionData.amount + }] }); - - //INSERT TRANSACTION JOURNAL FOR SENDER - const journalSender = await manager.insert(TransactionJournal, { - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - coa: coaSender, - type: balanceType.CREDIT, - }); - - //INSERT TRANSACTION JOURNAL FOR RECEIVER - const journalReceiver = await manager.insert(TransactionJournal, { - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - coa: coaReciever, - type: balanceType.DEBIT, - }); - - //UPDATE AMOUNT COA SENDER - coaSender.amount = coaSender.amount - distributeTransactionDto.amount; - await manager.save(coaSender); - - coaReciever.amount = coaReciever.amount + distributeTransactionDto.amount; - await manager.save(coaReciever); }); return true; From 847f6f45d6eb01bb8e7b185381be37c420071b9f Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 17:02:05 +0700 Subject: [PATCH 030/135] add unfinish order transaction --- src/product/entities/product.entity.ts | 5 + src/transaction/dto/order-transaction.dto.ts | 3 - src/transaction/transaction.controller.ts | 7 +- src/transaction/transaction.service.ts | 124 ++++++++++++------- 4 files changed, 91 insertions(+), 48 deletions(-) diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index a139fe0..2a3cef8 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -29,6 +29,11 @@ export class Product extends BaseModel{ @Column() price: number; + @Column({ + nullable:true + }) + basePrice: number; + @ManyToOne( () => ProductSubCategories, (subCategories) => subCategories.category, diff --git a/src/transaction/dto/order-transaction.dto.ts b/src/transaction/dto/order-transaction.dto.ts index 2081cba..462682c 100644 --- a/src/transaction/dto/order-transaction.dto.ts +++ b/src/transaction/dto/order-transaction.dto.ts @@ -3,7 +3,4 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class OrderTransactionDto { @IsNotEmpty() productCode: string; - - @IsNotEmpty() - destination: string; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 801fcc7..af080c3 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -57,7 +57,10 @@ export class TransactionController { @Post('order') - orderTransaction(@Body() orderTransactionDto: OrderTransactionDto) { - return this.transactionService.orderTransaction(orderTransactionDto); + orderTransaction( + @Body() orderTransactionDto: OrderTransactionDto, + @Request() req + ) { + return this.transactionService.orderTransaction(orderTransactionDto,req.user); } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 0313d0f..e5b211b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -55,7 +55,6 @@ export class TransactionService { const coaInventory = await this.coaService.findByName( coaType[coaType.INVENTORY]+'-'+addSaldoSupplier.supplier, ); - console.log(coaInventory); //GET USER const userData = await this.userService.findByUsername(currentUser.username); @@ -195,16 +194,58 @@ export class TransactionService { return true; } - async orderTransaction(orderTransactionDto: OrderTransactionDto) { - const coaAccount = await this.coaService.findByUser( - 'id_user', - coaType.WALLET, - ); - + async orderTransaction(orderTransactionDto: OrderTransactionDto,currentUser:any) { //GET PRODUCT const product = await this.productService.findOne( orderTransactionDto.productCode, ); + + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + let supervisorData = []; + if(userData.superior != null){ + supervisorData.push(await this.userService.findByUsername(currentUser.username)); + if(supervisorData[0].superior != null){ + supervisorData.push(await this.userService.findByUsername(currentUser.username)); + if(supervisorData[0].superior != null){ + supervisorData.push(await this.userService.findByUsername(currentUser.username)); + } + } + } + + //GET COA + const coaAccount = await this.coaService.findByUser( + userData.id, + coaType.WALLET, + ); + + const coaInventory = await this.coaService.findByName( + coaType[coaType.INVENTORY]+'-IRS', + ); + + const coaCostOfSales = await this.coaService.findByName( + coaType[coaType.COST_OF_SALES]+'-SYSTEM', + ); + + const coaSales = await this.coaService.findByName( + coaType[coaType.SALES]+'-SYSTEM', + ); + + const coaExpense = await this.coaService.findByName( + coaType[coaType.EXPENSE]+'-SYSTEM', + ); + + supervisorData = supervisorData.map(async it =>{ + const coaAccount = await this.coaService.findByUser( + it.id, + coaType.WALLET, + ); + + return { + coa_id: coaAccount.id, + credit: 0 + } + }) if (coaAccount.amount <= product.price) { throw new HttpException( @@ -217,46 +258,43 @@ export class TransactionService { } try { - const orderIRS = await irsService.createTransaction( - orderTransactionDto.productCode, - orderTransactionDto.destination, - ); - - if (orderIRS.success) { - await this.connection.transaction(async (manager) => { - //INSERT TRANSACTION - const transactionSaved = await manager.insert(Transactions, { - amount: product.price, - user: 'id_user', - status: statusTransaction.SUCCESS, - type: typeTransaction.ORDER, - }); - - //INSERT TRANSACTION JOURNAL - const journalSender = await manager.insert(TransactionJournal, { - amount: product.price, - transaction: transactionSaved.identifiers[0], - coa: coaAccount, - type: balanceType.CREDIT, - }); - - //UPDATE AMOUNT COA - coaAccount.amount = coaAccount.amount - product.price; - await manager.save(coaAccount); + await this.connection.transaction(async (manager) => { + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = product.price, + transactionData.user = userData.id, + transactionData.status = statusTransaction.SUCCESS, + transactionData.type = typeTransaction.DISTRIBUTION, + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager:manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [{ + coa_id: coaInventory.id, + credit: product.basePrice + }, { + coa_id: coaCostOfSales.id, + debit: product.basePrice + }, { + coa_id: coaAccount.id, + debit: product.price + }, { + coa_id: coaSales.id, + credit: product.price + },{ + coa_id: coaExpense.id, + credit: 0 + }].concat(supervisorData) }); - } else { - throw new HttpException( - { - statusCode: HttpStatus.INTERNAL_SERVER_ERROR, - error: `Transaction Failed because ${orderIRS.msg}`, - }, - HttpStatus.INTERNAL_SERVER_ERROR, - ); - } + }); } catch (e) { throw e; } - + return true; } From 1eba2cbb473838955fad93fe426d85d58b2dd2c4 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra <329246-hasta.ragil@users.noreply.gitlab.com> Date: Thu, 9 Dec 2021 12:26:17 +0000 Subject: [PATCH 031/135] Update deployment.yaml --- k8s/staging/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/staging/deployment.yaml b/k8s/staging/deployment.yaml index 4300c95..6d3e967 100644 --- a/k8s/staging/deployment.yaml +++ b/k8s/staging/deployment.yaml @@ -15,7 +15,7 @@ spec: spec: containers: - name: ppob-backend - image: registry-harbor.app.bangun-kreatif.com/empatnusabangsa/ppob-backend:2 + image: registry-harbor.app.bangun-kreatif.com/empatnusabangsa/ppob-backend: ports: - containerPort: 5000 envFrom: From 39eb1898bac5bbe09df9bc46962566ad915492dd Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 9 Dec 2021 19:30:44 +0700 Subject: [PATCH 032/135] add: product price --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 12187a9..5a4cfb6 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "class-validator": "^0.13.1", "crypto": "^1.0.1", "joi": "^17.4.2", + "lodash": "^4.17.21", "nestjs-pino": "^2.3.1", "passport": "^0.5.0", "passport-jwt": "^4.0.0", From 19c951c331db34b5f642e32047a49d7a11258b18 Mon Sep 17 00:00:00 2001 From: Hasta Ragil Saputra Date: Thu, 9 Dec 2021 19:48:07 +0700 Subject: [PATCH 033/135] feat: add decimal.js --- package-lock.json | 7824 --------------------------------------------- package.json | 1 + yarn.lock | 2 +- 3 files changed, 2 insertions(+), 7825 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3947f09..0000000 --- a/package-lock.json +++ /dev/null @@ -1,7824 +0,0 @@ -{ - "name": "ppob-backend", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@angular-devkit/core": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.3.tgz", - "integrity": "sha512-5yTYW6m4pkDPSYNxThm+47h+UZ6XVEfdfsXR3o+WlRG0hc18EuQ+sXZkzhvZrk5KMLlXFex4eO40RPq2vvWS/w==", - "dev": true, - "requires": { - "ajv": "8.6.3", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.3.tgz", - "integrity": "sha512-+Va1E0zJBCg5jqSfITusghoMJgPAwlU+WUs49fuGVCzfJPwfSjTKSrsbhanahMd27+Ys3rovGZq0F2JUdL801A==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.0.3", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/schematics-cli": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.0.3.tgz", - "integrity": "sha512-iGEA3hEbHcmhAkGmrFXKWDnelzhSSJLaZPHr6SLPpztKEU8OFMZxv8NFATc/IpXknEhX3+Tm5DkrOpSc4rJlhA==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.0.3", - "@angular-devkit/schematics": "13.0.3", - "ansi-colors": "4.1.1", - "inquirer": "8.2.0", - "minimist": "1.2.5", - "symbol-observable": "4.0.0" - }, - "dependencies": { - "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - } - } - }, - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", - "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@fastify/ajv-compiler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", - "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", - "requires": { - "ajv": "^6.12.6" - } - }, - "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", - "jest-util": "^27.4.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.3.tgz", - "integrity": "sha512-V9ms3zSxUHxh1E/ZLAiXF7SLejsdFnjWTFizWotMOWvjho0lW5kSjZymhQSodNW0T0ZMQRiha7f8+NcFVm3hJQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.3", - "jest-haste-map": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.3", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2" - } - }, - "@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.2", - "@jest/types": "^27.4.2", - "expect": "^27.4.2" - } - }, - "@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" - } - }, - "@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@nestjs/cli": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-8.1.5.tgz", - "integrity": "sha512-eGlSTCFf/M3ACSNpW3mx5raZ+qq7k/4v6nFuaGpKafQKSKNw7cRVqSeAtHzd7bcK0ik7tKTyhQ8oxnygMLm5Iw==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.0.3", - "@angular-devkit/schematics": "13.0.3", - "@angular-devkit/schematics-cli": "13.0.3", - "@nestjs/schematics": "^8.0.3", - "chalk": "3.0.0", - "chokidar": "3.5.2", - "cli-table3": "0.6.0", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "6.4.0", - "inquirer": "7.3.3", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "os-name": "4.0.1", - "rimraf": "3.0.2", - "shelljs": "0.8.4", - "source-map-support": "0.5.20", - "tree-kill": "1.2.2", - "tsconfig-paths": "3.11.0", - "tsconfig-paths-webpack-plugin": "3.5.2", - "typescript": "4.3.5", - "webpack": "5.64.1", - "webpack-node-externals": "3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true - } - } - }, - "@nestjs/common": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.2.3.tgz", - "integrity": "sha512-slXVVMc9tZG6ZaARXkTUsSqZbkEcc0hVKb4mPLxS9mjXmDspUleGQakZ5OzniiEWqzO299BVlEbm6TGyoGbpNg==", - "requires": { - "axios": "0.24.0", - "iterare": "1.2.1", - "tslib": "2.3.1", - "uuid": "8.3.2" - } - }, - "@nestjs/config": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-1.1.5.tgz", - "integrity": "sha512-xSpp/6TIHFhicuuwRu2fFGmClzN+YXtpVSLGX3LT9iAwtNDcccX3qVDOX1BLdFdBbqZTqT3KezsT+iE/czd/xg==", - "requires": { - "dotenv": "10.0.0", - "dotenv-expand": "5.1.0", - "lodash.get": "4.4.2", - "lodash.has": "4.5.2", - "lodash.set": "4.3.2", - "uuid": "8.3.2" - } - }, - "@nestjs/core": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.2.3.tgz", - "integrity": "sha512-CP/Z+uTEdblTZQXRf+xvZHvESZ6v2vxX/YaRcpJDv/ytgxxOafmOJ/RDKSzNOGBkt8kVwYNFpWXzzll4P5AJ0g==", - "requires": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "object-hash": "2.2.0", - "path-to-regexp": "3.2.0", - "tslib": "2.3.1", - "uuid": "8.3.2" - } - }, - "@nestjs/jwt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz", - "integrity": "sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==", - "requires": { - "@types/jsonwebtoken": "8.5.4", - "jsonwebtoken": "8.5.1" - } - }, - "@nestjs/mapped-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", - "integrity": "sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==" - }, - "@nestjs/passport": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.0.1.tgz", - "integrity": "sha512-vn/ZJLXQKvSf9D0BvEoNFJLfzl9AVqfGtDyQMfWDLbaNpoEB2FyeaHGxdiX6H71oLSrQV78c/yuhfantzwdjdg==" - }, - "@nestjs/platform-express": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.2.3.tgz", - "integrity": "sha512-x8pyUpoKU8KUMYYwGiG17UXu818RUa6YCPu5Jvyq9P6G37ZfOAERYu3yveg9G5Q6YL6Z7jXAW9ojy+lWQXXhng==", - "requires": { - "body-parser": "1.19.0", - "cors": "2.8.5", - "express": "4.17.1", - "multer": "1.4.3", - "tslib": "2.3.1" - } - }, - "@nestjs/platform-fastify": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-8.2.3.tgz", - "integrity": "sha512-uZelasRb99Rgq6h7QLWXlFdx8lqf3M/ln+1XzVPaWbJza4eUSo1f3BvrO4r1V/OKZLgW7pyB1CM2P4lKLMK1cA==", - "requires": { - "fastify": "3.24.0", - "fastify-cors": "6.0.2", - "fastify-formbody": "5.2.0", - "light-my-request": "4.6.0", - "middie": "5.3.0", - "path-to-regexp": "3.2.0", - "tslib": "2.3.1" - } - }, - "@nestjs/schematics": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.5.tgz", - "integrity": "sha512-nK1hWQeLNbdhsiJDX/XJXLqq7nC6/xxC8CN+seFTQmly+H3gG2xaFnl6JPHURumuQaYJX8JEpC8m0+4tz+wvOg==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.0.2", - "@angular-devkit/schematics": "13.0.2", - "fs-extra": "10.0.0", - "jsonc-parser": "3.0.0", - "pluralize": "8.0.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.2.tgz", - "integrity": "sha512-I4co4GH+iu0tns+UXfMtjJISO+cLpaUuiEH6kf0wF5cqjaIeluA9UjIRnxuNbdTW8iE2xVj/UWhQfHe/Ncp76w==", - "dev": true, - "requires": { - "ajv": "8.6.3", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.2.tgz", - "integrity": "sha512-qrTe1teQptgP8gmVy6QX0T4dNfnNipEv+cM2cr7JXOmkPpwF+6oBDrTRIJ55t6rziqrXHJ3rxjKm1aHAxFrIEQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.0.2", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", - "ora": "5.4.1", - "rxjs": "6.6.7" - } - }, - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@nestjs/testing": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.2.3.tgz", - "integrity": "sha512-5jDORCCfRXIWygf1/C9K9py2NGWE/5Bu+fsYQNEQyZlmGbDf2g7q/3O203hj2IVltMvrue7ea/eo1vI0fz1RsA==", - "dev": true, - "requires": { - "optional": "0.1.4", - "tslib": "2.3.1" - } - }, - "@nestjs/typeorm": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-8.0.2.tgz", - "integrity": "sha512-UHn4IsRkzm22eNDir/uI+x8gmgo66EO7SxWfVOiPpeLSdrTfZHKYz6q/P9KRgYbwXs8TrywVdIbJhp+4C0tzjQ==", - "requires": { - "uuid": "8.3.2" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - } - }, - "@sideway/address": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", - "integrity": "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sqltools/formatter": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", - "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", - "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "@types/eslint": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", - "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.26", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz", - "integrity": "sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", - "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", - "dev": true, - "requires": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/jsonwebtoken": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz", - "integrity": "sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/passport": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.7.tgz", - "integrity": "sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/passport-jwt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.6.tgz", - "integrity": "sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "@types/passport-local": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz", - "integrity": "sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "@types/passport-strategy": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", - "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/superagent": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", - "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", - "dev": true, - "requires": { - "@types/superagent": "*" - } - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "@types/zen-observable": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", - "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" - }, - "avvio": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.2.tgz", - "integrity": "sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw==", - "requires": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1", - "queue-microtask": "^1.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "requires": { - "follow-redirects": "^1.14.4" - } - }, - "babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", - "dev": true, - "requires": { - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001284", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", - "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" - }, - "class-validator": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", - "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", - "requires": { - "libphonenumber-js": "^1.9.43", - "validator": "^13.7.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true - }, - "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "dependencies": { - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", - "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "dependencies": { - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - } - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "esbuild": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", - "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", - "dev": true, - "requires": { - "esbuild-android-arm64": "0.14.2", - "esbuild-darwin-64": "0.14.2", - "esbuild-darwin-arm64": "0.14.2", - "esbuild-freebsd-64": "0.14.2", - "esbuild-freebsd-arm64": "0.14.2", - "esbuild-linux-32": "0.14.2", - "esbuild-linux-64": "0.14.2", - "esbuild-linux-arm": "0.14.2", - "esbuild-linux-arm64": "0.14.2", - "esbuild-linux-mips64le": "0.14.2", - "esbuild-linux-ppc64le": "0.14.2", - "esbuild-netbsd-64": "0.14.2", - "esbuild-openbsd-64": "0.14.2", - "esbuild-sunos-64": "0.14.2", - "esbuild-windows-32": "0.14.2", - "esbuild-windows-64": "0.14.2", - "esbuild-windows-arm64": "0.14.2" - } - }, - "esbuild-android-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", - "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", - "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", - "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", - "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", - "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", - "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", - "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", - "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", - "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", - "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", - "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", - "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", - "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", - "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", - "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", - "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", - "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-json-stringify": { - "version": "2.7.12", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.12.tgz", - "integrity": "sha512-4hjwZDPmgj/ZUKXhEWovGPciE/5mWtAIQQxN+2VBDFun7DRTk2oOItbu9ZZp6kqj+eZ/u7z+dgBgM74cfGRnBQ==", - "requires": { - "ajv": "^6.11.0", - "deepmerge": "^4.2.2", - "rfdc": "^1.2.0", - "string-similarity": "^4.0.1" - } - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-redact": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", - "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==" - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "requires": { - "punycode": "^1.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "fastify": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.24.0.tgz", - "integrity": "sha512-fmRyrI25rzLGHDQ1FME02NsbP658mVa0EaSqfYUFwx2UOF+4/GcyNrsdWILSDOEiUbOsRYCD3sRCE9v7mvRLRQ==", - "requires": { - "@fastify/ajv-compiler": "^1.0.0", - "abstract-logging": "^2.0.0", - "avvio": "^7.1.2", - "fast-json-stringify": "^2.5.2", - "fastify-error": "^0.3.0", - "fastify-warning": "^0.2.0", - "find-my-way": "^4.1.0", - "flatstr": "^1.0.12", - "light-my-request": "^4.2.0", - "pino": "^6.13.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.1.4", - "secure-json-parse": "^2.0.0", - "semver": "^7.3.2", - "tiny-lru": "^7.0.0" - } - }, - "fastify-cors": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/fastify-cors/-/fastify-cors-6.0.2.tgz", - "integrity": "sha512-sE0AOyzmj5hLLRRVgenjA6G2iOGX35/1S3QGYB9rr9TXelMZB3lFrXy4CzwYVOMiujJeMiLgO4J7eRm8sQSv8Q==", - "requires": { - "fastify-plugin": "^3.0.0", - "vary": "^1.1.2" - } - }, - "fastify-error": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz", - "integrity": "sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ==" - }, - "fastify-formbody": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/fastify-formbody/-/fastify-formbody-5.2.0.tgz", - "integrity": "sha512-d8Y5hCL82akPyoFiXh2wYOm3es0pV9jqoPo3pO9OV2cNF0cQx39J5WAVXzCh4MSt9Z2qF4Fy5gHlvlyESwjtvg==", - "requires": { - "fastify-plugin": "^3.0.0" - } - }, - "fastify-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.0.tgz", - "integrity": "sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w==" - }, - "fastify-warning": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz", - "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-my-way": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.4.0.tgz", - "integrity": "sha512-hpntHvK0iOHp3pqWRRUEzioar4tp8euBD8DkPG3VauOriZLgwGZLTNp6yZSrdctJ8RCDS7zhZSR2V+yOaBbNow==", - "requires": { - "fast-decode-uri-component": "^1.0.1", - "fast-deep-equal": "^3.1.3", - "safe-regex2": "^2.0.0", - "semver-store": "^0.3.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, - "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.4.0.tgz", - "integrity": "sha512-3I3wFkc4DbzaUDPWEi96wdYGu4EKtxBafhZYm0o4mX51d9bphAY4P3mBl8K5mFXFJqVzHfmdbm9kLGnm7vwwBg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", - "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" - }, - "jest": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.3.tgz", - "integrity": "sha512-jwsfVABBzuN3Atm+6h6vIEpTs9+VApODLt4dk2qv1WMOpb1weI1IIZfuwpMiWZ62qvWj78MvdvMHIYdUfqrFaA==", - "dev": true, - "requires": { - "@jest/core": "^27.4.3", - "import-local": "^3.0.2", - "jest-cli": "^27.4.3" - }, - "dependencies": { - "jest-cli": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.3.tgz", - "integrity": "sha512-zZSJBXNC/i8UnJPwcKWsqnhGgIF3uoTYP7th32Zej7KNQJdxzOMj+wCfy2Ox3kU7nXErJ36DtYyXDhfiqaiDRw==", - "dev": true, - "requires": { - "@jest/core": "^27.4.3", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.4.3", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - } - } - }, - "jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-config": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.3.tgz", - "integrity": "sha512-DQ10HTSqYtC2pO7s9j2jw+li4xUnm2wLYWH2o7K1ftB8NyvToHsXoLlXxtsGh3AW9gUQR6KY/4B7G+T/NswJBw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.3", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0" - } - }, - "jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" - } - }, - "jest-environment-jsdom": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.3.tgz", - "integrity": "sha512-x1AUVz3G14LpEJs7KIFUaTINT2n0unOUmvdAby3s/sldUpJJetOJifHo1O/EUQC5fNBowggwJbVulko18y6OWw==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.2", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.2", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true - }, - "jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", - "dev": true, - "requires": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true - }, - "jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" - } - }, - "jest-runner": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.3.tgz", - "integrity": "sha512-JgR6Om/j22Fd6ZUUIGTWNcCtuZVYbNrecb4k89W4UyFJoRtHpo2zMKWkmFFFJoqwWGrfrcPLnVBIgkJiTV3cyA==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-util": "^27.4.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "leven": "^3.1.0", - "pretty-format": "^27.4.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.4.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.5.0.tgz", - "integrity": "sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "libphonenumber-js": { - "version": "1.9.44", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.44.tgz", - "integrity": "sha512-zhw8nUMJuQf7jG1dZfEOKKOS6M3QYIv3HnvB/vGohNd0QfxIQcObH3a6Y6s350H+9xgBeOXClOJkS0hJ0yvS3g==" - }, - "light-my-request": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.6.0.tgz", - "integrity": "sha512-wQWGwMr7l7fzYPzzzutRoEI1vuREpIpJpTi3t8cHlGdsnBrOF5iR559Bkh+nkDGgnUJtNuuutjnqbxP7zPWKkA==", - "requires": { - "ajv": "^8.1.0", - "cookie": "^0.4.0", - "fastify-warning": "^0.2.0", - "set-cookie-parser": "^2.4.1" - }, - "dependencies": { - "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memfs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", - "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", - "dev": true, - "requires": { - "fs-monkey": "1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "middie": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/middie/-/middie-5.3.0.tgz", - "integrity": "sha512-uq6Ob4dmmHeT6rJpBDWVwSxBzxzKlBvnrZdLSRJeuhHzljvZ6ccgLP/HaShgfiYrQvekRH0KUe/G1WTu/IrXsQ==", - "requires": { - "fastify-plugin": "^3.0.0", - "path-to-regexp": "^6.1.0", - "reusify": "^1.0.4" - }, - "dependencies": { - "path-to-regexp": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", - "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", - "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nestjs-pino": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-2.3.1.tgz", - "integrity": "sha512-FFDGs34LYv/MdFbtGPKz7PzrwLgtIrVnCPsjWDfW9ZEqAHwFz2v4X1DDM42tgeSiPgtvsF8+N6nA5GZQy3jzlQ==" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "on-exit-leak-free": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "passport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.0.tgz", - "integrity": "sha512-ln+ue5YaNDS+fes6O5PCzXKSseY5u8MYhX9H5Co4s+HfYI5oqvnHKoOORLYDUPh+8tHvrxugF2GFcUA1Q1Gqfg==", - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - } - }, - "passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", - "requires": { - "jsonwebtoken": "^8.2.0", - "passport-strategy": "^1.0.0" - } - }, - "passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "pg": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz", - "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==", - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.4.1", - "pg-protocol": "^1.5.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - } - }, - "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-pool": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", - "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==" - }, - "pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", - "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", - "requires": { - "split2": "^3.1.1" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pino": { - "version": "6.13.3", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.13.3.tgz", - "integrity": "sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg==", - "requires": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.8", - "fastify-warning": "^0.2.0", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^1.0.2" - } - }, - "pino-abstract-transport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", - "requires": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" - }, - "dependencies": { - "split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" - } - } - }, - "pino-http": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-6.3.3.tgz", - "integrity": "sha512-/TkDxOesPx4fGZRuOozYm1NdGbmkpqgGi00GY4ykM/1N3vlrisBmlnJ0PXU47xUPdMh/wt0GmkCtg8z2tBhwSA==", - "requires": { - "fast-url-parser": "^1.1.3", - "get-caller-file": "^2.0.5", - "pino": "^7.0.5", - "pino-std-serializers": "^5.0.0" - }, - "dependencies": { - "pino": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.5.1.tgz", - "integrity": "sha512-Wzo2G7CLaRHKOz3+Ex006LC5Xi0xEUm+mwm/h0NKzuKZONdekcbmjXg7vWDoO8hVTGX+1RuUy2fwlzvZ24EI5A==", - "requires": { - "fast-redact": "^3.0.0", - "fastify-warning": "^0.2.0", - "get-caller-file": "^2.0.5", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.13.0" - }, - "dependencies": { - "pino-std-serializers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" - } - } - }, - "pino-std-serializers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-5.0.0.tgz", - "integrity": "sha512-YC5Lv+nNxY51oicb/t8VX/sA3dnecCXeQ7heir+H+c4fbg3LD65NFdrfP3Y2ufR0Y/EYbEs5UDxHIB9NwCmYyQ==" - }, - "sonic-boom": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.4.1.tgz", - "integrity": "sha512-WgtVLfGl347/zS1oTuLaOAvVD5zijgjphAJHgbbnBJGgexnr+C1ULSj0j7ftoGxpuxR4PaV635NkwFemG8m/5w==", - "requires": { - "atomic-sleep": "^1.0.0" - } - } - } - }, - "pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "requires": { - "xtend": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "real-require": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "requires": { - "tslib": "~2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", - "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", - "requires": { - "ret": "~0.2.0" - } - }, - "safe-stable-stringify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "secure-json-parse": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", - "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-store": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", - "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-cookie-parser": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", - "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "requires": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-similarity": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", - "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "supertest": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", - "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^6.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", - "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", - "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", - "dev": true, - "requires": { - "jest-worker": "^27.0.6", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thread-stream": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.0.tgz", - "integrity": "sha512-kTMZeX4Dzlb1zZ00/01aerGaTw2i8NE4sWF0TvF1uXewRhCiUjCvatQkvxIvFqauWG2ADFS2Wpd3qBeYL9i3dg==", - "requires": { - "real-require": "^0.1.0" - } - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tiny-lru": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz", - "integrity": "sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "27.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.0.tgz", - "integrity": "sha512-ZouWlP03JMtzfNHg0ZeDrxAESYGmVhWyHtIl2/01kBbXaMbTr4Vhv6/GeMxUed6GFg/4ycMo+yU6Eo9gI16xTQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "esbuild": "~0.14.0", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "ts-loader": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", - "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - } - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "tsconfig-paths-webpack-plugin": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", - "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeorm": { - "version": "0.2.41", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.41.tgz", - "integrity": "sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw==", - "requires": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.11", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "xml2js": "^0.4.23", - "yargs": "^17.0.1", - "zen-observable-ts": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "typeorm-naming-strategies": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/typeorm-naming-strategies/-/typeorm-naming-strategies-2.0.0.tgz", - "integrity": "sha512-nsJ5jDjhBBEG6olFmxojkO4yrW7hEv38sH7ZXWWx9wnDoo9uaoH/mo2mBYAh/VKgwoFHBLu+CYxGmzXz2GUMcA==" - }, - "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - } - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", - "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "webpack": { - "version": "5.64.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.1.tgz", - "integrity": "sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.2" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - } - } - }, - "webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true - }, - "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", - "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "dependencies": { - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", - "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", - "requires": { - "@types/zen-observable": "0.8.3", - "zen-observable": "0.8.15" - } - } - } -} diff --git a/package.json b/package.json index 5a4cfb6..68ed9e8 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "crypto": "^1.0.1", + "decimal.js": "^10.3.1", "joi": "^17.4.2", "lodash": "^4.17.21", "nestjs-pino": "^2.3.1", diff --git a/yarn.lock b/yarn.lock index 64ac2a4..bd50c2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2106,7 +2106,7 @@ debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -decimal.js@^10.2.1: +decimal.js@^10.2.1, decimal.js@^10.3.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== From a057088a93024f2299882afdc7be6b6a8e82c38d Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 9 Dec 2021 21:30:10 +0700 Subject: [PATCH 034/135] add: role in jwt --- src/auth/auth.service.ts | 6 ++- src/users/users.service.ts | 88 ++++++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 5e6ab4b..e0212c1 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { hashPassword } from '../helper/hash_password'; import { JwtService } from '@nestjs/jwt'; +import { User } from '../users/entities/user.entity'; @Injectable() export class AuthService { @@ -22,10 +23,11 @@ export class AuthService { return null; } - async login(user: any) { + async login(user: User) { const payload = { username: user.username, - sub: user.userId, + sub: user.id, + role: user.roles.name, }; return { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 6cf326e..f122b90 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Connection, EntityNotFoundError, Repository } from 'typeorm'; @@ -10,14 +16,18 @@ import { CoaService } from 'src/transaction/coa.service'; import { balanceType, coaType } from 'src/helper/enum-list'; import { RoleService } from 'src/configurable/roles.service'; import { InputCoaDto } from 'src/transaction/dto/input-coa.dto'; -import * as uuid from "uuid"; +import * as uuid from 'uuid'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository, - @Inject(forwardRef(() => CoaService)) + @Inject( + forwardRef(() => { + return CoaService; + }), + ) private coaService: CoaService, private roleService: RoleService, private connection: Connection, @@ -27,51 +37,54 @@ export class UsersService { const roles = await this.roleService.findOne(createUserDto.roleId); const superior = await this.findByUsername(currentUser.username); const salt = randomStringGenerator(); - - let userData = new User(); + + const userData = new User(); + userData.id = uuid.v4(); - userData.username = createUserDto.username, - userData.password = await hashPassword(createUserDto.password, salt), - userData.salt = salt, - userData.superior = superior, - userData.roles = roles + (userData.username = createUserDto.username), + (userData.password = await hashPassword(createUserDto.password, salt)), + (userData.salt = salt), + (userData.superior = superior), + (userData.roles = roles); await this.connection.transaction(async (manager) => { - const result = await manager.insert(User,userData); - - let dataCoaWallet = new InputCoaDto(); + const result = await manager.insert(User, userData); + + const dataCoaWallet = new InputCoaDto(); + dataCoaWallet.user = userData; dataCoaWallet.balanceType = balanceType.CREDIT; dataCoaWallet.type = coaType.WALLET; dataCoaWallet.coaEntityManager = manager; - - if(createUserDto.superior){ - let dataCoaAP = new InputCoaDto(); + + if (createUserDto.superior) { + const dataCoaAP = new InputCoaDto(); + dataCoaAP.user = userData; dataCoaAP.balanceType = balanceType.CREDIT; dataCoaAP.relatedUserId = superior.id; dataCoaAP.type = coaType.ACCOUNT_PAYABLE; dataCoaAP.coaEntityManager = manager; - - let dataCoaAR = new InputCoaDto(); + + const dataCoaAR = new InputCoaDto(); + dataCoaAR.user = userData; dataCoaAR.balanceType = balanceType.DEBIT; dataCoaAR.relatedUserId = superior.id; dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; dataCoaAR.coaEntityManager = manager; - + await this.coaService.create(dataCoaAP); await this.coaService.create(dataCoaAR); } - - await this.coaService.create(dataCoaWallet); - }) + await this.coaService.create(dataCoaWallet); + }); return userData; } - findAll(page:number) { + findAll(page: number) { return this.usersRepository.findAndCount({ skip: page * 10, take: 10, @@ -81,12 +94,12 @@ export class UsersService { }); } - findByRoles(relationId:string,page:number) { + findByRoles(relationId: string, page: number) { return this.usersRepository.findAndCount({ skip: page * 10, take: 10, - where:{ - roles:relationId + where: { + roles: relationId, }, order: { updatedAt: 'DESC', @@ -96,7 +109,7 @@ export class UsersService { async findExist(id: string) { try { - return await this.usersRepository.findOneOrFail(id); + return await this.usersRepository.findOneOrFail(id); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -114,9 +127,9 @@ export class UsersService { async findByUsername(username: string) { try { - return await this.usersRepository.findOneOrFail({ - username:username - }); + return await this.usersRepository.findOneOrFail({ + username: username, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -133,17 +146,19 @@ export class UsersService { } async findOne(id: string) { - const coa = await this.coaService.findByUser(id,coaType.WALLET); + const coa = await this.coaService.findByUser(id, coaType.WALLET); + try { - const userData = await this.usersRepository.findOneOrFail({ - where: { - id: id + const userData = await this.usersRepository.findOneOrFail({ + where: { + id: id, }, - relations:["roles","superior"] + relations: ['roles', 'superior'], }); + return { ...userData, - wallet:coa.amount, + wallet: coa.amount, }; } catch (e) { if (e instanceof EntityNotFoundError) { @@ -207,6 +222,7 @@ export class UsersService { where: { username, }, + relations: ['roles'], }); } } From 09c84f2cf54882c52d6bebc3cdf83684abf15557 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 00:14:05 +0700 Subject: [PATCH 035/135] add: get product by categories --- src/product/product.controller.ts | 15 + src/product/product.service.ts | 13 + src/transaction/transaction.controller.ts | 36 +- src/transaction/transaction.service.ts | 403 ++++++++++++++-------- 4 files changed, 302 insertions(+), 165 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 2b20bde..691f3e1 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -78,6 +78,21 @@ export class ProductController { }; } + @Get('by-categories') + async findByCategories( + @Query('page') page: number, + @Query('categories') categories: string, + ) { + const [data, count] = await this.productService.findAll(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('categories') async findAllCategories(@Query('page') page: number) { const [data, count] = await this.productCategoriesService.findAll(page); diff --git a/src/product/product.service.ts b/src/product/product.service.ts index cf45007..9238e7b 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -53,6 +53,19 @@ export class ProductService { }); } + findAllByCategories(page, categories) { + return this.productRepository.findAndCount({ + where: { + subCategories: categories, + }, + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } + async findOne(code: string) { try { return await this.productRepository.findOneOrFail({ code: code }); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index af080c3..1d60c85 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -7,7 +7,7 @@ import { Param, Delete, Request, - HttpStatus + HttpStatus, } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; @@ -25,42 +25,52 @@ export class TransactionController { @Post('distribute') create( @Body() createTransactionDto: DistributeTransactionDto, - @Request() req + @Request() req, ) { - return this.transactionService.distributeDeposit(createTransactionDto,req.user); + return this.transactionService.distributeDeposit( + createTransactionDto, + req.user, + ); } @Post('distribute-admin') distributeAdmin( @Body() createTransactionDto: DistributeTransactionDto, - @Request() req + @Request() req, ) { return { - data: this.transactionService.distributeFromAdmin(createTransactionDto,req.user), + data: this.transactionService.distributeFromAdmin( + createTransactionDto, + req.user, + ), statusCode: HttpStatus.CREATED, message: 'success', - }; + }; } @Post('add-saldo-supplier') async addSaldoSupplier( @Body() addSaldoSupplier: AddSaldoSupplier, - @Request() req + @Request() req, ) { - return { - data: await this.transactionService.addIRSWallet(addSaldoSupplier,req.user), + data: await this.transactionService.addIRSWallet( + addSaldoSupplier, + req.user, + ), statusCode: HttpStatus.CREATED, message: 'success', - }; + }; } - @Post('order') orderTransaction( @Body() orderTransactionDto: OrderTransactionDto, - @Request() req + @Request() req, ) { - return this.transactionService.orderTransaction(orderTransactionDto,req.user); + return this.transactionService.orderTransaction( + orderTransactionDto, + req.user, + ); } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index e5b211b..e4d07a2 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -8,9 +8,9 @@ import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; -import * as uuid from "uuid"; -import { uniq } from "lodash"; -import {Decimal} from 'decimal.js'; +import * as uuid from 'uuid'; +import { uniq } from 'lodash'; +import { Decimal } from 'decimal.js'; import { balanceType, coaType, @@ -46,50 +46,58 @@ export class TransactionService { private connection: Connection, ) {} - async addIRSWallet(addSaldoSupplier: AddSaldoSupplier,currentUser:any) { + async addIRSWallet(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { // GET COA const coaBank = await this.coaService.findByName( - coaType[coaType.BANK]+'-SYSTEM', + `${coaType[coaType.BANK]}-SYSTEM`, ); const coaInventory = await this.coaService.findByName( - coaType[coaType.INVENTORY]+'-'+addSaldoSupplier.supplier, + `${coaType[coaType.INVENTORY]}-${addSaldoSupplier.supplier}`, ); //GET USER - const userData = await this.userService.findByUsername(currentUser.username); + const userData = await this.userService.findByUsername( + currentUser.username, + ); - await this.connection.transaction(async (manager) => { //INSERT TRANSACTION - let transactionData = new Transactions(); + const transactionData = new Transactions(); + transactionData.id = uuid.v4(); - transactionData.amount = addSaldoSupplier.amount, - transactionData.user = userData.id, - transactionData.status = statusTransaction.SUCCESS, - transactionData.type = typeTransaction.DEPOSIT_IRS, - + transactionData.amount = addSaldoSupplier.amount; + transactionData.user = userData.id; + transactionData.status = statusTransaction.SUCCESS; + transactionData.type = typeTransaction.DEPOSIT_IRS; + await manager.insert(Transactions, transactionData); - + await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager:manager, - transaction: transactionData, - amount: transactionData.amount, - journals: [{ - coa_id: coaBank.id, - debit: transactionData.amount - }, { - coa_id: coaInventory.id, - credit: transactionData.amount - }] + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaBank.id, + debit: transactionData.amount, + }, + { + coa_id: coaInventory.id, + credit: transactionData.amount, + }, + ], }); }); return true; } - async distributeFromAdmin(distributeTransactionDto: DistributeTransactionDto,currentUser:any) { + async distributeFromAdmin( + distributeTransactionDto: DistributeTransactionDto, + currentUser: any, + ) { // GET COA const coaAR = await this.coaService.findByUser( distributeTransactionDto.destination, @@ -101,42 +109,52 @@ export class TransactionService { ); //GET USER - const userData = await this.userService.findByUsername(currentUser.username); + const userData = await this.userService.findByUsername( + currentUser.username, + ); await this.connection.transaction(async (manager) => { //INSERT TRANSACTION - let transactionData = new Transactions(); - transactionData.id = uuid.v4(); - transactionData.amount = distributeTransactionDto.amount, - transactionData.user = userData.id, - transactionData.status = statusTransaction.SUCCESS, - transactionData.type = typeTransaction.DISTRIBUTION, - - await manager.insert(Transactions, transactionData); - - await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager:manager, - transaction: transactionData, - amount: transactionData.amount, - journals: [{ - coa_id: coaAR.id, - debit: transactionData.amount - }, { - coa_id: coaWallet.id, - credit: transactionData.amount - }] - }); + const transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = distributeTransactionDto.amount; + transactionData.user = userData.id; + transactionData.status = statusTransaction.SUCCESS; + transactionData.type = typeTransaction.DISTRIBUTION; + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaAR.id, + debit: transactionData.amount, + }, + { + coa_id: coaWallet.id, + credit: transactionData.amount, + }, + ], + }); }); return true; } - async distributeDeposit(distributeTransactionDto: DistributeTransactionDto,currentUser:any) { + async distributeDeposit( + distributeTransactionDto: DistributeTransactionDto, + currentUser: any, + ) { //GET USER - const userData = await this.userService.findByUsername(currentUser.username); - + const userData = await this.userService.findByUsername( + currentUser.username, + ); + // GET COA const coaSenderWallet = await this.coaService.findByUser( userData.id, @@ -161,54 +179,74 @@ export class TransactionService { ); await this.connection.transaction(async (manager) => { - let transactionData = new Transactions(); + const transactionData = new Transactions(); + transactionData.id = uuid.v4(); - transactionData.amount = distributeTransactionDto.amount, - transactionData.user = userData.id, - transactionData.status = statusTransaction.SUCCESS, - transactionData.type = typeTransaction.DISTRIBUTION, - + transactionData.amount = distributeTransactionDto.amount; + transactionData.user = userData.id; + transactionData.status = statusTransaction.SUCCESS; + transactionData.type = typeTransaction.DISTRIBUTION; + await manager.insert(Transactions, transactionData); - + await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager:manager, - transaction: transactionData, - amount: transactionData.amount, - journals: [{ - coa_id: coaSenderWallet.id, - debit: transactionData.amount - }, { - coa_id: coaReceiverWallet.id, - credit: transactionData.amount - }, { + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaSenderWallet.id, + debit: transactionData.amount, + }, + { + coa_id: coaReceiverWallet.id, + credit: transactionData.amount, + }, + { coa_id: coaAR.id, - debit: transactionData.amount - }, { - coa_id: coaAP.id, - credit: transactionData.amount - }] + debit: transactionData.amount, + }, + { + coa_id: coaAP.id, + credit: transactionData.amount, + }, + ], }); }); return true; } - async orderTransaction(orderTransactionDto: OrderTransactionDto,currentUser:any) { + async orderTransaction( + orderTransactionDto: OrderTransactionDto, + currentUser: any, + ) { //GET PRODUCT const product = await this.productService.findOne( orderTransactionDto.productCode, ); - + //GET USER - const userData = await this.userService.findByUsername(currentUser.username); + const userData = await this.userService.findByUsername( + currentUser.username, + ); let supervisorData = []; - if(userData.superior != null){ - supervisorData.push(await this.userService.findByUsername(currentUser.username)); - if(supervisorData[0].superior != null){ - supervisorData.push(await this.userService.findByUsername(currentUser.username)); - if(supervisorData[0].superior != null){ - supervisorData.push(await this.userService.findByUsername(currentUser.username)); + + if (userData.superior != null) { + supervisorData.push( + await this.userService.findByUsername(currentUser.username), + ); + + if (supervisorData[0].superior != null) { + supervisorData.push( + await this.userService.findByUsername(currentUser.username), + ); + + if (supervisorData[0].superior != null) { + supervisorData.push( + await this.userService.findByUsername(currentUser.username), + ); } } } @@ -220,22 +258,22 @@ export class TransactionService { ); const coaInventory = await this.coaService.findByName( - coaType[coaType.INVENTORY]+'-IRS', + `${coaType[coaType.INVENTORY]}-IRS`, ); const coaCostOfSales = await this.coaService.findByName( - coaType[coaType.COST_OF_SALES]+'-SYSTEM', + `${coaType[coaType.COST_OF_SALES]}-SYSTEM`, ); const coaSales = await this.coaService.findByName( - coaType[coaType.SALES]+'-SYSTEM', + `${coaType[coaType.SALES]}-SYSTEM`, ); const coaExpense = await this.coaService.findByName( - coaType[coaType.EXPENSE]+'-SYSTEM', + `${coaType[coaType.EXPENSE]}-SYSTEM`, ); - - supervisorData = supervisorData.map(async it =>{ + + supervisorData = supervisorData.map(async (it) => { const coaAccount = await this.coaService.findByUser( it.id, coaType.WALLET, @@ -243,9 +281,9 @@ export class TransactionService { return { coa_id: coaAccount.id, - credit: 0 - } - }) + credit: 0, + }; + }); if (coaAccount.amount <= product.price) { throw new HttpException( @@ -259,103 +297,164 @@ export class TransactionService { try { await this.connection.transaction(async (manager) => { - let transactionData = new Transactions(); + const transactionData = new Transactions(); + transactionData.id = uuid.v4(); - transactionData.amount = product.price, - transactionData.user = userData.id, - transactionData.status = statusTransaction.SUCCESS, - transactionData.type = typeTransaction.DISTRIBUTION, - + transactionData.amount = product.price; + transactionData.user = userData.id; + transactionData.status = statusTransaction.SUCCESS; + transactionData.type = typeTransaction.DISTRIBUTION; await manager.insert(Transactions, transactionData); - + await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager:manager, - transaction: transactionData, - amount: transactionData.amount, - journals: [{ - coa_id: coaInventory.id, - credit: product.basePrice - }, { - coa_id: coaCostOfSales.id, - debit: product.basePrice - }, { - coa_id: coaAccount.id, - debit: product.price - }, { - coa_id: coaSales.id, - credit: product.price - },{ - coa_id: coaExpense.id, - credit: 0 - }].concat(supervisorData) + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaInventory.id, + credit: product.basePrice, + }, + { + coa_id: coaCostOfSales.id, + debit: product.basePrice, + }, + { + coa_id: coaAccount.id, + debit: product.price, + }, + { + coa_id: coaSales.id, + credit: product.price, + }, + { + coa_id: coaExpense.id, + credit: 0, + }, + ].concat(supervisorData), }); }); } catch (e) { throw e; } - + return true; } - async accountingTransaction(createJournalDto: CreateJournalDto ) { - let creditSum = createJournalDto.journals.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); - let debitSum = createJournalDto.journals.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); - let coaIds = uniq(createJournalDto.journals.map(it => it.coa_id)); - + async accountingTransaction(createJournalDto: CreateJournalDto) { + const creditSum = createJournalDto.journals + .map((it) => { + return it.credit; + }) + .filter((it) => { + return it; + }) + .reduce((a, b) => { + return a.plus(b); + }, new Decimal(0)); + const debitSum = createJournalDto.journals + .map((it) => { + return it.debit; + }) + .filter((it) => { + return it; + }) + .reduce((a, b) => { + return a.plus(b); + }, new Decimal(0)); + const coaIds = uniq( + createJournalDto.journals.map((it) => { + return it.coa_id; + }), + ); + if (!creditSum.equals(debitSum)) { - throw new Error(`credit and debit doesn't match`); + throw new Error(`credit and debit doesn't match`); } const coas = await this.coaRepository.findByIds(coaIds); - console.log("berhasil") + const transaction = createJournalDto.transaction; - const transaction = createJournalDto.transaction - - await Promise.all(createJournalDto.journals.map(journal => { - const coa = coas.find(it => it.id === journal.coa_id); + await Promise.all( + createJournalDto.journals.map((journal) => { + const coa = coas.find((it) => { + return it.id === journal.coa_id; + }); if (!coa) { - throw new Error(`coa ${journal.coa_id} not found`); + throw new Error(`coa ${journal.coa_id} not found`); } const journalEntry = new TransactionJournal(); + journalEntry.coa = coa; - journalEntry.type = journal.debit ? balanceType.DEBIT : balanceType.CREDIT; - journalEntry.amount = (journal.debit) ? journal.debit : journal.credit; + journalEntry.type = journal.debit + ? balanceType.DEBIT + : balanceType.CREDIT; + journalEntry.amount = journal.debit ? journal.debit : journal.credit; journalEntry.transaction = transaction; return this.transactionJournalRepository.save(journalEntry); - })); + }), + ); - await Promise.all(coaIds.map(coaId => { - let journalPerCoa = createJournalDto.journals.filter(journal => journal.coa_id == coaId); + await Promise.all( + coaIds.map((coaId) => { + const journalPerCoa = createJournalDto.journals.filter((journal) => { + return journal.coa_id == coaId; + }); - let creditSum = journalPerCoa.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); - let debitSum = journalPerCoa.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); + const creditSum = journalPerCoa + .map((it) => { + return it.credit; + }) + .filter((it) => { + return it; + }) + .reduce((a, b) => { + return a.plus(b); + }, new Decimal(0)); + const debitSum = journalPerCoa + .map((it) => { + return it.debit; + }) + .filter((it) => { + return it; + }) + .reduce((a, b) => { + return a.plus(b); + }, new Decimal(0)); - let coa = coas.find(it => it.id.toLowerCase() === coaId.toLowerCase()); + const coa = coas.find((it) => { + (it) => { + return it.id.toLowerCase() === coaId.toLowerCase(); + }; + }); let balance = new Decimal(coa.amount); if (coa.balanceType === balanceType.DEBIT) { - balance = balance.plus(debitSum.minus(creditSum)); + balance = balance.plus(debitSum.minus(creditSum)); } else if (coa.balanceType === balanceType.CREDIT) { - balance = balance.plus(creditSum.minus(debitSum)); + balance = balance.plus(creditSum.minus(debitSum)); } const diff = balance.minus(new Decimal(coa.amount)); return createJournalDto.transactionalEntityManager - .createQueryBuilder() - .update(COA) - .set({ - amount: () => "amount + " + diff.toString() - }) - .where("id = :id", { id: coa.id }) - .execute(); - })); + .createQueryBuilder() + .update(COA) + .set({ + amount: () => { + return `amount + ${diff.toString()}`; + }, + }) + .where('id = :id', { id: coa.id }) + .execute(); + }), + ); return transaction; } From 77d9a95d8a882ae9176864fb6de2c5fff4b71563 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 01:02:33 +0700 Subject: [PATCH 036/135] add: member by superrior --- .../entities/product-sub-category.entity.ts | 11 ++++---- src/product/entities/product.entity.ts | 12 +++++--- src/product/product.service.ts | 7 +++-- src/users/entities/user.entity.ts | 8 ++---- src/users/users.controller.ts | 28 +++++++++++-------- src/users/users.service.ts | 24 ++++++++++++---- 6 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/product/entities/product-sub-category.entity.ts b/src/product/entities/product-sub-category.entity.ts index ff50c6b..6cfd1bd 100644 --- a/src/product/entities/product-sub-category.entity.ts +++ b/src/product/entities/product-sub-category.entity.ts @@ -2,17 +2,15 @@ import { Entity, Column, PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, ManyToOne, + OneToMany, } from 'typeorm'; import { ProductCategories } from './product-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; +import { Product } from './product.entity'; @Entity() -export class ProductSubCategories extends BaseModel{ +export class ProductSubCategories extends BaseModel { @PrimaryGeneratedColumn('uuid') id: string; @@ -21,4 +19,7 @@ export class ProductSubCategories extends BaseModel{ @ManyToOne(() => ProductCategories, (categories) => categories.subCategories) category: ProductCategories; + + @OneToMany(() => Product, (product) => product.subCategories) + product: Product; } diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 2a3cef8..f754f38 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -13,7 +13,7 @@ import { ProductSubCategories } from './product-sub-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; @Entity() -export class Product extends BaseModel{ +export class Product extends BaseModel { @PrimaryGeneratedColumn('uuid') id: string; @@ -30,13 +30,17 @@ export class Product extends BaseModel{ price: number; @Column({ - nullable:true + nullable: true, }) basePrice: number; @ManyToOne( - () => ProductSubCategories, - (subCategories) => subCategories.category, + () => { + return ProductSubCategories; + }, + (subCategories) => { + return subCategories.product; + }, ) subCategories: ProductSubCategories; } diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 9238e7b..871a49b 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -55,8 +55,9 @@ export class ProductService { findAllByCategories(page, categories) { return this.productRepository.findAndCount({ - where: { - subCategories: categories, + join: { + alias: 'subCategories', + innerJoin: { subCategories: 'roles.users' }, }, skip: page * 10, take: 10, @@ -130,7 +131,7 @@ export class ProductService { endDate: updatePriceProductDto.endDate, }); - return + return true; } async remove(id: string) { diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index e23355a..5a121c6 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,9 +1,5 @@ import { Roles } from 'src/configurable/entities/roles.entity'; -import { - Entity, - Column, - PrimaryGeneratedColumn, ManyToOne, -} from 'typeorm'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; @@ -33,7 +29,7 @@ export class User extends BaseModel { }, ) superior: User; - + @ManyToOne( () => { return Roles; diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 4b64e5f..f9f2387 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -9,12 +9,12 @@ import { ParseUUIDPipe, HttpStatus, Query, - Request + Request, } from '@nestjs/common'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import {Public} from "../auth/public.decorator"; +import { Public } from '../auth/public.decorator'; @Controller({ path: 'users', @@ -24,12 +24,9 @@ export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() - async create( - @Request() req, - @Body() createUserDto: CreateUserDto - ) { + async create(@Request() req, @Body() createUserDto: CreateUserDto) { return { - data: await this.usersService.create(createUserDto,req.user), + data: await this.usersService.create(createUserDto, req.user), statusCode: HttpStatus.CREATED, message: 'success', }; @@ -48,13 +45,22 @@ export class UsersController { }; } + @Get('find-by-supperior') + async findBySuperrior(@Request() req, @Query('page') page: number) { + return { + data: await this.usersService.findBySuperrior(req.user.id, page), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('find-by-roles/:id') async findByRoles( - @Param('id', ParseUUIDPipe) id: string, - @Query('page') page: number - ) { + @Param('id', ParseUUIDPipe) id: string, + @Query('page') page: number, + ) { return { - data: await this.usersService.findByRoles(id,page), + data: await this.usersService.findByRoles(id, page), statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index f122b90..96365c7 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -41,11 +41,11 @@ export class UsersService { const userData = new User(); userData.id = uuid.v4(); - (userData.username = createUserDto.username), - (userData.password = await hashPassword(createUserDto.password, salt)), - (userData.salt = salt), - (userData.superior = superior), - (userData.roles = roles); + userData.username = createUserDto.username; + userData.password = await hashPassword(createUserDto.password, salt); + userData.salt = salt; + userData.superior = superior; + userData.roles = roles; await this.connection.transaction(async (manager) => { const result = await manager.insert(User, userData); @@ -107,6 +107,20 @@ export class UsersService { }); } + findBySuperrior(superriorId: string, page: number) { + return this.usersRepository.findAndCount({ + skip: page * 10, + take: 10, + where: { + superior: superriorId, + }, + relations: ['roles'], + order: { + updatedAt: 'DESC', + }, + }); + } + async findExist(id: string) { try { return await this.usersRepository.findOneOrFail(id); From 1e0be3dc480930ed50628f5279e6ad4e8e030d77 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 01:37:39 +0700 Subject: [PATCH 037/135] add: relation --- src/product/product.service.ts | 1 + src/users/users.controller.ts | 2 +- src/users/users.service.ts | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 871a49b..ac5f9bb 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -46,6 +46,7 @@ export class ProductService { findAll(page) { return this.productRepository.findAndCount({ skip: page * 10, + relations: ['subCategories'], take: 10, order: { version: 'DESC', diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index f9f2387..dca7282 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -48,7 +48,7 @@ export class UsersController { @Get('find-by-supperior') async findBySuperrior(@Request() req, @Query('page') page: number) { return { - data: await this.usersService.findBySuperrior(req.user.id, page), + data: await this.usersService.findBySuperrior(req.user.userId, page), statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 96365c7..e7ff8c6 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -114,7 +114,6 @@ export class UsersService { where: { superior: superriorId, }, - relations: ['roles'], order: { updatedAt: 'DESC', }, From 6360b92bf8f5f2ccb4de885ab2d0608055f53372 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 10:50:44 +0700 Subject: [PATCH 038/135] add: relation --- src/users/users.controller.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index dca7282..addb15e 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -47,8 +47,13 @@ export class UsersController { @Get('find-by-supperior') async findBySuperrior(@Request() req, @Query('page') page: number) { + const [data, count] = await this.usersService.findBySuperrior( + req.user.userId, + page, + ); return { - data: await this.usersService.findBySuperrior(req.user.userId, page), + data, + count, statusCode: HttpStatus.OK, message: 'success', }; @@ -59,8 +64,10 @@ export class UsersController { @Param('id', ParseUUIDPipe) id: string, @Query('page') page: number, ) { + const [data, count] = await this.usersService.findByRoles(id, page); return { - data: await this.usersService.findByRoles(id, page), + data, + count, statusCode: HttpStatus.OK, message: 'success', }; From 64e73813fa17145ae950adde3c08c5e5ad424c9f Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 10:58:35 +0700 Subject: [PATCH 039/135] fix: product --- src/product/entities/product-category.entity.ts | 2 +- .../entities/product-history-price.entity.ts | 13 ++++--------- src/product/entities/product-sub-category.entity.ts | 4 ++-- src/product/entities/product.entity.ts | 2 +- src/product/product.service.ts | 8 ++++---- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/product/entities/product-category.entity.ts b/src/product/entities/product-category.entity.ts index 86da379..0964848 100644 --- a/src/product/entities/product-category.entity.ts +++ b/src/product/entities/product-category.entity.ts @@ -23,5 +23,5 @@ export class ProductCategories extends BaseModel { () => ProductSubCategories, (subCategories) => subCategories.category, ) - subCategories: ProductSubCategories; + sub_categories: ProductSubCategories; } diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index e7d7d16..e50d22d 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -1,9 +1,4 @@ -import { - Entity, - Column, - PrimaryGeneratedColumn, - ManyToOne, -} from 'typeorm'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { productType } from '../../helper/enum-list'; @@ -20,14 +15,14 @@ export class ProductHistoryPrice extends BaseModel { price: number; @Column() - markUpPrice: number; + mark_up_price: number; @Column({ type: 'date' }) startDate: Date; - @Column({ + @Column({ type: 'date', - nullable:true + nullable: true, }) endDate: Date; diff --git a/src/product/entities/product-sub-category.entity.ts b/src/product/entities/product-sub-category.entity.ts index 6cfd1bd..6b129a2 100644 --- a/src/product/entities/product-sub-category.entity.ts +++ b/src/product/entities/product-sub-category.entity.ts @@ -17,9 +17,9 @@ export class ProductSubCategories extends BaseModel { @Column() name: string; - @ManyToOne(() => ProductCategories, (categories) => categories.subCategories) + @ManyToOne(() => ProductCategories, (categories) => categories.sub_categories) category: ProductCategories; - @OneToMany(() => Product, (product) => product.subCategories) + @OneToMany(() => Product, (product) => product.sub_categories) product: Product; } diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index f754f38..982fa3b 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -42,5 +42,5 @@ export class Product extends BaseModel { return subCategories.product; }, ) - subCategories: ProductSubCategories; + sub_categories: ProductSubCategories; } diff --git a/src/product/product.service.ts b/src/product/product.service.ts index ac5f9bb..dc615a2 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -27,7 +27,7 @@ export class ProductService { name: createProductDto.name, code: createProductDto.code, status: createProductDto.status, - subCategories: subCategories, + sub_categories: subCategories, price: createProductDto.price, }); @@ -35,7 +35,7 @@ export class ProductService { product: result.identifiers[0], type: productType.NORMAL, price: createProductDto.price, - markUpPrice: createProductDto.markUpPrice, + mark_up_price: createProductDto.markUpPrice, startDate: new Date(), endDate: null, }); @@ -111,7 +111,7 @@ export class ProductService { name: updateProductDto.name, code: updateProductDto.code, status: updateProductDto.status, - subCategories: subCategories, + sub_categories: subCategories, }); return this.productRepository.findOneOrFail(id); @@ -127,7 +127,7 @@ export class ProductService { product: product, type: updatePriceProductDto.type, price: updatePriceProductDto.price, - markUpPrice: updatePriceProductDto.markUpPrice, + mark_up_price: updatePriceProductDto.markUpPrice, startDate: updatePriceProductDto.startDate, endDate: updatePriceProductDto.endDate, }); From d36de7d96652533104a3d76bfa2be0408d0c58a3 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 11:08:03 +0700 Subject: [PATCH 040/135] fix: product --- src/product/product.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index dc615a2..0e14188 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -46,7 +46,7 @@ export class ProductService { findAll(page) { return this.productRepository.findAndCount({ skip: page * 10, - relations: ['subCategories'], + relations: ['sub_categories'], take: 10, order: { version: 'DESC', @@ -57,8 +57,8 @@ export class ProductService { findAllByCategories(page, categories) { return this.productRepository.findAndCount({ join: { - alias: 'subCategories', - innerJoin: { subCategories: 'roles.users' }, + alias: 'sub_categories', + innerJoin: { sub_categories: 'roles.users' }, }, skip: page * 10, take: 10, From 17c68fa402e7334ef0e3caf66a5857bab3c0b79c Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 13:42:03 +0700 Subject: [PATCH 041/135] fix: transaction --- src/transaction/entities/transactions.entity.ts | 2 +- src/transaction/transaction.service.ts | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index af235db..5627735 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -30,5 +30,5 @@ export class Transactions extends BaseModel { @Column({ nullable: true, }) - userDestination: string; + user_destination: string; } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index e4d07a2..9e818f9 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -427,11 +427,9 @@ export class TransactionService { return a.plus(b); }, new Decimal(0)); - const coa = coas.find((it) => { - (it) => { - return it.id.toLowerCase() === coaId.toLowerCase(); - }; - }); + let coa = coas.find( + (it) => it.id.toLowerCase() === coaId.toLowerCase(), + ); let balance = new Decimal(coa.amount); From 6730c773fcef6969a50466584033a08a2798561e Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 14:19:09 +0700 Subject: [PATCH 042/135] add --- src/configurable/configurable.controller.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index 8d4d3ca..f1ca79c 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -7,7 +7,8 @@ import { Param, Delete, ParseUUIDPipe, - HttpStatus, Query, + HttpStatus, + Query, } from '@nestjs/common'; import { RoleService } from './roles.service'; @@ -16,11 +17,11 @@ import { RoleService } from './roles.service'; version: '1', }) export class ConfigurableController { - constructor(private readonly usersService: RoleService) {} + constructor(private readonly roleService: RoleService) {} - @Get() + @Get('/roles') async findAll(@Query('page') page: number) { - const [data, count] = await this.usersService.findAllRoles(page); + const [data, count] = await this.roleService.findAllRoles(page); return { data, @@ -33,10 +34,9 @@ export class ConfigurableController { @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { - data: await this.usersService.findOne(id), + data: await this.roleService.findOne(id), statusCode: HttpStatus.OK, message: 'success', }; } - } From cc9a92dbab72003200e0222e3c78759c69054809 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 14:26:01 +0700 Subject: [PATCH 043/135] add roles in findBySupperior --- src/users/users.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index e7ff8c6..f4f5329 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -111,6 +111,7 @@ export class UsersService { return this.usersRepository.findAndCount({ skip: page * 10, take: 10, + relations: ['roles'], where: { superior: superriorId, }, From 38dedebae7f2a1b7a30f9ddd55c25e8ea896ccf1 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 10 Dec 2021 15:31:19 +0700 Subject: [PATCH 044/135] add validation in create member --- src/users/users.service.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index f4f5329..228a642 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -36,6 +36,21 @@ export class UsersService { async create(createUserDto: CreateUserDto, currentUser: any) { const roles = await this.roleService.findOne(createUserDto.roleId); const superior = await this.findByUsername(currentUser.username); + + const check = await this.usersRepository.findOne({ + username: createUserDto.username, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Username Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + const salt = randomStringGenerator(); const userData = new User(); From d332935e85eeb4be870210ce9148cd24929a0bc4 Mon Sep 17 00:00:00 2001 From: ilham Date: Sat, 11 Dec 2021 11:24:28 +0700 Subject: [PATCH 045/135] add: commission setting --- src/configurable/commission.service.ts | 48 +++++++++++++++++++ src/configurable/configurable.controller.ts | 30 +++++++++++- src/configurable/configurable.module.ts | 8 ++-- .../entities/commission_setting.entity.ts | 16 +++++++ src/helper/enum-list.ts | 9 +++- src/users/entities/partner.entity.ts | 13 +++++ src/users/entities/userDetail.entity.ts | 18 ------- src/users/entities/user_detail.entity.ts | 22 +++++++++ 8 files changed, 140 insertions(+), 24 deletions(-) create mode 100644 src/configurable/commission.service.ts create mode 100644 src/configurable/entities/commission_setting.entity.ts create mode 100644 src/users/entities/partner.entity.ts delete mode 100644 src/users/entities/userDetail.entity.ts create mode 100644 src/users/entities/user_detail.entity.ts diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts new file mode 100644 index 0000000..3765970 --- /dev/null +++ b/src/configurable/commission.service.ts @@ -0,0 +1,48 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { EntityNotFoundError, Repository } from 'typeorm'; +import { Roles } from './entities/roles.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { UpdateUserDto } from '../users/dto/update-user.dto'; +import { CommissionSetting } from './entities/commission_setting.entity'; + +@Injectable() +export class CommissionService { + constructor( + @InjectRepository(CommissionSetting) + private commissionRepository: Repository, + ) {} + + findAllRoles(page) { + return this.commissionRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } + + async updateCommission(id: string, request) { + try { + await this.commissionRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + + const result = await this.commissionRepository.update(id, { + commission: request.value, + }); + + return this.commissionRepository.findOneOrFail(id); + } +} diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index f1ca79c..63d6006 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -11,13 +11,17 @@ import { Query, } from '@nestjs/common'; import { RoleService } from './roles.service'; +import { CommissionService } from './commission.service'; @Controller({ path: 'config', version: '1', }) export class ConfigurableController { - constructor(private readonly roleService: RoleService) {} + constructor( + private readonly roleService: RoleService, + private readonly commissionService: CommissionService, + ) {} @Get('/roles') async findAll(@Query('page') page: number) { @@ -31,6 +35,18 @@ export class ConfigurableController { }; } + @Get('/commission') + async findCommission(@Query('page') page: number) { + const [data, count] = await this.commissionService.findAllRoles(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { @@ -39,4 +55,16 @@ export class ConfigurableController { message: 'success', }; } + + @Put('/commission/:id') + async updateCommission( + @Param('id', ParseUUIDPipe) id: string, + @Body() request, + ) { + return { + data: await this.commissionService.updateCommission(id, request), + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/configurable/configurable.module.ts b/src/configurable/configurable.module.ts index 5325245..58d0459 100644 --- a/src/configurable/configurable.module.ts +++ b/src/configurable/configurable.module.ts @@ -3,11 +3,13 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { Roles } from './entities/roles.entity'; import { ConfigurableController } from './configurable.controller'; import { RoleService } from './roles.service'; +import { CommissionService } from './commission.service'; +import { CommissionSetting } from './entities/commission_setting.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Roles])], + imports: [TypeOrmModule.forFeature([Roles, CommissionSetting])], controllers: [ConfigurableController], - providers: [RoleService], - exports: [RoleService] + providers: [RoleService, CommissionService], + exports: [RoleService], }) export class ConfigurableModule {} diff --git a/src/configurable/entities/commission_setting.entity.ts b/src/configurable/entities/commission_setting.entity.ts new file mode 100644 index 0000000..8f0de02 --- /dev/null +++ b/src/configurable/entities/commission_setting.entity.ts @@ -0,0 +1,16 @@ +import { Entity, Column, OneToOne, JoinColumn } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { Roles } from './roles.entity'; + +@Entity() +export class CommissionSetting extends BaseModel { + @Column() + name: string; + + @Column() + commission: number; + + @OneToOne(() => Roles) + @JoinColumn() + role: Roles; +} diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 303ff60..2ba4d88 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -24,10 +24,15 @@ export enum coaType { BANK, EXPENSE, ACCOUNT_RECEIVABLE, - ACCOUNT_PAYABLE + ACCOUNT_PAYABLE, } export enum balanceType { DEBIT, CREDIT, -} \ No newline at end of file +} + +export enum accountType { + PARTNER, + CUSTOMER, +} diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts new file mode 100644 index 0000000..8ff03d9 --- /dev/null +++ b/src/users/entities/partner.entity.ts @@ -0,0 +1,13 @@ +import { Roles } from 'src/configurable/entities/roles.entity'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { hashPassword } from '../../helper/hash_password'; + +@Entity() +export class User extends BaseModel { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; +} diff --git a/src/users/entities/userDetail.entity.ts b/src/users/entities/userDetail.entity.ts deleted file mode 100644 index 579325b..0000000 --- a/src/users/entities/userDetail.entity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - Entity, - Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, -} from 'typeorm'; - -@Entity() -export class User { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column() - firstName: string; -} diff --git a/src/users/entities/user_detail.entity.ts b/src/users/entities/user_detail.entity.ts new file mode 100644 index 0000000..7113eb9 --- /dev/null +++ b/src/users/entities/user_detail.entity.ts @@ -0,0 +1,22 @@ +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; +import { accountType } from '../../helper/enum-list'; + +@Entity() +export class UserDetail { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; + + @Column() + first_name: string; + + @Column() + phone_number: string; + + @Column({ + nullable: true, + }) + type: accountType; +} From 14a00988d90e9c400bf56d57521022f4ec6357c5 Mon Sep 17 00:00:00 2001 From: ilham Date: Sat, 11 Dec 2021 23:45:03 +0700 Subject: [PATCH 046/135] add: create supplier --- src/helper/enum-list.ts | 2 + src/product/dto/product/create-product.dto.ts | 3 + .../entities/product-history-price.entity.ts | 4 + src/product/entities/product.entity.ts | 11 ++ src/transaction/coa.service.ts | 57 +++++++-- src/transaction/dto/input-coa.dto.ts | 4 + src/transaction/entities/coa.entity.ts | 16 ++- .../entities/transaction-journal.entity.ts | 1 - .../entities/transaction-type.entity.ts | 11 -- src/transaction/transaction.module.ts | 10 +- src/transaction/transaction.service.ts | 3 - src/users/dto/create-partner.dto.ts | 15 +++ src/users/dto/create-supplier.dto.ts | 9 ++ .../{partner.entity.ts => supplier.entity.ts} | 8 +- src/users/supplier.service.spec.ts | 18 +++ src/users/supplier.service.ts | 114 ++++++++++++++++++ src/users/users.controller.ts | 16 ++- src/users/users.module.ts | 10 +- 18 files changed, 267 insertions(+), 45 deletions(-) delete mode 100644 src/transaction/entities/transaction-type.entity.ts create mode 100644 src/users/dto/create-partner.dto.ts create mode 100644 src/users/dto/create-supplier.dto.ts rename src/users/entities/{partner.entity.ts => supplier.entity.ts} (77%) create mode 100644 src/users/supplier.service.spec.ts create mode 100644 src/users/supplier.service.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 2ba4d88..8c29165 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -25,6 +25,8 @@ export enum coaType { EXPENSE, ACCOUNT_RECEIVABLE, ACCOUNT_PAYABLE, + BUDGET, + CONTRA_BUDGET, } export enum balanceType { diff --git a/src/product/dto/product/create-product.dto.ts b/src/product/dto/product/create-product.dto.ts index be1ab0c..74433dc 100644 --- a/src/product/dto/product/create-product.dto.ts +++ b/src/product/dto/product/create-product.dto.ts @@ -18,4 +18,7 @@ export class CreateProductDto { @IsUUID() subCategoriesId: string; + + @IsUUID() + supplierId: string; } diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index e50d22d..6abf098 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -2,6 +2,7 @@ import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { productType } from '../../helper/enum-list'; +import { User } from '../../users/entities/user.entity'; @Entity() export class ProductHistoryPrice extends BaseModel { @@ -11,6 +12,9 @@ export class ProductHistoryPrice extends BaseModel { @ManyToOne(() => Product, (product) => product.id) product: Product; + @ManyToOne(() => User, (user) => user.id) + user: User; + @Column() price: number; diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 982fa3b..cc2241f 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -11,6 +11,7 @@ import { } from 'typeorm'; import { ProductSubCategories } from './product-sub-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; +import { Supplier } from '../../users/entities/supplier.entity'; @Entity() export class Product extends BaseModel { @@ -43,4 +44,14 @@ export class Product extends BaseModel { }, ) sub_categories: ProductSubCategories; + + @ManyToOne( + () => { + return Supplier; + }, + (partner) => { + return partner.id; + }, + ) + supplier: Supplier; } diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index d828f5f..33beffc 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; @@ -10,24 +16,40 @@ export class CoaService { constructor( @InjectRepository(COA) private coaRepository: Repository, - @Inject(forwardRef(() => UsersService)) + @Inject( + forwardRef(() => { + return UsersService; + }), + ) private userService: UsersService, ) {} async create(inputCoaDto: InputCoaDto) { - const user = inputCoaDto.user - let coaData = new COA(); - coaData.user = user.id; - coaData.name = coaType[inputCoaDto.type] + '-' + user.username; + const coaData = new COA(); + let name = ''; + if (inputCoaDto.user) { + coaData.user = inputCoaDto.user.id; + name = inputCoaDto.user.username; + } + + if (inputCoaDto.supplier) { + coaData.supplier = inputCoaDto.supplier.id; + name = inputCoaDto.supplier.code; + } + + coaData.name = `${coaType[inputCoaDto.type]}-${name}`; coaData.balanceType = inputCoaDto.balanceType; coaData.type = inputCoaDto.type; coaData.amount = 0; - const result = await inputCoaDto.coaEntityManager.insert(COA,coaData); + const result = await inputCoaDto.coaEntityManager.insert(COA, coaData); - if(inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || inputCoaDto.type == coaType.ACCOUNT_PAYABLE){ + if ( + inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || + inputCoaDto.type == coaType.ACCOUNT_PAYABLE + ) { coaData.relatedUser = inputCoaDto.relatedUserId; - await inputCoaDto.coaEntityManager.save(coaData) + await inputCoaDto.coaEntityManager.save(coaData); } return coaData; @@ -35,7 +57,10 @@ export class CoaService { async findByUser(id: string, typeOfCoa: coaType) { try { - return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa }); + return await this.coaRepository.findOneOrFail({ + user: id, + type: typeOfCoa, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -51,9 +76,17 @@ export class CoaService { } } - async findByUserWithRelated(id: string, relatedId: string, typeOfCoa: coaType) { + async findByUserWithRelated( + id: string, + relatedId: string, + typeOfCoa: coaType, + ) { try { - return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa, relatedUser:relatedId }); + return await this.coaRepository.findOneOrFail({ + user: id, + type: typeOfCoa, + relatedUser: relatedId, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/dto/input-coa.dto.ts b/src/transaction/dto/input-coa.dto.ts index 5e068dc..b6c580d 100644 --- a/src/transaction/dto/input-coa.dto.ts +++ b/src/transaction/dto/input-coa.dto.ts @@ -2,6 +2,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { balanceType, coaType } from 'src/helper/enum-list'; import { User } from 'src/users/entities/user.entity'; import { EntityManager } from 'typeorm'; +import { Supplier } from '../../users/entities/supplier.entity'; export class InputCoaDto { @IsUUID() @@ -16,6 +17,9 @@ export class InputCoaDto { @IsUUID() relatedUserId: string; + @IsUUID() + supplier: Supplier; + @IsNotEmpty() coaEntityManager: EntityManager; } diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index a463b68..b26ece3 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -1,7 +1,4 @@ -import { - Entity, - Column, -} from 'typeorm'; +import { Entity, Column } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { coaType, balanceType } from '../../helper/enum-list'; @@ -19,11 +16,18 @@ export class COA extends BaseModel { @Column() amount: number; - @Column() + @Column({ + nullable: true, + }) user: string; @Column({ - nullable:true + nullable: true, }) relatedUser: string; + + @Column({ + nullable: true, + }) + supplier: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index ad5ba0a..821fc71 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -9,7 +9,6 @@ import { import { BaseModel } from '../../config/basemodel.entity'; import { COA } from './coa.entity'; import { Transactions } from './transactions.entity'; -import { TransactionType } from './transaction-type.entity'; import { balanceType } from '../../helper/enum-list'; @Entity() diff --git a/src/transaction/entities/transaction-type.entity.ts b/src/transaction/entities/transaction-type.entity.ts deleted file mode 100644 index c146c85..0000000 --- a/src/transaction/entities/transaction-type.entity.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - Entity, - Column, -} from 'typeorm'; -import { BaseModel } from '../../config/basemodel.entity'; - -@Entity() -export class TransactionType extends BaseModel { - @Column() - name: string; -} diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 8b1f631..698ef2b 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -4,7 +4,6 @@ import { TransactionController } from './transaction.controller'; import { PpobCallbackController } from './ppob_callback.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; -import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; @@ -13,17 +12,12 @@ import { UsersModule } from 'src/users/users.module'; @Module({ imports: [ - TypeOrmModule.forFeature([ - TransactionType, - COA, - TransactionJournal, - Transactions, - ]), + TypeOrmModule.forFeature([COA, TransactionJournal, Transactions]), ProductModule, forwardRef(() => UsersModule), ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], - exports:[CoaService] + exports: [CoaService], }) export class TransactionModule {} diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 9e818f9..17769fd 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -5,7 +5,6 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; import { Connection, EntityManager, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; -import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import * as uuid from 'uuid'; @@ -34,8 +33,6 @@ export class TransactionService { constructor( @InjectRepository(Transactions) private transactionRepository: Repository, - @InjectRepository(TransactionType) - private transactionTypeRepository: Repository, @InjectRepository(TransactionJournal) private transactionJournalRepository: Repository, @InjectRepository(COA) diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts new file mode 100644 index 0000000..b4acc45 --- /dev/null +++ b/src/users/dto/create-partner.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty } from 'class-validator'; + +export class CreatePartnerDto { + @IsNotEmpty() + name: string; + + @IsNotEmpty() + address: string; + + @IsNotEmpty() + owner: string; + + @IsNotEmpty() + npwp: string; +} diff --git a/src/users/dto/create-supplier.dto.ts b/src/users/dto/create-supplier.dto.ts new file mode 100644 index 0000000..8a2e585 --- /dev/null +++ b/src/users/dto/create-supplier.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class CreateSupplierDto { + @IsNotEmpty() + name: string; + + @IsNotEmpty() + code: string; +} diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/supplier.entity.ts similarity index 77% rename from src/users/entities/partner.entity.ts rename to src/users/entities/supplier.entity.ts index 8ff03d9..080c04c 100644 --- a/src/users/entities/partner.entity.ts +++ b/src/users/entities/supplier.entity.ts @@ -4,10 +4,16 @@ import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; @Entity() -export class User extends BaseModel { +export class Supplier extends BaseModel { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; + + @Column() + code: string; + + @Column() + status: boolean; } diff --git a/src/users/supplier.service.spec.ts b/src/users/supplier.service.spec.ts new file mode 100644 index 0000000..9eb9cce --- /dev/null +++ b/src/users/supplier.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SupplierService } from './supplier.service'; + +describe('PartnerService', () => { + let service: SupplierService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [SupplierService], + }).compile(); + + service = module.get(SupplierService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/users/supplier.service.ts b/src/users/supplier.service.ts new file mode 100644 index 0000000..a5ccbcf --- /dev/null +++ b/src/users/supplier.service.ts @@ -0,0 +1,114 @@ +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Supplier } from './entities/supplier.entity'; +import { InputCoaDto } from '../transaction/dto/input-coa.dto'; +import { balanceType, coaType } from '../helper/enum-list'; +import { CreateSupplierDto } from './dto/create-supplier.dto'; +import { CoaService } from '../transaction/coa.service'; +import * as uuid from 'uuid'; + +@Injectable() +export class SupplierService { + constructor( + @InjectRepository(Supplier) + private supplierRepository: Repository, + @Inject( + forwardRef(() => { + return CoaService; + }), + ) + private coaService: CoaService, + private connection: Connection, + ) {} + + async create(createSupplierDto: CreateSupplierDto) { + const check = await this.supplierRepository.findOne({ + code: createSupplierDto.code, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Supplier Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const supplierData = new Supplier(); + supplierData.id = uuid.v4(); + supplierData.name = createSupplierDto.name; + supplierData.code = createSupplierDto.code; + supplierData.status = true; + + await this.connection.transaction(async (manager) => { + const result = await manager.insert(Supplier, supplierData); + + const dataCoaInventory = new InputCoaDto(); + dataCoaInventory.supplier = supplierData; + dataCoaInventory.balanceType = balanceType.DEBIT; + dataCoaInventory.type = coaType.INVENTORY; + dataCoaInventory.coaEntityManager = manager; + await this.coaService.create(dataCoaInventory); + + const dataCoaCostOfSales = new InputCoaDto(); + dataCoaCostOfSales.supplier = supplierData; + dataCoaCostOfSales.balanceType = balanceType.DEBIT; + dataCoaCostOfSales.type = coaType.COST_OF_SALES; + dataCoaCostOfSales.coaEntityManager = manager; + await this.coaService.create(dataCoaCostOfSales); + + const dataCoaBudget = new InputCoaDto(); + dataCoaBudget.supplier = supplierData; + dataCoaBudget.balanceType = balanceType.DEBIT; + dataCoaBudget.type = coaType.BUDGET; + dataCoaBudget.coaEntityManager = manager; + await this.coaService.create(dataCoaBudget); + + const dataCoaContraBudget = new InputCoaDto(); + dataCoaContraBudget.supplier = supplierData; + dataCoaContraBudget.balanceType = balanceType.CREDIT; + dataCoaContraBudget.type = coaType.CONTRA_BUDGET; + dataCoaContraBudget.coaEntityManager = manager; + await this.coaService.create(dataCoaContraBudget); + }); + + return supplierData; + } + + findAllSupplier(page) { + return this.supplierRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } + + async findOne(id: string) { + try { + return await this.supplierRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } +} diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index addb15e..7980740 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -15,13 +15,18 @@ import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Public } from '../auth/public.decorator'; +import { CreateSupplierDto } from './dto/create-supplier.dto'; +import { SupplierService } from './supplier.service'; @Controller({ path: 'users', version: '1', }) export class UsersController { - constructor(private readonly usersService: UsersService) {} + constructor( + private readonly usersService: UsersService, + private readonly supplierService: SupplierService, + ) {} @Post() async create(@Request() req, @Body() createUserDto: CreateUserDto) { @@ -32,6 +37,15 @@ export class UsersController { }; } + @Post('supplier') + async createPartner(@Body() createPartnerDto: CreateSupplierDto) { + return { + data: await this.supplierService.create(createPartnerDto), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Public() @Get() async findAll(@Query('page') page: number) { diff --git a/src/users/users.module.ts b/src/users/users.module.ts index c9ef16d..637a6ea 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -5,11 +5,17 @@ import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; import { TransactionModule } from 'src/transaction/transaction.module'; import { ConfigurableModule } from 'src/configurable/configurable.module'; +import { SupplierService } from './supplier.service'; +import { Supplier } from './entities/supplier.entity'; @Module({ - imports: [TypeOrmModule.forFeature([User]), forwardRef(() => TransactionModule), ConfigurableModule], + imports: [ + TypeOrmModule.forFeature([User, Supplier]), + forwardRef(() => TransactionModule), + ConfigurableModule, + ], controllers: [UsersController], - providers: [UsersService], + providers: [UsersService, SupplierService], exports: [UsersService], }) export class UsersModule {} From ed5ca6556dfefe47fb707a1a4572746ca48bc4ee Mon Sep 17 00:00:00 2001 From: ilham Date: Sun, 12 Dec 2021 00:23:13 +0700 Subject: [PATCH 047/135] add: top up saldo supplier --- src/transaction/dto/add-saldo-supplier.dto.ts | 16 +++++---- src/transaction/transaction.controller.ts | 2 +- src/transaction/transaction.service.ts | 34 ++++++++++++++----- src/users/supplier.service.ts | 6 ++-- src/users/users.module.ts | 2 +- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/transaction/dto/add-saldo-supplier.dto.ts b/src/transaction/dto/add-saldo-supplier.dto.ts index 6f27f52..8927ac7 100644 --- a/src/transaction/dto/add-saldo-supplier.dto.ts +++ b/src/transaction/dto/add-saldo-supplier.dto.ts @@ -1,12 +1,16 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; -import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; +import { + balanceType, + coaType, + statusTransaction, + typeTransaction, +} from 'src/helper/enum-list'; import { EntityManager } from 'typeorm'; - export class AddSaldoSupplier { - @IsNotEmpty() - supplier?: string; + @IsNotEmpty() + supplier: string; - @IsNotEmpty() - amount?: number; + @IsNotEmpty() + amount: number; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 1d60c85..9d95332 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -54,7 +54,7 @@ export class TransactionController { @Request() req, ) { return { - data: await this.transactionService.addIRSWallet( + data: await this.transactionService.addPartnerSaldo( addSaldoSupplier, req.user, ), diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 17769fd..7772502 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -21,6 +21,7 @@ import * as irsService from '../helper/irs-service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; +import { SupplierService } from '../users/supplier.service'; interface JournalEntry { coa_id: string; @@ -40,17 +41,29 @@ export class TransactionService { private coaService: CoaService, private productService: ProductService, private userService: UsersService, + private supplierService: SupplierService, private connection: Connection, ) {} - async addIRSWallet(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { + async addPartnerSaldo(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { + const supplier = await this.supplierService.findByCode( + addSaldoSupplier.supplier, + ); // GET COA const coaBank = await this.coaService.findByName( `${coaType[coaType.BANK]}-SYSTEM`, ); const coaInventory = await this.coaService.findByName( - `${coaType[coaType.INVENTORY]}-${addSaldoSupplier.supplier}`, + `${coaType[coaType.INVENTORY]}-${supplier.code}`, + ); + + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); + + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, ); //GET USER @@ -78,10 +91,18 @@ export class TransactionService { journals: [ { coa_id: coaBank.id, - debit: transactionData.amount, + credit: transactionData.amount, }, { coa_id: coaInventory.id, + debit: transactionData.amount, + }, + { + coa_id: coaBudget.id, + debit: transactionData.amount, + }, + { + coa_id: coaContraBudget.id, credit: transactionData.amount, }, ], @@ -429,15 +450,12 @@ export class TransactionService { ); let balance = new Decimal(coa.amount); - - if (coa.balanceType === balanceType.DEBIT) { + if (coa.balanceType == balanceType.DEBIT) { balance = balance.plus(debitSum.minus(creditSum)); - } else if (coa.balanceType === balanceType.CREDIT) { + } else if (coa.balanceType == balanceType.CREDIT) { balance = balance.plus(creditSum.minus(debitSum)); } - const diff = balance.minus(new Decimal(coa.amount)); - return createJournalDto.transactionalEntityManager .createQueryBuilder() .update(COA) diff --git a/src/users/supplier.service.ts b/src/users/supplier.service.ts index a5ccbcf..6f5278b 100644 --- a/src/users/supplier.service.ts +++ b/src/users/supplier.service.ts @@ -94,9 +94,11 @@ export class SupplierService { }); } - async findOne(id: string) { + async findByCode(code: string) { try { - return await this.supplierRepository.findOneOrFail(id); + return await this.supplierRepository.findOneOrFail({ + code: code, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 637a6ea..0cf442a 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -16,6 +16,6 @@ import { Supplier } from './entities/supplier.entity'; ], controllers: [UsersController], providers: [UsersService, SupplierService], - exports: [UsersService], + exports: [UsersService, SupplierService], }) export class UsersModule {} From 78470a0e3fdca66f7ebd8490dd455acd995d1514 Mon Sep 17 00:00:00 2001 From: ilham Date: Sun, 12 Dec 2021 01:01:37 +0700 Subject: [PATCH 048/135] fix: distribute saldo partner from admin --- .../dto/distribute-transaction.dto.ts | 3 ++ .../entities/transaction-journal.entity.ts | 8 ++-- src/transaction/transaction.service.ts | 39 ++++++++++++++++--- src/users/users.service.ts | 5 ++- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/transaction/dto/distribute-transaction.dto.ts b/src/transaction/dto/distribute-transaction.dto.ts index 7d79186..c1728ce 100644 --- a/src/transaction/dto/distribute-transaction.dto.ts +++ b/src/transaction/dto/distribute-transaction.dto.ts @@ -6,4 +6,7 @@ export class DistributeTransactionDto { @IsNotEmpty() destination: string; + + @IsNotEmpty() + supplier: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index 821fc71..b3a9664 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -19,15 +19,15 @@ export class TransactionJournal extends BaseModel { @Column() amount: number; - @OneToOne( + @ManyToOne( () => { return Transactions; }, - (trans) => { - return trans.id; + (transaction) => { + return transaction.id; }, ) - transaction: Transactions; + transaction_head: Transactions; @ManyToOne( () => { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 7772502..f831e16 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -116,6 +116,25 @@ export class TransactionService { distributeTransactionDto: DistributeTransactionDto, currentUser: any, ) { + //GET USER + const userData = await this.userService.findByUsername( + currentUser.username, + ); + if (userData.roles.name != 'Admin') { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Roles Not Admin', + }, + HttpStatus.NOT_ACCEPTABLE, + ); + } + + //GET Supplier + const supplier = await this.supplierService.findByCode( + distributeTransactionDto.supplier, + ); + // GET COA const coaAR = await this.coaService.findByUser( distributeTransactionDto.destination, @@ -125,10 +144,12 @@ export class TransactionService { distributeTransactionDto.destination, coaType.WALLET, ); + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); - //GET USER - const userData = await this.userService.findByUsername( - currentUser.username, + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, ); await this.connection.transaction(async (manager) => { @@ -157,6 +178,14 @@ export class TransactionService { coa_id: coaWallet.id, credit: transactionData.amount, }, + { + coa_id: coaBudget.id, + credit: transactionData.amount, + }, + { + coa_id: coaContraBudget.id, + debit: transactionData.amount, + }, ], }); }); @@ -412,9 +441,9 @@ export class TransactionService { ? balanceType.DEBIT : balanceType.CREDIT; journalEntry.amount = journal.debit ? journal.debit : journal.credit; - journalEntry.transaction = transaction; + journalEntry.transaction_head = transaction; - return this.transactionJournalRepository.save(journalEntry); + return createJournalDto.transactionalEntityManager.save(journalEntry); }), ); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 228a642..2f3cb0e 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -157,7 +157,10 @@ export class UsersService { async findByUsername(username: string) { try { return await this.usersRepository.findOneOrFail({ - username: username, + where: { + username: username, + }, + relations: ['roles'], }); } catch (e) { if (e instanceof EntityNotFoundError) { From ff60406af29e3aad45be79dc82a8fee3768044e9 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 13 Dec 2021 00:49:13 +0700 Subject: [PATCH 049/135] add:partner module --- src/auth/auth.service.ts | 1 + src/configurable/roles.service.ts | 2 +- src/transaction/transaction.service.ts | 2 +- src/users/dto/create-partner.dto.ts | 3 + src/users/dto/create-user.dto.ts | 2 + src/users/entities/partner.entity.ts | 22 ++++++ src/users/entities/user.entity.ts | 11 +++ src/users/partner/partner.service.spec.ts | 18 +++++ src/users/partner/partner.service.ts | 79 +++++++++++++++++++ .../{ => supplier}/supplier.service.spec.ts | 0 src/users/{ => supplier}/supplier.service.ts | 10 +-- src/users/users.controller.ts | 54 +++++++++++-- src/users/users.module.ts | 8 +- src/users/users.service.ts | 29 ++++--- 14 files changed, 216 insertions(+), 25 deletions(-) create mode 100644 src/users/entities/partner.entity.ts create mode 100644 src/users/partner/partner.service.spec.ts create mode 100644 src/users/partner/partner.service.ts rename src/users/{ => supplier}/supplier.service.spec.ts (100%) rename src/users/{ => supplier}/supplier.service.ts (91%) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index e0212c1..78f8b4b 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -28,6 +28,7 @@ export class AuthService { username: user.username, sub: user.id, role: user.roles.name, + partner: user.partner.id, }; return { diff --git a/src/configurable/roles.service.ts b/src/configurable/roles.service.ts index 9404376..7147f1a 100644 --- a/src/configurable/roles.service.ts +++ b/src/configurable/roles.service.ts @@ -28,7 +28,7 @@ export class RoleService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Data Role not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index f831e16..3af4c7a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -21,7 +21,7 @@ import * as irsService from '../helper/irs-service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; -import { SupplierService } from '../users/supplier.service'; +import { SupplierService } from '../users/supplier/supplier.service'; interface JournalEntry { coa_id: string; diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts index b4acc45..2fbac10 100644 --- a/src/users/dto/create-partner.dto.ts +++ b/src/users/dto/create-partner.dto.ts @@ -12,4 +12,7 @@ export class CreatePartnerDto { @IsNotEmpty() npwp: string; + + @IsNotEmpty() + password_account: string; } diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index d9f00b8..122fd85 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,4 +1,5 @@ import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator'; +import { Partner } from '../entities/partner.entity'; export class CreateUserDto { @IsNotEmpty() @@ -13,6 +14,7 @@ export class CreateUserDto { @IsNotEmpty() superior: boolean; + partner: Partner; // @ValidateIf((o) => { // return !!o.superior; // }) diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts new file mode 100644 index 0000000..9d2402b --- /dev/null +++ b/src/users/entities/partner.entity.ts @@ -0,0 +1,22 @@ +import { Roles } from 'src/configurable/entities/roles.entity'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { hashPassword } from '../../helper/hash_password'; + +@Entity() +export class Partner extends BaseModel { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; + + @Column() + npwp: string; + + @Column() + address: string; + + @Column({ default: true }) + status: boolean; +} diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 5a121c6..89bc47f 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -2,6 +2,7 @@ import { Roles } from 'src/configurable/entities/roles.entity'; import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; +import { Partner } from './partner.entity'; @Entity() export class User extends BaseModel { @@ -39,4 +40,14 @@ export class User extends BaseModel { }, ) roles: Roles; + + @ManyToOne( + () => { + return Partner; + }, + (partner) => { + return partner.id; + }, + ) + partner: Partner; } diff --git a/src/users/partner/partner.service.spec.ts b/src/users/partner/partner.service.spec.ts new file mode 100644 index 0000000..81edeba --- /dev/null +++ b/src/users/partner/partner.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { PartnerService } from './partner.service'; + +describe('PartnerService', () => { + let service: PartnerService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [PartnerService], + }).compile(); + + service = module.get(PartnerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts new file mode 100644 index 0000000..78ca16d --- /dev/null +++ b/src/users/partner/partner.service.ts @@ -0,0 +1,79 @@ +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { CoaService } from '../../transaction/coa.service'; +import { CreatePartnerDto } from '../dto/create-partner.dto'; +import { Partner } from '../entities/partner.entity'; +import * as uuid from 'uuid'; +import { UsersService } from '../users.service'; +import { CreateUserDto } from '../dto/create-user.dto'; + +@Injectable() +export class PartnerService { + constructor( + @InjectRepository(Partner) + private partnerRepository: Repository, + @Inject( + forwardRef(() => { + return CoaService; + }), + ) + private coaService: CoaService, + private userService: UsersService, + private connection: Connection, + ) {} + + async create(createPartnerDto: CreatePartnerDto, currentUser: any) { + const check = await this.partnerRepository.findOne({ + npwp: createPartnerDto.npwp, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'N Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const partnerData = new Partner(); + partnerData.id = uuid.v4(); + partnerData.name = createPartnerDto.name; + partnerData.npwp = createPartnerDto.npwp; + partnerData.address = createPartnerDto.address; + partnerData.status = true; + + await this.connection.transaction(async (manager) => { + const result = await manager.insert(Partner, partnerData); + }); + + const dataUser = new CreateUserDto(); + dataUser.username = `admin_${partnerData.name}`; + dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b'; + dataUser.superior = false; + dataUser.partner = partnerData; + dataUser.password = createPartnerDto.password_account; + + await this.userService.create(dataUser, currentUser); + + return partnerData; + } + + findAllPartner(page) { + return this.partnerRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } +} diff --git a/src/users/supplier.service.spec.ts b/src/users/supplier/supplier.service.spec.ts similarity index 100% rename from src/users/supplier.service.spec.ts rename to src/users/supplier/supplier.service.spec.ts diff --git a/src/users/supplier.service.ts b/src/users/supplier/supplier.service.ts similarity index 91% rename from src/users/supplier.service.ts rename to src/users/supplier/supplier.service.ts index 6f5278b..3bff728 100644 --- a/src/users/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -7,11 +7,11 @@ import { } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, EntityNotFoundError, Repository } from 'typeorm'; -import { Supplier } from './entities/supplier.entity'; -import { InputCoaDto } from '../transaction/dto/input-coa.dto'; -import { balanceType, coaType } from '../helper/enum-list'; -import { CreateSupplierDto } from './dto/create-supplier.dto'; -import { CoaService } from '../transaction/coa.service'; +import { Supplier } from '../entities/supplier.entity'; +import { InputCoaDto } from '../../transaction/dto/input-coa.dto'; +import { balanceType, coaType } from '../../helper/enum-list'; +import { CreateSupplierDto } from '../dto/create-supplier.dto'; +import { CoaService } from '../../transaction/coa.service'; import * as uuid from 'uuid'; @Injectable() diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 7980740..e6a77ff 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -16,7 +16,9 @@ import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Public } from '../auth/public.decorator'; import { CreateSupplierDto } from './dto/create-supplier.dto'; -import { SupplierService } from './supplier.service'; +import { SupplierService } from './supplier/supplier.service'; +import { PartnerService } from './partner/partner.service'; +import { CreatePartnerDto } from './dto/create-partner.dto'; @Controller({ path: 'users', @@ -26,6 +28,7 @@ export class UsersController { constructor( private readonly usersService: UsersService, private readonly supplierService: SupplierService, + private readonly partnerService: PartnerService, ) {} @Post() @@ -38,7 +41,7 @@ export class UsersController { } @Post('supplier') - async createPartner(@Body() createPartnerDto: CreateSupplierDto) { + async createSupplier(@Body() createPartnerDto: CreateSupplierDto) { return { data: await this.supplierService.create(createPartnerDto), statusCode: HttpStatus.CREATED, @@ -46,10 +49,49 @@ export class UsersController { }; } - @Public() + @Post('partner') + async createPartner( + @Request() req, + @Body() createPartnerDto: CreatePartnerDto, + ) { + return { + data: await this.partnerService.create(createPartnerDto, req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Get() - async findAll(@Query('page') page: number) { - const [data, count] = await this.usersService.findAll(page); + async findAll(@Request() req, @Query('page') page: number) { + const [data, count] = await this.usersService.findAll( + page, + req.user.userId, + ); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Public() + @Get('supplier') + async findAllSupplier(@Query('page') page: number) { + const [data, count] = await this.supplierService.findAllSupplier(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('partner') + async findAllPartner(@Query('page') page: number) { + const [data, count] = await this.partnerService.findAllPartner(page); return { data, @@ -65,6 +107,7 @@ export class UsersController { req.user.userId, page, ); + return { data, count, @@ -79,6 +122,7 @@ export class UsersController { @Query('page') page: number, ) { const [data, count] = await this.usersService.findByRoles(id, page); + return { data, count, diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 0cf442a..079856d 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -5,17 +5,19 @@ import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; import { TransactionModule } from 'src/transaction/transaction.module'; import { ConfigurableModule } from 'src/configurable/configurable.module'; -import { SupplierService } from './supplier.service'; +import { SupplierService } from './supplier/supplier.service'; import { Supplier } from './entities/supplier.entity'; +import { Partner } from './entities/partner.entity'; +import { PartnerService } from './partner/partner.service'; @Module({ imports: [ - TypeOrmModule.forFeature([User, Supplier]), + TypeOrmModule.forFeature([User, Supplier, Partner]), forwardRef(() => TransactionModule), ConfigurableModule, ], controllers: [UsersController], - providers: [UsersService, SupplierService], + providers: [UsersService, SupplierService, PartnerService], exports: [UsersService, SupplierService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 2f3cb0e..e94e43f 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -7,7 +7,13 @@ import { } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { + Connection, + EntityNotFoundError, + Equal, + Not, + Repository, +} from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; @@ -59,53 +65,56 @@ export class UsersService { userData.username = createUserDto.username; userData.password = await hashPassword(createUserDto.password, salt); userData.salt = salt; - userData.superior = superior; + if (createUserDto.superior) { + userData.superior = superior; + } else { + userData.superior = null; + userData.partner = createUserDto.partner; + } userData.roles = roles; await this.connection.transaction(async (manager) => { const result = await manager.insert(User, userData); const dataCoaWallet = new InputCoaDto(); - dataCoaWallet.user = userData; dataCoaWallet.balanceType = balanceType.CREDIT; dataCoaWallet.type = coaType.WALLET; dataCoaWallet.coaEntityManager = manager; + await this.coaService.create(dataCoaWallet); if (createUserDto.superior) { const dataCoaAP = new InputCoaDto(); - dataCoaAP.user = userData; dataCoaAP.balanceType = balanceType.CREDIT; dataCoaAP.relatedUserId = superior.id; dataCoaAP.type = coaType.ACCOUNT_PAYABLE; dataCoaAP.coaEntityManager = manager; + await this.coaService.create(dataCoaAP); const dataCoaAR = new InputCoaDto(); - dataCoaAR.user = userData; dataCoaAR.balanceType = balanceType.DEBIT; dataCoaAR.relatedUserId = superior.id; dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; dataCoaAR.coaEntityManager = manager; - - await this.coaService.create(dataCoaAP); await this.coaService.create(dataCoaAR); } - - await this.coaService.create(dataCoaWallet); }); return userData; } - findAll(page: number) { + findAll(page: number, id: string) { return this.usersRepository.findAndCount({ skip: page * 10, take: 10, order: { version: 'DESC', }, + where: { + id: Not(Equal(id)), + }, }); } From 26e74011633ec2a4df4fd91d52612a0675521891 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Tue, 14 Dec 2021 03:54:30 +0700 Subject: [PATCH 050/135] fix jwt --- src/auth/auth.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 78f8b4b..3e76f1c 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -28,7 +28,7 @@ export class AuthService { username: user.username, sub: user.id, role: user.roles.name, - partner: user.partner.id, + partner: user.partner?.id, }; return { From 6b1352e671d1735147ace6a6acdc89b656bc34d7 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 15:18:25 +0700 Subject: [PATCH 051/135] feat: add update partner endpoint --- src/users/dto/update-partner.dto.ts | 5 +++ src/users/partner/partner.service.ts | 59 +++++++++++++++++++++++----- src/users/users.controller.ts | 29 ++++++++++---- src/users/users.service.ts | 52 ++++++++++++++++++++++-- 4 files changed, 126 insertions(+), 19 deletions(-) create mode 100644 src/users/dto/update-partner.dto.ts diff --git a/src/users/dto/update-partner.dto.ts b/src/users/dto/update-partner.dto.ts new file mode 100644 index 0000000..2e2f4c1 --- /dev/null +++ b/src/users/dto/update-partner.dto.ts @@ -0,0 +1,5 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreatePartnerDto } from './create-partner.dto'; + +export class UpdatePartnerDto extends PartialType(CreatePartnerDto) { +} diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index 78ca16d..bbb715b 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -1,18 +1,14 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Connection, Not, Repository } from 'typeorm'; import { CoaService } from '../../transaction/coa.service'; import { CreatePartnerDto } from '../dto/create-partner.dto'; import { Partner } from '../entities/partner.entity'; import * as uuid from 'uuid'; import { UsersService } from '../users.service'; import { CreateUserDto } from '../dto/create-user.dto'; +import { UpdatePartnerDto } from '../dto/update-partner.dto'; +import { UpdateUserDto } from '../dto/update-user.dto'; @Injectable() export class PartnerService { @@ -38,7 +34,7 @@ export class PartnerService { throw new HttpException( { statusCode: HttpStatus.NOT_ACCEPTABLE, - error: 'N Already Exist', + error: 'NPWP Already Exist', }, HttpStatus.NOT_FOUND, ); @@ -67,6 +63,51 @@ export class PartnerService { return partnerData; } + async update( + id: string, + updatePartnerDto: UpdatePartnerDto, + currentUser: any, + ) { + const check = await this.partnerRepository.findOne({ + npwp: updatePartnerDto.npwp, + id: Not(id), + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'NPWP Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const partnerData = new Partner(); + + partnerData.id = id; + partnerData.name = updatePartnerDto.name; + partnerData.address = updatePartnerDto.address; + + if (updatePartnerDto.npwp) { + partnerData.npwp = updatePartnerDto.npwp; + } + + await this.connection.transaction(async (manager) => { + await manager.update(Partner, { id: id }, partnerData); + }); + + const dataUser = new UpdateUserDto(); + const userData = await this.userService.findOneByPartner(id); + + dataUser.username = `admin_${partnerData.name}`; + dataUser.partner = partnerData; + + await this.userService.update(userData.id, dataUser, currentUser); + + return partnerData; + } + findAllPartner(page) { return this.partnerRepository.findAndCount({ skip: page * 10, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index e6a77ff..02e4313 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -1,13 +1,13 @@ import { - Controller, - Get, - Post, Body, - Put, - Param, + Controller, Delete, - ParseUUIDPipe, + Get, HttpStatus, + Param, + ParseUUIDPipe, + Post, + Put, Query, Request, } from '@nestjs/common'; @@ -19,6 +19,7 @@ import { CreateSupplierDto } from './dto/create-supplier.dto'; import { SupplierService } from './supplier/supplier.service'; import { PartnerService } from './partner/partner.service'; import { CreatePartnerDto } from './dto/create-partner.dto'; +import { UpdatePartnerDto } from './dto/update-partner.dto'; @Controller({ path: 'users', @@ -61,6 +62,19 @@ export class UsersController { }; } + @Put('partner/:id') + async updatePartner( + @Param('id', ParseUUIDPipe) id: string, + @Request() req, + @Body() updatePartnerDto: UpdatePartnerDto, + ) { + return { + data: await this.partnerService.update(id, updatePartnerDto, req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Get() async findAll(@Request() req, @Query('page') page: number) { const [data, count] = await this.usersService.findAll( @@ -143,10 +157,11 @@ export class UsersController { @Put(':id') async update( @Param('id', ParseUUIDPipe) id: string, + @Request() req, @Body() updateUserDto: UpdateUserDto, ) { return { - data: await this.usersService.update(id, updateUserDto), + data: await this.usersService.update(id, updateUserDto, req.user), statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index e94e43f..743e04c 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -216,7 +216,7 @@ export class UsersService { } } - async update(id: string, updateUserDto: UpdateUserDto) { + async update(id: string, updateUserDto: UpdateUserDto, currentUser: any) { try { await this.usersRepository.findOneOrFail(id); } catch (e) { @@ -233,9 +233,32 @@ export class UsersService { } } - // const result = await this.usersRepository.update(id, updateUserDto); + const check = await this.usersRepository.findOne({ + username: updateUserDto.username, + id: Not(id), + }); - return this.usersRepository.findOneOrFail(id); + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Username Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const userData = new User(); + + userData.id = id; + userData.username = updateUserDto.username; + userData.partner = updateUserDto.partner; + + await this.connection.transaction(async (manager) => { + const result = await manager.update(User, { id: id }, userData); + }); + + return userData; } async remove(id: string) { @@ -266,4 +289,27 @@ export class UsersService { relations: ['roles'], }); } + + async findOneByPartner(partnerId: string) { + try { + return this.usersRepository.findOneOrFail({ + relations: ['roles'], + where: { + partner: partnerId, + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } From 04fd5c571ffc2a67a9af74bb5144c7f77ff1adf8 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 16:03:59 +0700 Subject: [PATCH 052/135] feat: add change status partner endpoint --- src/users/partner/partner.service.ts | 26 +++++++++++++++++++++++++- src/users/users.controller.ts | 12 ++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index bbb715b..8d3b23b 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, Not, Repository } from 'typeorm'; import { CoaService } from '../../transaction/coa.service'; @@ -108,6 +114,24 @@ export class PartnerService { return partnerData; } + setStatus = async (id: string, type: string) => { + const partnerData = await this.partnerRepository.findOne({ + id: id, + }); + + if (type === 'active') { + partnerData.status = true; + } else { + partnerData.status = false; + } + + await this.connection.transaction(async (manager) => { + await manager.update(Partner, { id: id }, partnerData); + }); + + return partnerData; + }; + findAllPartner(page) { return this.partnerRepository.findAndCount({ skip: page * 10, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 02e4313..f078627 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -62,6 +62,18 @@ export class UsersController { }; } + @Get('partner/:id/:type') + async setStatusPartner( + @Param('id', ParseUUIDPipe) id: string, + @Param('type') type: string, + ) { + return { + data: await this.partnerService.setStatus(id, type), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Put('partner/:id') async updatePartner( @Param('id', ParseUUIDPipe) id: string, From e07503e70ab61b18dfd14a82046f1efefc0500e7 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 16:04:31 +0700 Subject: [PATCH 053/135] build: add pino dependency in package json --- package.json | 6 ++- yarn.lock | 106 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 98 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 68ed9e8..eae83c4 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", - "start:dev": "nest start --watch", - "start:debug": "nest start --debug --watch", + "start:dev": "nest start --watch | pino-pretty", + "start:debug": "nest start --debug --watch | pino-pretty", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", @@ -42,7 +42,9 @@ "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "pg": "^8.7.1", + "pino": "^7.5.1", "pino-http": "^6.3.0", + "pino-pretty": "^7.3.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0", diff --git a/yarn.lock b/yarn.lock index bd50c2d..4e706e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1495,6 +1495,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +args@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761" + integrity sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ== + dependencies: + camelcase "5.0.0" + chalk "2.4.2" + leven "2.1.0" + mri "1.1.4" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" @@ -1745,6 +1755,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -1760,6 +1775,15 @@ caniuse-lite@^1.0.30001280: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== +chalk@2.4.2, chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -1779,15 +1803,6 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -1937,6 +1952,11 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2092,6 +2112,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -3708,6 +3733,11 @@ joi@^17.4.2: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3857,6 +3887,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +leven@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -4136,6 +4171,11 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mri@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" + integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -4550,7 +4590,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pino-abstract-transport@v0.5.0: +pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== @@ -4568,6 +4608,24 @@ pino-http@^6.3.0: pino "^7.0.5" pino-std-serializers "^5.0.0" +pino-pretty@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-7.3.0.tgz#277fdc2306a2f6d727a1127e7747d1c078efdd4b" + integrity sha512-HAhShJ2z2QzxXhYAn6XfwYpF13o1PQbjzSNA9q+30FAvhjOmeACit9lprhV/mCOw/8YFWSyyNk0YCq2EDYGYpw== + dependencies: + args "^5.0.1" + colorette "^2.0.7" + dateformat "^4.6.3" + fast-safe-stringify "^2.0.7" + joycon "^3.1.1" + pino-abstract-transport "^0.5.0" + pump "^3.0.0" + readable-stream "^3.6.0" + rfdc "^1.3.0" + secure-json-parse "^2.4.0" + sonic-boom "^2.2.0" + strip-json-comments "^3.1.1" + pino-std-serializers@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz" @@ -4613,6 +4671,23 @@ pino@^7.0.5: sonic-boom "^2.2.1" thread-stream "^0.13.0" +pino@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.5.1.tgz#6e4cd3389e9365caf64039d4b83dcfa84ed43fee" + integrity sha512-Wzo2G7CLaRHKOz3+Ex006LC5Xi0xEUm+mwm/h0NKzuKZONdekcbmjXg7vWDoO8hVTGX+1RuUy2fwlzvZ24EI5A== + dependencies: + fast-redact "^3.0.0" + fastify-warning "^0.2.0" + get-caller-file "^2.0.5" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.13.0" + pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -4903,7 +4978,7 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.1.4, rfdc@^1.2.0: +rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== @@ -4998,7 +5073,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -secure-json-parse@^2.0.0: +secure-json-parse@^2.0.0, secure-json-parse@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== @@ -5141,6 +5216,13 @@ sonic-boom@^1.0.2: atomic-sleep "^1.0.0" flatstr "^1.0.12" +sonic-boom@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.4.1.tgz#6e1c3762c677425c6ffbd7bd106c4f8258b45b39" + integrity sha512-WgtVLfGl347/zS1oTuLaOAvVD5zijgjphAJHgbbnBJGgexnr+C1ULSj0j7ftoGxpuxR4PaV635NkwFemG8m/5w== + dependencies: + atomic-sleep "^1.0.0" + sonic-boom@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.3.1.tgz#e6572184fb3adf145dbfeccff48141bbd1009e4c" From 091d4220db684e1ee764fa881b15289fe632c062 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 19:57:07 +0700 Subject: [PATCH 054/135] feat: add update supplier endpoint --- src/users/dto/update-supplier.dto.ts | 4 ++++ src/users/supplier/supplier.service.ts | 31 +++++++++++++++++++++++++- src/users/users.controller.ts | 13 +++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/users/dto/update-supplier.dto.ts diff --git a/src/users/dto/update-supplier.dto.ts b/src/users/dto/update-supplier.dto.ts new file mode 100644 index 0000000..40a7218 --- /dev/null +++ b/src/users/dto/update-supplier.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateSupplierDto } from './create-supplier.dto'; + +export class UpdateSupplierDto extends PartialType(CreateSupplierDto) {} diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 3bff728..54f1b22 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -6,13 +6,14 @@ import { Injectable, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { Supplier } from '../entities/supplier.entity'; import { InputCoaDto } from '../../transaction/dto/input-coa.dto'; import { balanceType, coaType } from '../../helper/enum-list'; import { CreateSupplierDto } from '../dto/create-supplier.dto'; import { CoaService } from '../../transaction/coa.service'; import * as uuid from 'uuid'; +import { UpdateSupplierDto } from '../dto/update-supplier.dto'; @Injectable() export class SupplierService { @@ -84,6 +85,34 @@ export class SupplierService { return supplierData; } + async update(id: string, updateSupplierDto: UpdateSupplierDto) { + const check = await this.supplierRepository.findOne({ + code: updateSupplierDto.code, + id: Not(id), + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Supplier Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const supplierData = new Supplier(); + + supplierData.name = updateSupplierDto.name; + supplierData.status = true; + + await this.connection.transaction(async (manager) => { + await manager.update(Supplier, { id: id }, supplierData); + }); + + return supplierData; + } + findAllSupplier(page) { return this.supplierRepository.findAndCount({ skip: page * 10, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index f078627..ff4b8b7 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -20,6 +20,7 @@ import { SupplierService } from './supplier/supplier.service'; import { PartnerService } from './partner/partner.service'; import { CreatePartnerDto } from './dto/create-partner.dto'; import { UpdatePartnerDto } from './dto/update-partner.dto'; +import { UpdateSupplierDto } from './dto/update-supplier.dto'; @Controller({ path: 'users', @@ -50,6 +51,18 @@ export class UsersController { }; } + @Put('supplier/:id') + async updateSupplier( + @Param('id', ParseUUIDPipe) id: string, + @Body() updatePartnerDto: UpdateSupplierDto, + ) { + return { + data: await this.supplierService.update(id, updatePartnerDto), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Post('partner') async createPartner( @Request() req, From cab057f68378d2cfdb422b7634f7d073ef23d4a0 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 20:05:13 +0700 Subject: [PATCH 055/135] feat: add set status supplier endpoint --- src/users/supplier/supplier.service.ts | 16 ++++++++++++++++ src/users/users.controller.ts | 14 +++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 54f1b22..491b858 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -113,6 +113,22 @@ export class SupplierService { return supplierData; } + setStatus = async (id: string, type: string) => { + const supplierData = new Supplier(); + + if (type === 'active') { + supplierData.status = true; + } else { + supplierData.status = false; + } + + await this.connection.transaction(async (manager) => { + await manager.update(Supplier, { id: id }, supplierData); + }); + + return supplierData; + }; + findAllSupplier(page) { return this.supplierRepository.findAndCount({ skip: page * 10, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index ff4b8b7..f8e4e9c 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -51,8 +51,20 @@ export class UsersController { }; } - @Put('supplier/:id') + @Get('supplier/:id/:type') async updateSupplier( + @Param('id', ParseUUIDPipe) id: string, + @Param('type') type: string, + ) { + return { + data: await this.supplierService.setStatus(id, type), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + + @Put('supplier/:id') + async setStatusSupplier( @Param('id', ParseUUIDPipe) id: string, @Body() updatePartnerDto: UpdateSupplierDto, ) { From 3835b0ee35ab9ed732d3df215439a0b81b64e37e Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 20:38:23 +0700 Subject: [PATCH 056/135] feat: add set status membership endpoint --- src/users/users.controller.ts | 12 ++++++++++++ src/users/users.service.ts | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index f8e4e9c..4c15b31 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -191,6 +191,18 @@ export class UsersController { }; } + @Get(':id/:type') + async setStatusMembership( + @Param('id', ParseUUIDPipe) id: string, + @Param('type') type: string, + ) { + return { + data: await this.usersService.setStatus(id, type), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Put(':id') async update( @Param('id', ParseUUIDPipe) id: string, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 743e04c..71d2bfb 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -261,6 +261,22 @@ export class UsersService { return userData; } + setStatus = async (id: string, type: string) => { + const userData = new User(); + + if (type === 'active') { + userData.isActive = true; + } else { + userData.isActive = false; + } + + await this.connection.transaction(async (manager) => { + await manager.update(User, { id: id }, userData); + }); + + return userData; + }; + async remove(id: string) { try { await this.usersRepository.findOneOrFail(id); From b4cd5620e55b3d1cfbc246852869a6746aa06dbb Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 14 Dec 2021 21:16:28 +0700 Subject: [PATCH 057/135] feat: add get profile endpoint --- src/auth/auth.controller.ts | 8 +++----- src/auth/auth.service.ts | 4 ++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index b3eb1bb..cbc862f 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,8 +1,7 @@ -import { Controller, Post, UseGuards, Request, Get } from '@nestjs/common'; +import { Controller, Get, Post, Request, UseGuards } from '@nestjs/common'; import { LocalAuthGuard } from './local-auth.guard'; import { AuthService } from './auth.service'; -import { JwtAuthGuard } from './jwt-auth.guard'; -import {Public} from "./public.decorator"; +import { Public } from './public.decorator'; @Controller({ path: 'auth', @@ -18,9 +17,8 @@ export class AuthController { return this.authService.login(req.user); } - @UseGuards(JwtAuthGuard) @Get('profile') getProfile(@Request() req) { - return req.user; + return this.authService.getProfile(req.user.userId); } } diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 3e76f1c..56f4b63 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -35,4 +35,8 @@ export class AuthService { access_token: this.jwtService.sign(payload), }; } + + getProfile = async (userId: string) => { + return this.usersService.findOne(userId); + }; } From 6f1f82cc037c207b837aa5283bcdaafa498b6278 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 14 Dec 2021 21:48:21 +0700 Subject: [PATCH 058/135] fixing: get product --- package.json | 2 + src/auth/auth.service.ts | 2 +- src/auth/jwt.strategy.ts | 7 +- .../entities/product-history-price.entity.ts | 5 +- src/product/entities/product.entity.ts | 13 +++ src/product/product.controller.ts | 28 +++++- src/product/product.module.ts | 4 +- src/product/product.service.ts | 81 ++++++++++++++--- src/transaction/transaction.service.ts | 1 - src/users/users.service.ts | 2 +- yarn.lock | 89 ++++++++++++++++--- 11 files changed, 198 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index 68ed9e8..e78fde3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", + "start:formatted": "nest start | pino-pretty", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", @@ -43,6 +44,7 @@ "passport-local": "^1.0.0", "pg": "^8.7.1", "pino-http": "^6.3.0", + "pino-pretty": "^7.3.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0", diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 78f8b4b..3e76f1c 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -28,7 +28,7 @@ export class AuthService { username: user.username, sub: user.id, role: user.roles.name, - partner: user.partner.id, + partner: user.partner?.id, }; return { diff --git a/src/auth/jwt.strategy.ts b/src/auth/jwt.strategy.ts index 08eccd1..43d220d 100644 --- a/src/auth/jwt.strategy.ts +++ b/src/auth/jwt.strategy.ts @@ -1,7 +1,7 @@ import { ExtractJwt, Strategy } from 'passport-jwt'; import { PassportStrategy } from '@nestjs/passport'; import { Injectable } from '@nestjs/common'; -import {ConfigService} from "@nestjs/config"; +import { ConfigService } from '@nestjs/config'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { @@ -14,6 +14,9 @@ export class JwtStrategy extends PassportStrategy(Strategy) { } async validate(payload: any) { - return { userId: payload.sub, username: payload.username }; + return { + userId: payload.sub, + username: payload.username, + }; } } diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index 6abf098..033b34d 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -3,6 +3,7 @@ import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { productType } from '../../helper/enum-list'; import { User } from '../../users/entities/user.entity'; +import { Partner } from '../../users/entities/partner.entity'; @Entity() export class ProductHistoryPrice extends BaseModel { @@ -12,8 +13,8 @@ export class ProductHistoryPrice extends BaseModel { @ManyToOne(() => Product, (product) => product.id) product: Product; - @ManyToOne(() => User, (user) => user.id) - user: User; + @ManyToOne(() => Partner, (partner) => partner.id) + partner: Partner; @Column() price: number; diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index cc2241f..16c8b37 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -12,6 +12,7 @@ import { import { ProductSubCategories } from './product-sub-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { Supplier } from '../../users/entities/supplier.entity'; +import { ProductHistoryPrice } from './product-history-price.entity'; @Entity() export class Product extends BaseModel { @@ -54,4 +55,16 @@ export class Product extends BaseModel { }, ) supplier: Supplier; + + @OneToMany( + () => { + return ProductHistoryPrice; + }, + (php) => { + return php.product; + }, + ) + priceHistory: ProductHistoryPrice; + + currentPrice: ProductHistoryPrice; } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 691f3e1..cdf0348 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -9,6 +9,7 @@ import { ParseUUIDPipe, HttpStatus, Query, + Request, } from '@nestjs/common'; import { ProductService } from './product.service'; import { ProductCategoriesService } from './product-categories.service'; @@ -78,16 +79,37 @@ export class ProductController { }; } + @Get('by-categories-all') + async findByCategoriesAll( + @Query('page') page: number, + @Query('categories') categories: string, + ) { + const data = await this.productService.findAllByCategories( + page, + categories, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('by-categories') async findByCategories( @Query('page') page: number, @Query('categories') categories: string, + @Request() req, ) { - const [data, count] = await this.productService.findAll(page); + const data = await this.productService.findAllByCategoriesAndPartner( + page, + categories, + req.user.username, + ); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/product/product.module.ts b/src/product/product.module.ts index e514519..b0fc683 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { ProductService } from './product.service'; import { ProductController } from './product.controller'; import { ProductCategoriesService } from './product-categories.service'; @@ -8,6 +8,7 @@ import { ProductCategories } from './entities/product-category.entity'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { ProductSubCategories } from './entities/product-sub-category.entity'; import { ProductSubCategoriesService } from './product-sub-categories.service'; +import { UsersModule } from '../users/users.module'; @Module({ imports: [ @@ -17,6 +18,7 @@ import { ProductSubCategoriesService } from './product-sub-categories.service'; ProductHistoryPrice, ProductSubCategories, ]), + forwardRef(() => UsersModule), ], controllers: [ProductController], providers: [ diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 0e14188..51f1790 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,4 +1,9 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { + HttpException, + HttpStatus, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; @@ -8,6 +13,8 @@ import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; +import { Raw } from 'typeorm/browser'; +import { UsersService } from '../users/users.service'; export class ProductService { constructor( @@ -16,6 +23,7 @@ export class ProductService { @InjectRepository(ProductHistoryPrice) private productHistoryPrice: Repository, private productSubCategoriesService: ProductSubCategoriesService, + private usersService: UsersService, ) {} async create(createProductDto: CreateProductDto) { @@ -54,18 +62,65 @@ export class ProductService { }); } - findAllByCategories(page, categories) { - return this.productRepository.findAndCount({ - join: { - alias: 'sub_categories', - innerJoin: { sub_categories: 'roles.users' }, - }, - skip: page * 10, - take: 10, - order: { - version: 'DESC', - }, - }); + async findAllByCategories(page, categories) { + const baseQuery = this.productRepository + .createQueryBuilder('product') + .leftJoin('product.sub_categories', 'sub_categories') + .where('sub_categories.category_id = :id', { + id: categories, + }) + .leftJoinAndMapOne( + 'product.currentPrice', + 'product.priceHistory', + 'current_price', + 'current_price.partner_id is null', + ); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; + } + + async findAllByCategoriesAndPartner( + page: number, + categories: string, + username: string, + ) { + const user = await this.usersService.findOneByUsername(username); + + const baseQuery = this.productRepository + .createQueryBuilder('product') + .leftJoin('product.sub_categories', 'sub_categories') + .where('sub_categories.category_id = :id', { + id: categories, + }) + .leftJoinAndMapOne( + 'product.currentPrice', + 'product.priceHistory', + 'current_price', + 'current_price.partner_id = :id_partner and current_price.end_date is NULL', + ) + .setParameter('id_partner', user.partner.id); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; } async findOne(code: string) { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 3af4c7a..86e609b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -17,7 +17,6 @@ import { typeTransaction, } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; -import * as irsService from '../helper/irs-service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index e94e43f..c95af73 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -263,7 +263,7 @@ export class UsersService { where: { username, }, - relations: ['roles'], + relations: ['roles', 'partner'], }); } } diff --git a/yarn.lock b/yarn.lock index bd50c2d..5de4fe2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1495,6 +1495,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +args@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761" + integrity sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ== + dependencies: + camelcase "5.0.0" + chalk "2.4.2" + leven "2.1.0" + mri "1.1.4" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" @@ -1745,6 +1755,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -1760,6 +1775,15 @@ caniuse-lite@^1.0.30001280: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== +chalk@2.4.2, chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -1779,15 +1803,6 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -1937,6 +1952,11 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2092,6 +2112,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -3708,6 +3733,11 @@ joi@^17.4.2: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3857,6 +3887,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +leven@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -4136,6 +4171,11 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mri@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" + integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -4550,7 +4590,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pino-abstract-transport@v0.5.0: +pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== @@ -4568,6 +4608,24 @@ pino-http@^6.3.0: pino "^7.0.5" pino-std-serializers "^5.0.0" +pino-pretty@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-7.3.0.tgz#277fdc2306a2f6d727a1127e7747d1c078efdd4b" + integrity sha512-HAhShJ2z2QzxXhYAn6XfwYpF13o1PQbjzSNA9q+30FAvhjOmeACit9lprhV/mCOw/8YFWSyyNk0YCq2EDYGYpw== + dependencies: + args "^5.0.1" + colorette "^2.0.7" + dateformat "^4.6.3" + fast-safe-stringify "^2.0.7" + joycon "^3.1.1" + pino-abstract-transport "^0.5.0" + pump "^3.0.0" + readable-stream "^3.6.0" + rfdc "^1.3.0" + secure-json-parse "^2.4.0" + sonic-boom "^2.2.0" + strip-json-comments "^3.1.1" + pino-std-serializers@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz" @@ -4903,7 +4961,7 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.1.4, rfdc@^1.2.0: +rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== @@ -4998,7 +5056,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -secure-json-parse@^2.0.0: +secure-json-parse@^2.0.0, secure-json-parse@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== @@ -5141,6 +5199,13 @@ sonic-boom@^1.0.2: atomic-sleep "^1.0.0" flatstr "^1.0.12" +sonic-boom@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.4.1.tgz#6e1c3762c677425c6ffbd7bd106c4f8258b45b39" + integrity sha512-WgtVLfGl347/zS1oTuLaOAvVD5zijgjphAJHgbbnBJGgexnr+C1ULSj0j7ftoGxpuxR4PaV635NkwFemG8m/5w== + dependencies: + atomic-sleep "^1.0.0" + sonic-boom@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.3.1.tgz#e6572184fb3adf145dbfeccff48141bbd1009e4c" From 6951d052ff711d65ad80c0db1e03df6b4b876420 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 14 Dec 2021 22:15:21 +0700 Subject: [PATCH 059/135] fixing: get product by supplier and categories --- src/product/product.controller.ts | 3 ++- src/product/product.service.ts | 31 ++++++++++++++++---------- src/users/supplier/supplier.service.ts | 22 +++++++++++++++++- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index cdf0348..6476aa9 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -83,6 +83,7 @@ export class ProductController { async findByCategoriesAll( @Query('page') page: number, @Query('categories') categories: string, + @Query('supplier') supplier: string, ) { const data = await this.productService.findAllByCategories( page, @@ -102,7 +103,7 @@ export class ProductController { @Query('categories') categories: string, @Request() req, ) { - const data = await this.productService.findAllByCategoriesAndPartner( + const data = await this.productService.findAllForPartner( page, categories, req.user.username, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 51f1790..7ea059a 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -15,6 +15,7 @@ import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; import { Raw } from 'typeorm/browser'; import { UsersService } from '../users/users.service'; +import { SupplierService } from '../users/supplier/supplier.service'; export class ProductService { constructor( @@ -24,6 +25,7 @@ export class ProductService { private productHistoryPrice: Repository, private productSubCategoriesService: ProductSubCategoriesService, private usersService: UsersService, + private supplierService: SupplierService, ) {} async create(createProductDto: CreateProductDto) { @@ -62,13 +64,17 @@ export class ProductService { }); } - async findAllByCategories(page, categories) { + async findAllByCategories(page, categories, supplier) { const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') - .where('sub_categories.category_id = :id', { - id: categories, - }) + .where( + 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', + { + id: categories, + supplier_id: supplier, + }, + ) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -89,19 +95,20 @@ export class ProductService { }; } - async findAllByCategoriesAndPartner( - page: number, - categories: string, - username: string, - ) { + async findAllForPartner(page: number, categories: string, username: string) { const user = await this.usersService.findOneByUsername(username); + const supplier = await this.supplierService.findByActive(); const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') - .where('sub_categories.category_id = :id', { - id: categories, - }) + .where( + 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', + { + id: categories, + supplier_id: supplier.id, + }, + ) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 491b858..dcec953 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -48,7 +48,7 @@ export class SupplierService { supplierData.id = uuid.v4(); supplierData.name = createSupplierDto.name; supplierData.code = createSupplierDto.code; - supplierData.status = true; + supplierData.status = false; await this.connection.transaction(async (manager) => { const result = await manager.insert(Supplier, supplierData); @@ -158,4 +158,24 @@ export class SupplierService { } } } + + async findByActive() { + try { + return await this.supplierRepository.findOneOrFail({ + status: true, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Supplier Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } From 0b644f42cee75f40083ebef6f05f031351d7d96c Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 14 Dec 2021 22:31:53 +0700 Subject: [PATCH 060/135] fix: yarn lock --- yarn.lock | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/yarn.lock b/yarn.lock index 4e706e9..df8474c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1803,6 +1803,15 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -4590,6 +4599,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +pino-abstract-transport@v0.5.0: pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" @@ -4978,6 +4988,7 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.1.4, rfdc@^1.2.0: rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" @@ -5073,6 +5084,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +secure-json-parse@^2.0.0: secure-json-parse@^2.0.0, secure-json-parse@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" @@ -6112,3 +6124,4 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + From e8bbc1e5543415978ac7cdab59356478d6fde220 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 14 Dec 2021 22:35:41 +0700 Subject: [PATCH 061/135] fix: yarn lock --- src/product/product.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 6476aa9..d3a2753 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -88,6 +88,7 @@ export class ProductController { const data = await this.productService.findAllByCategories( page, categories, + supplier, ); return { From 53575f36d6af0d6b200d34621ad6d0d449723e1b Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 15 Dec 2021 08:51:05 +0700 Subject: [PATCH 062/135] fix: order product --- src/configurable/commission.service.ts | 24 ++++- src/configurable/configurable.controller.ts | 2 +- src/configurable/configurable.module.ts | 2 +- src/product/product.controller.ts | 16 +++ src/product/product.module.ts | 4 +- src/product/product.service.ts | 8 +- src/transaction/transaction.module.ts | 2 + src/transaction/transaction.service.ts | 103 ++++++++++++-------- src/users/users.service.ts | 18 ++-- 9 files changed, 125 insertions(+), 54 deletions(-) diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts index 3765970..491e929 100644 --- a/src/configurable/commission.service.ts +++ b/src/configurable/commission.service.ts @@ -12,7 +12,7 @@ export class CommissionService { private commissionRepository: Repository, ) {} - findAllRoles(page) { + findAllCommission(page) { return this.commissionRepository.findAndCount({ skip: page * 10, take: 10, @@ -22,6 +22,28 @@ export class CommissionService { }); } + async findOne(role: string) { + try { + return await this.commissionRepository.findOneOrFail({ + where: { + role: role, + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async updateCommission(id: string, request) { try { await this.commissionRepository.findOneOrFail(id); diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index 63d6006..fe94a6e 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -37,7 +37,7 @@ export class ConfigurableController { @Get('/commission') async findCommission(@Query('page') page: number) { - const [data, count] = await this.commissionService.findAllRoles(page); + const [data, count] = await this.commissionService.findAllCommission(page); return { data, diff --git a/src/configurable/configurable.module.ts b/src/configurable/configurable.module.ts index 58d0459..45c0081 100644 --- a/src/configurable/configurable.module.ts +++ b/src/configurable/configurable.module.ts @@ -10,6 +10,6 @@ import { CommissionSetting } from './entities/commission_setting.entity'; imports: [TypeOrmModule.forFeature([Roles, CommissionSetting])], controllers: [ConfigurableController], providers: [RoleService, CommissionService], - exports: [RoleService], + exports: [RoleService, CommissionService], }) export class ConfigurableModule {} diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index d3a2753..a9eea82 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -20,6 +20,7 @@ import { ProductSubCategoriesService } from './product-sub-categories.service'; import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; import { CreateProductDto } from './dto/product/create-product.dto'; import { UpdateProductDto } from './dto/product/update-product.dto'; +import { ProductHistoryPriceService } from './history-price/history-price.service'; @Controller({ path: 'product', @@ -30,6 +31,7 @@ export class ProductController { private readonly productService: ProductService, private readonly productCategoriesService: ProductCategoriesService, private readonly productSubCategoriesService: ProductSubCategoriesService, + private readonly productHistoryPriceService: ProductHistoryPriceService, ) {} @Post() @@ -79,6 +81,20 @@ export class ProductController { }; } + @Get('test') + async test(@Request() req) { + const data = await this.productHistoryPriceService.findOne( + '4d3b328c-3ce4-4c84-84bb-cd9c36e85a45', + '27effb3e-0351-428a-ba7f-08a21c54e16a', + ); + + return { + data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('by-categories-all') async findByCategoriesAll( @Query('page') page: number, diff --git a/src/product/product.module.ts b/src/product/product.module.ts index b0fc683..231478e 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -9,6 +9,7 @@ import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { ProductSubCategories } from './entities/product-sub-category.entity'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UsersModule } from '../users/users.module'; +import { ProductHistoryPriceService } from './history-price/history-price.service'; @Module({ imports: [ @@ -25,7 +26,8 @@ import { UsersModule } from '../users/users.module'; ProductService, ProductCategoriesService, ProductSubCategoriesService, + ProductHistoryPriceService, ], - exports: [ProductService], + exports: [ProductService, ProductHistoryPriceService], }) export class ProductModule {} diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 7ea059a..a74f24a 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -13,7 +13,6 @@ import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; -import { Raw } from 'typeorm/browser'; import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; @@ -132,7 +131,12 @@ export class ProductService { async findOne(code: string) { try { - return await this.productRepository.findOneOrFail({ code: code }); + return await this.productRepository.findOneOrFail({ + relations: ['supplier'], + where: { + code: code, + }, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 698ef2b..13bae9e 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -9,11 +9,13 @@ import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; import { ProductModule } from '../product/product.module'; import { UsersModule } from 'src/users/users.module'; +import { ConfigurableModule } from '../configurable/configurable.module'; @Module({ imports: [ TypeOrmModule.forFeature([COA, TransactionJournal, Transactions]), ProductModule, + ConfigurableModule, forwardRef(() => UsersModule), ], controllers: [TransactionController, PpobCallbackController], diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 86e609b..fe598ca 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -21,6 +21,8 @@ import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; import { SupplierService } from '../users/supplier/supplier.service'; +import { ProductHistoryPriceService } from '../product/history-price/history-price.service'; +import { CommissionService } from '../configurable/commission.service'; interface JournalEntry { coa_id: string; @@ -39,7 +41,9 @@ export class TransactionService { private coaRepository: Repository, private coaService: CoaService, private productService: ProductService, + private productHistoryPriceService: ProductHistoryPriceService, private userService: UsersService, + private commissionService: CommissionService, private supplierService: SupplierService, private connection: Connection, ) {} @@ -268,33 +272,30 @@ export class TransactionService { orderTransactionDto: OrderTransactionDto, currentUser: any, ) { + //GET USER + const userData = await this.userService.findByUsername( + currentUser.username, + ); + //GET PRODUCT const product = await this.productService.findOne( orderTransactionDto.productCode, ); - //GET USER - const userData = await this.userService.findByUsername( - currentUser.username, + const product_price = await this.productHistoryPriceService.findOne( + product.id, + userData.partner?.id, ); + let supervisorData = []; - if (userData.superior != null) { - supervisorData.push( - await this.userService.findByUsername(currentUser.username), + if (!userData.partner) { + //GET SALES + supervisorData = await this.calculateCommission( + supervisorData, + product_price.mark_up_price - product_price.price, + userData, ); - - if (supervisorData[0].superior != null) { - supervisorData.push( - await this.userService.findByUsername(currentUser.username), - ); - - if (supervisorData[0].superior != null) { - supervisorData.push( - await this.userService.findByUsername(currentUser.username), - ); - } - } } //GET COA @@ -304,11 +305,11 @@ export class TransactionService { ); const coaInventory = await this.coaService.findByName( - `${coaType[coaType.INVENTORY]}-IRS`, + `${coaType[coaType.INVENTORY]}-${product.supplier.code}`, ); const coaCostOfSales = await this.coaService.findByName( - `${coaType[coaType.COST_OF_SALES]}-SYSTEM`, + `${coaType[coaType.COST_OF_SALES]}-${product.supplier.code}`, ); const coaSales = await this.coaService.findByName( @@ -319,18 +320,6 @@ export class TransactionService { `${coaType[coaType.EXPENSE]}-SYSTEM`, ); - supervisorData = supervisorData.map(async (it) => { - const coaAccount = await this.coaService.findByUser( - it.id, - coaType.WALLET, - ); - - return { - coa_id: coaAccount.id, - credit: 0, - }; - }); - if (coaAccount.amount <= product.price) { throw new HttpException( { @@ -346,10 +335,10 @@ export class TransactionService { const transactionData = new Transactions(); transactionData.id = uuid.v4(); - transactionData.amount = product.price; + transactionData.amount = product_price.mark_up_price; transactionData.user = userData.id; transactionData.status = statusTransaction.SUCCESS; - transactionData.type = typeTransaction.DISTRIBUTION; + transactionData.type = typeTransaction.ORDER; await manager.insert(Transactions, transactionData); await this.accountingTransaction({ @@ -360,23 +349,25 @@ export class TransactionService { journals: [ { coa_id: coaInventory.id, - credit: product.basePrice, + credit: product_price.price, }, { coa_id: coaCostOfSales.id, - debit: product.basePrice, + debit: product_price.price, }, { coa_id: coaAccount.id, - debit: product.price, + debit: product_price.mark_up_price, }, { coa_id: coaSales.id, - credit: product.price, + credit: product_price.mark_up_price, }, { coa_id: coaExpense.id, - credit: 0, + credit: userData.partner + ? 0 + : product_price.mark_up_price - product_price.price, }, ].concat(supervisorData), }); @@ -388,6 +379,40 @@ export class TransactionService { return true; } + async calculateCommission(data, totalPrice, userData) { + let supervisorData = []; + supervisorData.push( + await this.userService.findByUsername(userData.superior.username), + ); + + //GET Supervisor + supervisorData.push( + await this.userService.findByUsername( + supervisorData[0].superior.username, + ), + ); + + //GET Admin + supervisorData.push( + await this.userService.findByUsername( + supervisorData[1].superior.username, + ), + ); + + return supervisorData.map(async (it) => { + const coaAccount = await this.coaService.findByUser( + it.id, + coaType.WALLET, + ); + const commissionValue = await this.commissionService.findOne(it.role.id); + + return { + coa_id: coaAccount.id, + credit: totalPrice * commissionValue.commission, + }; + }); + } + async accountingTransaction(createJournalDto: CreateJournalDto) { const creditSum = createJournalDto.journals .map((it) => { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 74edf69..04106ba 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -83,6 +83,14 @@ export class UsersService { dataCoaWallet.coaEntityManager = manager; await this.coaService.create(dataCoaWallet); + const dataCoaAR = new InputCoaDto(); + dataCoaAR.user = userData; + dataCoaAR.balanceType = balanceType.DEBIT; + dataCoaAR.relatedUserId = superior.id; + dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; + dataCoaAR.coaEntityManager = manager; + await this.coaService.create(dataCoaAR); + if (createUserDto.superior) { const dataCoaAP = new InputCoaDto(); dataCoaAP.user = userData; @@ -91,14 +99,6 @@ export class UsersService { dataCoaAP.type = coaType.ACCOUNT_PAYABLE; dataCoaAP.coaEntityManager = manager; await this.coaService.create(dataCoaAP); - - const dataCoaAR = new InputCoaDto(); - dataCoaAR.user = userData; - dataCoaAR.balanceType = balanceType.DEBIT; - dataCoaAR.relatedUserId = superior.id; - dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; - dataCoaAR.coaEntityManager = manager; - await this.coaService.create(dataCoaAR); } }); @@ -169,7 +169,7 @@ export class UsersService { where: { username: username, }, - relations: ['roles'], + relations: ['superior', 'roles', 'partner'], }); } catch (e) { if (e instanceof EntityNotFoundError) { From 8c5e944cc82e385c5bb6c7c73c767c429ec987d4 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 15 Dec 2021 15:17:59 +0700 Subject: [PATCH 063/135] fix: get tranasction history by user --- .../history-price.service.spec.ts | 18 +++++++ .../history-price/history-price.service.ts | 37 +++++++++++++ .../entities/transactions.entity.ts | 7 +++ src/transaction/transaction.controller.ts | 15 ++++++ src/transaction/transaction.service.ts | 52 ++++++++++++++++--- 5 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 src/product/history-price/history-price.service.spec.ts create mode 100644 src/product/history-price/history-price.service.ts diff --git a/src/product/history-price/history-price.service.spec.ts b/src/product/history-price/history-price.service.spec.ts new file mode 100644 index 0000000..0a9952d --- /dev/null +++ b/src/product/history-price/history-price.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { HistoryPriceService } from './history-price.service'; + +describe('HistoryPriceService', () => { + let service: HistoryPriceService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [HistoryPriceService], + }).compile(); + + service = module.get(HistoryPriceService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts new file mode 100644 index 0000000..eb0a183 --- /dev/null +++ b/src/product/history-price/history-price.service.ts @@ -0,0 +1,37 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { EntityNotFoundError, IsNull, Repository } from 'typeorm'; +import { InjectRepository } from '@nestjs/typeorm'; +import { ProductCategories } from '../entities/product-category.entity'; +import { ProductHistoryPrice } from '../entities/product-history-price.entity'; + +@Injectable() +export class ProductHistoryPriceService { + constructor( + @InjectRepository(ProductHistoryPrice) + private productHistoryPriceService: Repository, + ) {} + + async findOne(product: string, partner: string) { + try { + return await this.productHistoryPriceService.findOneOrFail({ + where: { + product: product, + endDate: IsNull(), + partner: partner ? partner : IsNull(), + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } +} diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index 5627735..0a3d34e 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -12,6 +12,8 @@ import { } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { statusTransaction, typeTransaction } from '../../helper/enum-list'; +import { Partner } from '../../users/entities/partner.entity'; +import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; @Entity() export class Transactions extends BaseModel { @@ -31,4 +33,9 @@ export class Transactions extends BaseModel { nullable: true, }) user_destination: string; + + @ManyToOne(() => ProductHistoryPrice, (product) => product.id) + product_price: ProductHistoryPrice; + + mark_up_price: number; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 9d95332..d93fad0 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -8,6 +8,7 @@ import { Delete, Request, HttpStatus, + Query, } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; @@ -73,4 +74,18 @@ export class TransactionController { req.user, ); } + + @Get('history') + async findByCategories(@Query('page') page: number, @Request() req) { + const data = await this.transactionService.transactionHistoryByUser( + page, + req.user.userId, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index fe598ca..eaa232b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -123,6 +123,7 @@ export class TransactionService { const userData = await this.userService.findByUsername( currentUser.username, ); + if (userData.roles.name != 'Admin') { throw new HttpException( { @@ -289,11 +290,13 @@ export class TransactionService { let supervisorData = []; + const profit = product_price.mark_up_price - product_price.price; + if (!userData.partner) { //GET SALES supervisorData = await this.calculateCommission( supervisorData, - product_price.mark_up_price - product_price.price, + profit, userData, ); } @@ -339,6 +342,7 @@ export class TransactionService { transactionData.user = userData.id; transactionData.status = statusTransaction.SUCCESS; transactionData.type = typeTransaction.ORDER; + transactionData.product_price = product_price; await manager.insert(Transactions, transactionData); await this.accountingTransaction({ @@ -365,9 +369,7 @@ export class TransactionService { }, { coa_id: coaExpense.id, - credit: userData.partner - ? 0 - : product_price.mark_up_price - product_price.price, + credit: userData.partner ? 0 : profit, }, ].concat(supervisorData), }); @@ -379,8 +381,39 @@ export class TransactionService { return true; } + async transactionHistoryByUser(page: number, user: string) { + const baseQuery = this.transactionRepository + .createQueryBuilder('transaction') + .select('transaction.id', 'id') + .addSelect('transaction.created_at', 'created_at') + .where('transaction.user = :id and transaction.type = 1', { + id: user, + }) + .leftJoin('transaction.product_price', 'product_price') + .leftJoin('product_price.product', 'product') + .addSelect('product_price.mark_up_price', 'mark_up_price') + .addSelect('product.name', 'name') + .addSelect('product.id', 'product_id'); + + // .leftJoinAndSelect('transaction.product_price', 'product_price') + // .leftJoinAndSelect('product_price.product', 'product'); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getRawMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; + } + async calculateCommission(data, totalPrice, userData) { - let supervisorData = []; + const supervisorData = []; + supervisorData.push( await this.userService.findByUsername(userData.superior.username), ); @@ -498,17 +531,20 @@ export class TransactionService { return a.plus(b); }, new Decimal(0)); - let coa = coas.find( - (it) => it.id.toLowerCase() === coaId.toLowerCase(), - ); + const coa = coas.find((it) => { + return it.id.toLowerCase() === coaId.toLowerCase(); + }); let balance = new Decimal(coa.amount); + if (coa.balanceType == balanceType.DEBIT) { balance = balance.plus(debitSum.minus(creditSum)); } else if (coa.balanceType == balanceType.CREDIT) { balance = balance.plus(creditSum.minus(debitSum)); } + const diff = balance.minus(new Decimal(coa.amount)); + return createJournalDto.transactionalEntityManager .createQueryBuilder() .update(COA) From dcad18339b70490acf1b6eadf4c9a2a23c2b1c9d Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 13:37:44 +0700 Subject: [PATCH 064/135] fix: add user detail on create member --- src/users/dto/create-user.dto.ts | 7 +++++++ src/users/entities/user.entity.ts | 9 ++++++++- src/users/entities/user_detail.entity.ts | 20 ++++++++++++-------- src/users/users.module.ts | 3 ++- src/users/users.service.ts | 7 +++++++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 122fd85..d2defaf 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,10 +1,17 @@ import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator'; import { Partner } from '../entities/partner.entity'; +import { Column } from 'typeorm'; export class CreateUserDto { @IsNotEmpty() username: string; + @IsNotEmpty() + name: string; + + @IsNotEmpty() + phone_number: string; + @IsNotEmpty() password: string; diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 89bc47f..4655b14 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,8 +1,15 @@ import { Roles } from 'src/configurable/entities/roles.entity'; -import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { + Entity, + Column, + PrimaryGeneratedColumn, + ManyToOne, + OneToOne, +} from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; import { Partner } from './partner.entity'; +import { UserDetail } from './user_detail.entity'; @Entity() export class User extends BaseModel { diff --git a/src/users/entities/user_detail.entity.ts b/src/users/entities/user_detail.entity.ts index 7113eb9..2628685 100644 --- a/src/users/entities/user_detail.entity.ts +++ b/src/users/entities/user_detail.entity.ts @@ -1,5 +1,13 @@ -import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; +import { + Entity, + Column, + PrimaryGeneratedColumn, + OneToOne, + ManyToOne, + JoinColumn, +} from 'typeorm'; import { accountType } from '../../helper/enum-list'; +import { User } from './user.entity'; @Entity() export class UserDetail { @@ -9,14 +17,10 @@ export class UserDetail { @Column() name: string; - @Column() - first_name: string; - @Column() phone_number: string; - @Column({ - nullable: true, - }) - type: accountType; + @OneToOne(() => User) + @JoinColumn() + user: User; } diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 079856d..523735e 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -9,10 +9,11 @@ import { SupplierService } from './supplier/supplier.service'; import { Supplier } from './entities/supplier.entity'; import { Partner } from './entities/partner.entity'; import { PartnerService } from './partner/partner.service'; +import { UserDetail } from './entities/user_detail.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([User, Supplier, Partner]), + TypeOrmModule.forFeature([User, Supplier, Partner, UserDetail]), forwardRef(() => TransactionModule), ConfigurableModule, ], diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 04106ba..21132cc 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -23,6 +23,7 @@ import { balanceType, coaType } from 'src/helper/enum-list'; import { RoleService } from 'src/configurable/roles.service'; import { InputCoaDto } from 'src/transaction/dto/input-coa.dto'; import * as uuid from 'uuid'; +import { UserDetail } from './entities/user_detail.entity'; @Injectable() export class UsersService { @@ -76,6 +77,12 @@ export class UsersService { await this.connection.transaction(async (manager) => { const result = await manager.insert(User, userData); + const userDetailData = new UserDetail(); + userDetailData.name = createUserDto.name; + userDetailData.phone_number = createUserDto.phone_number; + userDetailData.user = userData; + const user_detail = await manager.insert(UserDetail, userDetailData); + const dataCoaWallet = new InputCoaDto(); dataCoaWallet.user = userData; dataCoaWallet.balanceType = balanceType.CREDIT; From 264b7312eda92f734e2bc524b1432e60d93a85be Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 15:05:10 +0700 Subject: [PATCH 065/135] fix: add coa in supplier --- src/product/product.controller.ts | 2 +- src/product/product.service.ts | 35 ++++++++++++++++++++++++-- src/transaction/entities/coa.entity.ts | 1 + src/users/entities/supplier.entity.ts | 3 +++ src/users/supplier/supplier.service.ts | 31 +++++++++++++++++------ 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index a9eea82..4c33c15 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -101,7 +101,7 @@ export class ProductController { @Query('categories') categories: string, @Query('supplier') supplier: string, ) { - const data = await this.productService.findAllByCategories( + const data = await this.productService.findAllBySubCategories( page, categories, supplier, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index a74f24a..53be4c3 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -63,14 +63,45 @@ export class ProductService { }); } - async findAllByCategories(page, categories, supplier) { + async findAllByCategories(page, subCategories, supplier) { const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .where( 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', { - id: categories, + id: subCategories, + supplier_id: supplier, + }, + ) + .leftJoinAndMapOne( + 'product.currentPrice', + 'product.priceHistory', + 'current_price', + 'current_price.partner_id is null', + ); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; + } + + async findAllBySubCategories(page, subCategories, supplier) { + const baseQuery = this.productRepository + .createQueryBuilder('product') + .leftJoin('product.sub_categories', 'sub_categories') + .where( + 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', + { + id: subCategories, supplier_id: supplier, }, ) diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index b26ece3..23de4f0 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -27,6 +27,7 @@ export class COA extends BaseModel { relatedUser: string; @Column({ + type: 'uuid', nullable: true, }) supplier: string; diff --git a/src/users/entities/supplier.entity.ts b/src/users/entities/supplier.entity.ts index 080c04c..41dddfb 100644 --- a/src/users/entities/supplier.entity.ts +++ b/src/users/entities/supplier.entity.ts @@ -2,6 +2,7 @@ import { Roles } from 'src/configurable/entities/roles.entity'; import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; +import { COA } from '../../transaction/entities/coa.entity'; @Entity() export class Supplier extends BaseModel { @@ -16,4 +17,6 @@ export class Supplier extends BaseModel { @Column() status: boolean; + + coa: COA; } diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index dcec953..22a7b92 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -14,6 +14,7 @@ import { CreateSupplierDto } from '../dto/create-supplier.dto'; import { CoaService } from '../../transaction/coa.service'; import * as uuid from 'uuid'; import { UpdateSupplierDto } from '../dto/update-supplier.dto'; +import { COA } from '../../transaction/entities/coa.entity'; @Injectable() export class SupplierService { @@ -129,14 +130,28 @@ export class SupplierService { return supplierData; }; - findAllSupplier(page) { - return this.supplierRepository.findAndCount({ - skip: page * 10, - take: 10, - order: { - version: 'DESC', - }, - }); + async findAllSupplier(page) { + const baseQuery = this.supplierRepository + .createQueryBuilder('supplier') + .leftJoinAndMapOne( + 'supplier.coa', + COA, + 'coa', + `coa.supplier = supplier.id`, + ) + .select(['supplier', 'coa.amount']); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; } async findByCode(code: string) { From bd469fe66a3827327204b40e62a1e831604ba09c Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 15:05:16 +0700 Subject: [PATCH 066/135] fix: add coa in supplier --- src/users/users.controller.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 4c15b31..6151726 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -130,11 +130,10 @@ export class UsersController { @Public() @Get('supplier') async findAllSupplier(@Query('page') page: number) { - const [data, count] = await this.supplierService.findAllSupplier(page); + const data = await this.supplierService.findAllSupplier(page); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; From e43ec5129d1de63140cfe178caedea95a65d0837 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 15:33:44 +0700 Subject: [PATCH 067/135] fix: add user deetail in get all user --- src/users/entities/user.entity.ts | 5 ++++ src/users/users.controller.ts | 8 ++---- src/users/users.service.ts | 44 +++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 4655b14..2bd222c 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -10,6 +10,7 @@ import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; import { Partner } from './partner.entity'; import { UserDetail } from './user_detail.entity'; +import { COA } from '../../transaction/entities/coa.entity'; @Entity() export class User extends BaseModel { @@ -57,4 +58,8 @@ export class User extends BaseModel { }, ) partner: Partner; + + user_detail: UserDetail; + + coa: COA; } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 6151726..4b377ee 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -114,14 +114,10 @@ export class UsersController { @Get() async findAll(@Request() req, @Query('page') page: number) { - const [data, count] = await this.usersService.findAll( - page, - req.user.userId, - ); + const data = await this.usersService.findAll(page, req.user.userId); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 21132cc..a4c1aa2 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -24,6 +24,7 @@ import { RoleService } from 'src/configurable/roles.service'; import { InputCoaDto } from 'src/transaction/dto/input-coa.dto'; import * as uuid from 'uuid'; import { UserDetail } from './entities/user_detail.entity'; +import { COA } from '../transaction/entities/coa.entity'; @Injectable() export class UsersService { @@ -112,17 +113,38 @@ export class UsersService { return userData; } - findAll(page: number, id: string) { - return this.usersRepository.findAndCount({ - skip: page * 10, - take: 10, - order: { - version: 'DESC', - }, - where: { - id: Not(Equal(id)), - }, - }); + async findAll(page: number, id: string) { + const baseQuery = this.usersRepository + .createQueryBuilder('user') + .where('user.id != :id', { + id: id, + }) + .leftJoinAndSelect('user.roles', 'roles', `roles.id = user.roles_id`) + .leftJoinAndMapOne( + 'user.user_detail', + UserDetail, + 'user_detail', + `user_detail.user = user.id`, + ) + .select([ + 'user.id', + 'user.username', + 'user.isActive', + 'roles.name', + 'user_detail', + ]); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; } findByRoles(relationId: string, page: number) { From fabc663021d8609d4732726797eef4ddb905f038 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Thu, 16 Dec 2021 15:34:19 +0700 Subject: [PATCH 068/135] fix: user detail relations --- src/users/entities/user.entity.ts | 8 ++++---- src/users/entities/user_detail.entity.ts | 10 ++++------ src/users/users.service.ts | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 2bd222c..4f6427f 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,13 +1,12 @@ import { Roles } from 'src/configurable/entities/roles.entity'; import { - Entity, Column, - PrimaryGeneratedColumn, + Entity, ManyToOne, OneToOne, + PrimaryGeneratedColumn, } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; -import { hashPassword } from '../../helper/hash_password'; import { Partner } from './partner.entity'; import { UserDetail } from './user_detail.entity'; import { COA } from '../../transaction/entities/coa.entity'; @@ -59,7 +58,8 @@ export class User extends BaseModel { ) partner: Partner; - user_detail: UserDetail; + @OneToOne(() => UserDetail, (userDetail) => userDetail.user) + userDetail: UserDetail; coa: COA; } diff --git a/src/users/entities/user_detail.entity.ts b/src/users/entities/user_detail.entity.ts index 2628685..cb67b8c 100644 --- a/src/users/entities/user_detail.entity.ts +++ b/src/users/entities/user_detail.entity.ts @@ -1,12 +1,10 @@ import { - Entity, Column, - PrimaryGeneratedColumn, - OneToOne, - ManyToOne, + Entity, JoinColumn, + OneToOne, + PrimaryGeneratedColumn, } from 'typeorm'; -import { accountType } from '../../helper/enum-list'; import { User } from './user.entity'; @Entity() @@ -20,7 +18,7 @@ export class UserDetail { @Column() phone_number: string; - @OneToOne(() => User) + @OneToOne(() => User, (user) => user.userDetail) @JoinColumn() user: User; } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index a4c1aa2..d26d7ef 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -223,7 +223,7 @@ export class UsersService { where: { id: id, }, - relations: ['roles', 'superior'], + relations: ['roles', 'superior', 'userDetail'], }); return { From c3de4f56e17a382bb5ec7cc0edc02323a54f72aa Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 17:28:56 +0700 Subject: [PATCH 069/135] fix: add user deetail in get all user --- src/users/users.controller.ts | 8 ++----- src/users/users.service.ts | 43 ++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 4b377ee..c7d614b 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -149,14 +149,10 @@ export class UsersController { @Get('find-by-supperior') async findBySuperrior(@Request() req, @Query('page') page: number) { - const [data, count] = await this.usersService.findBySuperrior( - req.user.userId, - page, - ); + const data = await this.usersService.findBySuperrior(req.user.userId, page); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index a4c1aa2..d6f36a1 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -160,18 +160,39 @@ export class UsersService { }); } - findBySuperrior(superriorId: string, page: number) { - return this.usersRepository.findAndCount({ - skip: page * 10, - take: 10, - relations: ['roles'], - where: { + async findBySuperrior(superriorId: string, page: number) { + const baseQuery = this.usersRepository + .createQueryBuilder('user') + .where('user.id != :id and user.superior_id = :superior', { + id: superriorId, superior: superriorId, - }, - order: { - updatedAt: 'DESC', - }, - }); + }) + .leftJoinAndSelect('user.roles', 'roles', `roles.id = user.roles_id`) + .leftJoinAndMapOne( + 'user.user_detail', + UserDetail, + 'user_detail', + `user_detail.user = user.id`, + ) + .select([ + 'user.id', + 'user.username', + 'user.isActive', + 'roles.name', + 'user_detail', + ]); + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; } async findExist(id: string) { From e82ab2c3e1e4e632f46125cf94be2d71691af663 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 18:12:20 +0700 Subject: [PATCH 070/135] fix: add rol in get user --- src/users/users.service.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index da00a45..4235e3f 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -130,6 +130,7 @@ export class UsersService { 'user.id', 'user.username', 'user.isActive', + 'roles.id', 'roles.name', 'user_detail', ]); @@ -178,6 +179,7 @@ export class UsersService { 'user.id', 'user.username', 'user.isActive', + 'roles.id', 'roles.name', 'user_detail', ]); From 0f801483a3a90fab33c4bbd2b4a84060acae972b Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 19:04:38 +0700 Subject: [PATCH 071/135] fix: add code in categories and subcategories --- .../create-categories-product.dto.ts | 3 ++ .../create-sub-categories-product.dto.ts | 3 ++ .../entities/product-category.entity.ts | 3 ++ .../entities/product-sub-category.entity.ts | 3 ++ src/product/product-categories.service.ts | 36 +++++++++++++++++++ src/product/product-sub-categories.service.ts | 15 ++++++++ 6 files changed, 63 insertions(+) diff --git a/src/product/dto/categories/create-categories-product.dto.ts b/src/product/dto/categories/create-categories-product.dto.ts index e878820..78203f5 100644 --- a/src/product/dto/categories/create-categories-product.dto.ts +++ b/src/product/dto/categories/create-categories-product.dto.ts @@ -3,4 +3,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class CreateCategoriesProductDto { @IsNotEmpty() name: string; + + @IsNotEmpty() + code: string; } diff --git a/src/product/dto/sub-categories/create-sub-categories-product.dto.ts b/src/product/dto/sub-categories/create-sub-categories-product.dto.ts index 385db53..a451dd3 100644 --- a/src/product/dto/sub-categories/create-sub-categories-product.dto.ts +++ b/src/product/dto/sub-categories/create-sub-categories-product.dto.ts @@ -5,6 +5,9 @@ export class CreateSubCategoriesProductDto extends CreateCategoriesProductDto { @IsNotEmpty() name: string; + @IsNotEmpty() + code: string; + @IsUUID() categoryId: string; } diff --git a/src/product/entities/product-category.entity.ts b/src/product/entities/product-category.entity.ts index 0964848..3da2720 100644 --- a/src/product/entities/product-category.entity.ts +++ b/src/product/entities/product-category.entity.ts @@ -19,6 +19,9 @@ export class ProductCategories extends BaseModel { @Column() name: string; + @Column() + code: string; + @OneToMany( () => ProductSubCategories, (subCategories) => subCategories.category, diff --git a/src/product/entities/product-sub-category.entity.ts b/src/product/entities/product-sub-category.entity.ts index 6b129a2..a5b1aad 100644 --- a/src/product/entities/product-sub-category.entity.ts +++ b/src/product/entities/product-sub-category.entity.ts @@ -17,6 +17,9 @@ export class ProductSubCategories extends BaseModel { @Column() name: string; + @Column() + code: string; + @ManyToOne(() => ProductCategories, (categories) => categories.sub_categories) category: ProductCategories; diff --git a/src/product/product-categories.service.ts b/src/product/product-categories.service.ts index 081a411..d3c2cdc 100644 --- a/src/product/product-categories.service.ts +++ b/src/product/product-categories.service.ts @@ -13,6 +13,20 @@ export class ProductCategoriesService { ) {} async create(CreateCategoriesProductDto: CreateCategoriesProductDto) { + const check = await this.productCategoriesRepository.findOne({ + code: CreateCategoriesProductDto.code, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Category Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + const result = await this.productCategoriesRepository.insert( CreateCategoriesProductDto, ); @@ -50,6 +64,28 @@ export class ProductCategoriesService { } } + async findByCode(code: string) { + try { + return await this.productCategoriesRepository.findOneOrFail({ + where: { + code: code, + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async update( id: string, updateCategoriesProductDto: UpdateCategoriesProductDto, diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index cd36294..f5b30a3 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -15,12 +15,27 @@ export class ProductSubCategoriesService { ) {} async create(createSubCategoriesProductDto: CreateSubCategoriesProductDto) { + const check = await this.productSubCategoriesRepository.findOne({ + code: createSubCategoriesProductDto.code, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Sub Category Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + const categories = await this.productCategoriesService.findOne( createSubCategoriesProductDto.categoryId, ); const result = await this.productSubCategoriesRepository.insert({ name: createSubCategoriesProductDto.name, + code: createSubCategoriesProductDto.code, category: categories, }); From 973ac686e72dcc0c4dcb6940937d6659bf4cf6f8 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 19:29:44 +0700 Subject: [PATCH 072/135] fix: entity cateogires --- src/product/entities/product-category.entity.ts | 4 +++- src/product/entities/product-sub-category.entity.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/product/entities/product-category.entity.ts b/src/product/entities/product-category.entity.ts index 3da2720..873538f 100644 --- a/src/product/entities/product-category.entity.ts +++ b/src/product/entities/product-category.entity.ts @@ -19,7 +19,9 @@ export class ProductCategories extends BaseModel { @Column() name: string; - @Column() + @Column({ + nullable: true, + }) code: string; @OneToMany( diff --git a/src/product/entities/product-sub-category.entity.ts b/src/product/entities/product-sub-category.entity.ts index a5b1aad..f60eec2 100644 --- a/src/product/entities/product-sub-category.entity.ts +++ b/src/product/entities/product-sub-category.entity.ts @@ -17,7 +17,9 @@ export class ProductSubCategories extends BaseModel { @Column() name: string; - @Column() + @Column({ + nullable: true, + }) code: string; @ManyToOne(() => ProductCategories, (categories) => categories.sub_categories) From d897dacd08a350054766a862981a21475739424e Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 19:38:24 +0700 Subject: [PATCH 073/135] fix: get supplier --- src/users/supplier/supplier.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 22a7b92..7a5155e 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -137,7 +137,7 @@ export class SupplierService { 'supplier.coa', COA, 'coa', - `coa.supplier = supplier.id`, + `coa.supplier = supplier.id and coa.type = '2'`, ) .select(['supplier', 'coa.amount']); From 4f035cea2e42960a953487f42cb5e7054e66e7ea Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 20:19:49 +0700 Subject: [PATCH 074/135] fix: add pageSize in product for partner --- src/product/product.controller.ts | 2 ++ src/product/product.service.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 4c33c15..a3bea09 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -117,11 +117,13 @@ export class ProductController { @Get('by-categories') async findByCategories( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('categories') categories: string, @Request() req, ) { const data = await this.productService.findAllForPartner( page, + pageSize, categories, req.user.username, ); diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 53be4c3..8e2980d 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -125,7 +125,12 @@ export class ProductService { }; } - async findAllForPartner(page: number, categories: string, username: string) { + async findAllForPartner( + page: number, + pageSize: number, + categories: string, + username: string, + ) { const user = await this.usersService.findOneByUsername(username); const supplier = await this.supplierService.findByActive(); @@ -148,8 +153,8 @@ export class ProductService { .setParameter('id_partner', user.partner.id); const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * pageSize) + .take(pageSize) .getMany(); const totalData = await baseQuery.getCount(); From 2e04cd4ee1d8afde4eec695ca59667c50baa2b5f Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 20:53:19 +0700 Subject: [PATCH 075/135] fix: add categories in subcategoreis --- src/product/product-sub-categories.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index f5b30a3..34e79a4 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -48,6 +48,7 @@ export class ProductSubCategoriesService { return this.productSubCategoriesRepository.findAndCount({ skip: page * 10, take: 10, + relations: ['category'], order: { version: 'DESC', }, From dbf19eb77a90530f249ad6ef169a3d87e6362b51 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 16 Dec 2021 23:54:51 +0700 Subject: [PATCH 076/135] fix: product --- src/product/product-sub-categories.service.ts | 32 ++++++++++++++++++- src/product/product.controller.ts | 9 +++--- src/product/product.service.ts | 3 ++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index 34e79a4..eb0aeab 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -44,10 +44,40 @@ export class ProductSubCategoriesService { ); } - findAll(page) { + async findAll(page, category) { + const baseQuery = this.productSubCategoriesRepository + .createQueryBuilder('product_sub_categories') + .leftJoinAndSelect( + 'product_sub_categories.category', + 'category', + ); + + if (category != 'null') { + baseQuery.where({ + category: category, + }); + } + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; + } + + findAllByCategories(page, category) { return this.productSubCategoriesRepository.findAndCount({ skip: page * 10, take: 10, + where: { + category: category, + }, relations: ['category'], order: { version: 'DESC', diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index a3bea09..38aadc3 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -98,7 +98,7 @@ export class ProductController { @Get('by-categories-all') async findByCategoriesAll( @Query('page') page: number, - @Query('categories') categories: string, + @Query('sub-categories') categories: string, @Query('supplier') supplier: string, ) { const data = await this.productService.findAllBySubCategories( @@ -148,12 +148,11 @@ export class ProductController { } @Get('sub-categories') - async findAllSubCategories(@Query('page') page: number) { - const [data, count] = await this.productSubCategoriesService.findAll(page); + async findAllSubCategories(@Query('page') page: number,@Query('category') category: string) { + const data = await this.productSubCategoriesService.findAll(page, category); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 8e2980d..4e9c770 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -95,6 +95,9 @@ export class ProductService { } async findAllBySubCategories(page, subCategories, supplier) { + if (!supplier) { + supplier = await this.supplierService.findByActive(); + } const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') From ba417b643eafbfc1ad6cb8473ba32c84144cee1f Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 00:32:28 +0700 Subject: [PATCH 077/135] fix: product --- src/product/product-sub-categories.service.ts | 5 +---- src/product/product.controller.ts | 4 ++-- src/product/product.service.ts | 18 ++++++++++-------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index eb0aeab..c6c3b8c 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -47,10 +47,7 @@ export class ProductSubCategoriesService { async findAll(page, category) { const baseQuery = this.productSubCategoriesRepository .createQueryBuilder('product_sub_categories') - .leftJoinAndSelect( - 'product_sub_categories.category', - 'category', - ); + .leftJoinAndSelect('product_sub_categories.category', 'category'); if (category != 'null') { baseQuery.where({ diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 38aadc3..312f8c2 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -98,12 +98,12 @@ export class ProductController { @Get('by-categories-all') async findByCategoriesAll( @Query('page') page: number, - @Query('sub-categories') categories: string, + @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { const data = await this.productService.findAllBySubCategories( page, - categories, + subcategory, supplier, ); diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 4e9c770..4cebe51 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -95,19 +95,15 @@ export class ProductService { } async findAllBySubCategories(page, subCategories, supplier) { - if (!supplier) { + if (supplier != 'null' && !supplier) { supplier = await this.supplierService.findByActive(); } const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') - .where( - 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', - { - id: subCategories, - supplier_id: supplier, - }, - ) + .where('product.supplier_id = :supplier_id', { + supplier_id: supplier, + }) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -115,6 +111,12 @@ export class ProductService { 'current_price.partner_id is null', ); + if (subCategories != 'null' && !subCategories) { + baseQuery.where('product.sub_categories_id = :id', { + id: subCategories, + }); + } + const data = await baseQuery .skip(page * 10) .take(10) From 8df907287abf2730ad4815fb3d9c7170a1674eb4 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 01:04:13 +0700 Subject: [PATCH 078/135] fix: get product --- src/product/product.service.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 4cebe51..da8e81a 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -15,6 +15,7 @@ import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; +import { type } from 'os'; export class ProductService { constructor( @@ -96,7 +97,7 @@ export class ProductService { async findAllBySubCategories(page, subCategories, supplier) { if (supplier != 'null' && !supplier) { - supplier = await this.supplierService.findByActive(); + supplier = (await this.supplierService.findByActive()).id; } const baseQuery = this.productRepository .createQueryBuilder('product') @@ -111,7 +112,8 @@ export class ProductService { 'current_price.partner_id is null', ); - if (subCategories != 'null' && !subCategories) { + if (subCategories != 'null' && subCategories) { + console.log(!subCategories,"testingan") baseQuery.where('product.sub_categories_id = :id', { id: subCategories, }); From 3c8b01893797365c3c7179d956992c8144787960 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 01:32:45 +0700 Subject: [PATCH 079/135] add: get product all --- src/product/product.controller.ts | 24 +++++++++++---- src/product/product.service.ts | 51 +++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 312f8c2..2a0ef46 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -69,13 +69,22 @@ export class ProductController { }; } - @Get() - async findAll(@Query('page') page: number) { - const [data, count] = await this.productService.findAll(page); + @Get('get-all') + async findAll( + @Query('page') page: number, + @Query('sub-category') subcategory: string, + @Query('category') category: string, + @Query('supplier') supplier: string, + ) { + const data = await this.productService.findAll( + page, + supplier, + category, + subcategory, + ); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; @@ -148,7 +157,10 @@ export class ProductController { } @Get('sub-categories') - async findAllSubCategories(@Query('page') page: number,@Query('category') category: string) { + async findAllSubCategories( + @Query('page') page: number, + @Query('category') category: string, + ) { const data = await this.productSubCategoriesService.findAll(page, category); return { diff --git a/src/product/product.service.ts b/src/product/product.service.ts index da8e81a..daef8a0 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -53,15 +53,47 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - findAll(page) { - return this.productRepository.findAndCount({ - skip: page * 10, - relations: ['sub_categories'], - take: 10, - order: { - version: 'DESC', - }, - }); + async findAll(page, supplier, categories, subCategories) { + if (supplier != 'null' && !supplier) { + supplier = (await this.supplierService.findByActive()).id; + } + const baseQuery = this.productRepository + .createQueryBuilder('product') + .leftJoin('product.sub_categories', 'sub_categories') + .leftJoin('sub_categories.category', 'category') + .where('product.supplier_id = :supplier_id', { + supplier_id: supplier, + }) + .leftJoinAndMapOne( + 'product.currentPrice', + 'product.priceHistory', + 'current_price', + 'current_price.partner_id is null', + ); + + if (subCategories != 'null' && subCategories) { + baseQuery.where('product.sub_categories_id = :id', { + id: subCategories, + }); + } + + if (categories != 'null' && categories) { + baseQuery.where('sub_categories.category_id = :id', { + id: categories, + }); + } + + const data = await baseQuery + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; } async findAllByCategories(page, subCategories, supplier) { @@ -113,7 +145,6 @@ export class ProductService { ); if (subCategories != 'null' && subCategories) { - console.log(!subCategories,"testingan") baseQuery.where('product.sub_categories_id = :id', { id: subCategories, }); From c5b5a4ab0662319f453d345a1e22fc06af58de2e Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 01:46:22 +0700 Subject: [PATCH 080/135] fix: change wording on error --- src/configurable/commission.service.ts | 4 ++-- src/product/history-price/history-price.service.ts | 2 +- src/product/product-categories.service.ts | 8 ++++---- src/product/product-sub-categories.service.ts | 8 ++++---- src/product/product.service.ts | 6 +++--- src/transaction/coa.service.ts | 2 +- src/users/supplier/supplier.service.ts | 2 +- src/users/users.service.ts | 12 ++++++------ 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts index 491e929..4b605a4 100644 --- a/src/configurable/commission.service.ts +++ b/src/configurable/commission.service.ts @@ -34,7 +34,7 @@ export class CommissionService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Commission not found', }, HttpStatus.NOT_FOUND, ); @@ -52,7 +52,7 @@ export class CommissionService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Commission not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts index eb0a183..77e71bb 100644 --- a/src/product/history-price/history-price.service.ts +++ b/src/product/history-price/history-price.service.ts @@ -25,7 +25,7 @@ export class ProductHistoryPriceService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Price not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/product/product-categories.service.ts b/src/product/product-categories.service.ts index d3c2cdc..6aa1e30 100644 --- a/src/product/product-categories.service.ts +++ b/src/product/product-categories.service.ts @@ -54,7 +54,7 @@ export class ProductCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Categories not found', }, HttpStatus.NOT_FOUND, ); @@ -76,7 +76,7 @@ export class ProductCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Categories not found', }, HttpStatus.NOT_FOUND, ); @@ -97,7 +97,7 @@ export class ProductCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Categories not found', }, HttpStatus.NOT_FOUND, ); @@ -122,7 +122,7 @@ export class ProductCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Categories not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index c6c3b8c..ffc0492 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -49,7 +49,7 @@ export class ProductSubCategoriesService { .createQueryBuilder('product_sub_categories') .leftJoinAndSelect('product_sub_categories.category', 'category'); - if (category != 'null') { + if (category != 'null' && category) { baseQuery.where({ category: category, }); @@ -90,7 +90,7 @@ export class ProductSubCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Sub Categories not found', }, HttpStatus.NOT_FOUND, ); @@ -111,7 +111,7 @@ export class ProductSubCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Sub Categories not found', }, HttpStatus.NOT_FOUND, ); @@ -140,7 +140,7 @@ export class ProductSubCategoriesService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product Sub Categories not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/product/product.service.ts b/src/product/product.service.ts index daef8a0..f459374 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -216,7 +216,7 @@ export class ProductService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product not found', }, HttpStatus.NOT_FOUND, ); @@ -234,7 +234,7 @@ export class ProductService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product not found', }, HttpStatus.NOT_FOUND, ); @@ -283,7 +283,7 @@ export class ProductService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Product not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 33beffc..fac2a6e 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -66,7 +66,7 @@ export class CoaService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'COA not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 7a5155e..68bef24 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -164,7 +164,7 @@ export class SupplierService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Supplier not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 4235e3f..38fb9e9 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -205,7 +205,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); @@ -228,7 +228,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); @@ -258,7 +258,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); @@ -276,7 +276,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); @@ -337,7 +337,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); @@ -371,7 +371,7 @@ export class UsersService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'User not found', }, HttpStatus.NOT_FOUND, ); From 4d1ac8dd0d9ed948e72667d05d2c0ff0e6e529e7 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Fri, 17 Dec 2021 01:57:02 +0700 Subject: [PATCH 081/135] feat: change url name --- src/product/product.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 2a0ef46..058cf15 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -69,7 +69,7 @@ export class ProductController { }; } - @Get('get-all') + @Get('all') async findAll( @Query('page') page: number, @Query('sub-category') subcategory: string, From 5da48273c0afda9337e4bdb139fa573fcef00b8b Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 02:00:07 +0700 Subject: [PATCH 082/135] fix: get product all --- src/product/product.controller.ts | 20 +------------------- src/product/product.service.ts | 2 +- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 2a0ef46..08f09ce 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -69,7 +69,7 @@ export class ProductController { }; } - @Get('get-all') + @Get('all') async findAll( @Query('page') page: number, @Query('sub-category') subcategory: string, @@ -179,24 +179,6 @@ export class ProductController { }; } - @Get('categories/:id') - async findOneCategories(@Param('id', ParseUUIDPipe) id: string) { - return { - data: await this.productCategoriesService.findOne(id), - statusCode: HttpStatus.OK, - message: 'success', - }; - } - - @Get('sub-categories/:id') - async findOneSubCategories(@Param('id', ParseUUIDPipe) id: string) { - return { - data: await this.productSubCategoriesService.findOne(id), - statusCode: HttpStatus.OK, - message: 'success', - }; - } - @Put(':id') async update( @Param('id', ParseUUIDPipe) id: string, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index f459374..57f96dc 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -54,7 +54,7 @@ export class ProductService { } async findAll(page, supplier, categories, subCategories) { - if (supplier != 'null' && !supplier) { + if (supplier == 'null' || !supplier) { supplier = (await this.supplierService.findByActive()).id; } const baseQuery = this.productRepository From aafb132b8e9dff144659da471a642cfc0ee25e00 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 02:26:57 +0700 Subject: [PATCH 083/135] fix: get product all --- src/product/product.service.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 57f96dc..7138d13 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -72,16 +72,16 @@ export class ProductService { ); if (subCategories != 'null' && subCategories) { - baseQuery.where('product.sub_categories_id = :id', { + baseQuery.andWhere('product.sub_categories_id = :id', { id: subCategories, }); } - if (categories != 'null' && categories) { - baseQuery.where('sub_categories.category_id = :id', { - id: categories, - }); - } + // if (categories != 'null' && categories) { + // baseQuery.andWhere('sub_categories.category_id = :id', { + // id: categories, + // }); + // } const data = await baseQuery .skip(page * 10) From 3f7dbd64718505ad8c142b888752fc339d6b164c Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 09:37:47 +0700 Subject: [PATCH 084/135] add: get role for create membership --- src/configurable/configurable.controller.ts | 14 ++++++++++++++ src/configurable/roles.service.ts | 20 +++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index fe94a6e..65864ee 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -47,6 +47,20 @@ export class ConfigurableController { }; } + @Get('/roles/for-membership') + async findAllForMembership(@Query('page') page: number) { + const [data, count] = await this.roleService.findAllRolesForCreateMember( + page, + ); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { diff --git a/src/configurable/roles.service.ts b/src/configurable/roles.service.ts index 7147f1a..2f2424e 100644 --- a/src/configurable/roles.service.ts +++ b/src/configurable/roles.service.ts @@ -1,5 +1,5 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { EntityNotFoundError, Repository } from 'typeorm'; +import { EntityNotFoundError, In, Not, Repository } from 'typeorm'; import { Roles } from './entities/roles.entity'; import { InjectRepository } from '@nestjs/typeorm'; @@ -20,6 +20,24 @@ export class RoleService { }); } + findAllRolesForCreateMember(page) { + return this.rolesRepository.findAndCount({ + skip: page * 10, + take: 10, + where: { + id: Not( + In([ + '3196cdf4-ae5f-4677-9bcd-98be35c72321', + '21dceea2-416e-4b55-b74c-12605e1f8d1b', + ]), + ), + }, + order: { + version: 'DESC', + }, + }); + } + async findOne(id: string) { try { return await this.rolesRepository.findOneOrFail(id); From cc595411b269cdc8ea10697032c660d762d64adc Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 09:51:28 +0700 Subject: [PATCH 085/135] fix: create partner --- src/users/entities/partner.entity.ts | 3 +++ src/users/partner/partner.service.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts index 9d2402b..e7a1fab 100644 --- a/src/users/entities/partner.entity.ts +++ b/src/users/entities/partner.entity.ts @@ -17,6 +17,9 @@ export class Partner extends BaseModel { @Column() address: string; + @Column() + phone_number: string; + @Column({ default: true }) status: boolean; } diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index 8d3b23b..2373826 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -59,6 +59,8 @@ export class PartnerService { const dataUser = new CreateUserDto(); dataUser.username = `admin_${partnerData.name}`; + dataUser.username = partnerData.name; + dataUser.phone_number = partnerData.phone_number; dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b'; dataUser.superior = false; dataUser.partner = partnerData; From 8f5b3588d26e8a5835bbd13e6e2b0d00d7a98073 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 11:26:34 +0700 Subject: [PATCH 086/135] fix: entity partner --- src/users/entities/partner.entity.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts index e7a1fab..7601e41 100644 --- a/src/users/entities/partner.entity.ts +++ b/src/users/entities/partner.entity.ts @@ -17,7 +17,9 @@ export class Partner extends BaseModel { @Column() address: string; - @Column() + @Column({ + nullable: true, + }) phone_number: string; @Column({ default: true }) From e7db0073c501ada44180f1f45ef7e868e8c930a4 Mon Sep 17 00:00:00 2001 From: ilham Date: Fri, 17 Dec 2021 14:53:42 +0700 Subject: [PATCH 087/135] fix: add saldo member --- src/transaction/coa.service.ts | 22 +++++ src/transaction/transaction.service.ts | 117 ++++++++++++++----------- 2 files changed, 86 insertions(+), 53 deletions(-) diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index fac2a6e..3fb4a7e 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -76,6 +76,28 @@ export class CoaService { } } + async findByTwoUser(from: string, destination: string, typeOfCoa: coaType) { + try { + return await this.coaRepository.findOneOrFail({ + user: from, + relatedUser: destination, + type: typeOfCoa, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'COA not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findByUserWithRelated( id: string, relatedId: string, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index eaa232b..471f310 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,7 +3,12 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Connection, EntityManager, Repository } from 'typeorm'; +import { + Connection, + EntityManager, + EntityNotFoundError, + Repository, +} from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; @@ -23,6 +28,7 @@ import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; import { SupplierService } from '../users/supplier/supplier.service'; import { ProductHistoryPriceService } from '../product/history-price/history-price.service'; import { CommissionService } from '../configurable/commission.service'; +import { catchError } from 'rxjs'; interface JournalEntry { coa_id: string; @@ -134,65 +140,70 @@ export class TransactionService { ); } - //GET Supplier - const supplier = await this.supplierService.findByCode( - distributeTransactionDto.supplier, - ); + try { + //GET Supplier + const supplier = await this.supplierService.findByCode( + distributeTransactionDto.supplier, + ); - // GET COA - const coaAR = await this.coaService.findByUser( - distributeTransactionDto.destination, - coaType.ACCOUNT_RECEIVABLE, - ); - const coaWallet = await this.coaService.findByUser( - distributeTransactionDto.destination, - coaType.WALLET, - ); - const coaBudget = await this.coaService.findByName( - `${coaType[coaType.BUDGET]}-${supplier.code}`, - ); + // GET COA + const coaAR = await this.coaService.findByTwoUser( + distributeTransactionDto.destination, + currentUser.userId, + coaType.ACCOUNT_RECEIVABLE, + ); + const coaWallet = await this.coaService.findByUser( + distributeTransactionDto.destination, + coaType.WALLET, + ); + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); - const coaContraBudget = await this.coaService.findByName( - `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, - ); + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, + ); - await this.connection.transaction(async (manager) => { - //INSERT TRANSACTION - const transactionData = new Transactions(); + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + const transactionData = new Transactions(); - transactionData.id = uuid.v4(); - transactionData.amount = distributeTransactionDto.amount; - transactionData.user = userData.id; - transactionData.status = statusTransaction.SUCCESS; - transactionData.type = typeTransaction.DISTRIBUTION; + transactionData.id = uuid.v4(); + transactionData.amount = distributeTransactionDto.amount; + transactionData.user = userData.id; + transactionData.status = statusTransaction.SUCCESS; + transactionData.type = typeTransaction.DISTRIBUTION; - await manager.insert(Transactions, transactionData); + await manager.insert(Transactions, transactionData); - await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager: manager, - transaction: transactionData, - amount: transactionData.amount, - journals: [ - { - coa_id: coaAR.id, - debit: transactionData.amount, - }, - { - coa_id: coaWallet.id, - credit: transactionData.amount, - }, - { - coa_id: coaBudget.id, - credit: transactionData.amount, - }, - { - coa_id: coaContraBudget.id, - debit: transactionData.amount, - }, - ], + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaAR.id, + debit: transactionData.amount, + }, + { + coa_id: coaWallet.id, + credit: transactionData.amount, + }, + { + coa_id: coaBudget.id, + credit: transactionData.amount, + }, + { + coa_id: coaContraBudget.id, + debit: transactionData.amount, + }, + ], + }); }); - }); + } catch (e) { + throw e; + } return true; } From 38f24a1480b42379e2e43f73d78013d8f084e098 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 00:18:22 +0700 Subject: [PATCH 088/135] fix: deposit_return and fix transction --- src/helper/enum-list.ts | 5 +- src/transaction/dto/add-saldo-supplier.dto.ts | 7 - src/transaction/dto/deposit_return.dto.ts | 7 + .../dto/distribute-transaction.dto.ts | 3 - .../entities/transactions.entity.ts | 5 + src/transaction/transaction.controller.ts | 128 +++++++-- src/transaction/transaction.service.ts | 272 +++++++++++++++--- 7 files changed, 360 insertions(+), 67 deletions(-) create mode 100644 src/transaction/dto/deposit_return.dto.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 8c29165..aad950e 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -2,12 +2,15 @@ export enum statusTransaction { PENDING, SUCCESS, FAILED, + APPROVED, + REJECTED, } export enum typeTransaction { DISTRIBUTION, ORDER, - DEPOSIT_IRS, + DEPOSIT_SUPPLIER, + DEPOSIT_RETURN, } export enum productType { diff --git a/src/transaction/dto/add-saldo-supplier.dto.ts b/src/transaction/dto/add-saldo-supplier.dto.ts index 8927ac7..518c5b5 100644 --- a/src/transaction/dto/add-saldo-supplier.dto.ts +++ b/src/transaction/dto/add-saldo-supplier.dto.ts @@ -1,11 +1,4 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; -import { - balanceType, - coaType, - statusTransaction, - typeTransaction, -} from 'src/helper/enum-list'; -import { EntityManager } from 'typeorm'; export class AddSaldoSupplier { @IsNotEmpty() diff --git a/src/transaction/dto/deposit_return.dto.ts b/src/transaction/dto/deposit_return.dto.ts new file mode 100644 index 0000000..7d1110b --- /dev/null +++ b/src/transaction/dto/deposit_return.dto.ts @@ -0,0 +1,7 @@ +import { DistributeTransactionDto } from './distribute-transaction.dto'; +import { IsNotEmpty } from 'class-validator'; + +export class DepositReturnDto extends DistributeTransactionDto { + @IsNotEmpty() + image_prove: string; +} diff --git a/src/transaction/dto/distribute-transaction.dto.ts b/src/transaction/dto/distribute-transaction.dto.ts index c1728ce..7d79186 100644 --- a/src/transaction/dto/distribute-transaction.dto.ts +++ b/src/transaction/dto/distribute-transaction.dto.ts @@ -6,7 +6,4 @@ export class DistributeTransactionDto { @IsNotEmpty() destination: string; - - @IsNotEmpty() - supplier: string; } diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index 0a3d34e..a1fed62 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -37,5 +37,10 @@ export class Transactions extends BaseModel { @ManyToOne(() => ProductHistoryPrice, (product) => product.id) product_price: ProductHistoryPrice; + @Column({ + nullable: true, + }) + image_prove: string; + mark_up_price: number; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index d93fad0..b3e472c 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -9,12 +9,14 @@ import { Request, HttpStatus, Query, + Put, + ParseUUIDPipe, } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; -import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; +import { DepositReturnDto } from './dto/deposit_return.dto'; @Controller({ path: 'transaction', @@ -24,23 +26,27 @@ export class TransactionController { constructor(private readonly transactionService: TransactionService) {} @Post('distribute') - create( - @Body() createTransactionDto: DistributeTransactionDto, - @Request() req, - ) { - return this.transactionService.distributeDeposit( - createTransactionDto, - req.user, - ); - } - - @Post('distribute-admin') - distributeAdmin( + async create( @Body() createTransactionDto: DistributeTransactionDto, @Request() req, ) { return { - data: this.transactionService.distributeFromAdmin( + data: await this.transactionService.distributeDeposit( + createTransactionDto, + req.user, + ), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + + @Post('distribute-admin') + async distributeAdmin( + @Body() createTransactionDto: DistributeTransactionDto, + @Request() req, + ) { + return { + data: await this.transactionService.distributeFromAdmin( createTransactionDto, req.user, ), @@ -65,14 +71,33 @@ export class TransactionController { } @Post('order') - orderTransaction( + async orderTransaction( @Body() orderTransactionDto: OrderTransactionDto, @Request() req, ) { - return this.transactionService.orderTransaction( - orderTransactionDto, - req.user, - ); + return { + data: await this.transactionService.orderTransaction( + orderTransactionDto, + req.user, + ), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + + @Post('deposit-return') + async depositReturn( + @Body() depositReturnDto: DepositReturnDto, + @Request() req, + ) { + return { + data: await this.transactionService.createDepositReturn( + req.user, + depositReturnDto, + ), + statusCode: HttpStatus.CREATED, + message: 'success', + }; } @Get('history') @@ -88,4 +113,69 @@ export class TransactionController { message: 'success', }; } + + @Get('deposit-return') + async findDepositReturn(@Query('page') page: number, @Request() req) { + const data = await this.transactionService.getAllDepositReturnFromUser( + req.user.userId, + page, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('deposit-return/confirmation') + async findDepositReturnConfirmation( + @Query('page') page: number, + @Request() req, + ) { + const data = await this.transactionService.getAllDepositReturnToUser( + req.user.userId, + page, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Put('deposit-return/confirmation/:id') + async confirmDepositReturn( + @Param('id', ParseUUIDPipe) id: string, + @Request() req, + @Body() status: string, + ) { + return { + data: await this.transactionService.confirmationDepositReturn( + id, + req.user, + status, + ), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Put('deposit-return/confirmation-admin/:id') + async confirmDepositReturnAdmin( + @Param('id', ParseUUIDPipe) id: string, + @Request() req, + @Body() status: string, + ) { + return { + data: await this.transactionService.confirmationAdminDepositReturn( + id, + req.user, + status, + ), + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 471f310..5204d80 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -28,7 +28,7 @@ import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; import { SupplierService } from '../users/supplier/supplier.service'; import { ProductHistoryPriceService } from '../product/history-price/history-price.service'; import { CommissionService } from '../configurable/commission.service'; -import { catchError } from 'rxjs'; +import { DepositReturnDto } from './dto/deposit_return.dto'; interface JournalEntry { coa_id: string; @@ -88,7 +88,7 @@ export class TransactionService { transactionData.amount = addSaldoSupplier.amount; transactionData.user = userData.id; transactionData.status = statusTransaction.SUCCESS; - transactionData.type = typeTransaction.DEPOSIT_IRS; + transactionData.type = typeTransaction.DEPOSIT_SUPPLIER; await manager.insert(Transactions, transactionData); @@ -130,21 +130,18 @@ export class TransactionService { currentUser.username, ); - if (userData.roles.name != 'Admin') { - throw new HttpException( - { - statusCode: HttpStatus.NOT_ACCEPTABLE, - error: 'Roles Not Admin', - }, - HttpStatus.NOT_ACCEPTABLE, - ); - } + const supplier = await this.supplierService.findByActive(); try { - //GET Supplier - const supplier = await this.supplierService.findByCode( - distributeTransactionDto.supplier, - ); + if (userData.roles.name != 'Admin') { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Roles Not Admin', + }, + HttpStatus.NOT_ACCEPTABLE, + ); + } // GET COA const coaAR = await this.coaService.findByTwoUser( @@ -171,6 +168,7 @@ export class TransactionService { transactionData.id = uuid.v4(); transactionData.amount = distributeTransactionDto.amount; transactionData.user = userData.id; + transactionData.user_destination = distributeTransactionDto.destination; transactionData.status = statusTransaction.SUCCESS; transactionData.type = typeTransaction.DISTRIBUTION; @@ -201,11 +199,11 @@ export class TransactionService { ], }); }); + + return true; } catch (e) { throw e; } - - return true; } async distributeDeposit( @@ -246,6 +244,7 @@ export class TransactionService { transactionData.id = uuid.v4(); transactionData.amount = distributeTransactionDto.amount; transactionData.user = userData.id; + transactionData.user_destination = distributeTransactionDto.destination; transactionData.status = statusTransaction.SUCCESS; transactionData.type = typeTransaction.DISTRIBUTION; @@ -301,7 +300,7 @@ export class TransactionService { let supervisorData = []; - const profit = product_price.mark_up_price - product_price.price; + let profit = product_price.mark_up_price - product_price.price; if (!userData.partner) { //GET SALES @@ -310,6 +309,9 @@ export class TransactionService { profit, userData, ); + profit = supervisorData + .map((item) => item.credit) + .reduce((prev, curr) => prev + curr, 0); } //GET COA @@ -380,7 +382,7 @@ export class TransactionService { }, { coa_id: coaExpense.id, - credit: userData.partner ? 0 : profit, + debit: userData.partner ? 0 : profit, }, ].concat(supervisorData), }); @@ -392,6 +394,154 @@ export class TransactionService { return true; } + async createDepositReturn(currentUser, depositReturnDto: DepositReturnDto) { + const userData = await this.userService.findByUsername( + currentUser.username, + ); + + try { + const transactionData = new Transactions(); + + transactionData.id = uuid.v4(); + transactionData.amount = depositReturnDto.amount; + transactionData.user = userData.id; + transactionData.user_destination = depositReturnDto.destination; + transactionData.status = statusTransaction.PENDING; + transactionData.type = typeTransaction.DEPOSIT_RETURN; + await this.connection.transaction(async (manager) => { + await manager.insert(Transactions, transactionData); + }); + + return transactionData; + } catch (e) { + throw e; + } + } + + async confirmationDepositReturn( + id: string, + userData, + statusApproval: string, + ) { + const transactionData = await this.findApprovalDepositReturn(id); + + const coaSenderWallet = await this.coaService.findByUser( + transactionData.user_destination, + coaType.WALLET, + ); + + const coaAP = await this.coaService.findByUserWithRelated( + userData.userId, + transactionData.user_destination, + coaType.ACCOUNT_PAYABLE, + ); + + const coaReceiverWallet = await this.coaService.findByUser( + transactionData.user_destination, + coaType.WALLET, + ); + + const coaAR = await this.coaService.findByUserWithRelated( + userData.userId, + transactionData.user_destination, + coaType.ACCOUNT_RECEIVABLE, + ); + + try { + await this.connection.transaction(async (manager) => { + transactionData.status = + statusApproval === 'Accept' + ? statusTransaction.APPROVED + : statusTransaction.REJECTED; + + await manager.save(transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaSenderWallet.id, + credit: transactionData.amount, + }, + { + coa_id: coaReceiverWallet.id, + debit: transactionData.amount, + }, + { + coa_id: coaAR.id, + credit: transactionData.amount, + }, + { + coa_id: coaAP.id, + debit: transactionData.amount, + }, + ], + }); + }); + + return transactionData; + } catch (e) { + throw e; + } + + return transactionData; + } + + async confirmationAdminDepositReturn( + id: string, + userData, + statusApproval: string, + ) { + const transactionData = await this.findApprovalDepositReturn(id); + + const coaAR = await this.coaService.findByUserWithRelated( + userData.userId, + transactionData.user_destination, + coaType.ACCOUNT_RECEIVABLE, + ); + + const coaBank = await this.coaService.findByName( + `${coaType[coaType.BANK]}-SYSTEM`, + ); + + try { + await this.connection.transaction(async (manager) => { + transactionData.status = + statusApproval === 'Accept' + ? statusTransaction.APPROVED + : statusTransaction.REJECTED; + + await manager.save(transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaAR.id, + credit: transactionData.amount, + }, + { + coa_id: coaBank.id, + debit: transactionData.amount, + }, + ], + }); + }); + + return transactionData; + } catch (e) { + throw e; + } + + return transactionData; + } + async transactionHistoryByUser(page: number, user: string) { const baseQuery = this.transactionRepository .createQueryBuilder('transaction') @@ -422,6 +572,58 @@ export class TransactionService { }; } + async findApprovalDepositReturn(id: string) { + try { + return await this.transactionRepository.findOneOrFail({ + where: { + id: id, + type: typeTransaction.DEPOSIT_RETURN, + status: statusTransaction.PENDING, + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Return Deposit not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + + async getAllDepositReturnFromUser(user: string, page: number) { + return this.transactionRepository.findAndCount({ + skip: page * 10, + take: 10, + where: { + user: user, + type: typeTransaction.DEPOSIT_RETURN, + }, + order: { + createdAt: 'DESC', + }, + }); + } + + async getAllDepositReturnToUser(user: string, page: number) { + return this.transactionRepository.findAndCount({ + skip: page * 10, + take: 10, + where: { + user_destination: user, + type: typeTransaction.DEPOSIT_RETURN, + }, + order: { + createdAt: 'DESC', + }, + }); + } + async calculateCommission(data, totalPrice, userData) { const supervisorData = []; @@ -436,25 +638,21 @@ export class TransactionService { ), ); - //GET Admin - supervisorData.push( - await this.userService.findByUsername( - supervisorData[1].superior.username, - ), + return Promise.all( + supervisorData.map(async (it) => { + const coaAccount = await this.coaService.findByUser( + it.id, + coaType.WALLET, + ); + const commissionValue = await this.commissionService.findOne( + it.roles.id, + ); + return { + coa_id: coaAccount.id, + credit: (totalPrice * commissionValue.commission) / 100, + }; + }), ); - - return supervisorData.map(async (it) => { - const coaAccount = await this.coaService.findByUser( - it.id, - coaType.WALLET, - ); - const commissionValue = await this.commissionService.findOne(it.role.id); - - return { - coa_id: coaAccount.id, - credit: totalPrice * commissionValue.commission, - }; - }); } async accountingTransaction(createJournalDto: CreateJournalDto) { From 5ef41a82dcc4540c1789ff04f472b2e49a8944f6 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 10:47:19 +0700 Subject: [PATCH 089/135] fix: transaction controller --- src/transaction/transaction.controller.ts | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index b3e472c..25118c4 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -116,13 +116,15 @@ export class TransactionController { @Get('deposit-return') async findDepositReturn(@Query('page') page: number, @Request() req) { - const data = await this.transactionService.getAllDepositReturnFromUser( - req.user.userId, - page, - ); + const [data, count] = + await this.transactionService.getAllDepositReturnFromUser( + req.user.userId, + page, + ); return { - ...data, + data, + count, statusCode: HttpStatus.OK, message: 'success', }; @@ -133,13 +135,15 @@ export class TransactionController { @Query('page') page: number, @Request() req, ) { - const data = await this.transactionService.getAllDepositReturnToUser( - req.user.userId, - page, - ); + const [data, count] = + await this.transactionService.getAllDepositReturnToUser( + req.user.userId, + page, + ); return { - ...data, + data, + count, statusCode: HttpStatus.OK, message: 'success', }; From 6c24f6784da752b39e15dc1062c4d31fc432985d Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 12:13:48 +0700 Subject: [PATCH 090/135] add: change password --- src/users/users.controller.ts | 13 +++++++++++++ src/users/users.service.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index c7d614b..42c581f 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -207,6 +207,19 @@ export class UsersController { }; } + @Put('change-password/:id') + async updatePassword( + @Param('id', ParseUUIDPipe) id: string, + @Request() req, + @Body() updateUserDto: UpdateUserDto, + ) { + return { + data: await this.usersService.updatePassword(id, updateUserDto, req.user), + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Delete(':id') async remove(@Param('id', ParseUUIDPipe) id: string) { await this.usersService.remove(id); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 38fb9e9..987c3bb 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -313,6 +313,34 @@ export class UsersService { return userData; } + async updatePassword( + id: string, + updateUserDto: UpdateUserDto, + currentUser: any, + ) { + try { + const dataUser = await this.usersRepository.findOneOrFail(id); + dataUser.password = await hashPassword( + updateUserDto.password, + dataUser.salt, + ); + const result = await this.usersRepository.save(dataUser); + return dataUser; + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'User not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + setStatus = async (id: string, type: string) => { const userData = new User(); From 691035c394b70b7517c997dbd72bba813b270fca Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 12:19:10 +0700 Subject: [PATCH 091/135] add: add validation if saldo not enough --- src/transaction/transaction.service.ts | 32 ++++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 5204d80..1d6ae06 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -144,6 +144,21 @@ export class TransactionService { } // GET COA + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); + if (coaBudget.amount < distributeTransactionDto.amount) { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because saldo not enough`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, + ); const coaAR = await this.coaService.findByTwoUser( distributeTransactionDto.destination, currentUser.userId, @@ -153,13 +168,6 @@ export class TransactionService { distributeTransactionDto.destination, coaType.WALLET, ); - const coaBudget = await this.coaService.findByName( - `${coaType[coaType.BUDGET]}-${supplier.code}`, - ); - - const coaContraBudget = await this.coaService.findByName( - `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, - ); await this.connection.transaction(async (manager) => { //INSERT TRANSACTION @@ -238,6 +246,16 @@ export class TransactionService { coaType.ACCOUNT_RECEIVABLE, ); + if (coaSenderWallet.amount < distributeTransactionDto.amount) { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because saldo not enough`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + await this.connection.transaction(async (manager) => { const transactionData = new Transactions(); From bee85570552cb8ddefe869315c5617e2c7b40e78 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 12:33:48 +0700 Subject: [PATCH 092/135] fix: unselect product that not active --- src/product/product.service.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 7138d13..061d23b 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -57,11 +57,12 @@ export class ProductService { if (supplier == 'null' || !supplier) { supplier = (await this.supplierService.findByActive()).id; } + const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .leftJoin('sub_categories.category', 'category') - .where('product.supplier_id = :supplier_id', { + .where(`product.supplier_id = :supplier_id`, { supplier_id: supplier, }) .leftJoinAndMapOne( @@ -131,12 +132,16 @@ export class ProductService { if (supplier != 'null' && !supplier) { supplier = (await this.supplierService.findByActive()).id; } + const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') - .where('product.supplier_id = :supplier_id', { - supplier_id: supplier, - }) + .where( + `product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, + { + supplier_id: supplier, + }, + ) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -176,7 +181,7 @@ export class ProductService { .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .where( - 'sub_categories.category_id = :id and product.supplier_id = :supplier_id', + `sub_categories.category_id = :id and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, { id: categories, supplier_id: supplier.id, From 894118465692d189a17dfbb143cbecfa40a8925f Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 14:01:32 +0700 Subject: [PATCH 093/135] add: upload file --- package.json | 2 ++ src/app.module.ts | 4 +++ src/config/configuration.ts | 2 ++ src/configurable/configurable.controller.ts | 28 +++++++++++++++ src/helper/file-handler.ts | 12 +++++++ src/main.ts | 26 +++++++------- yarn.lock | 39 +++++---------------- 7 files changed, 68 insertions(+), 45 deletions(-) create mode 100644 src/helper/file-handler.ts diff --git a/package.json b/package.json index e78fde3..1771d0d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "class-validator": "^0.13.1", "crypto": "^1.0.1", "decimal.js": "^10.3.1", + "fs-extra": "^10.0.0", "joi": "^17.4.2", "lodash": "^4.17.21", "nestjs-pino": "^2.3.1", @@ -57,6 +58,7 @@ "@nestjs/testing": "^8.0.0", "@types/express": "^4.17.13", "@types/jest": "^27.0.1", + "@types/multer": "^1.4.7", "@types/node": "^16.0.0", "@types/passport-jwt": "^3.0.6", "@types/passport-local": "^1.0.34", diff --git a/src/app.module.ts b/src/app.module.ts index 22dd095..a6673bb 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,6 +10,7 @@ import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; +import { MulterModule } from '@nestjs/platform-express'; @Module({ imports: [ @@ -30,6 +31,9 @@ import configuration from './config/configuration'; DATABASE_PORT: Joi.number().default(5432), }), }), + MulterModule.register({ + dest: './files', + }), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: (configService: ConfigService) => { diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 1b088c3..fc2a677 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -10,5 +10,7 @@ export default () => { password: process.env.DATABASE_PASSWORD || '', name: process.env.DATABASE_NAME, }, + upload_dir: __dirname + '/../uploads', + upload_url_path: '/files/', }; }; diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index 65864ee..1770219 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -9,9 +9,15 @@ import { ParseUUIDPipe, HttpStatus, Query, + UseInterceptors, + UploadedFile, + Res, } from '@nestjs/common'; import { RoleService } from './roles.service'; import { CommissionService } from './commission.service'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { diskStorage } from 'multer'; +import { editFileName } from '../helper/file-handler'; @Controller({ path: 'config', @@ -61,6 +67,11 @@ export class ConfigurableController { }; } + @Get('/image/:imgpath') + seeUploadedFile(@Param('imgpath') image, @Res() res) { + return res.sendFile(image, { root: './files' }); + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { @@ -70,6 +81,23 @@ export class ConfigurableController { }; } + @Post('/upload-files') + @UseInterceptors( + FileInterceptor('file', { + storage: diskStorage({ + destination: './files', + filename: editFileName, + }), + }), + ) + async uploadedFile(@UploadedFile() file: Express.Multer.File) { + const response = { + originalname: file, + filename: file.filename, + }; + return response; + } + @Put('/commission/:id') async updateCommission( @Param('id', ParseUUIDPipe) id: string, diff --git a/src/helper/file-handler.ts b/src/helper/file-handler.ts new file mode 100644 index 0000000..f0b4695 --- /dev/null +++ b/src/helper/file-handler.ts @@ -0,0 +1,12 @@ +import * as path from 'path'; + +export const editFileName = (req, file, callback) => { + const name = file.originalname.split('.')[0]; + const fileExtName = path.extname(file.originalname); + // const fileExtName = 'asdasd'; + const randomName = Array(4) + .fill(null) + .map(() => Math.round(Math.random() * 16).toString(16)) + .join(''); + callback(null, `${name}-${randomName}${fileExtName}`); +}; diff --git a/src/main.ts b/src/main.ts index f8a3c67..c19e714 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,17 +1,14 @@ import { NestFactory } from '@nestjs/core'; -import { - FastifyAdapter, - NestFastifyApplication, -} from '@nestjs/platform-fastify'; import { AppModule } from './app.module'; -import { ValidationPipe, VersioningType} from '@nestjs/common'; +import { ValidationPipe, VersioningType } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Logger } from 'nestjs-pino'; +import { NestExpressApplication } from '@nestjs/platform-express'; async function bootstrap() { - const app = await NestFactory.create( + const app = await NestFactory.create( AppModule, - new FastifyAdapter(), + // new FastifyAdapter(), { bufferLogs: true }, ); @@ -31,13 +28,14 @@ async function bootstrap() { const configService = app.get(ConfigService); const port = configService.get('port'); - await app.listen(port, '0.0.0.0', (error, address) => { - if (error) { - logger.error(error); - process.exit(1); - } else { - logger.log(`Server listening on ${address}`); - } + await app.listen(port, '0.0.0.0', () => { + logger.log('Service Started'); + // if (error) { + // logger.error(error); + // process.exit(1); + // } else { + // logger.log(`Server listening on ${address}`); + // } }); } diff --git a/yarn.lock b/yarn.lock index df8474c..5a03b46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -990,6 +990,13 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/multer@^1.4.7": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" + integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + dependencies: + "@types/express" "*" + "@types/node@*", "@types/node@^16.0.0": version "16.11.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae" @@ -1803,15 +1810,6 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -2840,7 +2838,7 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@10.0.0: +fs-extra@10.0.0, fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== @@ -4599,7 +4597,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pino-abstract-transport@v0.5.0: pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" @@ -4681,23 +4678,6 @@ pino@^7.0.5: sonic-boom "^2.2.1" thread-stream "^0.13.0" -pino@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/pino/-/pino-7.5.1.tgz#6e4cd3389e9365caf64039d4b83dcfa84ed43fee" - integrity sha512-Wzo2G7CLaRHKOz3+Ex006LC5Xi0xEUm+mwm/h0NKzuKZONdekcbmjXg7vWDoO8hVTGX+1RuUy2fwlzvZ24EI5A== - dependencies: - fast-redact "^3.0.0" - fastify-warning "^0.2.0" - get-caller-file "^2.0.5" - on-exit-leak-free "^0.2.0" - pino-abstract-transport v0.5.0 - pino-std-serializers "^4.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.1.0" - safe-stable-stringify "^2.1.0" - sonic-boom "^2.2.1" - thread-stream "^0.13.0" - pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -4988,7 +4968,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.1.4, rfdc@^1.2.0: rfdc@^1.1.4, rfdc@^1.2.0, rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" @@ -5084,7 +5063,6 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -secure-json-parse@^2.0.0: secure-json-parse@^2.0.0, secure-json-parse@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" @@ -6124,4 +6102,3 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - From e499a8a1e684d9337e42a3b8329cc5d1c0217434 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 15:14:01 +0700 Subject: [PATCH 094/135] add: saldo deposit in get member --- src/transaction/entities/coa.entity.ts | 2 ++ src/users/users.service.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index 23de4f0..f60bb7a 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -17,11 +17,13 @@ export class COA extends BaseModel { amount: number; @Column({ + type: 'uuid', nullable: true, }) user: string; @Column({ + type: 'uuid', nullable: true, }) relatedUser: string; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 987c3bb..eb97d80 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -126,6 +126,12 @@ export class UsersService { 'user_detail', `user_detail.user = user.id`, ) + .leftJoinAndMapOne( + 'user.coa', + COA, + 'coa', + `coa.user = user.id and coa.type = '0'`, + ) .select([ 'user.id', 'user.username', @@ -133,6 +139,7 @@ export class UsersService { 'roles.id', 'roles.name', 'user_detail', + 'coa.amount', ]); const data = await baseQuery @@ -175,6 +182,12 @@ export class UsersService { 'user_detail', `user_detail.user = user.id`, ) + .leftJoinAndMapOne( + 'user.coa', + COA, + 'coa', + `coa.user = user.id and coa.type = '0'`, + ) .select([ 'user.id', 'user.username', @@ -182,6 +195,7 @@ export class UsersService { 'roles.id', 'roles.name', 'user_detail', + 'coa.amount', ]); const data = await baseQuery From 1ea1e5cf4603adb058fbf62c80c5df69ab3043d1 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 20 Dec 2021 17:54:35 +0700 Subject: [PATCH 095/135] add: saldo supplier --- src/users/entities/supplier.entity.ts | 2 ++ src/users/supplier/supplier.service.ts | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/users/entities/supplier.entity.ts b/src/users/entities/supplier.entity.ts index 41dddfb..b265ca3 100644 --- a/src/users/entities/supplier.entity.ts +++ b/src/users/entities/supplier.entity.ts @@ -19,4 +19,6 @@ export class Supplier extends BaseModel { status: boolean; coa: COA; + + coa_undistribute: COA; } diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 68bef24..00ff8c0 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -139,7 +139,13 @@ export class SupplierService { 'coa', `coa.supplier = supplier.id and coa.type = '2'`, ) - .select(['supplier', 'coa.amount']); + .leftJoinAndMapOne( + 'supplier.coa_undistribute', + COA, + 'coa_undistribute', + `coa_undistribute.supplier = supplier.id and coa_undistribute.type = '9'`, + ) + .select(['supplier', 'coa.amount', 'coa_undistribute.amount']); const data = await baseQuery .skip(page * 10) From ebcf216fa76bf4848c4cbff81783fdfa6b923354 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 21 Dec 2021 13:35:04 +0700 Subject: [PATCH 096/135] feat: remove validation for upload image --- package.json | 2 +- src/configurable/configurable.controller.ts | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 1771d0d..291af1f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:formatted": "nest start | pino-pretty", - "start:dev": "nest start --watch", + "start:dev": "nest start --watch | pino-pretty", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index 1770219..aacae71 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -1,23 +1,23 @@ import { + Body, Controller, Get, - Post, - Body, - Put, - Param, - Delete, - ParseUUIDPipe, HttpStatus, + Param, + ParseUUIDPipe, + Post, + Put, Query, - UseInterceptors, - UploadedFile, Res, + UploadedFile, + UseInterceptors, } from '@nestjs/common'; import { RoleService } from './roles.service'; import { CommissionService } from './commission.service'; import { FileInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import { editFileName } from '../helper/file-handler'; +import { Public } from 'src/auth/public.decorator'; @Controller({ path: 'config', @@ -81,6 +81,7 @@ export class ConfigurableController { }; } + @Public() @Post('/upload-files') @UseInterceptors( FileInterceptor('file', { From f3863cd09fa5376b4ea406764c9348e05247426f Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 21 Dec 2021 14:39:18 +0700 Subject: [PATCH 097/135] feat: remove validation for get image --- src/configurable/configurable.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index aacae71..e4474da 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -67,6 +67,7 @@ export class ConfigurableController { }; } + @Public() @Get('/image/:imgpath') seeUploadedFile(@Param('imgpath') image, @Res() res) { return res.sendFile(image, { root: './files' }); From 0832308acdc98f7d0af911adf5fd4c62a22235ed Mon Sep 17 00:00:00 2001 From: caturbgs Date: Tue, 21 Dec 2021 21:28:25 +0700 Subject: [PATCH 098/135] feat: add endpoint get product history price --- .../history-price/history-price.service.ts | 46 ++++++++++++++++++- src/product/product.controller.ts | 31 ++++++++++--- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts index 77e71bb..a259ec2 100644 --- a/src/product/history-price/history-price.service.ts +++ b/src/product/history-price/history-price.service.ts @@ -1,7 +1,6 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, IsNull, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; -import { ProductCategories } from '../entities/product-category.entity'; import { ProductHistoryPrice } from '../entities/product-history-price.entity'; @Injectable() @@ -34,4 +33,49 @@ export class ProductHistoryPriceService { } } } + + async findOneByProductId( + page: number, + productId: string, + supplierId: string, + ) { + try { + const query = this.productHistoryPriceService + .createQueryBuilder('product_history_price') + .leftJoin('product_history_price.product', 'product') + .where({ product: productId }) + .andWhere('product_history_price.endDate IS NULL'); + + if (supplierId !== 'null' && supplierId) { + query.andWhere('product.supplier = :supplierId', { + supplierId: supplierId, + }); + } + + const data = await query + .orderBy('product_history_price.createdAt', 'DESC') + .skip(page * 10) + .take(10) + .getMany(); + + const totalData = await query.getCount(); + + return { + data, + count: totalData, + }; + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Product History Price not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 08f09ce..1dcc540 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -1,13 +1,13 @@ import { - Controller, - Get, - Post, Body, - Put, - Param, + Controller, Delete, - ParseUUIDPipe, + Get, HttpStatus, + Param, + ParseUUIDPipe, + Post, + Put, Query, Request, } from '@nestjs/common'; @@ -179,6 +179,25 @@ export class ProductController { }; } + @Get('price-history/:id') + async findPriceHistoryByProductId( + @Param('id', ParseUUIDPipe) id: string, + @Query('page') page: number, + @Query('supplier') supplier: string, + ) { + const data = await this.productHistoryPriceService.findOneByProductId( + page, + id, + supplier, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Put(':id') async update( @Param('id', ParseUUIDPipe) id: string, From ee42cc9acdef86b9fbf4959644aae46e240b5a38 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Wed, 22 Dec 2021 07:33:07 +0700 Subject: [PATCH 099/135] fix product --- src/product/product.service.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index a850649..5077910 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -77,9 +77,9 @@ export class ProductService { 'product.code', 'sub_categories.name', 'category.name', - ]); - // .addSelect('current_price.price') - // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); + ]) + .addSelect('current_price.price') + .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); if (subCategories != 'null' && subCategories) { baseQuery.andWhere('product.sub_categories_id = :id', { @@ -94,9 +94,9 @@ export class ProductService { // } const data = await baseQuery - .skip(page * 10) - .take(10) - .getMany(); + .offset(page * 10) + .limit(10) + .getRawMany(); const totalData = await baseQuery.getCount(); From d8b9202fb77456f616cb7c4ad3e3ae9b958bdb6c Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 09:53:46 +0700 Subject: [PATCH 100/135] add: unfinish product --- src/product/product.service.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 061d23b..a850649 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -70,7 +70,16 @@ export class ProductService { 'product.priceHistory', 'current_price', 'current_price.partner_id is null', - ); + ) + .select(['product.id']) + .addSelect([ + 'product.name', + 'product.code', + 'sub_categories.name', + 'category.name', + ]); + // .addSelect('current_price.price') + // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); if (subCategories != 'null' && subCategories) { baseQuery.andWhere('product.sub_categories_id = :id', { From ad81712bfa65414212345e9455850ad38f5f082a Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 13:35:59 +0700 Subject: [PATCH 101/135] feat: add filter on endpoint product all --- src/product/product.controller.ts | 8 +---- src/product/product.service.ts | 48 ++++++++++++++++---------- src/users/supplier/supplier.service.ts | 20 +++++++++++ 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 1dcc540..52d3c0e 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -73,15 +73,9 @@ export class ProductController { async findAll( @Query('page') page: number, @Query('sub-category') subcategory: string, - @Query('category') category: string, @Query('supplier') supplier: string, ) { - const data = await this.productService.findAll( - page, - supplier, - category, - subcategory, - ); + const data = await this.productService.findAll(page, supplier, subcategory); return { ...data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index a850649..007a995 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,9 +1,4 @@ -import { - HttpException, - HttpStatus, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; +import { HttpException, HttpStatus } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; @@ -15,7 +10,6 @@ import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; -import { type } from 'os'; export class ProductService { constructor( @@ -53,18 +47,30 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async findAll(page, supplier, categories, subCategories) { - if (supplier == 'null' || !supplier) { - supplier = (await this.supplierService.findByActive()).id; + async findAll(page: number, supplier: string, subCategories: string) { + let filterSupplier = []; + let filterSubCategories = []; + + if (supplier !== 'null') { + filterSupplier = supplier.split(',').map((data) => data.trim()); } + if (subCategories !== 'null') { + filterSubCategories = subCategories.split(',').map((data) => data.trim()); + } + // if (supplier.length > 0) { + // const dataSupplier = await this.supplierService.findByActiveAll(); + // supplier = dataSupplier.map((item) => item.id); + // } const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .leftJoin('sub_categories.category', 'category') - .where(`product.supplier_id = :supplier_id`, { - supplier_id: supplier, - }) + .leftJoin('product.supplier', 'supplier') + .where('supplier.status = :status', { status: true }) + // .where(`product.supplier_id = :supplier_id`, { + // supplier_id: In(supplier), + // }) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -78,12 +84,18 @@ export class ProductService { 'sub_categories.name', 'category.name', ]); - // .addSelect('current_price.price') - // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); + // .addSelect('current_price.price') + // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); - if (subCategories != 'null' && subCategories) { - baseQuery.andWhere('product.sub_categories_id = :id', { - id: subCategories, + if (filterSubCategories.length > 0) { + baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { + subCategoryId: filterSubCategories, + }); + } + + if (filterSupplier.length > 0) { + baseQuery.where('supplier.id IN (:...supplierId)', { + supplierId: filterSupplier, }); } diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 00ff8c0..13699cf 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -199,4 +199,24 @@ export class SupplierService { } } } + + async findByActiveAll() { + try { + return await this.supplierRepository.find({ + status: true, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Supplier Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } From 41856f7a02e912f3f43eaeecc32d515ca3bf4108 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 13:42:38 +0700 Subject: [PATCH 102/135] feat: add filter on endpoint product by sub category --- src/product/product-sub-categories.service.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index ffc0492..2d87321 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -1,5 +1,5 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { EntityNotFoundError, Repository } from 'typeorm'; +import { EntityNotFoundError, In, Repository } from 'typeorm'; import { ProductSubCategories } from './entities/product-sub-category.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; @@ -45,13 +45,19 @@ export class ProductSubCategoriesService { } async findAll(page, category) { + let filterCategories = []; + + if (category !== 'null') { + filterCategories = category.split(',').map((data) => data.trim()); + } + const baseQuery = this.productSubCategoriesRepository .createQueryBuilder('product_sub_categories') .leftJoinAndSelect('product_sub_categories.category', 'category'); - if (category != 'null' && category) { + if (filterCategories.length > 0) { baseQuery.where({ - category: category, + category: In(filterCategories), }); } From ff2205ea03b122a0d5d530ff2a6a58900c5c7c82 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 14:03:57 +0700 Subject: [PATCH 103/135] feat: rewrite filter for product --- src/product/product-sub-categories.service.ts | 12 +++--------- src/product/product.controller.ts | 11 +++++++++-- src/product/product.service.ts | 19 +++++-------------- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index 2d87321..be2c2e7 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -44,20 +44,14 @@ export class ProductSubCategoriesService { ); } - async findAll(page, category) { - let filterCategories = []; - - if (category !== 'null') { - filterCategories = category.split(',').map((data) => data.trim()); - } - + async findAll(page, category: []) { const baseQuery = this.productSubCategoriesRepository .createQueryBuilder('product_sub_categories') .leftJoinAndSelect('product_sub_categories.category', 'category'); - if (filterCategories.length > 0) { + if (category.length > 0) { baseQuery.where({ - category: In(filterCategories), + category: In(category), }); } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 52d3c0e..0539d81 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -75,7 +75,11 @@ export class ProductController { @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { - const data = await this.productService.findAll(page, supplier, subcategory); + const data = await this.productService.findAll( + page, + JSON.parse(supplier), + JSON.parse(subcategory), + ); return { ...data, @@ -155,7 +159,10 @@ export class ProductController { @Query('page') page: number, @Query('category') category: string, ) { - const data = await this.productSubCategoriesService.findAll(page, category); + const data = await this.productSubCategoriesService.findAll( + page, + JSON.parse(category), + ); return { ...data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 007a995..2a0cb36 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -47,16 +47,7 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async findAll(page: number, supplier: string, subCategories: string) { - let filterSupplier = []; - let filterSubCategories = []; - - if (supplier !== 'null') { - filterSupplier = supplier.split(',').map((data) => data.trim()); - } - if (subCategories !== 'null') { - filterSubCategories = subCategories.split(',').map((data) => data.trim()); - } + async findAll(page: number, supplier: [], subCategories: []) { // if (supplier.length > 0) { // const dataSupplier = await this.supplierService.findByActiveAll(); // supplier = dataSupplier.map((item) => item.id); @@ -87,15 +78,15 @@ export class ProductService { // .addSelect('current_price.price') // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); - if (filterSubCategories.length > 0) { + if (subCategories.length > 0) { baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { - subCategoryId: filterSubCategories, + subCategoryId: subCategories, }); } - if (filterSupplier.length > 0) { + if (supplier.length > 0) { baseQuery.where('supplier.id IN (:...supplierId)', { - supplierId: filterSupplier, + supplierId: supplier, }); } From d9ca0888e7d44f9564decc7a01d36303afc91f64 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 14:19:58 +0700 Subject: [PATCH 104/135] feat: rewrite filter for product again --- src/product/product-sub-categories.service.ts | 11 ++++++++--- src/product/product.controller.ts | 11 ++--------- src/product/product.service.ts | 17 ++++++++++++----- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index be2c2e7..6ad2644 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -44,14 +44,19 @@ export class ProductSubCategoriesService { ); } - async findAll(page, category: []) { + async findAll(page, category: string) { + let filterCategories; + if (category) { + filterCategories = category.split(',').map((data) => data.trim()); + } + const baseQuery = this.productSubCategoriesRepository .createQueryBuilder('product_sub_categories') .leftJoinAndSelect('product_sub_categories.category', 'category'); - if (category.length > 0) { + if (category && filterCategories.length > 0) { baseQuery.where({ - category: In(category), + category: In(filterCategories), }); } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 0539d81..52d3c0e 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -75,11 +75,7 @@ export class ProductController { @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { - const data = await this.productService.findAll( - page, - JSON.parse(supplier), - JSON.parse(subcategory), - ); + const data = await this.productService.findAll(page, supplier, subcategory); return { ...data, @@ -159,10 +155,7 @@ export class ProductController { @Query('page') page: number, @Query('category') category: string, ) { - const data = await this.productSubCategoriesService.findAll( - page, - JSON.parse(category), - ); + const data = await this.productSubCategoriesService.findAll(page, category); return { ...data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 2a0cb36..7642e6b 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -47,7 +47,14 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async findAll(page: number, supplier: [], subCategories: []) { + async findAll(page: number, supplier: string, subCategories: string) { + let filterSupplier, filterSubCategories; + if (supplier) { + filterSupplier = supplier.split(',').map((data) => data.trim()); + } + if (subCategories) { + filterSubCategories = subCategories.split(',').map((data) => data.trim()); + } // if (supplier.length > 0) { // const dataSupplier = await this.supplierService.findByActiveAll(); // supplier = dataSupplier.map((item) => item.id); @@ -78,15 +85,15 @@ export class ProductService { // .addSelect('current_price.price') // .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); - if (subCategories.length > 0) { + if (subCategories && filterSubCategories.length > 0) { baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { - subCategoryId: subCategories, + subCategoryId: filterSubCategories, }); } - if (supplier.length > 0) { + if (supplier && filterSupplier.length > 0) { baseQuery.where('supplier.id IN (:...supplierId)', { - supplierId: supplier, + supplierId: filterSupplier, }); } From 15945fa408503825601ae035f7f6cee703058e3e Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 14:24:03 +0700 Subject: [PATCH 105/135] feat: rewrite filter for product again --- src/product/product.controller.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 52d3c0e..0539d81 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -75,7 +75,11 @@ export class ProductController { @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { - const data = await this.productService.findAll(page, supplier, subcategory); + const data = await this.productService.findAll( + page, + JSON.parse(supplier), + JSON.parse(subcategory), + ); return { ...data, @@ -155,7 +159,10 @@ export class ProductController { @Query('page') page: number, @Query('category') category: string, ) { - const data = await this.productSubCategoriesService.findAll(page, category); + const data = await this.productSubCategoriesService.findAll( + page, + JSON.parse(category), + ); return { ...data, From 16058db62c6fdca60e9b0f13895e266d1b64f472 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 14:34:49 +0700 Subject: [PATCH 106/135] feat: rewrite filter for product again --- src/product/product.controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 0539d81..f26f7e0 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -77,8 +77,8 @@ export class ProductController { ) { const data = await this.productService.findAll( page, - JSON.parse(supplier), - JSON.parse(subcategory), + supplier == 'null' ? null : supplier, + subcategory == 'null' ? null : subcategory, ); return { @@ -161,7 +161,7 @@ export class ProductController { ) { const data = await this.productSubCategoriesService.findAll( page, - JSON.parse(category), + category == 'null' ? null : category, ); return { From 0bb1800696973137952de22eb76fb5c9b82efeda Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 14:56:31 +0700 Subject: [PATCH 107/135] fix: create partner --- src/users/dto/create-partner.dto.ts | 3 +++ src/users/partner/partner.service.ts | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts index 2fbac10..a53785f 100644 --- a/src/users/dto/create-partner.dto.ts +++ b/src/users/dto/create-partner.dto.ts @@ -15,4 +15,7 @@ export class CreatePartnerDto { @IsNotEmpty() password_account: string; + + @IsNotEmpty() + phone_number: string; } diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index 2373826..b956648 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -59,12 +59,13 @@ export class PartnerService { const dataUser = new CreateUserDto(); dataUser.username = `admin_${partnerData.name}`; - dataUser.username = partnerData.name; + dataUser.name = partnerData.name; dataUser.phone_number = partnerData.phone_number; dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b'; dataUser.superior = false; dataUser.partner = partnerData; dataUser.password = createPartnerDto.password_account; + dataUser.phone_number = createPartnerDto.phone_number; await this.userService.create(dataUser, currentUser); From a0ee6b9040d9efda7acc0d7d658c1dfc44913505 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 15:17:07 +0700 Subject: [PATCH 108/135] fix: get product for partner and for get --- src/product/product.controller.ts | 4 +-- src/product/product.service.ts | 41 ++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index f26f7e0..557857a 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -125,13 +125,13 @@ export class ProductController { async findByCategories( @Query('page') page: number, @Query('pageSize') pageSize: number, - @Query('categories') categories: string, + @Query('sub-category') subcategory: string, @Request() req, ) { const data = await this.productService.findAllForPartner( page, pageSize, - categories, + subcategory, req.user.username, ); diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 89aad86..f27966b 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -73,7 +73,7 @@ export class ProductService { 'product.currentPrice', 'product.priceHistory', 'current_price', - 'current_price.partner_id is null', + 'current_price.partner_id is null and current_price.end_date is NULL', ) .select(['product.id']) .addSelect([ @@ -83,7 +83,9 @@ export class ProductService { 'category.name', ]) .addSelect('current_price.price') - .addSelect('(current_price.price + current_price.mark_up_price) as mark_up_price'); + .addSelect( + '(current_price.price + current_price.mark_up_price) as mark_up_price', + ); if (subCategories && filterSubCategories.length > 0) { baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { @@ -190,19 +192,33 @@ export class ProductService { async findAllForPartner( page: number, pageSize: number, - categories: string, + subCategories: string, username: string, ) { const user = await this.usersService.findOneByUsername(username); const supplier = await this.supplierService.findByActive(); + let filterSupplier, filterSubCategories; + + if (subCategories) { + filterSubCategories = subCategories.split(',').map((data) => data.trim()); + } else { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Sub Categories not inlcude', + }, + HttpStatus.NOT_FOUND, + ); + } + const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .where( - `sub_categories.category_id = :id and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, + `product.sub_categories_id IN (:...subCategoryId) and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, { - id: categories, + subCategoryId: filterSubCategories, supplier_id: supplier.id, }, ) @@ -211,13 +227,20 @@ export class ProductService { 'product.priceHistory', 'current_price', 'current_price.partner_id = :id_partner and current_price.end_date is NULL', + { + id_partner: user.partner.id, + }, ) - .setParameter('id_partner', user.partner.id); + .select(['product.id']) + .addSelect(['product.name', 'product.code', 'sub_categories.name']) + .addSelect( + '(current_price.price + current_price.mark_up_price) as price', + ); const data = await baseQuery - .skip(page * pageSize) - .take(pageSize) - .getMany(); + .offset(page * 10) + .limit(10) + .getRawMany(); const totalData = await baseQuery.getCount(); From cdd6d39c90b2879da2a3a0ff99f1ad8193d200c7 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 14:47:04 +0700 Subject: [PATCH 109/135] feat: add status product column --- src/product/product.service.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index f27966b..e1c1b0a 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -49,11 +49,17 @@ export class ProductService { async findAll(page: number, supplier: string, subCategories: string) { let filterSupplier, filterSubCategories; + if (supplier) { - filterSupplier = supplier.split(',').map((data) => data.trim()); + filterSupplier = supplier.split(',').map((data) => { + return data.trim(); + }); } + if (subCategories) { - filterSubCategories = subCategories.split(',').map((data) => data.trim()); + filterSubCategories = subCategories.split(',').map((data) => { + return data.trim(); + }); } // if (supplier.length > 0) { // const dataSupplier = await this.supplierService.findByActiveAll(); @@ -81,6 +87,7 @@ export class ProductService { 'product.code', 'sub_categories.name', 'category.name', + 'product.status', ]) .addSelect('current_price.price') .addSelect( From c3df45dc9a3afe84ddb3b1cd32f18df4bcb82e27 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 15:23:05 +0700 Subject: [PATCH 110/135] feat: add page size in all the rest API --- src/configurable/commission.service.ts | 8 ++-- src/configurable/configurable.controller.ts | 23 +++++++--- src/configurable/roles.service.ts | 12 ++--- .../history-price/history-price.service.ts | 5 ++- src/product/product-categories.service.ts | 6 +-- src/product/product-sub-categories.service.ts | 6 +-- src/product/product.controller.ts | 18 +++++++- src/product/product.service.ts | 30 +++++-------- src/transaction/transaction.controller.ts | 31 +++++++------ src/transaction/transaction.service.ts | 44 ++++++++++--------- src/users/partner/partner.service.ts | 14 ++---- src/users/supplier/supplier.service.ts | 14 ++---- src/users/users.controller.ts | 26 ++++++++--- src/users/users.service.ts | 22 +++------- 14 files changed, 135 insertions(+), 124 deletions(-) diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts index 4b605a4..cf10d3b 100644 --- a/src/configurable/commission.service.ts +++ b/src/configurable/commission.service.ts @@ -1,8 +1,6 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; -import { Roles } from './entities/roles.entity'; import { InjectRepository } from '@nestjs/typeorm'; -import { UpdateUserDto } from '../users/dto/update-user.dto'; import { CommissionSetting } from './entities/commission_setting.entity'; @Injectable() @@ -12,10 +10,10 @@ export class CommissionService { private commissionRepository: Repository, ) {} - findAllCommission(page) { + findAllCommission(page, pageSize?) { return this.commissionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index e4474da..c814ebe 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -30,8 +30,11 @@ export class ConfigurableController { ) {} @Get('/roles') - async findAll(@Query('page') page: number) { - const [data, count] = await this.roleService.findAllRoles(page); + async findAll( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.roleService.findAllRoles(page, pageSize); return { data, @@ -42,8 +45,14 @@ export class ConfigurableController { } @Get('/commission') - async findCommission(@Query('page') page: number) { - const [data, count] = await this.commissionService.findAllCommission(page); + async findCommission( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.commissionService.findAllCommission( + page, + pageSize, + ); return { data, @@ -54,9 +63,13 @@ export class ConfigurableController { } @Get('/roles/for-membership') - async findAllForMembership(@Query('page') page: number) { + async findAllForMembership( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { const [data, count] = await this.roleService.findAllRolesForCreateMember( page, + pageSize, ); return { diff --git a/src/configurable/roles.service.ts b/src/configurable/roles.service.ts index 2f2424e..75b46bd 100644 --- a/src/configurable/roles.service.ts +++ b/src/configurable/roles.service.ts @@ -10,20 +10,20 @@ export class RoleService { private rolesRepository: Repository, ) {} - findAllRoles(page) { + findAllRoles(page, pageSize?) { return this.rolesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, }); } - findAllRolesForCreateMember(page) { + findAllRolesForCreateMember(page, pageSize?) { return this.rolesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { id: Not( In([ diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts index a259ec2..ee1325f 100644 --- a/src/product/history-price/history-price.service.ts +++ b/src/product/history-price/history-price.service.ts @@ -38,6 +38,7 @@ export class ProductHistoryPriceService { page: number, productId: string, supplierId: string, + pageSize?: number, ) { try { const query = this.productHistoryPriceService @@ -54,8 +55,8 @@ export class ProductHistoryPriceService { const data = await query .orderBy('product_history_price.createdAt', 'DESC') - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await query.getCount(); diff --git a/src/product/product-categories.service.ts b/src/product/product-categories.service.ts index 6aa1e30..5afab21 100644 --- a/src/product/product-categories.service.ts +++ b/src/product/product-categories.service.ts @@ -36,10 +36,10 @@ export class ProductCategoriesService { ); } - findAll(page) { + findAll(page, pageSize?) { return this.productCategoriesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index 6ad2644..98a5b22 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -44,7 +44,7 @@ export class ProductSubCategoriesService { ); } - async findAll(page, category: string) { + async findAll(page, category: string, pageSize?) { let filterCategories; if (category) { filterCategories = category.split(',').map((data) => data.trim()); @@ -61,8 +61,8 @@ export class ProductSubCategoriesService { } const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 557857a..6c012c4 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -72,6 +72,7 @@ export class ProductController { @Get('all') async findAll( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { @@ -79,6 +80,7 @@ export class ProductController { page, supplier == 'null' ? null : supplier, subcategory == 'null' ? null : subcategory, + pageSize, ); return { @@ -105,6 +107,7 @@ export class ProductController { @Get('by-categories-all') async findByCategoriesAll( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { @@ -112,6 +115,7 @@ export class ProductController { page, subcategory, supplier, + pageSize, ); return { @@ -143,8 +147,14 @@ export class ProductController { } @Get('categories') - async findAllCategories(@Query('page') page: number) { - const [data, count] = await this.productCategoriesService.findAll(page); + async findAllCategories( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.productCategoriesService.findAll( + page, + pageSize, + ); return { data, @@ -157,11 +167,13 @@ export class ProductController { @Get('sub-categories') async findAllSubCategories( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('category') category: string, ) { const data = await this.productSubCategoriesService.findAll( page, category == 'null' ? null : category, + pageSize, ); return { @@ -184,12 +196,14 @@ export class ProductController { async findPriceHistoryByProductId( @Param('id', ParseUUIDPipe) id: string, @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('supplier') supplier: string, ) { const data = await this.productHistoryPriceService.findOneByProductId( page, id, supplier, + pageSize, ); return { diff --git a/src/product/product.service.ts b/src/product/product.service.ts index e1c1b0a..e1fa8db 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -47,7 +47,12 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async findAll(page: number, supplier: string, subCategories: string) { + async findAll( + page: number, + supplier: string, + subCategories: string, + pageSize?: number, + ) { let filterSupplier, filterSubCategories; if (supplier) { @@ -61,10 +66,6 @@ export class ProductService { return data.trim(); }); } - // if (supplier.length > 0) { - // const dataSupplier = await this.supplierService.findByActiveAll(); - // supplier = dataSupplier.map((item) => item.id); - // } const baseQuery = this.productRepository .createQueryBuilder('product') @@ -72,9 +73,6 @@ export class ProductService { .leftJoin('sub_categories.category', 'category') .leftJoin('product.supplier', 'supplier') .where('supplier.status = :status', { status: true }) - // .where(`product.supplier_id = :supplier_id`, { - // supplier_id: In(supplier), - // }) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -106,15 +104,9 @@ export class ProductService { }); } - // if (categories != 'null' && categories) { - // baseQuery.andWhere('sub_categories.category_id = :id', { - // id: categories, - // }); - // } - const data = await baseQuery - .offset(page * 10) - .limit(10) + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) .getRawMany(); const totalData = await baseQuery.getCount(); @@ -156,7 +148,7 @@ export class ProductService { }; } - async findAllBySubCategories(page, subCategories, supplier) { + async findAllBySubCategories(page, subCategories, supplier, pageSize?) { if (supplier != 'null' && !supplier) { supplier = (await this.supplierService.findByActive()).id; } @@ -184,8 +176,8 @@ export class ProductService { } const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 25118c4..da3363e 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -1,17 +1,4 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Request, - HttpStatus, - Query, - Put, - ParseUUIDPipe, -} from '@nestjs/common'; +import { Body, Controller, Get, HttpStatus, Param, ParseUUIDPipe, Post, Put, Query, Request } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; @@ -101,10 +88,15 @@ export class TransactionController { } @Get('history') - async findByCategories(@Query('page') page: number, @Request() req) { + async findByCategories( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { const data = await this.transactionService.transactionHistoryByUser( page, req.user.userId, + pageSize, ); return { @@ -115,11 +107,16 @@ export class TransactionController { } @Get('deposit-return') - async findDepositReturn(@Query('page') page: number, @Request() req) { + async findDepositReturn( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { const [data, count] = await this.transactionService.getAllDepositReturnFromUser( req.user.userId, page, + pageSize, ); return { @@ -133,12 +130,14 @@ export class TransactionController { @Get('deposit-return/confirmation') async findDepositReturnConfirmation( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Request() req, ) { const [data, count] = await this.transactionService.getAllDepositReturnToUser( req.user.userId, page, + pageSize, ); return { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1d6ae06..1c12a1a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,24 +3,14 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { - Connection, - EntityManager, - EntityNotFoundError, - Repository, -} from 'typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import * as uuid from 'uuid'; import { uniq } from 'lodash'; import { Decimal } from 'decimal.js'; -import { - balanceType, - coaType, - statusTransaction, - typeTransaction, -} from '../helper/enum-list'; +import { balanceType, coaType, statusTransaction, typeTransaction } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; @@ -560,7 +550,11 @@ export class TransactionService { return transactionData; } - async transactionHistoryByUser(page: number, user: string) { + async transactionHistoryByUser( + page: number, + user: string, + pageSize?: number, + ) { const baseQuery = this.transactionRepository .createQueryBuilder('transaction') .select('transaction.id', 'id') @@ -578,8 +572,8 @@ export class TransactionService { // .leftJoinAndSelect('product_price.product', 'product'); const data = await baseQuery - .skip(page * 10) - .take(10) + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) .getRawMany(); const totalData = await baseQuery.getCount(); @@ -614,10 +608,14 @@ export class TransactionService { } } - async getAllDepositReturnFromUser(user: string, page: number) { + async getAllDepositReturnFromUser( + user: string, + page: number, + pageSize?: number, + ) { return this.transactionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { user: user, type: typeTransaction.DEPOSIT_RETURN, @@ -628,10 +626,14 @@ export class TransactionService { }); } - async getAllDepositReturnToUser(user: string, page: number) { + async getAllDepositReturnToUser( + user: string, + page: number, + pageSize?: number, + ) { return this.transactionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { user_destination: user, type: typeTransaction.DEPOSIT_RETURN, diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index b956648..1cae2f5 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -1,10 +1,4 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, Not, Repository } from 'typeorm'; import { CoaService } from '../../transaction/coa.service'; @@ -135,10 +129,10 @@ export class PartnerService { return partnerData; }; - findAllPartner(page) { + findAllPartner(page, pageSize?) { return this.partnerRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 13699cf..e322890 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -1,10 +1,4 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { Supplier } from '../entities/supplier.entity'; @@ -130,7 +124,7 @@ export class SupplierService { return supplierData; }; - async findAllSupplier(page) { + async findAllSupplier(page, pageSize?) { const baseQuery = this.supplierRepository .createQueryBuilder('supplier') .leftJoinAndMapOne( @@ -148,8 +142,8 @@ export class SupplierService { .select(['supplier', 'coa.amount', 'coa_undistribute.amount']); const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 42c581f..a127b27 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -125,8 +125,12 @@ export class UsersController { @Public() @Get('supplier') - async findAllSupplier(@Query('page') page: number) { - const data = await this.supplierService.findAllSupplier(page); + async findAllSupplier( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { + const data = await this.supplierService.findAllSupplier(page, pageSize); return { ...data, @@ -136,8 +140,15 @@ export class UsersController { } @Get('partner') - async findAllPartner(@Query('page') page: number) { - const [data, count] = await this.partnerService.findAllPartner(page); + async findAllPartner( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { + const [data, count] = await this.partnerService.findAllPartner( + page, + pageSize, + ); return { data, @@ -162,8 +173,13 @@ export class UsersController { async findByRoles( @Param('id', ParseUUIDPipe) id: string, @Query('page') page: number, + @Query('pageSize') pageSize: number, ) { - const [data, count] = await this.usersService.findByRoles(id, page); + const [data, count] = await this.usersService.findByRoles( + id, + page, + pageSize, + ); return { data, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index eb97d80..b823a26 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,19 +1,7 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { - Connection, - EntityNotFoundError, - Equal, - Not, - Repository, -} from 'typeorm'; +import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; @@ -155,10 +143,10 @@ export class UsersService { }; } - findByRoles(relationId: string, page: number) { + findByRoles(relationId: string, page: number, pageSize?: number) { return this.usersRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { roles: relationId, }, From 1f627e6db28f434b0e19a00198837618815fc4c0 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 15:32:53 +0700 Subject: [PATCH 111/135] fix: order transaction --- src/transaction/transaction.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1c12a1a..208eb66 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -308,7 +308,7 @@ export class TransactionService { let supervisorData = []; - let profit = product_price.mark_up_price - product_price.price; + let profit = product_price.mark_up_price; if (!userData.partner) { //GET SALES @@ -382,11 +382,11 @@ export class TransactionService { }, { coa_id: coaAccount.id, - debit: product_price.mark_up_price, + debit: product_price.mark_up_price + product_price.price, }, { coa_id: coaSales.id, - credit: product_price.mark_up_price, + credit: product_price.mark_up_price + product_price.price, }, { coa_id: coaExpense.id, From 4659b2a749d6ac1708ec99427efd3fbdebd9d27b Mon Sep 17 00:00:00 2001 From: caturbgs Date: Wed, 22 Dec 2021 16:09:39 +0700 Subject: [PATCH 112/135] feat: add insert image on endpoint payback --- src/transaction/transaction.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 208eb66..1ecf9b6 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -416,6 +416,7 @@ export class TransactionService { transactionData.user_destination = depositReturnDto.destination; transactionData.status = statusTransaction.PENDING; transactionData.type = typeTransaction.DEPOSIT_RETURN; + transactionData.image_prove = depositReturnDto.image_prove; await this.connection.transaction(async (manager) => { await manager.insert(Transactions, transactionData); }); From 97bcf40ac42c21214a6393054cb313455640a567 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 18:03:39 +0700 Subject: [PATCH 113/135] add: get History Deposit --- src/transaction/transaction.controller.ts | 25 +++++++++++- src/transaction/transaction.service.ts | 50 +++++++++++++++++++++-- 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index da3363e..f415960 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -48,7 +48,7 @@ export class TransactionController { @Request() req, ) { return { - data: await this.transactionService.addPartnerSaldo( + data: await this.transactionService.addSupplierSaldo( addSaldoSupplier, req.user, ), @@ -88,7 +88,7 @@ export class TransactionController { } @Get('history') - async findByCategories( + async getHistoryTransactionUser( @Query('page') page: number, @Query('pageSize') pageSize: number, @Request() req, @@ -106,6 +106,27 @@ export class TransactionController { }; } + @Get('history-deposit') + async getHistoryDepositUser( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Query('user-destination') userDestination: string, + @Request() req, + ) { + const data = await this.transactionService.topUpHistoryByUser( + page, + req.user.userId, + userDestination, + pageSize, + ); + + return { + ...data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('deposit-return') async findDepositReturn( @Query('page') page: number, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1ecf9b6..af5a30d 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -10,7 +10,12 @@ import { CoaService } from './coa.service'; import * as uuid from 'uuid'; import { uniq } from 'lodash'; import { Decimal } from 'decimal.js'; -import { balanceType, coaType, statusTransaction, typeTransaction } from '../helper/enum-list'; +import { + balanceType, + coaType, + statusTransaction, + typeTransaction, +} from '../helper/enum-list'; import { ProductService } from '../product/product.service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; @@ -44,7 +49,7 @@ export class TransactionService { private connection: Connection, ) {} - async addPartnerSaldo(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { + async addSupplierSaldo(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { const supplier = await this.supplierService.findByCode( addSaldoSupplier.supplier, ); @@ -137,6 +142,7 @@ export class TransactionService { const coaBudget = await this.coaService.findByName( `${coaType[coaType.BUDGET]}-${supplier.code}`, ); + if (coaBudget.amount < distributeTransactionDto.amount) { throw new HttpException( { @@ -146,6 +152,7 @@ export class TransactionService { HttpStatus.INTERNAL_SERVER_ERROR, ); } + const coaContraBudget = await this.coaService.findByName( `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, ); @@ -318,8 +325,12 @@ export class TransactionService { userData, ); profit = supervisorData - .map((item) => item.credit) - .reduce((prev, curr) => prev + curr, 0); + .map((item) => { + return item.credit; + }) + .reduce((prev, curr) => { + return prev + curr; + }, 0); } //GET COA @@ -585,6 +596,36 @@ export class TransactionService { }; } + async topUpHistoryByUser( + page: number, + user: string, + destinationUser: string, + pageSize?: number, + ) { + const baseQuery = this.transactionRepository + .createQueryBuilder('transaction') + .where( + 'transaction.user = :id and transaction.type = 0 and transaction.user_destination = :destinationId', + { + id: user, + destinationId: destinationUser, + }, + ) + .select(['id', 'created_at as transaction_date', 'amount']); + + const data = await baseQuery + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) + .getRawMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; + } + async findApprovalDepositReturn(id: string) { try { return await this.transactionRepository.findOneOrFail({ @@ -668,6 +709,7 @@ export class TransactionService { const commissionValue = await this.commissionService.findOne( it.roles.id, ); + return { coa_id: coaAccount.id, credit: (totalPrice * commissionValue.commission) / 100, From 7ab2c1fde30770fa05480992701d191b247cf293 Mon Sep 17 00:00:00 2001 From: Rido Akbar Ibrahim Date: Wed, 22 Dec 2021 20:42:53 +0700 Subject: [PATCH 114/135] add pvc --- k8s/staging/deployment.yaml | 7 +++++++ k8s/staging/pvc.yaml | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 k8s/staging/pvc.yaml diff --git a/k8s/staging/deployment.yaml b/k8s/staging/deployment.yaml index 6d3e967..9ca2ae7 100644 --- a/k8s/staging/deployment.yaml +++ b/k8s/staging/deployment.yaml @@ -21,6 +21,13 @@ spec: envFrom: - secretRef: name: ppob-backend-env + volumeMounts: + - name: storage + mountPath: /usr/src/app/files + volumes: + - name: storage + persistentVolumeClaim: + claimName: ppob-backend-pvc imagePullSecrets: - name: regcred diff --git a/k8s/staging/pvc.yaml b/k8s/staging/pvc.yaml new file mode 100644 index 0000000..8d14b9a --- /dev/null +++ b/k8s/staging/pvc.yaml @@ -0,0 +1,13 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: ppob-backend-pvc + namespace : empatnusabangsa-staging + annotations: + volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi From d0c9d90e3aac1ee9f82f4ac68cb0ffc12b26736c Mon Sep 17 00:00:00 2001 From: Rido Akbar Ibrahim Date: Wed, 22 Dec 2021 20:57:13 +0700 Subject: [PATCH 115/135] add pvc --- k8s/staging/deployment.yaml | 2 +- k8s/staging/pvc.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/k8s/staging/deployment.yaml b/k8s/staging/deployment.yaml index 9ca2ae7..217c96e 100644 --- a/k8s/staging/deployment.yaml +++ b/k8s/staging/deployment.yaml @@ -23,7 +23,7 @@ spec: name: ppob-backend-env volumeMounts: - name: storage - mountPath: /usr/src/app/files + mountPath: /home/node/files volumes: - name: storage persistentVolumeClaim: diff --git a/k8s/staging/pvc.yaml b/k8s/staging/pvc.yaml index 8d14b9a..5b3fc42 100644 --- a/k8s/staging/pvc.yaml +++ b/k8s/staging/pvc.yaml @@ -7,7 +7,7 @@ metadata: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" spec: accessModes: - - ReadWriteOnce + - ReadWriteMany resources: requests: storage: 10Gi From 3f57e574a686f328c36d7dd30481a2f72b0d4040 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 22:56:44 +0700 Subject: [PATCH 116/135] add: parser upload product --- package.json | 2 + src/helper/csv-parser.ts | 28 +++++++ src/product/product-sub-categories.service.ts | 8 ++ src/product/product.controller.ts | 5 +- src/product/product.service.ts | 82 ++++++++++++++++++- src/transaction/transaction.controller.ts | 13 ++- src/users/dto/create-partner.dto.ts | 3 + src/users/entities/partner.entity.ts | 5 ++ src/users/partner/partner.service.ts | 22 ++++- src/users/users.module.ts | 2 +- src/users/users.service.ts | 9 +- yarn.lock | 12 +++ 12 files changed, 181 insertions(+), 10 deletions(-) create mode 100644 src/helper/csv-parser.ts diff --git a/package.json b/package.json index 291af1f..05a3a9b 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,9 @@ "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "crypto": "^1.0.1", + "csv-parser": "^3.0.0", "decimal.js": "^10.3.1", + "fs": "^0.0.1-security", "fs-extra": "^10.0.0", "joi": "^17.4.2", "lodash": "^4.17.21", diff --git a/src/helper/csv-parser.ts b/src/helper/csv-parser.ts new file mode 100644 index 0000000..63c08f3 --- /dev/null +++ b/src/helper/csv-parser.ts @@ -0,0 +1,28 @@ +import { createReadStream } from 'fs'; +import * as csvParser from 'csv-parser'; +import * as path from 'path'; + +export async function parsingFile(dataFile) { + const parsingData: any = await new Promise((resolve, reject) => { + const results = []; + + const file = createReadStream( + path.join( + process.cwd(), + './files/Template Upload Product - Sheet1-a532.csv', + ), + ); + + file + .pipe( + csvParser({ + headers: false, + }), + ) + .on('data', (data) => results.push(data)) + .on('end', () => { + resolve(results); + }); + }); + return parsingData; +} diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index 98a5b22..9890ef7 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -105,6 +105,14 @@ export class ProductSubCategoriesService { } } + async findOneForCSVParser(code: string) { + return await this.productSubCategoriesRepository.findOne({ + where: { + code: code, + }, + }); + } + async update( id: string, updateCategoriesProductDto: UpdateSubCategoriesProductDto, diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 6c012c4..de6443e 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -92,10 +92,7 @@ export class ProductController { @Get('test') async test(@Request() req) { - const data = await this.productHistoryPriceService.findOne( - '4d3b328c-3ce4-4c84-84bb-cd9c36e85a45', - '27effb3e-0351-428a-ba7f-08a21c54e16a', - ); + const data = await this.productService.processUploadCSV(); return { data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index e1fa8db..f98fdc4 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,5 +1,5 @@ import { HttpException, HttpStatus } from '@nestjs/common'; -import { EntityNotFoundError, Repository } from 'typeorm'; +import { EntityNotFoundError, IsNull, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { CreateProductDto } from './dto/product/create-product.dto'; @@ -10,6 +10,8 @@ import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; +import { parsingFile } from '../helper/csv-parser'; +import { PartnerService } from '../users/partner/partner.service'; export class ProductService { constructor( @@ -20,6 +22,7 @@ export class ProductService { private productSubCategoriesService: ProductSubCategoriesService, private usersService: UsersService, private supplierService: SupplierService, + private partnerService: PartnerService, ) {} async create(createProductDto: CreateProductDto) { @@ -47,6 +50,83 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } + async processUploadCSV() { + const data = await parsingFile(''); + data.shift(); + await Promise.all( + data.map(async (it) => { + let dataHistoryPrice; + let partnerData; + + const subCategories = + await this.productSubCategoriesService.findOneForCSVParser(it[2]); + + if (!subCategories) { + return; + } + + const productData = await this.productRepository.findOne({ + code: it[0], + }); + if (productData) { + //TODO : Handle Update Product + productData.name = it[1]; + productData.status = it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE'; + await this.productRepository.save(productData); + + //TODO : Handle History Price + if (it[6] != '-' && it[6] != '') { + partnerData = await this.partnerService.findOne(it[6]); + dataHistoryPrice = await this.productHistoryPrice.findOne({ + product: productData, + partner: partnerData, + }); + } else { + dataHistoryPrice = await this.productHistoryPrice.findOne({ + product: productData, + }); + } + + dataHistoryPrice.endDate = new Date(); + await this.productHistoryPrice.save(dataHistoryPrice); + + await this.productHistoryPrice.insert({ + product: productData, + mark_up_price: it[4], + price: it[3], + type: productType.NORMAL, + startDate: new Date(), + endDate: null, + partner: it[6] != '-' ? partnerData : null, + }); + } else { + let partnerData; + if (it[6] != '-' && it[6] != '') { + partnerData = await this.partnerService.findOne(it[6]); + } + const savedProduct = await this.productRepository.insert({ + name: it[1], + code: it[0], + status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', + sub_categories: subCategories, + }); + + await this.productHistoryPrice.insert({ + product: savedProduct.identifiers[0], + mark_up_price: it[4], + price: it[3], + type: productType.NORMAL, + startDate: new Date(), + endDate: null, + partner: it[6] != '-' ? partnerData : null, + }); + } + }), + ); + + return data; + } + async findAll( page: number, supplier: string, diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index f415960..453dc23 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -1,4 +1,15 @@ -import { Body, Controller, Get, HttpStatus, Param, ParseUUIDPipe, Post, Put, Query, Request } from '@nestjs/common'; +import { + Body, + Controller, + Get, + HttpStatus, + Param, + ParseUUIDPipe, + Post, + Put, + Query, + Request, +} from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts index a53785f..a4f1bc9 100644 --- a/src/users/dto/create-partner.dto.ts +++ b/src/users/dto/create-partner.dto.ts @@ -10,6 +10,9 @@ export class CreatePartnerDto { @IsNotEmpty() owner: string; + @IsNotEmpty() + code: string; + @IsNotEmpty() npwp: string; diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts index 7601e41..dba4b0e 100644 --- a/src/users/entities/partner.entity.ts +++ b/src/users/entities/partner.entity.ts @@ -11,6 +11,11 @@ export class Partner extends BaseModel { @Column() name: string; + @Column({ + nullable: true, + }) + code: string; + @Column() npwp: string; diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index 1cae2f5..cf2422f 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -1,6 +1,12 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Connection, Not, Repository } from 'typeorm'; +import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { CoaService } from '../../transaction/coa.service'; import { CreatePartnerDto } from '../dto/create-partner.dto'; import { Partner } from '../entities/partner.entity'; @@ -9,6 +15,7 @@ import { UsersService } from '../users.service'; import { CreateUserDto } from '../dto/create-user.dto'; import { UpdatePartnerDto } from '../dto/update-partner.dto'; import { UpdateUserDto } from '../dto/update-user.dto'; +import { when } from 'joi'; @Injectable() export class PartnerService { @@ -41,10 +48,12 @@ export class PartnerService { } const partnerData = new Partner(); + partnerData.id = uuid.v4(); partnerData.name = createPartnerDto.name; partnerData.npwp = createPartnerDto.npwp; partnerData.address = createPartnerDto.address; + partnerData.code = createPartnerDto.code; partnerData.status = true; await this.connection.transaction(async (manager) => { @@ -52,6 +61,7 @@ export class PartnerService { }); const dataUser = new CreateUserDto(); + dataUser.username = `admin_${partnerData.name}`; dataUser.name = partnerData.name; dataUser.phone_number = partnerData.phone_number; @@ -129,6 +139,14 @@ export class PartnerService { return partnerData; }; + async findOne(code: string) { + return await this.partnerRepository.findOne({ + where: { + code: code, + }, + }); + } + findAllPartner(page, pageSize?) { return this.partnerRepository.findAndCount({ skip: page * (pageSize || 10), diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 523735e..449f2cc 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -19,6 +19,6 @@ import { UserDetail } from './entities/user_detail.entity'; ], controllers: [UsersController], providers: [UsersService, SupplierService, PartnerService], - exports: [UsersService, SupplierService], + exports: [UsersService, SupplierService, PartnerService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index b823a26..7ade7a4 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; @@ -383,6 +389,7 @@ export class UsersService { return this.usersRepository.findOneOrFail({ where: { username, + isActive: true, }, relations: ['roles', 'partner'], }); diff --git a/yarn.lock b/yarn.lock index 5a03b46..24f3843 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2110,6 +2110,13 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csv-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-3.0.0.tgz#b88a6256d79e090a97a1b56451f9327b01d710e7" + integrity sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ== + dependencies: + minimist "^1.2.0" + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -2867,6 +2874,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fs@^0.0.1-security: + version "0.0.1-security" + resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= + fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" From 00bac582a6e92850f1b6beababa1fc1e9e74bf46 Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 22 Dec 2021 23:31:41 +0700 Subject: [PATCH 117/135] fix: order by membership --- src/users/users.service.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 7ade7a4..12ef1e7 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -130,6 +130,7 @@ export class UsersService { 'user.id', 'user.username', 'user.isActive', + 'user.createdAt', 'roles.id', 'roles.name', 'user_detail', @@ -137,6 +138,7 @@ export class UsersService { ]); const data = await baseQuery + .orderBy('user.createdAt', 'DESC') .skip(page * 10) .take(10) .getMany(); From 2e3c56bb21a3ba06b846492d47d1a8fc317de24a Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 00:13:03 +0700 Subject: [PATCH 118/135] fix: get product for transaction --- src/product/product.service.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index f98fdc4..fc72d7c 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -246,7 +246,12 @@ export class ProductService { 'product.currentPrice', 'product.priceHistory', 'current_price', - 'current_price.partner_id is null', + 'current_price.partner_id is NULL and current_price.end_date is NULL', + ) + .select(['product.id']) + .addSelect(['product.name', 'product.code', 'sub_categories.name']) + .addSelect( + '(current_price.price + current_price.mark_up_price) as price', ); if (subCategories != 'null' && subCategories) { @@ -256,9 +261,9 @@ export class ProductService { } const data = await baseQuery - .skip(page * (pageSize || 10)) - .take(pageSize || 10) - .getMany(); + .offset(page * 10) + .limit(10) + .getRawMany(); const totalData = await baseQuery.getCount(); From 518c330ff9e296cee180d56d4e0a3dc365fbf94b Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 00:29:59 +0700 Subject: [PATCH 119/135] fix: confirm deposit return --- src/transaction/transaction.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index af5a30d..8ce0479 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -451,8 +451,8 @@ export class TransactionService { ); const coaAP = await this.coaService.findByUserWithRelated( - userData.userId, transactionData.user_destination, + userData.userId, coaType.ACCOUNT_PAYABLE, ); @@ -462,8 +462,8 @@ export class TransactionService { ); const coaAR = await this.coaService.findByUserWithRelated( - userData.userId, transactionData.user_destination, + userData.userId, coaType.ACCOUNT_RECEIVABLE, ); From 43b998c8366dd0dd73a1db52b8d5f78698f51366 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 00:35:43 +0700 Subject: [PATCH 120/135] fix: confirm deposit return --- src/transaction/transaction.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 8ce0479..610afba 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -446,23 +446,23 @@ export class TransactionService { const transactionData = await this.findApprovalDepositReturn(id); const coaSenderWallet = await this.coaService.findByUser( - transactionData.user_destination, + transactionData.user, coaType.WALLET, ); const coaAP = await this.coaService.findByUserWithRelated( - transactionData.user_destination, + transactionData.user, userData.userId, coaType.ACCOUNT_PAYABLE, ); const coaReceiverWallet = await this.coaService.findByUser( - transactionData.user_destination, + transactionData.user, coaType.WALLET, ); const coaAR = await this.coaService.findByUserWithRelated( - transactionData.user_destination, + transactionData.user, userData.userId, coaType.ACCOUNT_RECEIVABLE, ); From 2ca96556a15d8a230f3c51da139cfa13687f051a Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 00:43:43 +0700 Subject: [PATCH 121/135] fix: confirm deposit return --- src/transaction/transaction.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 453dc23..9397afe 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -180,11 +180,11 @@ export class TransactionController { }; } - @Put('deposit-return/confirmation/:id') + @Put('deposit-return/confirmation/:id/:status') async confirmDepositReturn( @Param('id', ParseUUIDPipe) id: string, + @Param('status') status: string, @Request() req, - @Body() status: string, ) { return { data: await this.transactionService.confirmationDepositReturn( From e8ba8ec9b869a24ebe0dc62e1d311cc6c4b840ea Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 00:44:41 +0700 Subject: [PATCH 122/135] fix: confirm deposit return --- src/transaction/transaction.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 610afba..9e93f39 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -470,7 +470,7 @@ export class TransactionService { try { await this.connection.transaction(async (manager) => { transactionData.status = - statusApproval === 'Accept' + statusApproval === 'accept' ? statusTransaction.APPROVED : statusTransaction.REJECTED; From 4b8278a6bbb774fee923df632d7853db41a7c829 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 01:17:08 +0700 Subject: [PATCH 123/135] fix: get deposit return to --- src/transaction/transaction.controller.ts | 14 +++++------- src/transaction/transaction.service.ts | 28 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 9397afe..fe3555a 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -165,16 +165,14 @@ export class TransactionController { @Query('pageSize') pageSize: number, @Request() req, ) { - const [data, count] = - await this.transactionService.getAllDepositReturnToUser( - req.user.userId, - page, - pageSize, - ); + const data = await this.transactionService.getAllDepositReturnToUser( + req.user.userId, + page, + pageSize, + ); return { - data, - count, + ...data, statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 9e93f39..352a95d 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -24,6 +24,8 @@ import { SupplierService } from '../users/supplier/supplier.service'; import { ProductHistoryPriceService } from '../product/history-price/history-price.service'; import { CommissionService } from '../configurable/commission.service'; import { DepositReturnDto } from './dto/deposit_return.dto'; +import { User } from '../users/entities/user.entity'; +import { UserDetail } from '../users/entities/user_detail.entity'; interface JournalEntry { coa_id: string; @@ -673,6 +675,32 @@ export class TransactionService { page: number, pageSize?: number, ) { + const baseQuery = this.transactionRepository + .createQueryBuilder('transaction') + .select('transaction.id', 'id') + .addSelect(['transaction.created_at', 'image_prove', 'amount']) + .where('transaction.user_destination = :id and transaction.type = 3', { + id: user, + }) + .leftJoinAndMapOne( + 'transaction.userData', + UserDetail, + 'userData', + 'userData.user = transaction.user', + ) + .addSelect('userData.name', 'name'); + + const data = await baseQuery + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) + .getRawMany(); + + const totalData = await baseQuery.getCount(); + + return { + data, + count: totalData, + }; return this.transactionRepository.findAndCount({ skip: page * (pageSize || 10), take: pageSize || 10, From 25308eb67f610c03ad6d80a3cf26c22b4e2bb554 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 01:18:22 +0700 Subject: [PATCH 124/135] fix: get deposit return to --- src/transaction/entities/transactions.entity.ts | 9 ++++++++- src/transaction/transaction.service.ts | 11 ++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index a1fed62..a9937e8 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -14,6 +14,8 @@ import { BaseModel } from '../../config/basemodel.entity'; import { statusTransaction, typeTransaction } from '../../helper/enum-list'; import { Partner } from '../../users/entities/partner.entity'; import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; +import { User } from '../../users/entities/user.entity'; +import { UserDetail } from '../../users/entities/user_detail.entity'; @Entity() export class Transactions extends BaseModel { @@ -26,7 +28,10 @@ export class Transactions extends BaseModel { @Column() type: typeTransaction; - @Column() + @Column({ + type: 'uuid', + nullable: true, + }) user: string; @Column({ @@ -43,4 +48,6 @@ export class Transactions extends BaseModel { image_prove: string; mark_up_price: number; + + userData: UserDetail; } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 352a95d..f7181a5 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -677,8 +677,6 @@ export class TransactionService { ) { const baseQuery = this.transactionRepository .createQueryBuilder('transaction') - .select('transaction.id', 'id') - .addSelect(['transaction.created_at', 'image_prove', 'amount']) .where('transaction.user_destination = :id and transaction.type = 3', { id: user, }) @@ -688,7 +686,14 @@ export class TransactionService { 'userData', 'userData.user = transaction.user', ) - .addSelect('userData.name', 'name'); + .select('transaction.id', 'id') + .addSelect([ + 'transaction.created_at', + 'image_prove', + 'amount', + 'status', + 'userData.name', + ]); const data = await baseQuery .offset(page * (pageSize || 10)) From ee6bcea111827520c872566be634755ceb158719 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Thu, 23 Dec 2021 11:43:26 +0700 Subject: [PATCH 125/135] feat: rearrangement find one user api service --- src/users/users.service.ts | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 12ef1e7..ceaf4ee 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,10 +1,4 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; @@ -252,12 +246,28 @@ export class UsersService { const coa = await this.coaService.findByUser(id, coaType.WALLET); try { - const userData = await this.usersRepository.findOneOrFail({ - where: { + const userData = await this.usersRepository + .createQueryBuilder('users') + .leftJoinAndSelect('users.roles', 'roles') + .leftJoinAndSelect('users.superior', 'superior') + .leftJoinAndSelect('users.userDetail', 'userDetail') + .where('users.id = :id', { id: id, - }, - relations: ['roles', 'superior', 'userDetail'], - }); + }) + .select([ + 'users.id', + 'users.username', + 'users.isActive', + 'users.createdAt', + 'roles.id', + 'roles.name', + 'superior.id', + 'superior.username', + 'userDetail.id', + 'userDetail.name', + 'userDetail.phone_number', + ]) + .getOne(); return { ...userData, From 1d71ddd2e197764888db4915c87100377d3ce5d8 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 12:41:41 +0700 Subject: [PATCH 126/135] add: create product based on csv --- src/helper/csv-parser.ts | 5 +---- src/product/dto/product/upload-product.dto.ts | 6 ++++++ src/product/product.controller.ts | 14 +++++++++++++- src/product/product.service.ts | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/product/dto/product/upload-product.dto.ts diff --git a/src/helper/csv-parser.ts b/src/helper/csv-parser.ts index 63c08f3..91b2675 100644 --- a/src/helper/csv-parser.ts +++ b/src/helper/csv-parser.ts @@ -7,10 +7,7 @@ export async function parsingFile(dataFile) { const results = []; const file = createReadStream( - path.join( - process.cwd(), - './files/Template Upload Product - Sheet1-a532.csv', - ), + path.join(process.cwd(), `./files/${dataFile}`), ); file diff --git a/src/product/dto/product/upload-product.dto.ts b/src/product/dto/product/upload-product.dto.ts new file mode 100644 index 0000000..c6cceb4 --- /dev/null +++ b/src/product/dto/product/upload-product.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; + +export class UploadProductDto { + @IsNotEmpty() + fileName: string; +} diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index de6443e..49b23e9 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -21,6 +21,7 @@ import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-c import { CreateProductDto } from './dto/product/create-product.dto'; import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPriceService } from './history-price/history-price.service'; +import { UploadProductDto } from './dto/product/upload-product.dto'; @Controller({ path: 'product', @@ -69,6 +70,17 @@ export class ProductController { }; } + @Post('upload-product') + async createProductBaseOnCSV(@Body() uploadProductDto: UploadProductDto) { + await this.productService.processUploadCSV(uploadProductDto.fileName); + + return { + data: 'Done', + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Get('all') async findAll( @Query('page') page: number, @@ -92,7 +104,7 @@ export class ProductController { @Get('test') async test(@Request() req) { - const data = await this.productService.processUploadCSV(); + const data = await this.productService.processUploadCSV(''); return { data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index fc72d7c..cadcdcd 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -50,8 +50,8 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async processUploadCSV() { - const data = await parsingFile(''); + async processUploadCSV(uploadFile: string) { + const data = await parsingFile(uploadFile); data.shift(); await Promise.all( data.map(async (it) => { From e4c92ef9673228ccaea70e30c55efb7346f1840f Mon Sep 17 00:00:00 2001 From: caturbgs Date: Thu, 23 Dec 2021 13:26:52 +0700 Subject: [PATCH 127/135] feat: add endpoint product detail --- src/product/product.controller.ts | 2 +- src/product/product.service.ts | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 49b23e9..939e9df 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -195,7 +195,7 @@ export class ProductController { @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { - data: await this.productService.findOne(id), + data: await this.productService.findOneById(id), statusCode: HttpStatus.OK, message: 'success', }; diff --git a/src/product/product.service.ts b/src/product/product.service.ts index cadcdcd..51d7762 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,5 +1,5 @@ import { HttpException, HttpStatus } from '@nestjs/common'; -import { EntityNotFoundError, IsNull, Repository } from 'typeorm'; +import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { CreateProductDto } from './dto/product/create-product.dto'; @@ -357,6 +357,29 @@ export class ProductService { } } + async findOneById(id: string) { + try { + return await this.productRepository.findOneOrFail({ + relations: ['supplier'], + where: { + id: id, + }, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Product not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async update(id: string, updateProductDto: UpdateProductDto) { try { await this.productRepository.findOneOrFail(id); From 356db39cfedf993b087ea287033f126251ddf2cd Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 16:16:10 +0700 Subject: [PATCH 128/135] add: update user --- src/users/users.service.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index ceaf4ee..da0dfe6 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -19,6 +19,8 @@ export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository, + @InjectRepository(UserDetail) + private userDetailRepository: Repository, @Inject( forwardRef(() => { return CoaService; @@ -289,8 +291,16 @@ export class UsersService { } async update(id: string, updateUserDto: UpdateUserDto, currentUser: any) { + let userData; + let userDetailData; + try { - await this.usersRepository.findOneOrFail(id); + userData = await this.usersRepository.findOneOrFail(id); + userDetailData = await this.userDetailRepository.findOneOrFail({ + where: { + user: userData, + }, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -320,14 +330,15 @@ export class UsersService { ); } - const userData = new User(); - - userData.id = id; userData.username = updateUserDto.username; userData.partner = updateUserDto.partner; + userDetailData.name = updateUserDto.name; + userDetailData.phone_number = updateUserDto.phone_number; + await this.connection.transaction(async (manager) => { - const result = await manager.update(User, { id: id }, userData); + await manager.save(userData); + await manager.save(userDetailData); }); return userData; From f142dc66c1f8d915916335c8edc9a613fafdcfa9 Mon Sep 17 00:00:00 2001 From: caturbgs Date: Thu, 23 Dec 2021 17:00:02 +0700 Subject: [PATCH 129/135] feat: add key supplier name in product all --- src/product/product.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 51d7762..d6d3dd2 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -164,6 +164,7 @@ export class ProductService { 'product.name', 'product.code', 'sub_categories.name', + 'supplier.name', 'category.name', 'product.status', ]) From 15852b1ecbb3d5503256ea340de3a3258531930b Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 19:59:35 +0700 Subject: [PATCH 130/135] fix: upload product --- src/product/entities/product.entity.ts | 4 +++- src/users/users.service.ts | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 16c8b37..1b23f0e 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -28,7 +28,9 @@ export class Product extends BaseModel { @Column() status: string; - @Column() + @Column({ + nullable: true, + }) price: number; @Column({ diff --git a/src/users/users.service.ts b/src/users/users.service.ts index da0dfe6..26730ff 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; @@ -335,7 +341,6 @@ export class UsersService { userDetailData.name = updateUserDto.name; userDetailData.phone_number = updateUserDto.phone_number; - await this.connection.transaction(async (manager) => { await manager.save(userData); await manager.save(userDetailData); From ef1ef4d42902bab0e7cc590b2a74a3ab883a682e Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 20:18:29 +0700 Subject: [PATCH 131/135] fix: upload product --- src/product/dto/product/upload-product.dto.ts | 3 +++ src/product/product.controller.ts | 7 +++++-- src/product/product.service.ts | 6 +++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/product/dto/product/upload-product.dto.ts b/src/product/dto/product/upload-product.dto.ts index c6cceb4..00f025d 100644 --- a/src/product/dto/product/upload-product.dto.ts +++ b/src/product/dto/product/upload-product.dto.ts @@ -3,4 +3,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class UploadProductDto { @IsNotEmpty() fileName: string; + + @IsNotEmpty() + supplierCode: string; } diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 939e9df..fee15ec 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -72,7 +72,10 @@ export class ProductController { @Post('upload-product') async createProductBaseOnCSV(@Body() uploadProductDto: UploadProductDto) { - await this.productService.processUploadCSV(uploadProductDto.fileName); + await this.productService.processUploadCSV( + uploadProductDto.fileName, + uploadProductDto.supplierCode, + ); return { data: 'Done', @@ -104,7 +107,7 @@ export class ProductController { @Get('test') async test(@Request() req) { - const data = await this.productService.processUploadCSV(''); + const data = await this.productService.processUploadCSV('',''); return { data, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index d6d3dd2..c585f55 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -50,7 +50,9 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async processUploadCSV(uploadFile: string) { + async processUploadCSV(uploadFile: string, supplierCode: string) { + const supplierData = await this.supplierService.findByCode(supplierCode); + const data = await parsingFile(uploadFile); data.shift(); await Promise.all( @@ -67,6 +69,7 @@ export class ProductService { const productData = await this.productRepository.findOne({ code: it[0], + supplier: supplierData, }); if (productData) { //TODO : Handle Update Product @@ -109,6 +112,7 @@ export class ProductService { code: it[0], status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', sub_categories: subCategories, + supplier: supplierData, }); await this.productHistoryPrice.insert({ From d9415dbaa3ff39b894bd3239fa79d6fa46adff90 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 20:43:34 +0700 Subject: [PATCH 132/135] add: profit akun coa --- src/helper/enum-list.ts | 1 + src/transaction/transaction.service.ts | 2 +- src/users/users.service.ts | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index aad950e..2be8537 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -30,6 +30,7 @@ export enum coaType { ACCOUNT_PAYABLE, BUDGET, CONTRA_BUDGET, + PROFIT, } export enum balanceType { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index f7181a5..1018caf 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -737,7 +737,7 @@ export class TransactionService { supervisorData.map(async (it) => { const coaAccount = await this.coaService.findByUser( it.id, - coaType.WALLET, + coaType.PROFIT, ); const commissionValue = await this.commissionService.findOne( it.roles.id, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 26730ff..197d5e9 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -95,6 +95,15 @@ export class UsersService { dataCoaAR.coaEntityManager = manager; await this.coaService.create(dataCoaAR); + if (roles.name == 'Supervisor' || roles.name == 'Sales') { + const dataCOAProfit = new InputCoaDto(); + dataCOAProfit.user = userData; + dataCOAProfit.balanceType = balanceType.CREDIT; + dataCOAProfit.type = coaType.PROFIT; + dataCOAProfit.coaEntityManager = manager; + await this.coaService.create(dataCOAProfit); + } + if (createUserDto.superior) { const dataCoaAP = new InputCoaDto(); dataCoaAP.user = userData; From 7b0056f2ae8c9a9c997360f701f62b0c9e859511 Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 21:43:48 +0700 Subject: [PATCH 133/135] fix: product --- src/product/product.service.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/product/product.service.ts b/src/product/product.service.ts index c585f55..227afa1 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -12,6 +12,7 @@ import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; import { parsingFile } from '../helper/csv-parser'; import { PartnerService } from '../users/partner/partner.service'; +import { isNull } from 'util'; export class ProductService { constructor( @@ -90,6 +91,11 @@ export class ProductService { }); } + if(!dataHistoryPrice){ + console.log(productData,"productnya",partnerData); + return; + } + dataHistoryPrice.endDate = new Date(); await this.productHistoryPrice.save(dataHistoryPrice); @@ -99,7 +105,6 @@ export class ProductService { price: it[3], type: productType.NORMAL, startDate: new Date(), - endDate: null, partner: it[6] != '-' ? partnerData : null, }); } else { @@ -122,7 +127,7 @@ export class ProductService { type: productType.NORMAL, startDate: new Date(), endDate: null, - partner: it[6] != '-' ? partnerData : null, + partner: partnerData, }); } }), From c5e1df20b8bda96990f46944f11f5b7b82b745ca Mon Sep 17 00:00:00 2001 From: ilham Date: Thu, 23 Dec 2021 22:33:25 +0700 Subject: [PATCH 134/135] add: withdraw --- src/helper/enum-list.ts | 2 + src/transaction/transaction.controller.ts | 9 +++++ src/transaction/transaction.service.ts | 46 ++++++++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 2be8537..e8ffaaf 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -11,6 +11,7 @@ export enum typeTransaction { ORDER, DEPOSIT_SUPPLIER, DEPOSIT_RETURN, + WITHDRAW, } export enum productType { @@ -31,6 +32,7 @@ export enum coaType { BUDGET, CONTRA_BUDGET, PROFIT, + WITHDRAW, } export enum balanceType { diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index fe3555a..58c896d 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -211,4 +211,13 @@ export class TransactionController { message: 'success', }; } + + @Put('withdraw/:id') + async withdrawProfit(@Param('id', ParseUUIDPipe) id: string, @Request() req) { + return { + data: await this.transactionService.withdrawBenefit(id), + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1018caf..0541b9b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -24,7 +24,6 @@ import { SupplierService } from '../users/supplier/supplier.service'; import { ProductHistoryPriceService } from '../product/history-price/history-price.service'; import { CommissionService } from '../configurable/commission.service'; import { DepositReturnDto } from './dto/deposit_return.dto'; -import { User } from '../users/entities/user.entity'; import { UserDetail } from '../users/entities/user_detail.entity'; interface JournalEntry { @@ -719,6 +718,51 @@ export class TransactionService { }); } + async withdrawBenefit(user) { + const userData = await this.userService.findExist(user); + + const coaProfit = await this.coaService.findByUser(user, coaType.PROFIT); + + const coaBank = await this.coaService.findByName( + `${coaType[coaType.BANK]}-SYSTEM`, + ); + + try { + const transactionData = new Transactions(); + + transactionData.id = uuid.v4(); + transactionData.amount = coaProfit.amount; + transactionData.user = userData.id; + transactionData.status = statusTransaction.APPROVED; + transactionData.type = typeTransaction.WITHDRAW; + + await this.connection.transaction(async (manager) => { + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [ + { + coa_id: coaBank.id, + credit: transactionData.amount, + }, + { + coa_id: coaProfit.id, + debit: transactionData.amount, + }, + ], + }); + }); + + return transactionData; + } catch (e) { + throw e; + } + } + async calculateCommission(data, totalPrice, userData) { const supervisorData = []; From 4f50bad562f5e9a1dac84e0a98db1d75c367cef5 Mon Sep 17 00:00:00 2001 From: ilham Date: Sun, 26 Dec 2021 00:43:27 +0700 Subject: [PATCH 135/135] add: callback transaction --- package.json | 1 + src/helper/irs-api.ts | 19 ++ .../history-price/history-price.service.ts | 24 ++ src/product/product.service.ts | 136 +++++------ src/transaction/dto/order-transaction.dto.ts | 3 + .../entities/transactions.entity.ts | 13 ++ src/transaction/ppob_callback.controller.ts | 15 +- src/transaction/transaction.controller.ts | 26 +++ src/transaction/transaction.service.ts | 213 +++++++++++++++++- yarn.lock | 5 + 10 files changed, 384 insertions(+), 71 deletions(-) create mode 100644 src/helper/irs-api.ts diff --git a/package.json b/package.json index 05a3a9b..b788325 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@nestjs/platform-fastify": "^8.0.8", "@nestjs/typeorm": "^8.0.2", "axios": "^0.24.0", + "bluebird": "^3.7.2", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "crypto": "^1.0.1", diff --git a/src/helper/irs-api.ts b/src/helper/irs-api.ts new file mode 100644 index 0000000..1c5b439 --- /dev/null +++ b/src/helper/irs-api.ts @@ -0,0 +1,19 @@ +import axios from 'axios'; + +const irs_url = 'http://h2h.elangpangarep.com/api/h2h'; +const irs_id = 'PT0005'; +const irs_pin = '04JFGC'; +const irs_user = 'D10BD0'; +const irs_pass = '6251F3'; + +export const doTransaction = async (productCode, destination, idtrx) => { + try { + const res = await axios.get( + `${irs_url}?id=${irs_id}&pin=${irs_pin}&user=${irs_user}&pass=${irs_pass}&kodeproduk=${productCode}&tujuan=${destination}&counter=1&idtrx=${idtrx}`, + ); + + return res.data; + } catch (err) { + throw err; + } +}; diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts index ee1325f..694dedd 100644 --- a/src/product/history-price/history-price.service.ts +++ b/src/product/history-price/history-price.service.ts @@ -10,6 +10,12 @@ export class ProductHistoryPriceService { private productHistoryPriceService: Repository, ) {} + async create(dataProduct: ProductHistoryPrice) { + const result = await this.productHistoryPriceService.save(dataProduct); + + return result; + } + async findOne(product: string, partner: string) { try { return await this.productHistoryPriceService.findOneOrFail({ @@ -34,6 +40,24 @@ export class ProductHistoryPriceService { } } + async findById(id: string) { + try { + return await this.productHistoryPriceService.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Price not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findOneByProductId( page: number, productId: string, diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 227afa1..55573ef 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -12,6 +12,7 @@ import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; import { parsingFile } from '../helper/csv-parser'; import { PartnerService } from '../users/partner/partner.service'; +import { mapSeries } from 'bluebird'; import { isNull } from 'util'; export class ProductService { @@ -56,82 +57,81 @@ export class ProductService { const data = await parsingFile(uploadFile); data.shift(); - await Promise.all( - data.map(async (it) => { - let dataHistoryPrice; - let partnerData; + await mapSeries(data, async (it) => { + let dataHistoryPrice; + let partnerData; - const subCategories = - await this.productSubCategoriesService.findOneForCSVParser(it[2]); + const subCategories = + await this.productSubCategoriesService.findOneForCSVParser(it[2]); - if (!subCategories) { + if (!subCategories) { + return; + } + + const productData = await this.productRepository.findOne({ + code: it[0], + supplier: supplierData, + }); + if (productData) { + //TODO : Handle Update Product + productData.name = it[1]; + productData.status = it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE'; + await this.productRepository.save(productData); + + //TODO : Handle History Price + if (it[6] != '-' && it[6] != '') { + partnerData = await this.partnerService.findOne(it[6]); + dataHistoryPrice = await this.productHistoryPrice.findOne({ + where: { + product: productData.id, + partner: partnerData.id, + }, + }); + } else { + dataHistoryPrice = await this.productHistoryPrice.findOne({ + product: productData, + }); + } + + if (!dataHistoryPrice) { return; } - const productData = await this.productRepository.findOne({ + dataHistoryPrice.endDate = new Date(); + await this.productHistoryPrice.save(dataHistoryPrice); + + await this.productHistoryPrice.insert({ + product: productData, + mark_up_price: it[4], + price: it[3], + type: productType.NORMAL, + startDate: new Date(), + partner: it[6] != '-' ? partnerData : null, + }); + } else { + let partnerData; + if (it[6] != '-' && it[6] != '') { + partnerData = await this.partnerService.findOne(it[6]); + } + const savedProduct = await this.productRepository.insert({ + name: it[1], code: it[0], + status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', + sub_categories: subCategories, supplier: supplierData, }); - if (productData) { - //TODO : Handle Update Product - productData.name = it[1]; - productData.status = it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE'; - await this.productRepository.save(productData); - //TODO : Handle History Price - if (it[6] != '-' && it[6] != '') { - partnerData = await this.partnerService.findOne(it[6]); - dataHistoryPrice = await this.productHistoryPrice.findOne({ - product: productData, - partner: partnerData, - }); - } else { - dataHistoryPrice = await this.productHistoryPrice.findOne({ - product: productData, - }); - } - - if(!dataHistoryPrice){ - console.log(productData,"productnya",partnerData); - return; - } - - dataHistoryPrice.endDate = new Date(); - await this.productHistoryPrice.save(dataHistoryPrice); - - await this.productHistoryPrice.insert({ - product: productData, - mark_up_price: it[4], - price: it[3], - type: productType.NORMAL, - startDate: new Date(), - partner: it[6] != '-' ? partnerData : null, - }); - } else { - let partnerData; - if (it[6] != '-' && it[6] != '') { - partnerData = await this.partnerService.findOne(it[6]); - } - const savedProduct = await this.productRepository.insert({ - name: it[1], - code: it[0], - status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', - sub_categories: subCategories, - supplier: supplierData, - }); - - await this.productHistoryPrice.insert({ - product: savedProduct.identifiers[0], - mark_up_price: it[4], - price: it[3], - type: productType.NORMAL, - startDate: new Date(), - endDate: null, - partner: partnerData, - }); - } - }), - ); + return await this.productHistoryPrice.insert({ + product: savedProduct.identifiers[0], + mark_up_price: it[4], + price: it[3], + type: productType.NORMAL, + startDate: new Date(), + endDate: null, + partner: partnerData, + }); + } + }); return data; } @@ -162,7 +162,7 @@ export class ProductService { .leftJoin('sub_categories.category', 'category') .leftJoin('product.supplier', 'supplier') .where('supplier.status = :status', { status: true }) - .leftJoinAndMapOne( + .innerJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', 'current_price', diff --git a/src/transaction/dto/order-transaction.dto.ts b/src/transaction/dto/order-transaction.dto.ts index 462682c..413a4b2 100644 --- a/src/transaction/dto/order-transaction.dto.ts +++ b/src/transaction/dto/order-transaction.dto.ts @@ -3,4 +3,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class OrderTransactionDto { @IsNotEmpty() productCode: string; + + @IsNotEmpty() + phoneNumber: string; } diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index a9937e8..c9b4c74 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -16,6 +16,7 @@ import { Partner } from '../../users/entities/partner.entity'; import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; import { User } from '../../users/entities/user.entity'; import { UserDetail } from '../../users/entities/user_detail.entity'; +import { TransactionJournal } from './transaction-journal.entity'; @Entity() export class Transactions extends BaseModel { @@ -47,7 +48,19 @@ export class Transactions extends BaseModel { }) image_prove: string; + @Column({ + nullable: true, + }) + supplier_trx_id: string; + + @Column({ + nullable: true, + }) + phone_number: string; + mark_up_price: number; userData: UserDetail; + + transactionJournal: TransactionJournal; } diff --git a/src/transaction/ppob_callback.controller.ts b/src/transaction/ppob_callback.controller.ts index 0044656..e7064ec 100644 --- a/src/transaction/ppob_callback.controller.ts +++ b/src/transaction/ppob_callback.controller.ts @@ -24,7 +24,20 @@ export class PpobCallbackController { constructor(private readonly transactionService: TransactionService) {} @Get() - get(@Req() request: FastifyRequest) { + async get(@Req() request: FastifyRequest) { + const response = request.query; + + if (response['statuscode'] == 2) { + //TODO: UPDATE GAGAL + const updateTransaction = + await this.transactionService.callbackOrderFailed(response['clientid']); + } else { + //TODO: UPDATE BERHASIL + const updateTransaction = + await this.transactionService.callbackOrderSuccess( + response['clientid'], + ); + } this.logger.log({ requestQuery: request.query, }); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 58c896d..d540938 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -83,6 +83,21 @@ export class TransactionController { }; } + @Post('order-prod') + async orderTransactionProd( + @Body() orderTransactionDto: OrderTransactionDto, + @Request() req, + ) { + return { + data: await this.transactionService.orderTransactionProd( + orderTransactionDto, + req.user, + ), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Post('deposit-return') async depositReturn( @Body() depositReturnDto: DepositReturnDto, @@ -159,6 +174,17 @@ export class TransactionController { }; } + @Get('total-order') + async findTotalOrder(@Request() req) { + const data = await this.transactionService.getTotalSell(); + + return { + data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('deposit-return/confirmation') async findDepositReturnConfirmation( @Query('page') page: number, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 0541b9b..dc64cee 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,4 +1,4 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; @@ -25,6 +25,8 @@ import { ProductHistoryPriceService } from '../product/history-price/history-pri import { CommissionService } from '../configurable/commission.service'; import { DepositReturnDto } from './dto/deposit_return.dto'; import { UserDetail } from '../users/entities/user_detail.entity'; +import { doTransaction } from '../helper/irs-api'; +import { ProductHistoryPrice } from '../product/entities/product-history-price.entity'; interface JournalEntry { coa_id: string; @@ -34,6 +36,8 @@ interface JournalEntry { @Injectable() export class TransactionService { + private readonly logger = new Logger(TransactionService.name); + constructor( @InjectRepository(Transactions) private transactionRepository: Repository, @@ -371,11 +375,13 @@ export class TransactionService { const transactionData = new Transactions(); transactionData.id = uuid.v4(); - transactionData.amount = product_price.mark_up_price; + transactionData.amount = + product_price.mark_up_price + product_price.price; transactionData.user = userData.id; transactionData.status = statusTransaction.SUCCESS; transactionData.type = typeTransaction.ORDER; transactionData.product_price = product_price; + transactionData.phone_number = orderTransactionDto.phoneNumber; await manager.insert(Transactions, transactionData); await this.accountingTransaction({ @@ -414,6 +420,82 @@ export class TransactionService { return true; } + async orderTransactionProd( + orderTransactionDto: OrderTransactionDto, + currentUser: any, + ) { + //TODO GET USER DATA + const userData = await this.userService.findByUsername( + currentUser.username, + ); + + //TODO GET PRODUCT AND PRICE + const product = await this.productService.findOne( + orderTransactionDto.productCode, + ); + + const product_price = await this.productHistoryPriceService.findOne( + product.id, + userData.partner?.id, + ); + + //TODO HIT API SUPPLIER + const trxId = Array(6) + .fill(null) + .map(() => Math.round(Math.random() * 16).toString(16)) + .join(''); + + const hitSupplier = await doTransaction( + orderTransactionDto.productCode, + orderTransactionDto.phoneNumber, + trxId, + ); + + this.logger.log({ + responseAPISupplier: hitSupplier, + }); + + //TODO TRANSACTION DAT + const transactionData = new Transactions(); + + transactionData.id = uuid.v4(); + transactionData.amount = product_price.mark_up_price + product_price.price; + transactionData.user = userData.id; + transactionData.type = typeTransaction.ORDER; + transactionData.product_price = product_price; + transactionData.phone_number = orderTransactionDto.phoneNumber; + transactionData.supplier_trx_id = trxId; + + if (!hitSupplier.success) { + transactionData.status = statusTransaction.FAILED; + await this.transactionRepository.insert(transactionData); + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: hitSupplier.msg, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } else { + transactionData.status = statusTransaction.PENDING; + await this.transactionRepository.insert(transactionData); + } + + if (hitSupplier.harga > product_price.price) { + product_price.endDate = new Date(); + + let newProductPrice = new ProductHistoryPrice(); + newProductPrice = product_price; + newProductPrice.id = uuid.v4(); + newProductPrice.price = hitSupplier.harga; + + await this.productHistoryPriceService.create(product_price); + await this.productHistoryPriceService.create(newProductPrice); + } + + return hitSupplier; + } + async createDepositReturn(currentUser, depositReturnDto: DepositReturnDto) { const userData = await this.userService.findByUsername( currentUser.username, @@ -563,6 +645,115 @@ export class TransactionService { return transactionData; } + async callbackOrderFailed(supplier_trx_id: string) { + const dataTransaction = await this.transactionRepository.findOne({ + where: { + supplier_trx_id: supplier_trx_id, + }, + }); + dataTransaction.status = statusTransaction.FAILED; + + await this.transactionRepository.save(dataTransaction); + } + + async callbackOrderSuccess(supplier_trx_id: string) { + const dataTransaction = await this.transactionRepository.findOne({ + where: { + supplier_trx_id: supplier_trx_id, + }, + }); + dataTransaction.status = statusTransaction.FAILED; + + const userData = await this.userService.findExist(dataTransaction.user); + + let supervisorData = []; + + const product_price = await this.productHistoryPriceService.findById( + dataTransaction.product_price.id, + ); + + const product = await this.productService.findOneById( + product_price.product.id, + ); + + let profit = product_price.mark_up_price; + + if (!userData.partner) { + //GET SALES + supervisorData = await this.calculateCommission( + supervisorData, + profit, + userData, + ); + profit = supervisorData + .map((item) => { + return item.credit; + }) + .reduce((prev, curr) => { + return prev + curr; + }, 0); + } + + //GET COA + const coaAccount = await this.coaService.findByUser( + userData.id, + coaType.WALLET, + ); + + const coaInventory = await this.coaService.findByName( + `${coaType[coaType.INVENTORY]}-${product.supplier.code}`, + ); + + const coaCostOfSales = await this.coaService.findByName( + `${coaType[coaType.COST_OF_SALES]}-${product.supplier.code}`, + ); + + const coaSales = await this.coaService.findByName( + `${coaType[coaType.SALES]}-SYSTEM`, + ); + + const coaExpense = await this.coaService.findByName( + `${coaType[coaType.EXPENSE]}-SYSTEM`, + ); + + try { + await this.connection.transaction(async (manager) => { + await manager.save(dataTransaction); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: dataTransaction, + amount: dataTransaction.amount, + journals: [ + { + coa_id: coaInventory.id, + credit: product_price.price, + }, + { + coa_id: coaCostOfSales.id, + debit: product_price.price, + }, + { + coa_id: coaAccount.id, + debit: product_price.mark_up_price + product_price.price, + }, + { + coa_id: coaSales.id, + credit: product_price.mark_up_price + product_price.price, + }, + { + coa_id: coaExpense.id, + debit: userData.partner ? 0 : profit, + }, + ].concat(supervisorData), + }); + }); + } catch (e) { + throw e; + } + } + async transactionHistoryByUser( page: number, user: string, @@ -763,6 +954,24 @@ export class TransactionService { } } + async getTotalSell() { + const { total_amount } = await this.transactionRepository + .createQueryBuilder('transactions') + .select('SUM(transactions.amount) as total_amount') + .getRawOne(); + + return parseInt(total_amount); + } + + async getTotalProfit() { + const { total_amount } = await this.transactionRepository + .createQueryBuilder('transactions') + .select('SUM(transactions.amount) as total_amount') + .getRawOne(); + + return parseInt(total_amount); + } + async calculateCommission(data, totalPrice, userData) { const supervisorData = []; diff --git a/yarn.lock b/yarn.lock index 24f3843..039e2b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1644,6 +1644,11 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + body-parser@1.19.0: version "1.19.0" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz"