From 652bd37a75e1bdd8eb519b9136653327dad2e4f1 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sat, 9 Apr 2022 11:39:05 +0300
Subject: [PATCH 001/221] integrating nestjs
---
common/dto.ts | 21 +
frontend/src/ts/message_handlers/Api.ts | 6 +-
frontend/src/ts/types/dto.ts | 12 +-
frontend/src/ts/types/types.ts | 5 -
frontend/src/vue/singup/Login.vue | 9 +-
newback/.gitignore | 3 +
newback/.nvmrc | 1 +
newback/config/Config.d.ts | 61 +
newback/config/default.json | 49 +
newback/nest-cli.json | 4 +
newback/package.json | 64 +
newback/sequelize-cli.config.js | 13 +
newback/src/common/decorators/validators.ts | 0
.../src/data/database/model/channel.model.ts | 38 +
.../database/model/message.history.model.ts | 47 +
.../data/database/model/message.mention.ts | 68 +
.../src/data/database/model/message.model.ts | 89 +
newback/src/data/database/model/room.model.ts | 87 +
.../data/database/model/user.auth.model.ts | 67 +
newback/src/data/database/model/user.model.ts | 52 +
.../data/database/model/user.profile.model.ts | 63 +
.../database/model/user.settings.model.ts | 95 +
.../data/database/model/verification.model.ts | 74 +
newback/src/data/types/model/db.ts | 6 +
newback/src/main.ts | 17 +
newback/src/modules/app/app.module.ts | 9 +
newback/src/modules/app/app.service.ts | 8 +
newback/src/modules/auth/auth.controller.ts | 18 +
newback/src/modules/auth/auth.module.ts | 13 +
newback/src/modules/auth/auth.service.ts | 8 +
newback/src/modules/auth/interfaces.ts | 27 +
newback/src/templates/change_email.html | 7 +
newback/src/templates/change_password.html | 7 +
newback/src/templates/sign_up_email.html | 37 +
newback/src/templates/token_email.html | 9 +
newback/tsconfig.build.json | 4 +
newback/tsconfig.json | 24 +
newback/yarn.lock | 5191 +++++++++++++++++
38 files changed, 6302 insertions(+), 11 deletions(-)
create mode 100644 common/dto.ts
create mode 100644 newback/.gitignore
create mode 100644 newback/.nvmrc
create mode 100644 newback/config/Config.d.ts
create mode 100644 newback/config/default.json
create mode 100644 newback/nest-cli.json
create mode 100644 newback/package.json
create mode 100644 newback/sequelize-cli.config.js
create mode 100644 newback/src/common/decorators/validators.ts
create mode 100644 newback/src/data/database/model/channel.model.ts
create mode 100644 newback/src/data/database/model/message.history.model.ts
create mode 100644 newback/src/data/database/model/message.mention.ts
create mode 100644 newback/src/data/database/model/message.model.ts
create mode 100644 newback/src/data/database/model/room.model.ts
create mode 100644 newback/src/data/database/model/user.auth.model.ts
create mode 100644 newback/src/data/database/model/user.model.ts
create mode 100644 newback/src/data/database/model/user.profile.model.ts
create mode 100644 newback/src/data/database/model/user.settings.model.ts
create mode 100644 newback/src/data/database/model/verification.model.ts
create mode 100644 newback/src/data/types/model/db.ts
create mode 100644 newback/src/main.ts
create mode 100644 newback/src/modules/app/app.module.ts
create mode 100644 newback/src/modules/app/app.service.ts
create mode 100644 newback/src/modules/auth/auth.controller.ts
create mode 100644 newback/src/modules/auth/auth.module.ts
create mode 100644 newback/src/modules/auth/auth.service.ts
create mode 100644 newback/src/modules/auth/interfaces.ts
create mode 100644 newback/src/templates/change_email.html
create mode 100644 newback/src/templates/change_password.html
create mode 100644 newback/src/templates/sign_up_email.html
create mode 100644 newback/src/templates/token_email.html
create mode 100644 newback/tsconfig.build.json
create mode 100644 newback/tsconfig.json
create mode 100644 newback/yarn.lock
diff --git a/common/dto.ts b/common/dto.ts
new file mode 100644
index 000000000..64352c8f8
--- /dev/null
+++ b/common/dto.ts
@@ -0,0 +1,21 @@
+export interface LoginRequest {
+ username: string;
+ password: string;
+}
+
+export enum Gender {
+ MALE = 'MALE',
+ FEMALE = 'FEMALE',
+ OTHER = 'OTHER',
+}
+
+export enum MessageStatus {
+ ON_SERVER = 'ON_SERVER',
+ READ = 'READ',
+ RECEIVED = 'RECEIVED', //received
+}
+export enum Theme {
+ COLOR_LOR = 'color-lor',
+ COLOR_REG = 'color-reg',
+ COLOR_WHITE = 'color-white'
+}
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index 02975a441..29e36ac60 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -23,6 +23,7 @@ import type {
import type {InternetAppearMessage} from "@/ts/types/messages/innerMessages";
import type {MultiResponse} from "giphy-api";
import type Subscription from "@/ts/classes/Subscription";
+import {LoginRequest} from '@/ts/types/dto';
export default class Api extends MessageHandler {
protected readonly handlers: HandlerTypes = {
@@ -42,11 +43,12 @@ export default class Api extends MessageHandler {
this.xhr = xhr;
}
- public async login(form: HTMLFormElement): Promise {
+ public async login(body: LoginRequest): Promise {
return this.xhr.doPost({
url: "/auth",
isJsonDecoded: true,
- formData: new FormData(form),
+ isJsonEncoded: true,
+ params: {...body}
});
}
diff --git a/frontend/src/ts/types/dto.ts b/frontend/src/ts/types/dto.ts
index 86ad58cde..92c2b0466 100644
--- a/frontend/src/ts/types/dto.ts
+++ b/frontend/src/ts/types/dto.ts
@@ -8,6 +8,14 @@ import type {
SexModelString,
UserModel,
} from "@/ts/types/model";
+
+export * from './backend/dto';
+
+export interface SessionResponse {
+ session: string;
+}
+
+
import type {LogLevel} from "lines-logger";
export type SexModelDto =
@@ -27,9 +35,7 @@ export interface RoomNoUsersDto {
roomCreatorId: number;
}
-export interface SessionResponse {
- session: string;
-}
+
export interface OauthSessionResponse extends SessionResponse {
isNewAccount: boolean;
diff --git a/frontend/src/ts/types/types.ts b/frontend/src/ts/types/types.ts
index 63822905b..aa0da90d3 100644
--- a/frontend/src/ts/types/types.ts
+++ b/frontend/src/ts/types/types.ts
@@ -32,11 +32,6 @@ export type ValueFilterForKey = {
type StuctureMappedType = Record;
-const sample: StuctureMappedType = {
- any3: "andy3",
-};
-
-
export interface UserIdConn {
connectionId: string;
userId: number;
diff --git a/frontend/src/vue/singup/Login.vue b/frontend/src/vue/singup/Login.vue
index 5683fdd4b..952b40679 100644
--- a/frontend/src/vue/singup/Login.vue
+++ b/frontend/src/vue/singup/Login.vue
@@ -8,6 +8,7 @@
{
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ autoIncrement: true,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.STRING(16),
+ allowNull: false,
+ })
+ public name: string;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ allowNull: true, // main room no id
+ type: DataType.INTEGER,
+ })
+ public creatorId: number;
+}
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/database/model/message.history.model.ts
new file mode 100644
index 000000000..1c5a8011c
--- /dev/null
+++ b/newback/src/data/database/model/message.history.model.ts
@@ -0,0 +1,47 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {UserModel} from '@/data/database/model/user.model';
+import {config} from 'node-config-ts';
+import {MessageModel} from '@/data/database/model/message.model';
+
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'message_history', timestamps: true })
+export class MessageHistoryModel extends Model {
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ autoIncrement: true,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+
+ @ForeignKey(() => MessageModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public messageId: number;
+
+ @Column({
+ allowNull: false,
+ type: DataType.DATE,
+ })
+ public time: Date;
+
+ @Column({
+ type: DataType.STRING(config.frontend.maxMessageSize),
+ allowNull: false,
+ })
+ public content: string;
+}
diff --git a/newback/src/data/database/model/message.mention.ts b/newback/src/data/database/model/message.mention.ts
new file mode 100644
index 000000000..fe580956d
--- /dev/null
+++ b/newback/src/data/database/model/message.mention.ts
@@ -0,0 +1,68 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+
+@Injectable()
+@Table({
+ paranoid: true,
+ tableName: 'message_mention',
+ timestamps: true,
+ co
+})
+export class MessageMention extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false
+ })
+ public userId: string;
+
+ @Column({
+ type: DataType.STRING(1),
+ allowNull: false
+ })
+ public symbol: string;
+
+ @Column({
+ type: DataType.STRING(30),
+ allowNull: true
+ })
+ public surname: string;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public birthday: Date;
+
+ @Column({
+ type: DataType.STRING(100),
+ allowNull: true
+ })
+ public contacts: string;
+}
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
new file mode 100644
index 000000000..732f5c231
--- /dev/null
+++ b/newback/src/data/database/model/message.model.ts
@@ -0,0 +1,89 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ MessageStatus,
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {RoomModel} from '@/data/database/model/room.model';
+import {config} from 'node-config-ts';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'message', timestamps: true })
+export class MessageModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ autoIncrement: true,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public senderId: number;
+
+ @ForeignKey(() => RoomModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public roomId: number;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public time: Date;
+
+ @Column({
+ type: DataType.STRING(config.frontend.maxMessageSize),
+ allowNull: true,
+ })
+ public content: string;
+
+ @Column({
+ type: DataType.STRING(1),
+ allowNull: true,
+ })
+ public symbol: string;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(MessageStatus)),
+ allowNull: false,
+ })
+ public messageStatus: MessageStatus;
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ defaultValue: 0
+ })
+ public threadMessageCount: number;
+
+
+ @ForeignKey(() => MessageModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: true,
+ })
+ public parentMessageId: number;
+}
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/database/model/room.model.ts
new file mode 100644
index 000000000..0148a8aea
--- /dev/null
+++ b/newback/src/data/database/model/room.model.ts
@@ -0,0 +1,87 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {VerificationType} from '@/data/types/model/db';
+import {ChannelModel} from '@/data/database/model/channel.model';
+
+
+// constraints = [
+// CheckConstraint(
+// check=Q(Q(channel__isnull=True) & Q(name__isnull=True)) | Q(channel__isnull=False) & Q(name__isnull=False),
+// name='channel_should_exist_for_public_room_and_not_exist_for_private'
+// ),
+// CheckConstraint(
+// check=Q(creator__isnull=True) | Q(name__isnull=False),
+// name='admin_should_not_be_define_for_private_rooms'
+// ),
+// CheckConstraint(
+// check=Q(p2p=False) | Q(name__isnull=True),
+// name='p2p_only_if_private'
+// )
+// ]
+@Injectable()
+@Table({ paranoid: true, tableName: 'room', timestamps: true })
+export class RoomModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+
+ @Column({
+ type: DataType.STRING(16),
+ allowNull: false,
+ })
+ public name: string;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public isMainInChannel: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public p2p: boolean;
+
+ @ForeignKey(() => ChannelModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: true,
+ defaultValue: null,
+ })
+ public channelId: number;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: true,
+ defaultValue: null,
+ })
+ public creatorId: number;
+}
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
new file mode 100644
index 000000000..17c04c984
--- /dev/null
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -0,0 +1,67 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'user_auth', timestamps: true })
+export class UserAuthModel extends Model {
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: false
+ })
+ public password: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ unique: true,
+ })
+ public email: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ unique: true,
+ })
+ public facebookId: string;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: true,
+ unique: true,
+ })
+ public googleId: string;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: true,
+ })
+ public emailVerificationId: string;
+
+}
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
new file mode 100644
index 000000000..4e97932db
--- /dev/null
+++ b/newback/src/data/database/model/user.model.ts
@@ -0,0 +1,52 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {Gender} from '@/data/types/dto/dto';
+import {config} from 'node-config-ts';
+
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'user', timestamps: true })
+export class UserModel extends Model {
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ autoIncrement: true,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public lastLogin: Date;
+
+ @Column({
+ allowNull: false,
+ unique: true,
+ type: DataType.STRING(config.frontend.maxUserNameLength),
+ })
+ public username: string;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(Gender)),
+ allowNull: false,
+ defaultValue: Gender.OTHER,
+ })
+ public sex: Gender;
+
+ @Column({
+ allowNull: true,
+ defaultValue: null,
+ })
+ public thumbnail: string;
+}
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
new file mode 100644
index 000000000..e53da66a8
--- /dev/null
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -0,0 +1,63 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'user_profile', timestamps: true })
+export class UserProfileModel extends Model {
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.STRING(30),
+ allowNull: true
+ })
+ public name: string;
+
+ @Column({
+ type: DataType.STRING(50),
+ allowNull: true
+ })
+ public city: string;
+
+ @Column({
+ type: DataType.STRING(30),
+ allowNull: true
+ })
+ public surname: string;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public birthday: Date;
+
+ @Column({
+ type: DataType.STRING(100),
+ allowNull: true
+ })
+ public contacts: string;
+}
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
new file mode 100644
index 000000000..ff82be7eb
--- /dev/null
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -0,0 +1,95 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Theme,
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'user_settings', timestamps: true })
+export class UserSettingsModel extends Model {
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: true,
+ })
+ public suggestions: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: true,
+ })
+ public showWhenImTyping: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: true,
+ })
+ public embeddedYoutube: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: true,
+ })
+ public highlightCode: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public messageSound: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public incomingFileCallSound: boolean;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public onlineChangeMessages: boolean;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(logLevels)),
+ allowNull: false,
+ defaultValue: 'error',
+ })
+ public devtoolsLogs: LogLevel;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(Theme)),
+ allowNull: false,
+ defaultValue: true,
+ })
+ public theme: boolean;
+}
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
new file mode 100644
index 000000000..c744c87b5
--- /dev/null
+++ b/newback/src/data/database/model/verification.model.ts
@@ -0,0 +1,74 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {VerificationType} from '@/data/types/model/db';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'verification', timestamps: true })
+export class VerificationModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(VerificationType)),
+ allowNull: false,
+ })
+ public type: VerificationType;
+
+ @Column({
+ type: DataType.STRING(17),
+ allowNull: false,
+ })
+ public token: string;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public userId: number;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public time: Date;
+
+ @Column({
+ type: DataType.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ })
+ public verified: Date;
+
+ @Column({
+ type: DataType.STRING(190),
+ allowNull: true,
+ unique: false,
+ defaultValue: false,
+ })
+ public email: string;
+}
diff --git a/newback/src/data/types/model/db.ts b/newback/src/data/types/model/db.ts
new file mode 100644
index 000000000..fb21dfe9f
--- /dev/null
+++ b/newback/src/data/types/model/db.ts
@@ -0,0 +1,6 @@
+export enum VerificationType {
+ REGISTER = 'REGISTER',
+ PASSWORD = 'PASSWORD',
+ EMAIL = 'EMAIL',
+ CONFIRM_EMAIL = 'CONFIRM_EMAIL',
+}
diff --git a/newback/src/main.ts b/newback/src/main.ts
new file mode 100644
index 000000000..8280df3ce
--- /dev/null
+++ b/newback/src/main.ts
@@ -0,0 +1,17 @@
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from '@/modules/app/app.module';
+import { config } from 'node-config-ts';
+import {
+ ConsoleLogger,
+ ValidationPipe
+} from '@nestjs/common';
+
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule, {
+ logger: new ConsoleLogger(),
+ });
+ app.useGlobalPipes(new ValidationPipe())
+ await app.listen(config.application.port);
+}
+bootstrap();
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
new file mode 100644
index 000000000..e3ecbd4f7
--- /dev/null
+++ b/newback/src/modules/app/app.module.ts
@@ -0,0 +1,9 @@
+import {
+ Module
+} from '@nestjs/common';
+import {AuthModule} from '@/modules/auth/auth.module';
+
+@Module({
+ imports: [AuthModule],
+})
+export class AppModule {}
diff --git a/newback/src/modules/app/app.service.ts b/newback/src/modules/app/app.service.ts
new file mode 100644
index 000000000..927d7cca0
--- /dev/null
+++ b/newback/src/modules/app/app.service.ts
@@ -0,0 +1,8 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class AppService {
+ getHello(): string {
+ return 'Hello World!';
+ }
+}
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
new file mode 100644
index 000000000..6eb75d1c1
--- /dev/null
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -0,0 +1,18 @@
+import {
+ Body,
+ Controller,
+ Get,
+ Post
+} from '@nestjs/common';
+import { AuthService } from '@/modules/auth/auth.service';
+import LoginRequestValidator from '@/modules/auth/interfaces';
+
+@Controller()
+export class AuthController {
+ constructor(private readonly appService: AuthService) {}
+
+ @Post('/auth')
+ public auth(@Body() body: LoginRequestValidator): string {
+ return 'asd';
+ }
+}
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
new file mode 100644
index 000000000..cb7a2acb5
--- /dev/null
+++ b/newback/src/modules/auth/auth.module.ts
@@ -0,0 +1,13 @@
+import {
+ Logger,
+ Module
+} from '@nestjs/common';
+import { AuthController } from '@/modules/auth/auth.controller';
+import { AuthService } from '@/modules/auth/auth.service';
+
+@Module({
+ imports: [],
+ controllers: [AuthController],
+ providers: [AuthService],
+})
+export class AuthModule {}
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/auth/auth.service.ts
new file mode 100644
index 000000000..53400c8b7
--- /dev/null
+++ b/newback/src/modules/auth/auth.service.ts
@@ -0,0 +1,8 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class AuthService {
+ getHello(): string {
+ return 'Hello World!';
+ }
+}
diff --git a/newback/src/modules/auth/interfaces.ts b/newback/src/modules/auth/interfaces.ts
new file mode 100644
index 000000000..074e4b59b
--- /dev/null
+++ b/newback/src/modules/auth/interfaces.ts
@@ -0,0 +1,27 @@
+import {
+ IsString,
+ Length,
+ Matches,
+} from 'class-validator';
+import {LoginRequest} from '@/types/frontend/dto';
+import {config} from 'node-config-ts';
+
+export default class LoginRequestValidator implements LoginRequest {
+ @IsString()
+ @Length(1, config.frontend.maxUserNameLength, {
+ message: `Username should be 1-${config.frontend.maxUserNameLength} characters`
+ })
+ @Matches(/[a-zA-Z-_0-9]+/, {
+ message: `Username can only contain latin characters, numbers and symbols '-' '_'`
+ })
+ public username: string;
+
+ @IsString()
+ @Length(3, 128, {
+ message: "Passwords should contain 3-64 symbols"
+ })
+ @Matches(/^[^\S].*[^\S]$/, {
+ message: `Password can't contain whitespaces`
+ })
+ public password: string;
+}
diff --git a/newback/src/templates/change_email.html b/newback/src/templates/change_email.html
new file mode 100644
index 000000000..e29393540
--- /dev/null
+++ b/newback/src/templates/change_email.html
@@ -0,0 +1,7 @@
+Hello, {{ username }}!
+You just changed your email to {{ email }}
+
+ on {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
+
\ No newline at end of file
diff --git a/newback/src/templates/change_password.html b/newback/src/templates/change_password.html
new file mode 100644
index 000000000..a2b546148
--- /dev/null
+++ b/newback/src/templates/change_password.html
@@ -0,0 +1,7 @@
+Hello, {{ username }}!
+You just changed your password, if it wasn't you we recommend to restore your account via email
+
+ on {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
+
\ No newline at end of file
diff --git a/newback/src/templates/sign_up_email.html b/newback/src/templates/sign_up_email.html
new file mode 100644
index 000000000..2d75d6399
--- /dev/null
+++ b/newback/src/templates/sign_up_email.html
@@ -0,0 +1,37 @@
+Hello, {{ username }}!
+{{ greetings }}
+
+
\ No newline at end of file
diff --git a/newback/src/templates/token_email.html b/newback/src/templates/token_email.html
new file mode 100644
index 000000000..72273e51f
--- /dev/null
+++ b/newback/src/templates/token_email.html
@@ -0,0 +1,9 @@
+{% include "sign_up_email.html" %}
+
+ Note : Your magic link will expire in 1 day, and can only be used one time.
+
+
+ Link was generated {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
+
\ No newline at end of file
diff --git a/newback/tsconfig.build.json b/newback/tsconfig.build.json
new file mode 100644
index 000000000..79548c6dc
--- /dev/null
+++ b/newback/tsconfig.build.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "exclude": ["node_modules", "dist", "**/*spec.ts"]
+}
diff --git a/newback/tsconfig.json b/newback/tsconfig.json
new file mode 100644
index 000000000..b153e066c
--- /dev/null
+++ b/newback/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "module": "commonjs",
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "target": "es2017",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true,
+ "strictNullChecks": false,
+ "noImplicitAny": false,
+ "strictBindCallApply": false,
+ "forceConsistentCasingInFileNames": false,
+ "noFallthroughCasesInSwitch": false
+ }
+}
diff --git a/newback/yarn.lock b/newback/yarn.lock
new file mode 100644
index 000000000..c5d0166ae
--- /dev/null
+++ b/newback/yarn.lock
@@ -0,0 +1,5191 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@angular-devkit/core@13.3.2":
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.3.2.tgz#b2e7a9a6457d587a59d5f6df799bebb6930a5ddc"
+ integrity sha512-wav5plcnlxQAfZ+0EUt3dvVTJnJ1au2TlKVQ0jSQJdR1LA6N7QUI49N2Ua6ZnDMwruQaQkoynitMW2l1it3qYQ==
+ dependencies:
+ ajv "8.9.0"
+ 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-cli@13.3.2":
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz#50607314ee19828d9bd3fb7cb1e3ab2b480ae934"
+ integrity sha512-cUHZFNq2kaCaReJAU28MSu2D+WDFTqt2v03U79TryOutYdF8BV4FyfvKqCSW6WXna219GXSXPepVqDYcjvn7/w==
+ dependencies:
+ "@angular-devkit/core" "13.3.2"
+ "@angular-devkit/schematics" "13.3.2"
+ ansi-colors "4.1.1"
+ inquirer "8.2.0"
+ minimist "1.2.6"
+ symbol-observable "4.0.0"
+
+"@angular-devkit/schematics@13.3.2":
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-13.3.2.tgz#ae5f4f68af852d56b9ceda4e878cceb1b4558dec"
+ integrity sha512-XCLb23jmqHN0gJg9ZlICaFgfpfnCufIQp5SOsRKMKRkhjKycvDmKnfBTKDlkzb1IaUl6wQwP5k7Z69b9EX+CQw==
+ dependencies:
+ "@angular-devkit/core" "13.3.2"
+ jsonc-parser "3.0.0"
+ magic-string "0.25.7"
+ ora "5.4.1"
+ rxjs "6.6.7"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/highlight@^7.16.7":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
+ integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@cspotcode/source-map-consumer@0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+ integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+
+"@cspotcode/source-map-support@0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
+ integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
+ dependencies:
+ "@cspotcode/source-map-consumer" "0.8.0"
+
+"@eslint/eslintrc@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6"
+ integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.3.1"
+ globals "^13.9.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.0.4"
+ strip-json-comments "^3.1.1"
+
+"@gar/promisify@^1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
+ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+
+"@humanwhocodes/config-array@^0.9.2":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
+ integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@isaacs/string-locale-compare@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
+ integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==
+
+"@nestjs/cli@^8.2.5":
+ version "8.2.5"
+ resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-8.2.5.tgz#02094177f4eac576d1a559b259d541393e49e0bb"
+ integrity sha512-b5DzZ08q/6iWvLz+n2DhEyZ3rsOurN1ec1jYQaWC5DCVQoZCwyOew48bVf01kevTK4eZyQxPwuErf7HnFAc0oQ==
+ dependencies:
+ "@angular-devkit/core" "13.3.2"
+ "@angular-devkit/schematics" "13.3.2"
+ "@angular-devkit/schematics-cli" "13.3.2"
+ "@nestjs/schematics" "^8.0.3"
+ chalk "3.0.0"
+ chokidar "3.5.3"
+ cli-table3 "0.6.1"
+ commander "4.1.1"
+ fork-ts-checker-webpack-plugin "7.2.3"
+ 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.5"
+ source-map-support "0.5.21"
+ tree-kill "1.2.2"
+ tsconfig-paths "3.14.1"
+ tsconfig-paths-webpack-plugin "3.5.2"
+ typescript "4.6.2"
+ webpack "5.71.0"
+ webpack-node-externals "3.0.0"
+
+"@nestjs/common@^8.4.4":
+ version "8.4.4"
+ resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.4.4.tgz#0914c6c0540b5a344c7c8fd6072faa1a49af1158"
+ integrity sha512-QHi7QcgH/5Jinz+SCfIZJkFHc6Cch1YsAEGFEhi6wSp6MILb0sJMQ1CX06e9tCOAjSlBwaJj4PH0eFCVau5v9Q==
+ dependencies:
+ axios "0.26.1"
+ iterare "1.2.1"
+ tslib "2.3.1"
+ uuid "8.3.2"
+
+"@nestjs/core@^8.4.4":
+ version "8.4.4"
+ resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.4.4.tgz#94fd2d63fd77791f616fbecafb79faa2235eeeff"
+ integrity sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg==
+ dependencies:
+ "@nuxtjs/opencollective" "0.3.2"
+ fast-safe-stringify "2.1.1"
+ iterare "1.2.1"
+ object-hash "3.0.0"
+ path-to-regexp "3.2.0"
+ tslib "2.3.1"
+ uuid "8.3.2"
+
+"@nestjs/mapped-types@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz#78b62041c7a407db4a90eb140567321602bed18e"
+ integrity sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==
+
+"@nestjs/platform-express@^8.4.4":
+ version "8.4.4"
+ resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-8.4.4.tgz#c01de14ddc9ba6f26e3290cc165c784a64071d98"
+ integrity sha512-n/H83uzw154v6NVVSg6mniZIvYWtYp0dtNpU9O1qdEmDO030p0tBkeIRoDtpeOVvL2fW5PsHiUYS7HY4tNfykQ==
+ dependencies:
+ body-parser "1.20.0"
+ cors "2.8.5"
+ express "4.17.3"
+ multer "1.4.4"
+ tslib "2.3.1"
+
+"@nestjs/schematics@^8.0.10", "@nestjs/schematics@^8.0.3":
+ version "8.0.10"
+ resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-8.0.10.tgz#4f951ea1ac94721ba6a6ccfae6461f8b22949573"
+ integrity sha512-gQq/8TYjtgum+5+QuPfHHKgKxDgNLGh8mH+EJ1skOKX+GTxgt5jmg1GFmwEfiOXZUcF9thT6GsOVNKWrdO3YMg==
+ dependencies:
+ "@angular-devkit/core" "13.3.2"
+ "@angular-devkit/schematics" "13.3.2"
+ fs-extra "10.0.1"
+ jsonc-parser "3.0.0"
+ pluralize "8.0.0"
+
+"@nestjs/sequelize@^8.0.0":
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@nestjs/sequelize/-/sequelize-8.0.0.tgz#850aa1260dd77e1a8d1860f6408e504060215ea3"
+ integrity sha512-+hCs/uO1b+Vjt9EmKc31Srr5j9k8MI6eDg+NtSkym/u18hC8eW2RjcxxK+62yn5maxMLyp5fTtAEg3YmicYL4Q==
+ dependencies:
+ uuid "8.3.2"
+
+"@nestjs/swagger@^5.2.1":
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/@nestjs/swagger/-/swagger-5.2.1.tgz#0fbd5dbc84aeebc2912009cce1309d4bebe9a52c"
+ integrity sha512-7dNa08WCnTsW/oAk3Ujde+z64JMfNm19DhpXasFR8oJp/9pggYAbYU927HpA+GJsSFJX6adjIRZsCKUqaGWznw==
+ dependencies:
+ "@nestjs/mapped-types" "1.0.1"
+ lodash "4.17.21"
+ path-to-regexp "3.2.0"
+
+"@nestjs/testing@^8.4.4":
+ version "8.4.4"
+ resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-8.4.4.tgz#ac58e1f4be2344823b14243072179ce13a1ebd40"
+ integrity sha512-eGj0Lbi0ONMkjDKbKQHoGX+ecGdrGRZ81I8i6fH4dx9jIR0p4MsBlW964f6Swn1MGkPm/xxomJmBWLPqZEjF7g==
+ dependencies:
+ optional "0.1.4"
+ tslib "2.3.1"
+
+"@node-redis/bloom@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@node-redis/bloom/-/bloom-1.0.1.tgz#144474a0b7dc4a4b91badea2cfa9538ce0a1854e"
+ integrity sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw==
+
+"@node-redis/client@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@node-redis/client/-/client-1.0.5.tgz#ebac5e2bbf12214042a37621604973a954ede755"
+ integrity sha512-ESZ3bd1f+od62h4MaBLKum+klVJfA4wAeLHcVQBkoXa1l0viFesOWnakLQqKg+UyrlJhZmXJWtu0Y9v7iTMrig==
+ dependencies:
+ cluster-key-slot "1.1.0"
+ generic-pool "3.8.2"
+ redis-parser "3.0.0"
+ yallist "4.0.0"
+
+"@node-redis/graph@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@node-redis/graph/-/graph-1.0.0.tgz#baf8eaac4a400f86ea04d65ec3d65715fd7951ab"
+ integrity sha512-mRSo8jEGC0cf+Rm7q8mWMKKKqkn6EAnA9IA2S3JvUv/gaWW/73vil7GLNwion2ihTptAm05I9LkepzfIXUKX5g==
+
+"@node-redis/json@1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@node-redis/json/-/json-1.0.2.tgz#8ad2d0f026698dc1a4238cc3d1eb099a3bee5ab8"
+ integrity sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==
+
+"@node-redis/search@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@node-redis/search/-/search-1.0.5.tgz#96050007eb7c50a7e47080320b4f12aca8cf94c4"
+ integrity sha512-MCOL8iCKq4v+3HgEQv8zGlSkZyXSXtERgrAJ4TSryIG/eLFy84b57KmNNa/V7M1Q2Wd2hgn2nPCGNcQtk1R1OQ==
+
+"@node-redis/time-series@1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@node-redis/time-series/-/time-series-1.0.2.tgz#5dd3638374edd85ebe0aa6b0e87addc88fb9df69"
+ integrity sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@npmcli/arborist@^5.0.0", "@npmcli/arborist@^5.0.4":
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.0.5.tgz#e38b63cabc496840bb329182fe6bee18ad9f3ee2"
+ integrity sha512-96UwbW4ASOMg/ltORxx36njDiIy5HYdWR5HOvroYeVhoSOLYKwlixALowNK7ZBt49MOaJVCfLMyu9on71gQC/g==
+ dependencies:
+ "@isaacs/string-locale-compare" "^1.1.0"
+ "@npmcli/installed-package-contents" "^1.0.7"
+ "@npmcli/map-workspaces" "^2.0.0"
+ "@npmcli/metavuln-calculator" "^3.0.1"
+ "@npmcli/move-file" "^2.0.0"
+ "@npmcli/name-from-folder" "^1.0.1"
+ "@npmcli/node-gyp" "^2.0.0"
+ "@npmcli/package-json" "^2.0.0"
+ "@npmcli/run-script" "^3.0.0"
+ bin-links "^3.0.0"
+ cacache "^16.0.0"
+ common-ancestor-path "^1.0.1"
+ json-parse-even-better-errors "^2.3.1"
+ json-stringify-nice "^1.1.4"
+ mkdirp "^1.0.4"
+ mkdirp-infer-owner "^2.0.0"
+ nopt "^5.0.0"
+ npm-install-checks "^5.0.0"
+ npm-package-arg "^9.0.0"
+ npm-pick-manifest "^7.0.0"
+ npm-registry-fetch "^13.0.0"
+ npmlog "^6.0.1"
+ pacote "^13.0.5"
+ parse-conflict-json "^2.0.1"
+ proc-log "^2.0.0"
+ promise-all-reject-late "^1.0.0"
+ promise-call-limit "^1.0.1"
+ read-package-json-fast "^2.0.2"
+ readdir-scoped-modules "^1.1.0"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ ssri "^9.0.0"
+ treeverse "^2.0.0"
+ walk-up-path "^1.0.0"
+
+"@npmcli/ci-detect@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89"
+ integrity sha512-8yQtQ9ArHh/TzdUDKQwEvwCgpDuhSWTDAbiKMl3854PcT+Dk4UmWaiawuFTLy9n5twzXOBXVflWe+90/ffXQrA==
+
+"@npmcli/config@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-4.0.2.tgz#cecb171225d8325cee30ee45893eebd9503bb203"
+ integrity sha512-UqD4h4LgyNOb7xRmAK7QXiMu0/k2x7wEzrEqXZ1wGIQVmCl3vamsAprDjAhi7IKlgRulg09hpwYs2/57OP22xw==
+ dependencies:
+ "@npmcli/map-workspaces" "^2.0.2"
+ ini "^3.0.0"
+ mkdirp-infer-owner "^2.0.0"
+ nopt "^5.0.0"
+ proc-log "^2.0.0"
+ read-package-json-fast "^2.0.3"
+ semver "^7.3.5"
+ walk-up-path "^1.0.0"
+
+"@npmcli/disparity-colors@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-2.0.0.tgz#cb518166ee21573b96241a3613fef70acb2a60ba"
+ integrity sha512-FFXGrIjhvd2qSZ8iS0yDvbI7nbjdyT2VNO7wotosjYZM2p2r8PN3B7Om3M5NO9KqW/OVzfzLB3L0V5Vo5QXC7A==
+ dependencies:
+ ansi-styles "^4.3.0"
+
+"@npmcli/fs@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109"
+ integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==
+ dependencies:
+ "@gar/promisify" "^1.1.3"
+ semver "^7.3.5"
+
+"@npmcli/git@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.1.tgz#049b99b1381a2ddf7dc56ba3e91eaf76ca803a8d"
+ integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==
+ dependencies:
+ "@npmcli/promise-spawn" "^3.0.0"
+ lru-cache "^7.4.4"
+ mkdirp "^1.0.4"
+ npm-pick-manifest "^7.0.0"
+ proc-log "^2.0.0"
+ promise-inflight "^1.0.1"
+ promise-retry "^2.0.1"
+ semver "^7.3.5"
+ which "^2.0.2"
+
+"@npmcli/installed-package-contents@^1.0.7":
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa"
+ integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==
+ dependencies:
+ npm-bundled "^1.1.1"
+ npm-normalize-package-bin "^1.0.1"
+
+"@npmcli/map-workspaces@^2.0.0", "@npmcli/map-workspaces@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.2.tgz#dfc87ced615afeb98a081da2aa9bba072bf6712d"
+ integrity sha512-ED54EslGsHFWBPN5x8JAOszuWywuoXYSi9E3HQRsgVkWnqsdTBJDSM4IFMRwmmBUbCHAxmP3wGLu1WMm4fhrOw==
+ dependencies:
+ "@npmcli/name-from-folder" "^1.0.1"
+ glob "^7.2.0"
+ minimatch "^5.0.1"
+ read-package-json-fast "^2.0.3"
+
+"@npmcli/metavuln-calculator@^3.0.1":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.0.tgz#b1c2f0991c4f2d992b1615a54d4358c05efc3702"
+ integrity sha512-Q5fbQqGDlYqk7kWrbg6E2j/mtqQjZop0ZE6735wYA1tYNHguIDjAuWs+kFb5rJCkLIlXllfapvsyotYKiZOTBA==
+ dependencies:
+ cacache "^16.0.0"
+ json-parse-even-better-errors "^2.3.1"
+ pacote "^13.0.3"
+ semver "^7.3.5"
+
+"@npmcli/move-file@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02"
+ integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==
+ dependencies:
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
+
+"@npmcli/name-from-folder@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a"
+ integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==
+
+"@npmcli/node-gyp@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35"
+ integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==
+
+"@npmcli/package-json@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-1.0.1.tgz#1ed42f00febe5293c3502fd0ef785647355f6e89"
+ integrity sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==
+ dependencies:
+ json-parse-even-better-errors "^2.3.1"
+
+"@npmcli/package-json@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a"
+ integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==
+ dependencies:
+ json-parse-even-better-errors "^2.3.1"
+
+"@npmcli/promise-spawn@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573"
+ integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==
+ dependencies:
+ infer-owner "^1.0.4"
+
+"@npmcli/run-script@^3.0.0", "@npmcli/run-script@^3.0.1":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-3.0.2.tgz#3e9116d831f4539bf292d18b015977a6118997ee"
+ integrity sha512-vdjD/PMBl+OX9j9C9irx5sCCIKfp2PWkpPNH9zxvlJAfSZ3Qp5aU412v+O3PFJl3R1PFNwuyChCqHg4ma6ci2Q==
+ dependencies:
+ "@npmcli/node-gyp" "^2.0.0"
+ "@npmcli/promise-spawn" "^3.0.0"
+ node-gyp "^9.0.0"
+ read-package-json-fast "^2.0.3"
+
+"@nuxtjs/opencollective@0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c"
+ integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==
+ dependencies:
+ chalk "^4.1.0"
+ consola "^2.15.0"
+ node-fetch "^2.6.1"
+
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+ integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+ integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+ integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+ integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+
+"@types/bluebird@*":
+ version "3.5.36"
+ resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.36.tgz#00d9301d4dc35c2f6465a8aec634bb533674c652"
+ integrity sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==
+
+"@types/body-parser@*":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+ integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/connect@*":
+ version "3.4.35"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+ integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/continuation-local-storage@*":
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.4.tgz#655c8ffd9327aa60fb8ae773a5f2efbc973a7cbb"
+ integrity sha512-OT32vCVMymU1JMPKDeY0lX3cduAr0Pm/VwIbxygMeDS4lRcv57qYXn9bMwBRcRnEpXKBb/r4xYaZCARTZllP0A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/debug@^4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
+ integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304"
+ integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/express-serve-static-core@^4.17.18":
+ version "4.17.28"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8"
+ integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@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==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@types/lodash@*":
+ version "4.14.181"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d"
+ integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==
+
+"@types/mime@^1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/ms@*":
+ version "0.7.31"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
+ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+
+"@types/node@*", "@types/node@^17.0.23":
+ version "17.0.23"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
+ integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/qs@*":
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/sequelize@^4.28.11":
+ version "4.28.11"
+ resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.28.11.tgz#8b0c530bac4e6d73a0416a94db0de820cc4d47c3"
+ integrity sha512-2zeMcB5ZI+u1UwxM4sa3gLu8eSp0Gk+emTKPWXuNk3ePFo4EUYLgmIhGV6b+kYoshXpZHG3nJVMK00tuh5vEQA==
+ dependencies:
+ "@types/bluebird" "*"
+ "@types/continuation-local-storage" "*"
+ "@types/lodash" "*"
+ "@types/validator" "*"
+
+"@types/serve-static@*":
+ version "1.13.10"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+ integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+ dependencies:
+ "@types/mime" "^1"
+ "@types/node" "*"
+
+"@types/validator@*", "@types/validator@^13.7.1":
+ version "13.7.2"
+ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.2.tgz#a2114225d9be743fb154b06c29b8257aaca42922"
+ integrity sha512-KFcchQ3h0OPQgFirBRPZr5F/sVjxZsOrQHedj3zi8AH3Zv/hOLx2OLR4hxR5HcfoU+33n69ZuOfzthKVdMoTiw==
+
+"@typescript-eslint/eslint-plugin@^5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz#950df411cec65f90d75d6320a03b2c98f6c3af7d"
+ integrity sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.18.0"
+ "@typescript-eslint/type-utils" "5.18.0"
+ "@typescript-eslint/utils" "5.18.0"
+ debug "^4.3.2"
+ functional-red-black-tree "^1.0.1"
+ ignore "^5.1.8"
+ regexpp "^3.2.0"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.18.0.tgz#2bcd4ff21df33621df33e942ccb21cb897f004c6"
+ integrity sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.18.0"
+ "@typescript-eslint/types" "5.18.0"
+ "@typescript-eslint/typescript-estree" "5.18.0"
+ debug "^4.3.2"
+
+"@typescript-eslint/scope-manager@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz#a7d7b49b973ba8cebf2a3710eefd457ef2fb5505"
+ integrity sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==
+ dependencies:
+ "@typescript-eslint/types" "5.18.0"
+ "@typescript-eslint/visitor-keys" "5.18.0"
+
+"@typescript-eslint/type-utils@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz#62dbfc8478abf36ba94a90ddf10be3cc8e471c74"
+ integrity sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==
+ dependencies:
+ "@typescript-eslint/utils" "5.18.0"
+ debug "^4.3.2"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.18.0.tgz#4f0425d85fdb863071680983853c59a62ce9566e"
+ integrity sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==
+
+"@typescript-eslint/typescript-estree@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz#6498e5ee69a32e82b6e18689e2f72e4060986474"
+ integrity sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==
+ dependencies:
+ "@typescript-eslint/types" "5.18.0"
+ "@typescript-eslint/visitor-keys" "5.18.0"
+ debug "^4.3.2"
+ globby "^11.0.4"
+ is-glob "^4.0.3"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.18.0.tgz#27fc84cf95c1a96def0aae31684cb43a37e76855"
+ integrity sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.18.0"
+ "@typescript-eslint/types" "5.18.0"
+ "@typescript-eslint/typescript-estree" "5.18.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.18.0":
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz#c7c07709823804171d569017f3b031ced7253e60"
+ integrity sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==
+ dependencies:
+ "@typescript-eslint/types" "5.18.0"
+ eslint-visitor-keys "^3.0.0"
+
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+ dependencies:
+ "@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@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@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@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@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@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@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@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@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@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abbrev@1, abbrev@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn-jsx@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.1.1:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+ integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
+ integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+
+agent-base@6, agent-base@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+agentkeepalive@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
+ integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
+ dependencies:
+ debug "^4.1.0"
+ depd "^1.1.2"
+ humanize-ms "^1.2.1"
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv-formats@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@8.9.0:
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18"
+ integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ 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@^8.0.0:
+ version "8.11.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
+ integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+ansi-colors@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansicolors@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
+ integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
+
+ansistyles@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
+ integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+append-field@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
+ integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=
+
+"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+ integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
+archy@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+ integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
+
+are-we-there-yet@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d"
+ integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-includes@^3.0.2:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
+ integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+ get-intrinsic "^1.1.1"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+asap@^2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+axios@0.26.1:
+ version "0.26.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
+ integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
+ dependencies:
+ follow-redirects "^1.14.8"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bin-links@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.1.tgz#cc70ffb481988b22c527d3e6e454787876987a49"
+ integrity sha512-9vx+ypzVhASvHTS6K+YSGf7nwQdANoz7v6MTC0aCtYnOEZ87YvMf81aY737EZnGZdpbRM3sfWjO9oWkKmuIvyQ==
+ dependencies:
+ cmd-shim "^5.0.0"
+ mkdirp-infer-owner "^2.0.0"
+ npm-normalize-package-bin "^1.0.0"
+ read-cmd-shim "^3.0.0"
+ rimraf "^3.0.0"
+ write-file-atomic "^4.0.0"
+
+binary-extensions@^2.0.0, binary-extensions@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bl@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.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.2:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
+ integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.8.1"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.9.7"
+ raw-body "2.4.3"
+ type-is "~1.6.18"
+
+body-parser@1.20.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
+ integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.10.3"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.14.5:
+ version "4.20.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88"
+ integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==
+ dependencies:
+ caniuse-lite "^1.0.30001317"
+ electron-to-chromium "^1.4.84"
+ escalade "^3.1.1"
+ node-releases "^2.0.2"
+ picocolors "^1.0.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-writer@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
+ integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
+
+buffer@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+builtins@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.0.tgz#20d87e7f95d46481b1abe4adc616a9cb6b492cba"
+ integrity sha512-aizhtbxgT1Udg0Fj6GssXshAVK+nxbtCV+1OtTrMNy67jffDFBY6CUBAkhO4owbleAx6fdbnWdpsmmcXydbzNw==
+ dependencies:
+ semver "^7.0.0"
+
+busboy@^0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+ integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=
+ dependencies:
+ dicer "0.2.5"
+ readable-stream "1.1.x"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacache@^16.0.0, cacache@^16.0.2, cacache@^16.0.3:
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.0.4.tgz#66877ae82717ade4d1416d5b3caa3a870f2c6d0c"
+ integrity sha512-U0D4wF3/W8ZgK4qDA5fTtOVSr0gaDfd5aa7tUdAV0uukVWKsAIn6SzXQCoVlg7RWZiJa+bcsM3/pXLumGaL2Ug==
+ dependencies:
+ "@npmcli/fs" "^2.1.0"
+ "@npmcli/move-file" "^2.0.0"
+ chownr "^2.0.0"
+ fs-minipass "^2.1.0"
+ glob "^7.2.0"
+ infer-owner "^1.0.4"
+ lru-cache "^7.7.1"
+ minipass "^3.1.6"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.4"
+ mkdirp "^1.0.4"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^9.0.0"
+ tar "^6.1.11"
+ unique-filename "^1.1.1"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001317:
+ version "1.0.30001327"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz#c1546d7d7bb66506f0ccdad6a7d07fc6d668c858"
+ integrity sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==
+
+chalk@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.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, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+chokidar@3.5.3, chokidar@^3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.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"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
+cidr-regex@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d"
+ integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw==
+ dependencies:
+ ip-regex "^4.1.0"
+
+class-transformer@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336"
+ integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==
+
+class-validator@^0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143"
+ integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==
+ dependencies:
+ libphonenumber-js "^1.9.43"
+ validator "^13.7.0"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-color@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.2.tgz#e295addbae470800def0254183c648531cdf4e3f"
+ integrity sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.59"
+ es6-iterator "^2.0.3"
+ memoizee "^0.4.15"
+ timers-ext "^0.1.7"
+
+cli-columns@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646"
+ integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==
+ dependencies:
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.5.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
+ integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
+
+cli-table3@0.6.1, cli-table3@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8"
+ integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==
+ dependencies:
+ string-width "^4.2.0"
+ optionalDependencies:
+ colors "1.4.0"
+
+cli-width@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+ integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+cluster-key-slot@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
+ integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==
+
+cmd-shim@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724"
+ integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==
+ dependencies:
+ mkdirp-infer-owner "^2.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+colors@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+columnify@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3"
+ integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==
+ dependencies:
+ strip-ansi "^6.0.1"
+ wcwidth "^1.0.0"
+
+commander@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+commander@^2.19.0, commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+common-ancestor-path@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7"
+ integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+config-chain@^1.1.12:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
+ integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+consola@^2.15.0:
+ version "2.15.3"
+ resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
+ integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
+
+console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cors@2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+cosmiconfig@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csv-parse@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3"
+ integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ==
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+debuglog@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+ integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@^1.1.2, depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+dezalgo@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
+ integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==
+ dependencies:
+ asap "^2.0.0"
+ wrappy "1"
+
+dicer@0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+ integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=
+ dependencies:
+ readable-stream "1.1.x"
+ streamsearch "0.1.2"
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+diff@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dottie@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154"
+ integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==
+
+editorconfig@^0.15.3:
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
+ integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
+ dependencies:
+ commander "^2.19.0"
+ lru-cache "^4.1.5"
+ semver "^5.6.0"
+ sigmund "^1.0.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.4.84:
+ version "1.4.106"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a"
+ integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2:
+ version "5.9.2"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9"
+ integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+err-code@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
+ integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0-next.1, es-abstract@^1.19.1:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f"
+ integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
+ has "^1.0.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.4"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.1"
+ is-string "^1.0.7"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.59, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
+ version "0.10.60"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.60.tgz#e8060a86472842b93019c31c34865012449883f4"
+ integrity sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+es6-weak-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+ integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.46"
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.1"
+
+es7-shim@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/es7-shim/-/es7-shim-6.0.0.tgz#0c430b40b8505ad15570721a8d8dd4eb0c553155"
+ integrity sha1-DEMLQLhQWtFVcHIajY3U6wxVMVU=
+ dependencies:
+ array-includes "^3.0.2"
+ object.entries "^1.0.3"
+ object.getownpropertydescriptors "^2.0.2"
+ object.values "^1.0.3"
+ string-at "^1.0.1"
+ string.prototype.padend "^3.0.0"
+ string.prototype.padstart "^3.0.0"
+ string.prototype.trimleft "^2.0.0"
+ string.prototype.trimright "^2.0.0"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.12.0:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e"
+ integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==
+ dependencies:
+ "@eslint/eslintrc" "^1.2.1"
+ "@humanwhocodes/config-array" "^0.9.2"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.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 "^6.0.1"
+ globals "^13.6.0"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^4.1.0"
+ 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"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^9.3.1:
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
+ integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
+ dependencies:
+ acorn "^8.7.0"
+ acorn-jsx "^5.3.1"
+ eslint-visitor-keys "^3.3.0"
+
+esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+event-emitter@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+ dependencies:
+ 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"
+
+express@4.17.3:
+ version "4.17.3"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
+ integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.19.2"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.4.2"
+ 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.7"
+ qs "6.9.7"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.17.2"
+ serve-static "1.14.2"
+ setprototypeof "1.2.0"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext@^1.1.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
+ integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
+ dependencies:
+ type "^2.5.0"
+
+external-editor@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+ integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
+ dependencies:
+ "@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@2.1.0, fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fast-safe-stringify@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+figures@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
+ integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+
+follow-redirects@^1.14.8:
+ version "1.14.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
+ integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
+
+fork-ts-checker-webpack-plugin@7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.3.tgz#978dbc0b601556552a5a274a8984ec5dd8de56a3"
+ integrity sha512-9v308zIFTIFkWJBN/4N1A5oqm/ed9hWG6GH+KYTCBjYCEJOmHoVtDIWpfrJ0eD6cPB7V53HEVoJ6bL2In8QRaw==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ chalk "^4.1.2"
+ chokidar "^3.5.3"
+ cosmiconfig "^7.0.1"
+ deepmerge "^4.2.2"
+ fs-extra "^10.0.0"
+ memfs "^3.4.1"
+ minimatch "^3.0.4"
+ schema-utils "^3.1.1"
+ semver "^7.3.5"
+ tapable "^2.2.1"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@10.0.1, fs-extra@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8"
+ integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^2.0.0, fs-minipass@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs-monkey@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
+ integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+gauge@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
+ integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.3"
+ console-control-strings "^1.1.0"
+ has-unicode "^2.0.1"
+ signal-exit "^3.0.7"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.5"
+
+generic-pool@3.8.2:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9"
+ integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@7.2.0, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ 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"
+
+globals@^13.6.0, globals@^13.9.0:
+ version "13.13.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b"
+ integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==
+ dependencies:
+ type-fest "^0.20.2"
+
+globby@^11.0.4:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hosted-git-info@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.0.0.tgz#df7a06678b4ebd722139786303db80fdf302ea56"
+ integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==
+ dependencies:
+ lru-cache "^7.5.1"
+
+http-cache-semantics@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
+ integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.1"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+ integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+ dependencies:
+ "@tootallnate/once" "2"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
+ dependencies:
+ ms "^2.0.0"
+
+i@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/i/-/i-0.3.7.tgz#2a7437a923d59c14b17243dc63a549af24d85799"
+ integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore-walk@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776"
+ integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==
+ dependencies:
+ minimatch "^5.0.1"
+
+ignore@^5.1.8, ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+infer-owner@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflection@^1.13.2:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.2.tgz#15e8c797c6c3dadf31aa658f8df8a4ea024798b0"
+ integrity sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+ini@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+ integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+
+ini@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.0.tgz#2f6de95006923aa75feed8894f5686165adc08f1"
+ integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==
+
+init-package-json@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69"
+ integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==
+ dependencies:
+ npm-package-arg "^9.0.1"
+ promzard "^0.3.0"
+ read "^1.0.7"
+ read-package-json "^5.0.0"
+ semver "^7.3.5"
+ validate-npm-package-license "^3.0.4"
+ validate-npm-package-name "^4.0.0"
+
+inquirer@7.3.3:
+ version "7.3.3"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
+ integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
+ dependencies:
+ 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"
+
+inquirer@8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a"
+ integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==
+ dependencies:
+ 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"
+
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+ip-regex@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
+ integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==
+
+ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.4, is-callable@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+ integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+
+is-cidr@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814"
+ integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==
+ dependencies:
+ cidr-regex "^3.1.1"
+
+is-core-module@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
+is-lambda@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
+ integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-promise@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+iterare@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042"
+ integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+js-beautify@^1.14.0:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.2.tgz#8180514fd4c7789c4ac4bcc327b6dda634c55666"
+ integrity sha512-H85kX95a53os+q1OCqtYe8AXAmgy3BvtysA/V83S3fdhznm6WlUpGi14DqSPbKFsL3dXZFXYl7YQwW9U1+76ng==
+ dependencies:
+ config-chain "^1.1.12"
+ editorconfig "^0.15.3"
+ glob "^7.1.3"
+ nopt "^5.0.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stringify-nice@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67"
+ integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==
+
+json-to-ts@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/json-to-ts/-/json-to-ts-1.7.0.tgz#896a4eaa3d1ed3fef0c9e73ba98b3e8b25c1e02d"
+ integrity sha512-uVhcw4SLnf9ucMwFpom/G1/IT+lnoILOyHbFE6xqxvw67oCvHl6iDZzmjyn2lPCRPsAOMSQgG/ZxvbCPySMi1Q==
+ dependencies:
+ es7-shim "^6.0.0"
+ hash.js "^1.0.3"
+ pluralize "^3.1.0"
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonc-parser@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
+ integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonparse@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+
+just-diff-apply@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.2.0.tgz#15da3888ab3acecc14ce9a067f2d7589c653cb89"
+ integrity sha512-unjtin7rnng0KUpE4RPWwTl8iwWiZuyZqOQ+vm8orV6aIXX8mHN8zlKCPPbOycfDNuLh2PBazbFhNoDJv4S/FA==
+
+just-diff@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.0.1.tgz#db8fe1cfeea1156f2374bfb289826dca28e7e390"
+ integrity sha512-X00TokkRIDotUIf3EV4xUm6ELc/IkqhS/vPSHdWnsM5y0HoNMfEqrazizI7g78lpHvnRSRt/PFfKtRqJCOGIuQ==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+libnpmaccess@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded"
+ integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg==
+ dependencies:
+ aproba "^2.0.0"
+ minipass "^3.1.1"
+ npm-package-arg "^9.0.1"
+ npm-registry-fetch "^13.0.0"
+
+libnpmdiff@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-4.0.3.tgz#ad3997330c887c1098ac42682f1e5ad014d49cec"
+ integrity sha512-AiwBtXtH7HjfmT7FbTf9LFzJB347RrIA4I+IewMfhq8vYXaUveHwJMVNgMM2H/o2J+7Hf12JCBoOF5bTwlmGyw==
+ dependencies:
+ "@npmcli/disparity-colors" "^2.0.0"
+ "@npmcli/installed-package-contents" "^1.0.7"
+ binary-extensions "^2.2.0"
+ diff "^5.0.0"
+ minimatch "^5.0.1"
+ npm-package-arg "^9.0.1"
+ pacote "^13.0.5"
+ tar "^6.1.0"
+
+libnpmexec@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-4.0.3.tgz#8f1af808d228766d046b24632304137d64630e1c"
+ integrity sha512-71QeTdmiR/nUyNhaSdVuquD65cDrEY2lKHyewlZSmQGX5k4ApimbLnpQkAjeEB7Y9/AVPNAM7F9nrHyb/aExjQ==
+ dependencies:
+ "@npmcli/arborist" "^5.0.0"
+ "@npmcli/ci-detect" "^2.0.0"
+ "@npmcli/run-script" "^3.0.0"
+ chalk "^4.1.0"
+ mkdirp-infer-owner "^2.0.0"
+ npm-package-arg "^9.0.1"
+ npmlog "^6.0.1"
+ pacote "^13.0.5"
+ proc-log "^2.0.0"
+ read "^1.0.7"
+ read-package-json-fast "^2.0.2"
+ walk-up-path "^1.0.0"
+
+libnpmfund@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-3.0.2.tgz#7da0827950f0db2cce0acb0dc7652d1834a8b239"
+ integrity sha512-wmFMP/93Wjy+jDg5LaSldDgAhSgCyA64JUUmp806Kae7y3YP9Qv5m1vUhPxT4yebxgB2v/I6G1/RUcNb1y0kVg==
+ dependencies:
+ "@npmcli/arborist" "^5.0.0"
+
+libnpmhook@^8.0.2:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-8.0.3.tgz#9628518a63455d21dafda312ee46175275707ff5"
+ integrity sha512-TEdNI1mC5zS+w/juCgxrwwQnpbq9lY76NDOS0N37pn6pWIUxB1Yq8mwy6MUEXR1TgH4HurSQyKT6I6Kp9Wjm4A==
+ dependencies:
+ aproba "^2.0.0"
+ npm-registry-fetch "^13.0.0"
+
+libnpmorg@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-4.0.3.tgz#a85cbdb3665ad4f7c7279d239a4581ec2eeef5a6"
+ integrity sha512-r4CpmCEF+e5PbFMBi64xSXmqn0uGgV4T7NWpGL4/A6KT/DTtIxALILQZq+l0ZdN1xm4RjOvqSDR22oT4il8rAQ==
+ dependencies:
+ aproba "^2.0.0"
+ npm-registry-fetch "^13.0.0"
+
+libnpmpack@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-4.0.3.tgz#0de60120a2456524b0cdb25bac58f454a1441c2e"
+ integrity sha512-/H4XXJp5S74palJfVhM5za/4dw8/1DRfU5g+t2taAojjr5+cSKyEoxxnHOnSRWu7zqqMeT8e4jX6Cz8lNUsbAw==
+ dependencies:
+ "@npmcli/run-script" "^3.0.0"
+ npm-package-arg "^9.0.1"
+ pacote "^13.0.5"
+
+libnpmpublish@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.3.tgz#b10cd9c8b2ebeccadc05aea78f11acb28fe606c4"
+ integrity sha512-slJ5XuTR3DIF669K7MLVSdhvkatoM3/D+wvryKxVtquKnEbfFORESI1w0lYD4tvrPEy6AU9y/qEMDqhUW712HQ==
+ dependencies:
+ normalize-package-data "^4.0.0"
+ npm-package-arg "^9.0.1"
+ npm-registry-fetch "^13.0.0"
+ semver "^7.1.3"
+ ssri "^9.0.0"
+
+libnpmsearch@^5.0.2:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-5.0.3.tgz#ed502a4c2c70ea36723180455fae1357546b2184"
+ integrity sha512-Ofq76qKAPhxbiyzPf/5LPjJln26VTKwU9hIU0ACxQ6tNtBJ1CHmI7iITrdp7vNezhZc0FlkXwrIpqXjhBJZgLQ==
+ dependencies:
+ npm-registry-fetch "^13.0.0"
+
+libnpmteam@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-4.0.3.tgz#9335fbbd032b3770f5c9b7ffc6203f47d1ed144a"
+ integrity sha512-LsYYLz4TlTpcqkusInY5MhKjiHFaCx1GV0LmydXJ/QMh+3IWBJpUhes4ynTZuFoJKkDIFjxyMU09ul+RZixgdg==
+ dependencies:
+ aproba "^2.0.0"
+ npm-registry-fetch "^13.0.0"
+
+libnpmversion@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-3.0.2.tgz#02e517ee2a6454010ab81fd47d26fa1e328f356d"
+ integrity sha512-W76aMbL6NWkvOCoBpbWEoypCBsaXU95vhYY2eqBg0Ev11lwpjLIGC78ZCzT/M2hI00ena+yoCpGXGnAk949KOQ==
+ dependencies:
+ "@npmcli/git" "^3.0.0"
+ "@npmcli/run-script" "^3.0.0"
+ json-parse-even-better-errors "^2.3.1"
+ proc-log "^2.0.0"
+ semver "^7.3.5"
+ stringify-package "^1.0.1"
+
+libphonenumber-js@^1.9.43:
+ version "1.9.50"
+ resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.50.tgz#f5028a2c4cc47a69d69a0de3629afad97a613712"
+ integrity sha512-cCzQPChw2XbordcO2LKiw5Htx5leHVfFk/EXkxNHqJfFo7Fndcb1kF5wPJpc316vCJhhikedYnVysMh3Sc7Ocw==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+lines-logger@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/lines-logger/-/lines-logger-2.1.2.tgz#85b619ee849938323615e40fa8cee76d24532de7"
+ integrity sha512-pSn6qr2K0tf28TgrVMMQxinADrZP3xObxxUBlhTNWWRZToRtrjHihzW7UOKlOypKDDiP3uk/DRjd6dqQsg1coA==
+
+loader-runner@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
+ integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+lru-cache@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^7.4.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
+ version "7.8.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747"
+ integrity sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==
+
+lru-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+ integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
+ dependencies:
+ es5-ext "~0.10.2"
+
+macos-release@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2"
+ integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==
+
+magic-string@0.25.7:
+ version "0.25.7"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
+ integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
+ dependencies:
+ sourcemap-codec "^1.4.4"
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6, make-fetch-happen@^10.1.1:
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz#acffef43f86250602b932eecc0ad3acc992ae233"
+ integrity sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==
+ dependencies:
+ agentkeepalive "^4.2.1"
+ cacache "^16.0.2"
+ http-cache-semantics "^4.1.0"
+ http-proxy-agent "^5.0.0"
+ https-proxy-agent "^5.0.0"
+ is-lambda "^1.0.1"
+ lru-cache "^7.7.1"
+ minipass "^3.1.6"
+ minipass-collect "^1.0.2"
+ minipass-fetch "^2.0.3"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.4"
+ negotiator "^0.6.3"
+ promise-retry "^2.0.1"
+ socks-proxy-agent "^6.1.1"
+ ssri "^9.0.0"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memfs@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305"
+ integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==
+ dependencies:
+ fs-monkey "1.0.3"
+
+memoizee@^0.4.15:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
+ integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.53"
+ es6-weak-map "^2.0.3"
+ event-emitter "^0.3.5"
+ is-promise "^2.2.2"
+ lru-queue "^0.1.0"
+ next-tick "^1.1.0"
+ timers-ext "^0.1.7"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^4.0.0, micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimatch@^3.0.4:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
+ integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-fetch@^2.0.3:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8"
+ integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==
+ dependencies:
+ minipass "^3.1.6"
+ minipass-sized "^1.0.3"
+ minizlib "^2.1.2"
+ optionalDependencies:
+ encoding "^0.1.13"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-json-stream@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7"
+ integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==
+ dependencies:
+ jsonparse "^1.3.1"
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+ integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-sized@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
+ integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+ integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
+ dependencies:
+ yallist "^4.0.0"
+
+minizlib@^2.1.1, minizlib@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mkdirp-infer-owner@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316"
+ integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==
+ dependencies:
+ chownr "^2.0.0"
+ infer-owner "^1.0.4"
+ mkdirp "^1.0.3"
+
+mkdirp@^0.5.4:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+moment-timezone@^0.5.34:
+ version "0.5.34"
+ resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c"
+ integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==
+ dependencies:
+ moment ">= 2.9.0"
+
+"moment@>= 2.9.0", moment@^2.29.1:
+ version "2.29.2"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
+ integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.0.0, ms@^2.1.2:
+ 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.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c"
+ integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==
+ dependencies:
+ 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@0.0.8, mute-stream@~0.0.4:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+negotiator@0.6.3, negotiator@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+next-tick@1, next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+"node-config-ts@npm:node-config-ts-2":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-config-ts-2/-/node-config-ts-2-1.0.0.tgz#349f5dd10e8de8d75f279e2a1e1148f782e77fbe"
+ integrity sha512-hnszqz2O74wrICiMsm+lIP8xVEeKrp48xebD6A8K7e5dEEOTa9HpUI5fvuXHLwiBwud3HeFGTuSutsKX4fTGKA==
+ dependencies:
+ json-to-ts "^1.6.0"
+ minimist "^1.2.0"
+ prettier "^1.19.1"
+ ramda "^0.27.0"
+
+node-emoji@1.11.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c"
+ integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==
+ dependencies:
+ lodash "^4.17.21"
+
+node-fetch@^2.6.1:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089"
+ integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==
+ dependencies:
+ env-paths "^2.2.0"
+ glob "^7.1.4"
+ graceful-fs "^4.2.6"
+ make-fetch-happen "^10.0.3"
+ nopt "^5.0.0"
+ npmlog "^6.0.0"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.2"
+ which "^2.0.2"
+
+node-releases@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+ integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+
+nopt@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+ integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c"
+ integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==
+ dependencies:
+ hosted-git-info "^5.0.0"
+ is-core-module "^2.8.1"
+ semver "^7.3.5"
+ validate-npm-package-license "^3.0.4"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-audit-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-3.0.0.tgz#1bf3e531208b5f77347c8d00c3d9badf5be30cd6"
+ integrity sha512-tWQzfbwz1sc4244Bx2BVELw0EmZlCsCF0X93RDcmmwhonCsPMoEviYsi+32R+mdRvOWXolPce9zo64n2xgPESw==
+ dependencies:
+ chalk "^4.0.0"
+
+npm-bundled@^1.1.1, npm-bundled@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1"
+ integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==
+ dependencies:
+ npm-normalize-package-bin "^1.0.1"
+
+npm-install-checks@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4"
+ integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==
+ dependencies:
+ semver "^7.1.1"
+
+npm-install-checks@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234"
+ integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==
+ dependencies:
+ semver "^7.1.1"
+
+npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
+ integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
+
+npm-package-arg@^9.0.0, npm-package-arg@^9.0.1:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.0.2.tgz#f3ef7b1b3b02e82564af2d5228b4c36567dcd389"
+ integrity sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g==
+ dependencies:
+ hosted-git-info "^5.0.0"
+ semver "^7.3.5"
+ validate-npm-package-name "^4.0.0"
+
+npm-packlist@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.0.0.tgz#74795ebbbf91bd5a2db6ecff4d6fe1f1c1a07e11"
+ integrity sha512-uU20UwM4Hogfab1Q7htJbhcyafM9lGHxOrDjkKvR2S3z7Ds0uRaESk0cXctczk+ABT4DZWNwjB10xlurFdEwZg==
+ dependencies:
+ glob "^7.2.0"
+ ignore-walk "^5.0.1"
+ npm-bundled "^1.1.2"
+ npm-normalize-package-bin "^1.0.1"
+
+npm-pick-manifest@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c"
+ integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==
+ dependencies:
+ npm-install-checks "^5.0.0"
+ npm-normalize-package-bin "^1.0.1"
+ npm-package-arg "^9.0.0"
+ semver "^7.3.5"
+
+npm-profile@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-6.0.2.tgz#b2da9887d16d1f0d1ce8a9c3b37a48454a372919"
+ integrity sha512-0Fq8l+A10YXnnS63E3HThWjOb7+19Wsh1nOVutC2fKuowar8t/5PpINsbcm5xQ2dA28uAu+wjFfUyiEVSMz4Jw==
+ dependencies:
+ npm-registry-fetch "^13.0.0"
+ proc-log "^2.0.0"
+
+npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.1.0:
+ version "13.1.0"
+ resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.0.tgz#71bed52e30a4b27441604bbba79c7db8e0e34cb5"
+ integrity sha512-TIYL5X8CcwDhbFMXFDShNcpG6OMCYK6VzvSr6MUWP20tCU2DJ4ao2qQg3DT+3Pet8mO6/cgbZpon4LMh3duYLg==
+ dependencies:
+ make-fetch-happen "^10.0.6"
+ minipass "^3.1.6"
+ minipass-fetch "^2.0.3"
+ minipass-json-stream "^1.0.1"
+ minizlib "^2.1.2"
+ npm-package-arg "^9.0.1"
+ proc-log "^2.0.0"
+
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+npm-user-validate@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561"
+ integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==
+
+npm@^8.6.0:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/npm/-/npm-8.6.0.tgz#46a601fdffa80b018e1dcf08e10d5efb625e5c9e"
+ integrity sha512-icekvN8FJFESIFkLaFEVl05Nocl5Id5HnoVhJzhCUvtNY8tj9kfUlH/J527fZq/8ltsAUqpettfutwRjQYS2fA==
+ dependencies:
+ "@isaacs/string-locale-compare" "^1.1.0"
+ "@npmcli/arborist" "^5.0.4"
+ "@npmcli/ci-detect" "^2.0.0"
+ "@npmcli/config" "^4.0.1"
+ "@npmcli/fs" "^2.1.0"
+ "@npmcli/map-workspaces" "^2.0.2"
+ "@npmcli/package-json" "^1.0.1"
+ "@npmcli/run-script" "^3.0.1"
+ abbrev "~1.1.1"
+ ansicolors "~0.3.2"
+ ansistyles "~0.1.3"
+ archy "~1.0.0"
+ cacache "^16.0.3"
+ chalk "^4.1.2"
+ chownr "^2.0.0"
+ cli-columns "^4.0.0"
+ cli-table3 "^0.6.1"
+ columnify "^1.6.0"
+ fastest-levenshtein "^1.0.12"
+ glob "^7.2.0"
+ graceful-fs "^4.2.9"
+ hosted-git-info "^5.0.0"
+ ini "^2.0.0"
+ init-package-json "^3.0.2"
+ is-cidr "^4.0.2"
+ json-parse-even-better-errors "^2.3.1"
+ libnpmaccess "^6.0.2"
+ libnpmdiff "^4.0.2"
+ libnpmexec "^4.0.2"
+ libnpmfund "^3.0.1"
+ libnpmhook "^8.0.2"
+ libnpmorg "^4.0.2"
+ libnpmpack "^4.0.2"
+ libnpmpublish "^6.0.2"
+ libnpmsearch "^5.0.2"
+ libnpmteam "^4.0.2"
+ libnpmversion "^3.0.1"
+ make-fetch-happen "^10.1.1"
+ minipass "^3.1.6"
+ minipass-pipeline "^1.2.4"
+ mkdirp "^1.0.4"
+ mkdirp-infer-owner "^2.0.0"
+ ms "^2.1.2"
+ node-gyp "^9.0.0"
+ nopt "^5.0.0"
+ npm-audit-report "^3.0.0"
+ npm-install-checks "^4.0.0"
+ npm-package-arg "^9.0.1"
+ npm-pick-manifest "^7.0.0"
+ npm-profile "^6.0.2"
+ npm-registry-fetch "^13.1.0"
+ npm-user-validate "^1.0.1"
+ npmlog "^6.0.1"
+ opener "^1.5.2"
+ pacote "^13.0.5"
+ parse-conflict-json "^2.0.2"
+ proc-log "^2.0.1"
+ qrcode-terminal "^0.12.0"
+ read "~1.0.7"
+ read-package-json "^5.0.0"
+ read-package-json-fast "^2.0.3"
+ readdir-scoped-modules "^1.1.0"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ ssri "^8.0.1"
+ tar "^6.1.11"
+ text-table "~0.2.0"
+ tiny-relative-date "^1.3.0"
+ treeverse "^1.0.4"
+ validate-npm-package-name "^4.0.0"
+ which "^2.0.2"
+ write-file-atomic "^4.0.1"
+
+npmlog@^6.0.0, npmlog@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17"
+ integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==
+ dependencies:
+ are-we-there-yet "^3.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^4.0.0"
+ set-blocking "^2.0.0"
+
+object-assign@^4, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-hash@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
+ integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+
+object-inspect@^1.12.0, object-inspect@^1.9.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
+ integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.entries@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
+ integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+object.getownpropertydescriptors@^2.0.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
+ integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+object.values@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
+ integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+on-finished@2.4.1, on-finished@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+opener@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
+ integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
+
+optional@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3"
+ integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ 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@5.4.1, ora@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
+ integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
+ dependencies:
+ 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@4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.1.tgz#32cee7823de85a8897647ba4d76db46bf845e555"
+ integrity sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==
+ dependencies:
+ macos-release "^2.5.0"
+ windows-release "^4.0.0"
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+packet-reader@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74"
+ integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==
+
+pacote@^13.0.3, pacote@^13.0.5:
+ version "13.1.1"
+ resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.1.1.tgz#d3e6e27ffc5137d2a07233ed6fba2a209ecb2b7b"
+ integrity sha512-MTT3k1OhUo+IpvoHGp25OwsRU0L+kJQM236OCywxvY4OIJ/YfloNW2/Yc3HMASH10BkfZaGMVK/pxybB7fWcLw==
+ dependencies:
+ "@npmcli/git" "^3.0.0"
+ "@npmcli/installed-package-contents" "^1.0.7"
+ "@npmcli/promise-spawn" "^3.0.0"
+ "@npmcli/run-script" "^3.0.1"
+ cacache "^16.0.0"
+ chownr "^2.0.0"
+ fs-minipass "^2.1.0"
+ infer-owner "^1.0.4"
+ minipass "^3.1.6"
+ mkdirp "^1.0.4"
+ npm-package-arg "^9.0.0"
+ npm-packlist "^5.0.0"
+ npm-pick-manifest "^7.0.0"
+ npm-registry-fetch "^13.0.1"
+ proc-log "^2.0.0"
+ promise-retry "^2.0.1"
+ read-package-json "^5.0.0"
+ read-package-json-fast "^2.0.3"
+ rimraf "^3.0.2"
+ ssri "^9.0.0"
+ tar "^6.1.11"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323"
+ integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==
+ dependencies:
+ json-parse-even-better-errors "^2.3.1"
+ just-diff "^5.0.1"
+ just-diff-apply "^5.2.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@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"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-to-regexp@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f"
+ integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pg-connection-string@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
+ integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
+
+pg-int8@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
+ integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
+
+pg-pool@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.1.tgz#f499ce76f9bf5097488b3b83b19861f28e4ed905"
+ integrity sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==
+
+pg-protocol@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0"
+ integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==
+
+pg-types@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
+ integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
+ dependencies:
+ 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"
+
+pg@^8.7.3:
+ version "8.7.3"
+ resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.3.tgz#8a5bdd664ca4fda4db7997ec634c6e5455b27c44"
+ integrity sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==
+ dependencies:
+ buffer-writer "2.0.0"
+ packet-reader "1.0.0"
+ pg-connection-string "^2.5.0"
+ pg-pool "^3.5.1"
+ pg-protocol "^1.5.0"
+ pg-types "^2.1.0"
+ pgpass "1.x"
+
+pgpass@1.x:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
+ integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
+ dependencies:
+ split2 "^4.1.0"
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pluralize@8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+pluralize@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.1.0.tgz#84213d0a12356069daa84060c559242633161368"
+ integrity sha1-hCE9ChI1YGnaqEBgxVkkJjMWE2g=
+
+postgres-array@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
+ integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
+
+postgres-bytea@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
+ integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
+
+postgres-date@~1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
+ integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
+
+postgres-interval@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
+ integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
+ dependencies:
+ xtend "^4.0.0"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier@^1.19.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
+ integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
+
+proc-log@^2.0.0, proc-log@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685"
+ integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+promise-all-reject-late@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2"
+ integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==
+
+promise-call-limit@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24"
+ integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+promise-retry@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
+ integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
+ dependencies:
+ err-code "^2.0.2"
+ retry "^0.12.0"
+
+promzard@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
+ integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
+ dependencies:
+ read "1"
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qrcode-terminal@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
+ integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
+
+qs@6.10.3:
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@6.9.7:
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
+ integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+ramda@^0.27.0:
+ version "0.27.2"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1"
+ integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
+ integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "1.8.1"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-cmd-shim@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155"
+ integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==
+
+read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83"
+ integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==
+ dependencies:
+ json-parse-even-better-errors "^2.3.0"
+ npm-normalize-package-bin "^1.0.1"
+
+read-package-json@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.0.tgz#d62602755547e152a3923c220238d9a7f0b60745"
+ integrity sha512-1cjk2MV5ONDMn34uxSID3X8NY7VKsXfJnjbcVdFMvHEnJOBzU6MJ7/3yg6QFVZDq5/1yFNrKBUK9kGnonyGP2Q==
+ dependencies:
+ glob "^7.2.0"
+ json-parse-even-better-errors "^2.3.1"
+ normalize-package-data "^4.0.0"
+ npm-normalize-package-bin "^1.0.1"
+
+read@1, read@^1.0.7, read@~1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+ integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
+ dependencies:
+ mute-stream "~0.0.4"
+
+readable-stream@1.1.x:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.2.2:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdir-scoped-modules@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
+ integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
+ dependencies:
+ debuglog "^1.0.1"
+ dezalgo "^1.0.0"
+ graceful-fs "^4.1.2"
+ once "^1.3.0"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+ dependencies:
+ resolve "^1.1.6"
+
+redis-errors@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
+ integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=
+
+redis-parser@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
+ integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=
+ dependencies:
+ redis-errors "^1.0.0"
+
+redis@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/redis/-/redis-4.0.6.tgz#a2ded4d9f4f4bad148e54781051618fc684cd858"
+ integrity sha512-IaPAxgF5dV0jx+A9l6yd6R9/PAChZIoAskDVRzUODeLDNhsMlq7OLLTmu0AwAr0xjrJ1bibW5xdpRwqIQ8Q0Xg==
+ dependencies:
+ "@node-redis/bloom" "1.0.1"
+ "@node-redis/client" "1.0.5"
+ "@node-redis/graph" "1.0.0"
+ "@node-redis/json" "1.0.2"
+ "@node-redis/search" "1.0.5"
+ "@node-redis/time-series" "1.0.2"
+
+reflect-metadata@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+regexpp@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.1.6, resolve@^1.20.0:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+retry-as-promised@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-5.0.0.tgz#f4ecc25133603a2d2a7aff4a128691d7bc506d54"
+ integrity sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==
+
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rxjs@6.6.7, rxjs@^6.6.0:
+ version "6.6.7"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+ integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+ dependencies:
+ tslib "^1.9.0"
+
+rxjs@^7.2.0:
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f"
+ integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==
+ dependencies:
+ tslib "^2.1.0"
+
+safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+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@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.3.4, semver@^7.3.5:
+ version "7.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
+ integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==
+ dependencies:
+ lru-cache "^7.4.0"
+
+send@0.17.2:
+ version "0.17.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
+ integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
+ dependencies:
+ 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.8.1"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+sequelize-cli@^6.4.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-6.4.1.tgz#fb9fbbde733ae887970316a700d264fcf0683770"
+ integrity sha512-gIzzFitUGUErq6DYd1JDnsmx7z7XcxzRNe4Py3AqeaxcyjpCAZU2BQnsNPGPMKAaXfMtKi/d9Tu4MtLrehVzIQ==
+ dependencies:
+ cli-color "^2.0.1"
+ fs-extra "^9.1.0"
+ js-beautify "^1.14.0"
+ lodash "^4.17.21"
+ resolve "^1.20.0"
+ umzug "^2.3.0"
+ yargs "^16.2.0"
+
+sequelize-pool@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768"
+ integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==
+
+sequelize-typescript@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-2.1.3.tgz#94a8d0a4b5739fc917c8d8fa66e1acb5aadc1274"
+ integrity sha512-0mejGAaLywuCoOOLSXCQs2sMBNudU/QtWZkGY5VT2dfTHToXZi5bOxCa3/CukNNk7wJwXnLuIdeHdlqjvVoj1g==
+ dependencies:
+ glob "7.2.0"
+
+sequelize@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.18.0.tgz#0e99e0c07ee144eb456374a56e2bd501634c3d16"
+ integrity sha512-x8TW8ovqG8ljZq0Uow1mtMq44hSKPefWEC590R9IWgF2dajEHvKJJpXo1FiRPfj6spOHWOnmOs1Xbb1JPG3Ifg==
+ dependencies:
+ "@types/debug" "^4.1.7"
+ "@types/validator" "^13.7.1"
+ debug "^4.3.3"
+ dottie "^2.0.2"
+ inflection "^1.13.2"
+ lodash "^4.17.21"
+ moment "^2.29.1"
+ moment-timezone "^0.5.34"
+ pg-connection-string "^2.5.0"
+ retry-as-promised "^5.0.0"
+ semver "^7.3.5"
+ sequelize-pool "^7.1.0"
+ toposort-class "^1.0.1"
+ uuid "^8.3.2"
+ validator "^13.7.0"
+ wkx "^0.5.0"
+
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.2:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
+ integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.2"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shelljs@0.8.5:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
+ integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+sigmund@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+ integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
+
+signal-exit@^3.0.2, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks-proxy-agent@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
+ integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
+ dependencies:
+ agent-base "^6.0.2"
+ debug "^4.3.1"
+ socks "^2.6.1"
+
+socks@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
+ integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
+ dependencies:
+ ip "^1.1.5"
+ smart-buffer "^4.2.0"
+
+source-map-support@0.5.21, source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@0.7.3, source-map@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+source-map@^0.6.0, source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sourcemap-codec@^1.4.4:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
+ integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+
+split2@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809"
+ integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==
+
+ssri@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+ integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+ dependencies:
+ minipass "^3.1.1"
+
+ssri@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.0.tgz#70ad90e339eb910f1a7ff1dcf4afc268326c4547"
+ integrity sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==
+ dependencies:
+ minipass "^3.1.1"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+streamsearch@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+ integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
+
+string-at@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/string-at/-/string-at-1.1.0.tgz#332e090c5724418266a27a09394924b9fad41275"
+ integrity sha512-jCpPowWKBn0NFdvtmK2qxK40Ol4jPcgCt8qYnKpPx6B5eDwHMDhRvq9MCsDEgsOTNtbXY6beAMHMRT2qPJXllA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.padend@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1"
+ integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+string.prototype.padstart@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz#4551d0117d9501692ec6000b15056ac3f816cfa5"
+ integrity sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimleft@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.3.tgz#dee305118117d0a1843c1fc0d38d5d0754d83c60"
+ integrity sha512-699Ibssmj/awVzvdNk4g83/Iu8U9vDohzmA/ly2BrQWGhamuY4Tlvs5XKmKliDt3ky6SKbE1bzPhASKCFlx9Sg==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ string.prototype.trimstart "^1.0.3"
+
+string.prototype.trimright@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.3.tgz#dc16a21d7456cbc8b2c54d47fe01f06d9efe94eb"
+ integrity sha512-hoOq56oRFnnfDuXNy2lGHiwT77MehHv9d0zGfRZ8QdC+4zjrkFB9vd5i/zYTd/ymFBd4YxtbdgHt3U6ksGeuBw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ string.prototype.trimend "^1.0.3"
+
+string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-package@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
+ integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+swagger-ui-dist@>=4.1.3:
+ version "4.10.3"
+ resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.10.3.tgz#d67066716ce20cb6afb23474c9ca2727633a9eb3"
+ integrity sha512-eR4vsd7sYo0Sx7ZKRP5Z04yij7JkNmIlUQfrDQgC+xO5ABYx+waabzN+nDsQTLAJ4Z04bjkRd8xqkJtbxr3G7w==
+
+swagger-ui-express@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.3.0.tgz#226238ab231f7718f9109d63a66efc3a795618dd"
+ integrity sha512-jN46SEEe9EoXa3ZgZoKgnSF6z0w3tnM1yqhO4Y+Q4iZVc8JOQB960EZpIAz6rNROrDApVDwcMHR0mhlnc/5Omw==
+ dependencies:
+ swagger-ui-dist ">=4.1.3"
+
+symbol-observable@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
+ integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
+
+tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
+ version "6.1.11"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
+ integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^3.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+terser-webpack-plugin@^5.1.3:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
+ integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
+ dependencies:
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ source-map "^0.6.1"
+ terser "^5.7.2"
+
+terser@^5.7.2:
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c"
+ integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==
+ dependencies:
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.20"
+
+text-table@^0.2.0, text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timers-ext@^0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
+ integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
+ dependencies:
+ es5-ext "~0.10.46"
+ next-tick "1"
+
+tiny-relative-date@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
+ integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+toposort-class@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
+ integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+tree-kill@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
+treeverse@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f"
+ integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==
+
+treeverse@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca"
+ integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==
+
+ts-loader@^9.2.8:
+ version "9.2.8"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.8.tgz#e89aa32fa829c5cad0a1d023d6b3adecd51d5a48"
+ integrity sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==
+ dependencies:
+ chalk "^4.1.0"
+ enhanced-resolve "^5.0.0"
+ micromatch "^4.0.0"
+ semver "^7.3.4"
+
+ts-node@^10.7.0:
+ version "10.7.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
+ integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
+ dependencies:
+ "@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"
+ v8-compile-cache-lib "^3.0.0"
+ yn "3.1.1"
+
+tsconfig-paths-webpack-plugin@3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a"
+ integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==
+ dependencies:
+ chalk "^4.1.0"
+ enhanced-resolve "^5.7.0"
+ tsconfig-paths "^3.9.0"
+
+tsconfig-paths@3.14.1, tsconfig-paths@^3.9.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
+ integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@2.3.1, tslib@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+tslib@^1.8.1, tslib@^1.9.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-is@^1.6.4, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.5.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
+ integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4"
+ integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
+
+typescript@^4.6.3:
+ version "4.6.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
+ integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+
+umzug@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.3.0.tgz#0ef42b62df54e216b05dcaf627830a6a8b84a184"
+ integrity sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==
+ dependencies:
+ bluebird "^3.7.2"
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@8.3.2, uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+v8-compile-cache-lib@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
+ integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
+
+v8-compile-cache@^2.0.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+validate-npm-package-license@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+validate-npm-package-name@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747"
+ integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==
+ dependencies:
+ builtins "^5.0.0"
+
+validator@^13.7.0:
+ version "13.7.0"
+ resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
+ integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+walk-up-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e"
+ integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==
+
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wcwidth@^1.0.0, wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+webpack-node-externals@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917"
+ integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@5.71.0:
+ version "5.71.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.71.0.tgz#b01fcf379570b8c5ee06ca06c829ca168c951884"
+ integrity sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@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.9.2"
+ 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.9"
+ 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.3.1"
+ webpack-sources "^3.2.3"
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which@^2.0.1, which@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
+windows-release@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377"
+ integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==
+ dependencies:
+ execa "^4.0.2"
+
+wkx@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"
+ integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==
+ dependencies:
+ "@types/node" "*"
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^4.0.0, write-file-atomic@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
+ integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.7"
+
+xtend@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@4.0.0, yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ 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"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
From a819450af1dae1ae076e1ab7f4f3e275be242ba3 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 11:16:43 +0300
Subject: [PATCH 002/221] Added more classes
---
.../src/data/database/model/image.model.ts | 62 ++++++++++++++
.../data/database/model/ip.address.model.ts | 83 +++++++++++++++++++
.../data/database/model/room.users.model.ts | 70 ++++++++++++++++
.../model/subscription.message.model.ts | 70 ++++++++++++++++
.../data/database/model/subscription.model.ts | 72 ++++++++++++++++
.../database/model/uploaded.file.model.ts | 82 ++++++++++++++++++
.../data/database/model/user.joined.info.ts | 61 ++++++++++++++
newback/src/data/types/model/db.ts | 15 ++++
8 files changed, 515 insertions(+)
create mode 100644 newback/src/data/database/model/image.model.ts
create mode 100644 newback/src/data/database/model/ip.address.model.ts
create mode 100644 newback/src/data/database/model/room.users.model.ts
create mode 100644 newback/src/data/database/model/subscription.message.model.ts
create mode 100644 newback/src/data/database/model/subscription.model.ts
create mode 100644 newback/src/data/database/model/uploaded.file.model.ts
create mode 100644 newback/src/data/database/model/user.joined.info.ts
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
new file mode 100644
index 000000000..02d0579c4
--- /dev/null
+++ b/newback/src/data/database/model/image.model.ts
@@ -0,0 +1,62 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'uploaded_file', timestamps: true })
+export class UploadedFileModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(UploadedFileChoices)),
+ allowNull: false,
+ })
+ public type: UploadedFileChoices;
+
+ @Column({
+ type: DataType.STRING(1),
+ allowNull: false,
+ })
+ public symbol: string;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public userId: number;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: false,
+ })
+ public file: string;
+}
diff --git a/newback/src/data/database/model/ip.address.model.ts b/newback/src/data/database/model/ip.address.model.ts
new file mode 100644
index 000000000..5996a783d
--- /dev/null
+++ b/newback/src/data/database/model/ip.address.model.ts
@@ -0,0 +1,83 @@
+import {
+ Column,
+ DataType,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import {Injectable} from '@nestjs/common';
+
+@Injectable()
+@Table({paranoid: true, tableName: 'ip_address', timestamps: true})
+export class IpAddressModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.STRING(32),
+ unique: true,
+ allowNull: false,
+ })
+ public ip: string;
+
+ @Column({
+ type: DataType.STRING(255),
+ allowNull: true,
+ })
+ public isp: string;
+
+ @Column({
+ type: DataType.STRING(16),
+ allowNull: true,
+ })
+ public countryCode: string;
+
+ @Column({
+ type: DataType.STRING(64),
+ allowNull: true,
+ })
+ public country: string;
+
+ @Column({
+ type: DataType.STRING(64),
+ allowNull: true,
+ })
+ public region: string;
+
+ @Column({
+ type: DataType.STRING(64),
+ allowNull: true,
+ })
+ public city: string;
+
+ @Column({
+ type: DataType.FLOAT,
+ allowNull: true,
+ })
+ public lat: number;
+ @Column({
+ type: DataType.FLOAT,
+ allowNull: true,
+ })
+ public lon: number;
+
+ @Column({
+ type: DataType.STRING(32),
+ allowNull: true,
+ })
+ public zip: string;
+
+ @Column({
+ type: DataType.STRING(32),
+ allowNull: true,
+ })
+ public timezone: string;
+
+
+}
diff --git a/newback/src/data/database/model/room.users.model.ts b/newback/src/data/database/model/room.users.model.ts
new file mode 100644
index 000000000..026d45da6
--- /dev/null
+++ b/newback/src/data/database/model/room.users.model.ts
@@ -0,0 +1,70 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ ImageType,
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+import {MessageModel} from '@/data/database/model/message.model';
+import {RoomModel} from '@/data/database/model/room.model';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'room_user', timestamps: true })
+export class UploadedFileModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @ForeignKey(() => RoomModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public roomId: number;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public userId: number;
+
+ @Column({
+ type: DataType.INTEGER,
+ defaultValue: 2,
+ allowNull: false,
+ })
+ public volume: number;
+
+
+ @Column({
+ type: DataType.BOOLEAN,
+ defaultValue: true,
+ allowNull: false,
+ })
+ public notifications: boolean;
+
+}
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/database/model/subscription.message.model.ts
new file mode 100644
index 000000000..8069a9dc7
--- /dev/null
+++ b/newback/src/data/database/model/subscription.message.model.ts
@@ -0,0 +1,70 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ ImageType,
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+import {MessageModel} from '@/data/database/model/message.model';
+import {RoomModel} from '@/data/database/model/room.model';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'room_user', timestamps: true })
+export class UploadedFileModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @ForeignKey(() => SubscritionModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public subscriptionId: number;
+
+ @ForeignKey(() => MessageModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public messageId: number;
+
+ @Column({
+ type: DataType.INTEGER,
+ defaultValue: 2,
+ allowNull: false,
+ })
+ public volume: number;
+
+
+ @Column({
+ type: DataType.BOOLEAN,
+ defaultValue: true,
+ allowNull: false,
+ })
+ public notifications: boolean;
+
+}
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
new file mode 100644
index 000000000..e0aa75604
--- /dev/null
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -0,0 +1,72 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'subscription', timestamps: true })
+export class UploadedFileModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public userId: number;
+
+ @Column({
+ type: DataType.STRING(255),
+ unique: true,
+ allowNull: false,
+ })
+ public registrationId: UploadedFileChoices;
+
+ @Column({
+ type: DataType.STRING(64),
+ allowNull: true,
+ })
+ public agent: string;
+
+
+ @Column({
+ type: DataType.BOOLEAN,
+ defaultValue: false,
+ allowNull: false,
+ })
+ public isMobile: boolean;
+
+ @ForeignKey(() => IpAdressModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: true,
+ })
+ public ipId: number;
+}
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
new file mode 100644
index 000000000..39bce5114
--- /dev/null
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -0,0 +1,82 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ ImageType,
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+import {MessageModel} from '@/data/database/model/message.model';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'uploaded_file', timestamps: true })
+export class UploadedFileModel extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @Column({
+ type: DataType.ENUM(...Object.keys(ImageType)),
+ allowNull: false,
+ })
+ public type: ImageType;
+
+ @Column({
+ type: DataType.STRING(1),
+ allowNull: false,
+ })
+ public symbol: string;
+
+ @ForeignKey(() => MessageModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public messageId: number;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public img: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public preview: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public absoluteUrl: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public webpAsboluteUrl: string;
+}
diff --git a/newback/src/data/database/model/user.joined.info.ts b/newback/src/data/database/model/user.joined.info.ts
new file mode 100644
index 000000000..d44433e6a
--- /dev/null
+++ b/newback/src/data/database/model/user.joined.info.ts
@@ -0,0 +1,61 @@
+import {
+ BelongsTo,
+ Column,
+ DataType,
+ ForeignKey,
+ HasOne,
+ Model,
+ Table,
+} from 'sequelize-typescript';
+import { Injectable } from '@nestjs/common';
+import {
+ Gender,
+ ThemeValues
+} from '@/data/types/dto/dto';
+import {UserModel} from '@/data/database/model/user.model';
+import {
+ LogLevel,
+ logLevels
+} from 'lines-logger'
+import {
+ ImageType,
+ UploadedFileChoices,
+ VerificationType
+} from '@/data/types/model/db';
+import {MessageModel} from '@/data/database/model/message.model';
+import {IpAddressModel} from '@/data/database/model/ip.address.model';
+
+@Injectable()
+@Table({ paranoid: true, tableName: 'user_joined_info', timestamps: true })
+export class UserJoinedInfo extends Model {
+
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ unique: true,
+ autoIncrement: true,
+ primaryKey: true,
+ })
+ public id: number;
+
+ @ForeignKey(() => IpAddressModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public ipId: number;
+
+ @ForeignKey(() => UserModel)
+ @Column({
+ type: DataType.INTEGER,
+ allowNull: false,
+ })
+ public userId: number;
+
+ @Column({
+ type: DataType.DATE,
+ allowNull: false,
+ })
+ public time: Date;
+
+}
diff --git a/newback/src/data/types/model/db.ts b/newback/src/data/types/model/db.ts
index fb21dfe9f..027d880d7 100644
--- a/newback/src/data/types/model/db.ts
+++ b/newback/src/data/types/model/db.ts
@@ -4,3 +4,18 @@ export enum VerificationType {
EMAIL = 'EMAIL',
CONFIRM_EMAIL = 'CONFIRM_EMAIL',
}
+
+export enum ImageType {
+ VIDEO = 'v',
+ IMAGE = 'i',
+ GIPHY= 'g'
+}
+export enum UploadedFileChoices {
+ VIDEO = 'V',
+ FILE = 'F',
+ MEDIA_RECORD= 'M',
+ AUDIO_RECORD = 'A',
+ IMAGE = 'I',
+ PREVIEW = 'P',
+ ISSUE = 'S'
+}
From ed10876b55a753d6181d0a17bbfb1a125bd6be51 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 13:11:06 +0300
Subject: [PATCH 003/221] Added more classes
---
newback/.sequelizerc | 7 ++
newback/config/default.json | 3 +-
newback/config/sequelize.cli.config.js | 13 ++++
newback/package.json | 1 +
newback/sequelize-cli.config.js | 13 ----
newback/src/data/database/database.module.ts | 57 +++++++++++++++++
.../src/data/database/model/channel.model.ts | 6 +-
.../src/data/database/model/image.model.ts | 21 ++----
.../database/model/message.history.model.ts | 7 +-
...ge.mention.ts => message.mention.model.ts} | 15 +----
.../src/data/database/model/message.model.ts | 15 +----
newback/src/data/database/model/room.model.ts | 15 +----
.../data/database/model/room.users.model.ts | 22 +------
.../model/subscription.message.model.ts | 26 ++------
.../data/database/model/subscription.model.ts | 21 ++----
.../database/model/uploaded.file.model.ts | 25 ++------
.../data/database/model/user.auth.model.ts | 14 +---
...ined.info.ts => user.joined.info.model.ts} | 22 +------
newback/src/data/database/model/user.model.ts | 7 +-
.../data/database/model/user.profile.model.ts | 14 +---
.../database/model/user.settings.model.ts | 10 +--
.../data/database/model/verification.model.ts | 14 +---
newback/src/data/database/ormconfig.ts | 21 ++++++
newback/yarn.lock | 64 ++++++++++++++++++-
24 files changed, 208 insertions(+), 225 deletions(-)
create mode 100644 newback/.sequelizerc
create mode 100644 newback/config/sequelize.cli.config.js
delete mode 100644 newback/sequelize-cli.config.js
create mode 100644 newback/src/data/database/database.module.ts
rename newback/src/data/database/model/{message.mention.ts => message.mention.model.ts} (77%)
rename newback/src/data/database/model/{user.joined.info.ts => user.joined.info.model.ts} (60%)
create mode 100644 newback/src/data/database/ormconfig.ts
diff --git a/newback/.sequelizerc b/newback/.sequelizerc
new file mode 100644
index 000000000..01f56f0aa
--- /dev/null
+++ b/newback/.sequelizerc
@@ -0,0 +1,7 @@
+const path = require('path');
+
+module.exports = {
+ 'config': './config/sequelize.cli.config.js',
+ 'models-path': path.resolve('src', 'data', 'database', 'model'),
+ 'migrations-path': path.resolve('src', 'data', 'database', 'migration'),
+};
diff --git a/newback/config/default.json b/newback/config/default.json
index f38bc0ea5..aabafbc8c 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -38,12 +38,11 @@
"mysql": {
"synchronize": false,
"logging": true,
- "dialect": "mysql",
"host": "localhost",
"default-character-set": "utf8mb4",
"port": 3306,
"username": "pychat",
"password": "pypass",
- "database": "pychat"
+ "database": "pychat2"
}
}
diff --git a/newback/config/sequelize.cli.config.js b/newback/config/sequelize.cli.config.js
new file mode 100644
index 000000000..b9308f07c
--- /dev/null
+++ b/newback/config/sequelize.cli.config.js
@@ -0,0 +1,13 @@
+const { config: sequelizeCliConfig } = require('node-config-ts');
+
+console.log('as')
+// fucking sequelize-cli hack
+const conf = {
+ ...sequelizeCliConfig.mysql,
+ dialect: 'mysql'
+}
+module.exports = {
+
+ development: conf
+};
+
diff --git a/newback/package.json b/newback/package.json
index b92f6b19f..af404a547 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -37,6 +37,7 @@
"csv-parse": "^5.0.4",
"i": "^0.3.7",
"lines-logger": "^2.1.2",
+ "mysql2": "^2.3.3",
"node-config-ts": "npm:node-config-ts-2",
"npm": "^8.6.0",
"pg": "^8.7.3",
diff --git a/newback/sequelize-cli.config.js b/newback/sequelize-cli.config.js
deleted file mode 100644
index ef327c97f..000000000
--- a/newback/sequelize-cli.config.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const { config: sequelizeCliConfig } = require('node-config-ts');
-
-const { postgres } = sequelizeCliConfig.db;
-
-postgres.password = postgres.password.replace(/\n/g, '');
-
-// fucking sequelize-cli hack
-module.exports = {
- local: postgres,
- development: postgres,
- staging: postgres,
- production: postgres,
-};
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
new file mode 100644
index 000000000..b8aa80a39
--- /dev/null
+++ b/newback/src/data/database/database.module.ts
@@ -0,0 +1,57 @@
+import { Module } from '@nestjs/common';
+import { SequelizeModule } from '@nestjs/sequelize';
+
+import ormconfig from '@/data/database/ormconfig';
+import {ChannelModel} from '@/data/database/model/channel.model';
+import {ImageModel} from '@/data/database/model/image.model';
+import {IpAddressModel} from '@/data/database/model/ip.address.model';
+import {MessageHistoryModel} from '@/data/database/model/message.history.model';
+import {MessageModel} from '@/data/database/model/message.model';
+import {RoomModel} from '@/data/database/model/room.model';
+import {RoomUsersModel} from '@/data/database/model/room.users.model';
+import {MessageMentionModel} from '@/data/database/model/message.mention.model';
+import {SubscriptionMessageModel} from '@/data/database/model/subscription.message.model';
+import {SubscriptionModel} from '@/data/database/model/subscription.model';
+import {UploadedFileModel} from '@/data/database/model/uploaded.file.model';
+import {UserAuthModel} from '@/data/database/model/user.auth.model';
+import {UserJoinedInfoModel} from '@/data/database/model/user.joined.info.model';
+import {UserModel} from '@/data/database/model/user.model';
+import {UserProfileModel} from '@/data/database/model/user.profile.model';
+import {UserSettingsModel} from '@/data/database/model/user.settings.model';
+import {VerificationModel} from '@/data/database/model/verification.model';
+
+const repositories = [
+
+];
+
+@Module({
+ imports: [
+ SequelizeModule.forRoot(ormconfig),
+ SequelizeModule.forFeature([
+ ChannelModel,
+ ImageModel,
+ IpAddressModel,
+ MessageHistoryModel,
+ MessageMentionModel,
+ MessageModel,
+ RoomModel,
+ RoomUsersModel,
+ SubscriptionMessageModel,
+ SubscriptionModel,
+ UploadedFileModel,
+ UserAuthModel,
+ UserJoinedInfoModel,
+ UserModel,
+ UserProfileModel,
+ UserSettingsModel,
+ VerificationModel,
+ ]),
+ ],
+ providers: [...repositories],
+ exports: [
+ SequelizeModule,
+ ...repositories,
+ ],
+})
+export class DatabaseModule {
+}
diff --git a/newback/src/data/database/model/channel.model.ts b/newback/src/data/database/model/channel.model.ts
index a0d1de5a5..cc7b84da2 100644
--- a/newback/src/data/database/model/channel.model.ts
+++ b/newback/src/data/database/model/channel.model.ts
@@ -1,18 +1,16 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'channel', timestamps: true })
+@Table({paranoid: true, tableName: 'channel', timestamps: true})
export class ChannelModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
index 02d0579c4..bfa73fbd1 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/database/model/image.model.ts
@@ -1,30 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
+import {UploadedFileChoices} from '@/data/types/model/db';
@Injectable()
-@Table({ paranoid: true, tableName: 'uploaded_file', timestamps: true })
-export class UploadedFileModel extends Model {
+@Table({paranoid: true, tableName: 'image', timestamps: true})
+export class ImageModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/database/model/message.history.model.ts
index 1c5a8011c..dd5258fe8 100644
--- a/newback/src/data/database/model/message.history.model.ts
+++ b/newback/src/data/database/model/message.history.model.ts
@@ -1,20 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
+import {Injectable} from '@nestjs/common';
import {config} from 'node-config-ts';
import {MessageModel} from '@/data/database/model/message.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'message_history', timestamps: true })
+@Table({paranoid: true, tableName: 'message_history', timestamps: true})
export class MessageHistoryModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/message.mention.ts b/newback/src/data/database/model/message.mention.model.ts
similarity index 77%
rename from newback/src/data/database/model/message.mention.ts
rename to newback/src/data/database/model/message.mention.model.ts
index fe580956d..00deedd31 100644
--- a/newback/src/data/database/model/message.mention.ts
+++ b/newback/src/data/database/model/message.mention.model.ts
@@ -1,31 +1,20 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
@Injectable()
@Table({
paranoid: true,
tableName: 'message_mention',
timestamps: true,
- co
})
-export class MessageMention extends Model {
+export class MessageMentionModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
index 732f5c231..ecc11bfc6 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/database/model/message.model.ts
@@ -1,27 +1,18 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- MessageStatus,
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
+import {MessageStatus,} from '@/data/types/dto/dto';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
import {RoomModel} from '@/data/database/model/room.model';
import {config} from 'node-config-ts';
@Injectable()
-@Table({ paranoid: true, tableName: 'message', timestamps: true })
+@Table({paranoid: true, tableName: 'message', timestamps: true})
export class MessageModel extends Model {
@Column({
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/database/model/room.model.ts
index 0148a8aea..4fac30bfb 100644
--- a/newback/src/data/database/model/room.model.ts
+++ b/newback/src/data/database/model/room.model.ts
@@ -1,23 +1,12 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {VerificationType} from '@/data/types/model/db';
import {ChannelModel} from '@/data/database/model/channel.model';
@@ -36,7 +25,7 @@ import {ChannelModel} from '@/data/database/model/channel.model';
// )
// ]
@Injectable()
-@Table({ paranoid: true, tableName: 'room', timestamps: true })
+@Table({paranoid: true, tableName: 'room', timestamps: true})
export class RoomModel extends Model {
@Column({
diff --git a/newback/src/data/database/model/room.users.model.ts b/newback/src/data/database/model/room.users.model.ts
index 026d45da6..e66b3c681 100644
--- a/newback/src/data/database/model/room.users.model.ts
+++ b/newback/src/data/database/model/room.users.model.ts
@@ -1,33 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- ImageType,
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
-import {MessageModel} from '@/data/database/model/message.model';
import {RoomModel} from '@/data/database/model/room.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'room_user', timestamps: true })
-export class UploadedFileModel extends Model {
+@Table({paranoid: true, tableName: 'room_user', timestamps: true})
+export class RoomUsersModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/database/model/subscription.message.model.ts
index 8069a9dc7..8acf3ea57 100644
--- a/newback/src/data/database/model/subscription.message.model.ts
+++ b/newback/src/data/database/model/subscription.message.model.ts
@@ -1,33 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
-import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- ImageType,
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
+import {Injectable} from '@nestjs/common';
import {MessageModel} from '@/data/database/model/message.model';
-import {RoomModel} from '@/data/database/model/room.model';
+import {SubscriptionModel} from '@/data/database/model/subscription.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'room_user', timestamps: true })
-export class UploadedFileModel extends Model {
+@Table({paranoid: true, tableName: 'room_user', timestamps: true})
+export class SubscriptionMessageModel extends Model {
@Column({
type: DataType.INTEGER,
@@ -38,7 +22,7 @@ export class UploadedFileModel extends Model {
})
public id: number;
- @ForeignKey(() => SubscritionModel)
+ @ForeignKey(() => SubscriptionModel)
@Column({
type: DataType.INTEGER,
allowNull: false,
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
index e0aa75604..7b573d86c 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -1,30 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
+import {UploadedFileChoices} from '@/data/types/model/db';
@Injectable()
-@Table({ paranoid: true, tableName: 'subscription', timestamps: true })
-export class UploadedFileModel extends Model {
+@Table({paranoid: true, tableName: 'subscription', timestamps: true})
+export class SubscriptionModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
index 39bce5114..7e95f0804 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -1,31 +1,16 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
-import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- ImageType,
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
+import {Injectable} from '@nestjs/common';
+import {ImageType} from '@/data/types/model/db';
import {MessageModel} from '@/data/database/model/message.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'uploaded_file', timestamps: true })
+@Table({paranoid: true, tableName: 'uploaded_file', timestamps: true})
export class UploadedFileModel extends Model {
@Column({
@@ -68,13 +53,13 @@ export class UploadedFileModel extends Model {
})
public preview: string;
- @Column({
+ @Column({
type: DataType.STRING,
allowNull: true,
})
public absoluteUrl: string;
- @Column({
+ @Column({
type: DataType.STRING,
allowNull: true,
})
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index 17c04c984..0db046427 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -1,25 +1,15 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
@Injectable()
-@Table({ paranoid: true, tableName: 'user_auth', timestamps: true })
+@Table({paranoid: true, tableName: 'user_auth', timestamps: true})
export class UserAuthModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.joined.info.ts b/newback/src/data/database/model/user.joined.info.model.ts
similarity index 60%
rename from newback/src/data/database/model/user.joined.info.ts
rename to newback/src/data/database/model/user.joined.info.model.ts
index d44433e6a..d0028e479 100644
--- a/newback/src/data/database/model/user.joined.info.ts
+++ b/newback/src/data/database/model/user.joined.info.model.ts
@@ -1,33 +1,17 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
-import {
- ImageType,
- UploadedFileChoices,
- VerificationType
-} from '@/data/types/model/db';
-import {MessageModel} from '@/data/database/model/message.model';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
@Injectable()
-@Table({ paranoid: true, tableName: 'user_joined_info', timestamps: true })
-export class UserJoinedInfo extends Model {
+@Table({paranoid: true, tableName: 'user_joined_info', timestamps: true})
+export class UserJoinedInfoModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index 4e97932db..4457a416a 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -1,19 +1,16 @@
import {
- BelongsTo,
Column,
DataType,
- ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
+import {Injectable} from '@nestjs/common';
import {Gender} from '@/data/types/dto/dto';
import {config} from 'node-config-ts';
@Injectable()
-@Table({ paranoid: true, tableName: 'user', timestamps: true })
+@Table({paranoid: true, tableName: 'user', timestamps: true})
export class UserModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
index e53da66a8..1306dbde4 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -1,25 +1,15 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
@Injectable()
-@Table({ paranoid: true, tableName: 'user_profile', timestamps: true })
+@Table({paranoid: true, tableName: 'user_profile', timestamps: true})
export class UserProfileModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
index ff82be7eb..fde40e6ad 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -1,16 +1,12 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Theme,
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
+import {Theme,} from '@/data/types/dto/dto';
import {UserModel} from '@/data/database/model/user.model';
import {
LogLevel,
@@ -18,7 +14,7 @@ import {
} from 'lines-logger'
@Injectable()
-@Table({ paranoid: true, tableName: 'user_settings', timestamps: true })
+@Table({paranoid: true, tableName: 'user_settings', timestamps: true})
export class UserSettingsModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index c744c87b5..d2a126824 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -1,26 +1,16 @@
import {
- BelongsTo,
Column,
DataType,
ForeignKey,
- HasOne,
Model,
Table,
} from 'sequelize-typescript';
-import { Injectable } from '@nestjs/common';
-import {
- Gender,
- ThemeValues
-} from '@/data/types/dto/dto';
+import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {
- LogLevel,
- logLevels
-} from 'lines-logger'
import {VerificationType} from '@/data/types/model/db';
@Injectable()
-@Table({ paranoid: true, tableName: 'verification', timestamps: true })
+@Table({paranoid: true, tableName: 'verification', timestamps: true})
export class VerificationModel extends Model {
@Column({
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
new file mode 100644
index 000000000..bf9a29233
--- /dev/null
+++ b/newback/src/data/database/ormconfig.ts
@@ -0,0 +1,21 @@
+import { ConsoleLogger } from '@nestjs/common';
+import { SequelizeModuleOptions } from '@nestjs/sequelize';
+import { config } from 'node-config-ts';
+
+const {
+ host, port, username, password, database, logging, synchronize,
+} = config.mysql;
+
+const logger = new ConsoleLogger('sql');
+export const ormconfig: SequelizeModuleOptions = {
+ synchronize,
+ logging: logging ? (sql: string): void => logger.log(sql, 'sql') : false,
+ dialect: 'mysql',
+ host,
+ port,
+ username,
+ password,
+ database,
+ autoLoadModels: true,
+};
+
diff --git a/newback/yarn.lock b/newback/yarn.lock
index c5d0166ae..b3fffa7d9 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -1589,6 +1589,11 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+denque@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
+ integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
+
depd@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -2218,6 +2223,13 @@ gauge@^4.0.0:
strip-ansi "^6.0.1"
wide-align "^1.1.5"
+generate-function@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
+ integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
+ dependencies:
+ is-property "^1.0.2"
+
generic-pool@3.8.2:
version "3.8.2"
resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9"
@@ -2429,7 +2441,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-iconv-lite@^0.6.2:
+iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -2692,6 +2704,11 @@ is-promise@^2.2.2:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+is-property@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+ integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
+
is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@@ -3022,7 +3039,12 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
-lru-cache@^4.1.5:
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+lru-cache@^4.1.3, lru-cache@^4.1.5:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -3030,6 +3052,13 @@ lru-cache@^4.1.5:
pseudomap "^1.0.2"
yallist "^2.1.2"
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
lru-cache@^7.4.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
version "7.8.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747"
@@ -3310,6 +3339,27 @@ mute-stream@0.0.8, mute-stream@~0.0.4:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+mysql2@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0"
+ integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==
+ dependencies:
+ denque "^2.0.1"
+ generate-function "^2.3.1"
+ iconv-lite "^0.6.3"
+ long "^4.0.0"
+ lru-cache "^6.0.0"
+ named-placeholders "^1.1.2"
+ seq-queue "^0.0.5"
+ sqlstring "^2.3.2"
+
+named-placeholders@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8"
+ integrity sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==
+ dependencies:
+ lru-cache "^4.1.3"
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -4303,6 +4353,11 @@ send@0.17.2:
range-parser "~1.2.1"
statuses "~1.5.0"
+seq-queue@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e"
+ integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=
+
sequelize-cli@^6.4.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-6.4.1.tgz#fb9fbbde733ae887970316a700d264fcf0683770"
@@ -4498,6 +4553,11 @@ split2@^4.1.0:
resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809"
integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==
+sqlstring@^2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c"
+ integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==
+
ssri@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
From 3db3d77b00b33dccbab71dec44e34f5a6277f973 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 18:36:28 +0300
Subject: [PATCH 004/221] Fixed db
---
common/dto.ts | 34 +++++++++++---
newback/config/default.json | 3 +-
newback/package.json | 1 +
newback/src/data/database/database.module.ts | 2 +-
.../src/data/database/model/channel.model.ts | 2 +-
.../src/data/database/model/image.model.ts | 45 +++++++++++++++----
.../data/database/model/ip.address.model.ts | 6 +--
.../database/model/message.history.model.ts | 4 +-
.../database/model/message.mention.model.ts | 32 ++++++-------
.../src/data/database/model/message.model.ts | 10 ++++-
newback/src/data/database/model/room.model.ts | 4 +-
.../data/database/model/room.users.model.ts | 7 ++-
.../model/subscription.message.model.ts | 20 ++++-----
.../data/database/model/subscription.model.ts | 7 +--
.../database/model/uploaded.file.model.ts | 40 ++++++-----------
.../data/database/model/user.auth.model.ts | 2 +-
.../database/model/user.joined.info.model.ts | 7 ++-
newback/src/data/database/model/user.model.ts | 7 +--
.../data/database/model/user.profile.model.ts | 2 +-
.../database/model/user.settings.model.ts | 6 +--
.../data/database/model/verification.model.ts | 7 ++-
newback/src/data/database/ormconfig.ts | 12 ++++-
newback/src/data/types/model/db.ts | 21 ---------
newback/src/modules/app/app.module.ts | 4 +-
newback/src/modules/auth/interfaces.ts | 2 +-
newback/yarn.lock | 2 +-
26 files changed, 165 insertions(+), 124 deletions(-)
delete mode 100644 newback/src/data/types/model/db.ts
diff --git a/common/dto.ts b/common/dto.ts
index 64352c8f8..9a73b2bfa 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -3,6 +3,7 @@ export interface LoginRequest {
password: string;
}
+// ISO/IEC 5218 1 male, 2 - female
export enum Gender {
MALE = 'MALE',
FEMALE = 'FEMALE',
@@ -10,12 +11,35 @@ export enum Gender {
}
export enum MessageStatus {
- ON_SERVER = 'ON_SERVER',
+ ON_SERVER = 'ON_SERVER', // uploaded to server
READ = 'READ',
- RECEIVED = 'RECEIVED', //received
+ RECEIVED = 'RECEIVED', //sent
}
export enum Theme {
- COLOR_LOR = 'color-lor',
- COLOR_REG = 'color-reg',
- COLOR_WHITE = 'color-white'
+ COLOR_LOR = 'COLOR_LOR',
+ COLOR_REG = 'COLOR_REG',
+ COLOR_WHITE = 'COLOR_WHITE'
+}
+
+
+export enum VerificationType {
+ REGISTER = 'REGISTER',
+ PASSWORD = ' PASSWORD = \'p\',\n',
+ EMAIL = 'EMAIL',
+ CONFIRM_EMAIL = 'CONFIRM_EMAIL',
+}
+
+export enum ImageType {
+ VIDEO = 'VIDEO',
+ IMAGE = 'IMAGE',
+ GIPHY= 'GIPHY'
+}
+export enum UploadedFileChoices {
+ VIDEO = 'VIDEO',
+ FILE = 'FILE',
+ MEDIA_RECORD= 'MEDIA_RECORD',
+ AUDIO_RECORD = 'AUDIO_RECORD',
+ IMAGE = 'IMAGE',
+ PREVIEW = 'PREVIEW',
+ ISSUE = 'ISSUE'
}
diff --git a/newback/config/default.json b/newback/config/default.json
index aabafbc8c..d26f6a301 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -36,10 +36,9 @@
}
},
"mysql": {
- "synchronize": false,
+ "synchronize": true,
"logging": true,
"host": "localhost",
- "default-character-set": "utf8mb4",
"port": 3306,
"username": "pychat",
"password": "pypass",
diff --git a/newback/package.json b/newback/package.json
index af404a547..af61780d0 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -43,6 +43,7 @@
"pg": "^8.7.3",
"redis": "^4.0.6",
"reflect-metadata": "^0.1.13",
+ "rxjs": "^7",
"sequelize": "^6.18.0",
"sequelize-typescript": "^2.1.3",
"swagger-ui-express": "^4.3.0"
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
index b8aa80a39..3be0c8857 100644
--- a/newback/src/data/database/database.module.ts
+++ b/newback/src/data/database/database.module.ts
@@ -1,7 +1,7 @@
import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
-import ormconfig from '@/data/database/ormconfig';
+import {ormconfig } from '@/data/database/ormconfig';
import {ChannelModel} from '@/data/database/model/channel.model';
import {ImageModel} from '@/data/database/model/image.model';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
diff --git a/newback/src/data/database/model/channel.model.ts b/newback/src/data/database/model/channel.model.ts
index cc7b84da2..a7738fd3d 100644
--- a/newback/src/data/database/model/channel.model.ts
+++ b/newback/src/data/database/model/channel.model.ts
@@ -10,7 +10,7 @@ import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({paranoid: true, tableName: 'channel', timestamps: true})
+@Table({tableName: 'channel'})
export class ChannelModel extends Model {
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
index bfa73fbd1..c76e2751b 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/database/model/image.model.ts
@@ -4,15 +4,24 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {UploadedFileChoices} from '@/data/types/model/db';
+import {
+ ImageType,
+ UploadedFileChoices
+} from '@/data/types/dto/dto';
+import {MessageModel} from '@/data/database/model/message.model';
+
+const uniqueUserIdSymbMess = 'unique_image_symbol_message';
+
@Injectable()
-@Table({paranoid: true, tableName: 'image', timestamps: true})
+@Table({ tableName: 'image'})
export class ImageModel extends Model {
+
@Column({
type: DataType.INTEGER,
allowNull: false,
@@ -23,27 +32,47 @@ export class ImageModel extends Model {
public id: number;
@Column({
- type: DataType.ENUM(...Object.keys(UploadedFileChoices)),
+ type: DataType.ENUM(...Object.keys(ImageType)),
allowNull: false,
})
- public type: UploadedFileChoices;
+ public type: ImageType;
+ @Unique(uniqueUserIdSymbMess)
@Column({
type: DataType.STRING(1),
allowNull: false,
})
public symbol: string;
- @ForeignKey(() => UserModel)
+ @Unique(uniqueUserIdSymbMess)
+ @ForeignKey(() => MessageModel)
@Column({
type: DataType.INTEGER,
allowNull: false,
})
- public userId: number;
+ public messageId: number;
@Column({
type: DataType.STRING,
- allowNull: false,
+ allowNull: true,
+ })
+ public img: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public preview: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
+ })
+ public absoluteUrl: string;
+
+ @Column({
+ type: DataType.STRING,
+ allowNull: true,
})
- public file: string;
+ public webpAsboluteUrl: string;
}
diff --git a/newback/src/data/database/model/ip.address.model.ts b/newback/src/data/database/model/ip.address.model.ts
index 5996a783d..75297b8eb 100644
--- a/newback/src/data/database/model/ip.address.model.ts
+++ b/newback/src/data/database/model/ip.address.model.ts
@@ -7,7 +7,7 @@ import {
import {Injectable} from '@nestjs/common';
@Injectable()
-@Table({paranoid: true, tableName: 'ip_address', timestamps: true})
+@Table({tableName: 'ip_address'})
export class IpAddressModel extends Model {
@Column({
@@ -57,12 +57,12 @@ export class IpAddressModel extends Model {
public city: string;
@Column({
- type: DataType.FLOAT,
+ type: DataType.DOUBLE,
allowNull: true,
})
public lat: number;
@Column({
- type: DataType.FLOAT,
+ type: DataType.DOUBLE,
allowNull: true,
})
public lon: number;
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/database/model/message.history.model.ts
index dd5258fe8..480fadf30 100644
--- a/newback/src/data/database/model/message.history.model.ts
+++ b/newback/src/data/database/model/message.history.model.ts
@@ -11,7 +11,7 @@ import {MessageModel} from '@/data/database/model/message.model';
@Injectable()
-@Table({paranoid: true, tableName: 'message_history', timestamps: true})
+@Table({tableName: 'message_history'})
export class MessageHistoryModel extends Model {
@Column({
type: DataType.INTEGER,
@@ -37,7 +37,7 @@ export class MessageHistoryModel extends Model {
public time: Date;
@Column({
- type: DataType.STRING(config.frontend.maxMessageSize),
+ type: DataType.TEXT('long'),
allowNull: false,
})
public content: string;
diff --git a/newback/src/data/database/model/message.mention.model.ts b/newback/src/data/database/model/message.mention.model.ts
index 00deedd31..856ae7ad0 100644
--- a/newback/src/data/database/model/message.mention.model.ts
+++ b/newback/src/data/database/model/message.mention.model.ts
@@ -4,15 +4,17 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
+import {MessageModel} from '@/data/database/model/message.model';
+
+const uniqueUserIdSymbMess = 'unique_message_mention_user_id_symbol_message_id';
@Injectable()
@Table({
- paranoid: true,
tableName: 'message_mention',
- timestamps: true,
})
export class MessageMentionModel extends Model {
@@ -25,33 +27,25 @@ export class MessageMentionModel extends Model {
public id: number;
@ForeignKey(() => UserModel)
+ @Unique(uniqueUserIdSymbMess)
@Column({
type: DataType.INTEGER,
allowNull: false
})
public userId: string;
+ @ForeignKey(() => MessageModel)
+ @Unique(uniqueUserIdSymbMess)
@Column({
- type: DataType.STRING(1),
+ type: DataType.INTEGER,
allowNull: false
})
- public symbol: string;
-
- @Column({
- type: DataType.STRING(30),
- allowNull: true
- })
- public surname: string;
+ public messageId: string;
+ @Unique(uniqueUserIdSymbMess)
@Column({
- type: DataType.DATE,
- allowNull: false,
- })
- public birthday: Date;
-
- @Column({
- type: DataType.STRING(100),
- allowNull: true
+ type: DataType.STRING(1),
+ allowNull: false
})
- public contacts: string;
+ public symbol: string;
}
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
index ecc11bfc6..45b4c611d 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/database/model/message.model.ts
@@ -12,7 +12,7 @@ import {RoomModel} from '@/data/database/model/room.model';
import {config} from 'node-config-ts';
@Injectable()
-@Table({paranoid: true, tableName: 'message', timestamps: true})
+@Table({ tableName: 'message'})
export class MessageModel extends Model {
@Column({
@@ -46,11 +46,17 @@ export class MessageModel extends Model {
public time: Date;
@Column({
- type: DataType.STRING(config.frontend.maxMessageSize),
+ type: DataType.TEXT('long'),
allowNull: true,
})
public content: string;
+ @Column({
+ type: DataType.STRING(255),
+ allowNull: true,
+ })
+ public giphy: string;
+
@Column({
type: DataType.STRING(1),
allowNull: true,
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/database/model/room.model.ts
index 4fac30bfb..3d7b78767 100644
--- a/newback/src/data/database/model/room.model.ts
+++ b/newback/src/data/database/model/room.model.ts
@@ -25,7 +25,7 @@ import {ChannelModel} from '@/data/database/model/channel.model';
// )
// ]
@Injectable()
-@Table({paranoid: true, tableName: 'room', timestamps: true})
+@Table({ tableName: 'room'})
export class RoomModel extends Model {
@Column({
@@ -40,7 +40,7 @@ export class RoomModel extends Model {
@Column({
type: DataType.STRING(16),
- allowNull: false,
+ allowNull: true,
})
public name: string;
diff --git a/newback/src/data/database/model/room.users.model.ts b/newback/src/data/database/model/room.users.model.ts
index e66b3c681..b8291ae33 100644
--- a/newback/src/data/database/model/room.users.model.ts
+++ b/newback/src/data/database/model/room.users.model.ts
@@ -4,13 +4,16 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
import {RoomModel} from '@/data/database/model/room.model';
+const uniqueRoomUser = 'unique_room_user_room_id_user_id';
+
@Injectable()
-@Table({paranoid: true, tableName: 'room_user', timestamps: true})
+@Table({tableName: 'room_user'})
export class RoomUsersModel extends Model {
@Column({
@@ -22,6 +25,7 @@ export class RoomUsersModel extends Model {
})
public id: number;
+ @Unique(uniqueRoomUser)
@ForeignKey(() => RoomModel)
@Column({
type: DataType.INTEGER,
@@ -29,6 +33,7 @@ export class RoomUsersModel extends Model {
})
public roomId: number;
+ @Unique(uniqueRoomUser)
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/database/model/subscription.message.model.ts
index 8acf3ea57..2593fc8f1 100644
--- a/newback/src/data/database/model/subscription.message.model.ts
+++ b/newback/src/data/database/model/subscription.message.model.ts
@@ -4,13 +4,16 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {MessageModel} from '@/data/database/model/message.model';
import {SubscriptionModel} from '@/data/database/model/subscription.model';
+const uniqueSubscriptionMessage = 'unique_subscription_message_subscription_id_message_id';
+
@Injectable()
-@Table({paranoid: true, tableName: 'room_user', timestamps: true})
+@Table({tableName: 'subscription_message'})
export class SubscriptionMessageModel extends Model {
@Column({
@@ -22,6 +25,7 @@ export class SubscriptionMessageModel extends Model {
})
public id: number;
+ @Unique(uniqueSubscriptionMessage)
@ForeignKey(() => SubscriptionModel)
@Column({
type: DataType.INTEGER,
@@ -29,6 +33,7 @@ export class SubscriptionMessageModel extends Model {
})
public subscriptionId: number;
+ @Unique(uniqueSubscriptionMessage)
@ForeignKey(() => MessageModel)
@Column({
type: DataType.INTEGER,
@@ -36,19 +41,12 @@ export class SubscriptionMessageModel extends Model {
})
public messageId: number;
- @Column({
- type: DataType.INTEGER,
- defaultValue: 2,
- allowNull: false,
- })
- public volume: number;
-
-
@Column({
type: DataType.BOOLEAN,
- defaultValue: true,
+ defaultValue: false,
allowNull: false,
})
- public notifications: boolean;
+ public received: boolean;
+
}
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
index 7b573d86c..7de1ff53d 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -7,10 +7,11 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {UploadedFileChoices} from '@/data/types/model/db';
+import {UploadedFileChoices} from '@/data/types/dto/dto';
+import {IpAddressModel} from '@/data/database/model/ip.address.model';
@Injectable()
-@Table({paranoid: true, tableName: 'subscription', timestamps: true})
+@Table({tableName: 'subscription'})
export class SubscriptionModel extends Model {
@Column({
@@ -50,7 +51,7 @@ export class SubscriptionModel extends Model {
})
public isMobile: boolean;
- @ForeignKey(() => IpAdressModel)
+ @ForeignKey(() => IpAddressModel)
@Column({
type: DataType.INTEGER,
allowNull: true,
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
index 7e95f0804..7f042f716 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -4,15 +4,21 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {ImageType} from '@/data/types/model/db';
+import {
+ ImageType,
+ UploadedFileChoices
+} from '@/data/types/dto/dto';
import {MessageModel} from '@/data/database/model/message.model';
+import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({paranoid: true, tableName: 'uploaded_file', timestamps: true})
+@Table({tableName: 'uploaded_file'})
export class UploadedFileModel extends Model {
+
@Column({
type: DataType.INTEGER,
allowNull: false,
@@ -23,10 +29,10 @@ export class UploadedFileModel extends Model {
public id: number;
@Column({
- type: DataType.ENUM(...Object.keys(ImageType)),
+ type: DataType.ENUM(...Object.keys(UploadedFileChoices)),
allowNull: false,
})
- public type: ImageType;
+ public type: UploadedFileChoices;
@Column({
type: DataType.STRING(1),
@@ -34,34 +40,16 @@ export class UploadedFileModel extends Model {
})
public symbol: string;
- @ForeignKey(() => MessageModel)
+ @ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
allowNull: false,
})
- public messageId: number;
-
- @Column({
- type: DataType.STRING,
- allowNull: true,
- })
- public img: string;
+ public userId: number;
@Column({
type: DataType.STRING,
- allowNull: true,
- })
- public preview: string;
-
- @Column({
- type: DataType.STRING,
- allowNull: true,
- })
- public absoluteUrl: string;
-
- @Column({
- type: DataType.STRING,
- allowNull: true,
+ allowNull: false,
})
- public webpAsboluteUrl: string;
+ public file: string;
}
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index 0db046427..bd581bd0d 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -9,7 +9,7 @@ import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({paranoid: true, tableName: 'user_auth', timestamps: true})
+@Table({ tableName: 'user_auth'})
export class UserAuthModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.joined.info.model.ts b/newback/src/data/database/model/user.joined.info.model.ts
index d0028e479..0620f1b71 100644
--- a/newback/src/data/database/model/user.joined.info.model.ts
+++ b/newback/src/data/database/model/user.joined.info.model.ts
@@ -4,13 +4,16 @@ import {
ForeignKey,
Model,
Table,
+ Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
+const uniqueUserJoinedInfoUserIdIpId = 'unique_user_joined_info_user_id_ip_id';
+
@Injectable()
-@Table({paranoid: true, tableName: 'user_joined_info', timestamps: true})
+@Table({tableName: 'user_joined_info'})
export class UserJoinedInfoModel extends Model {
@Column({
@@ -22,6 +25,7 @@ export class UserJoinedInfoModel extends Model {
})
public id: number;
+ @Unique(uniqueUserJoinedInfoUserIdIpId)
@ForeignKey(() => IpAddressModel)
@Column({
type: DataType.INTEGER,
@@ -29,6 +33,7 @@ export class UserJoinedInfoModel extends Model {
})
public ipId: number;
+ @Unique(uniqueUserJoinedInfoUserIdIpId)
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index 4457a416a..d041810dd 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -10,7 +10,7 @@ import {config} from 'node-config-ts';
@Injectable()
-@Table({paranoid: true, tableName: 'user', timestamps: true})
+@Table({tableName: 'user'})
export class UserModel extends Model {
@Column({
type: DataType.INTEGER,
@@ -25,7 +25,7 @@ export class UserModel extends Model {
type: DataType.DATE,
allowNull: false,
})
- public lastLogin: Date;
+ public lastTimeOnline: Date;
@Column({
allowNull: false,
@@ -37,12 +37,13 @@ export class UserModel extends Model {
@Column({
type: DataType.ENUM(...Object.keys(Gender)),
allowNull: false,
- defaultValue: Gender.OTHER,
+ defaultValue: Gender.OTHER.valueOf(),
})
public sex: Gender;
@Column({
allowNull: true,
+ type: DataType.STRING(100),
defaultValue: null,
})
public thumbnail: string;
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
index 1306dbde4..7a2d94015 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -9,7 +9,7 @@ import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({paranoid: true, tableName: 'user_profile', timestamps: true})
+@Table({ tableName: 'user_profile'})
export class UserProfileModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
index fde40e6ad..3a25884e5 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -14,7 +14,7 @@ import {
} from 'lines-logger'
@Injectable()
-@Table({paranoid: true, tableName: 'user_settings', timestamps: true})
+@Table({ tableName: 'user_settings'})
export class UserSettingsModel extends Model {
@ForeignKey(() => UserModel)
@@ -85,7 +85,7 @@ export class UserSettingsModel extends Model {
@Column({
type: DataType.ENUM(...Object.keys(Theme)),
allowNull: false,
- defaultValue: true,
+ defaultValue: Theme.COLOR_REG.valueOf(),
})
- public theme: boolean;
+ public theme: Theme;
}
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index d2a126824..a17201aff 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -7,10 +7,10 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {VerificationType} from '@/data/types/model/db';
+import {VerificationType} from '@/data/types/dto/dto';
@Injectable()
-@Table({paranoid: true, tableName: 'verification', timestamps: true})
+@Table({ tableName: 'verification'})
export class VerificationModel extends Model {
@Column({
@@ -52,13 +52,12 @@ export class VerificationModel extends Model {
allowNull: false,
defaultValue: false,
})
- public verified: Date;
+ public verified: boolean;
@Column({
type: DataType.STRING(190),
allowNull: true,
unique: false,
- defaultValue: false,
})
public email: string;
}
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index bf9a29233..487e42019 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -9,7 +9,10 @@ const {
const logger = new ConsoleLogger('sql');
export const ormconfig: SequelizeModuleOptions = {
synchronize,
- logging: logging ? (sql: string): void => logger.log(sql, 'sql') : false,
+ sync: {
+ force: true,
+ },
+ logging: logging ? (sql: string): void => logger.debug(sql) : false,
dialect: 'mysql',
host,
port,
@@ -17,5 +20,12 @@ export const ormconfig: SequelizeModuleOptions = {
password,
database,
autoLoadModels: true,
+ define: {
+ charset: 'utf8mb4',
+ paranoid: true,
+ timestamps: true,
+ freezeTableName: true,
+ underscored: true,
+ }
};
diff --git a/newback/src/data/types/model/db.ts b/newback/src/data/types/model/db.ts
deleted file mode 100644
index 027d880d7..000000000
--- a/newback/src/data/types/model/db.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-export enum VerificationType {
- REGISTER = 'REGISTER',
- PASSWORD = 'PASSWORD',
- EMAIL = 'EMAIL',
- CONFIRM_EMAIL = 'CONFIRM_EMAIL',
-}
-
-export enum ImageType {
- VIDEO = 'v',
- IMAGE = 'i',
- GIPHY= 'g'
-}
-export enum UploadedFileChoices {
- VIDEO = 'V',
- FILE = 'F',
- MEDIA_RECORD= 'M',
- AUDIO_RECORD = 'A',
- IMAGE = 'I',
- PREVIEW = 'P',
- ISSUE = 'S'
-}
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index e3ecbd4f7..d16cddd31 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -2,8 +2,10 @@ import {
Module
} from '@nestjs/common';
import {AuthModule} from '@/modules/auth/auth.module';
+import {DatabaseModule} from '@/data/database/database.module';
@Module({
- imports: [AuthModule],
+ imports: [AuthModule, DatabaseModule],
+ exports: [DatabaseModule]
})
export class AppModule {}
diff --git a/newback/src/modules/auth/interfaces.ts b/newback/src/modules/auth/interfaces.ts
index 074e4b59b..c57790ebf 100644
--- a/newback/src/modules/auth/interfaces.ts
+++ b/newback/src/modules/auth/interfaces.ts
@@ -3,7 +3,7 @@ import {
Length,
Matches,
} from 'class-validator';
-import {LoginRequest} from '@/types/frontend/dto';
+import {LoginRequest} from '@/data/types/dto/dto';
import {config} from 'node-config-ts';
export default class LoginRequestValidator implements LoginRequest {
diff --git a/newback/yarn.lock b/newback/yarn.lock
index b3fffa7d9..830a06fed 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -4291,7 +4291,7 @@ rxjs@6.6.7, rxjs@^6.6.0:
dependencies:
tslib "^1.9.0"
-rxjs@^7.2.0:
+rxjs@^7, rxjs@^7.2.0:
version "7.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f"
integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==
From c13df0203058dc56820723d3de77309a589604d1 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 19:35:20 +0300
Subject: [PATCH 005/221] Fix
---
newback/config/default.json | 6 +-
newback/config/sequelize.cli.config.js | 9 +-
newback/package.json | 2 +
newback/src/data/database/ormconfig.ts | 54 ++++---
newback/yarn.lock | 200 +++++++++++++++++++++++--
5 files changed, 223 insertions(+), 48 deletions(-)
diff --git a/newback/config/default.json b/newback/config/default.json
index d26f6a301..8f309b304 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -3,7 +3,7 @@
"application": {
"env": "default",
"port": 8889,
- "logLevel": "log",
+ "logLevel": "debug",
"logOutput": "text",
"crtPath": "../frontend/build/certs/server.crt.pem",
"keyPath": "../frontend/build/certs/private.key.pem"
@@ -20,7 +20,7 @@
"clientNoServerPingCloseTimeout": 320000
},
"redis": {
- "host": "localhos",
+ "host": "localhost",
"port": 6379,
"database": 0
},
@@ -36,7 +36,7 @@
}
},
"mysql": {
- "synchronize": true,
+ "synchronize": false,
"logging": true,
"host": "localhost",
"port": 3306,
diff --git a/newback/config/sequelize.cli.config.js b/newback/config/sequelize.cli.config.js
index b9308f07c..388895c46 100644
--- a/newback/config/sequelize.cli.config.js
+++ b/newback/config/sequelize.cli.config.js
@@ -1,13 +1,8 @@
-const { config: sequelizeCliConfig } = require('node-config-ts');
+const {generateConfig} = require('../src/data/database/ormconfig');
-console.log('as')
// fucking sequelize-cli hack
-const conf = {
- ...sequelizeCliConfig.mysql,
- dialect: 'mysql'
-}
+const conf = generateConfig((sql) => console.log(sql));
module.exports = {
-
development: conf
};
diff --git a/newback/package.json b/newback/package.json
index af61780d0..a39682806 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -5,6 +5,7 @@
"repository": "https://github.com/akoidan/pychat",
"license": "MIT",
"scripts": {
+ "makemigrations": " ./node_modules/.bin/ts-node -r tsconfig-paths/register ./node_modules/.bin/makemigration",
"generate-configs": "node-config-ts",
"prebuild": "rimraf dist",
"build": "nest build",
@@ -45,6 +46,7 @@
"reflect-metadata": "^0.1.13",
"rxjs": "^7",
"sequelize": "^6.18.0",
+ "sequelize-auto-migrations": "^1.0.3",
"sequelize-typescript": "^2.1.3",
"swagger-ui-express": "^4.3.0"
},
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index 487e42019..251556b7b 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -1,31 +1,29 @@
-import { ConsoleLogger } from '@nestjs/common';
-import { SequelizeModuleOptions } from '@nestjs/sequelize';
-import { config } from 'node-config-ts';
+import type {SequelizeModuleOptions} from '@nestjs/sequelize';
+import {config} from 'node-config-ts';
-const {
- host, port, username, password, database, logging, synchronize,
-} = config.mysql;
-const logger = new ConsoleLogger('sql');
-export const ormconfig: SequelizeModuleOptions = {
- synchronize,
- sync: {
- force: true,
- },
- logging: logging ? (sql: string): void => logger.debug(sql) : false,
- dialect: 'mysql',
- host,
- port,
- username,
- password,
- database,
- autoLoadModels: true,
- define: {
- charset: 'utf8mb4',
- paranoid: true,
- timestamps: true,
- freezeTableName: true,
- underscored: true,
- }
-};
+export function generateConfig(logging: ((sql: string) => void)): SequelizeModuleOptions {
+ return {
+ synchronize: config.mysql.synchronize,
+ sync: {
+ force: true,
+ },
+ logging: config.mysql.logging ? logging : false,
+ dialect: 'mysql',
+ host: config.mysql.host,
+ port: config.mysql.port,
+ username: config.mysql.username,
+ password: config.mysql.password,
+ database: config.mysql.database,
+ autoLoadModels: true,
+ define: {
+ collate: 'utf8mb4_general_ci',
+ charset: 'utf8mb4',
+ paranoid: true,
+ timestamps: true,
+ freezeTableName: true,
+ underscored: true,
+ }
+ };
+}
diff --git a/newback/yarn.lock b/newback/yarn.lock
index 830a06fed..b96bfc4be 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -541,6 +541,16 @@
"@types/qs" "*"
"@types/serve-static" "*"
+"@types/geojson@^1.0.0":
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf"
+ integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==
+
+"@types/geojson@^7946.0.0 || ^1.0.0":
+ version "7946.0.8"
+ resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca"
+ integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==
+
"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@@ -1001,6 +1011,11 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+array-back@^3.0.1, array-back@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
+ integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
+
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -1027,6 +1042,13 @@ asap@^2.0.0:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+async@^2.5.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
at-least-node@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
@@ -1075,7 +1097,7 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
-bluebird@^3.7.2:
+bluebird@^3.4.6, bluebird@^3.5.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==
@@ -1366,6 +1388,14 @@ clone@^1.0.2:
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+cls-bluebird@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee"
+ integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=
+ dependencies:
+ is-bluebird "^1.0.2"
+ shimmer "^1.1.0"
+
cluster-key-slot@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
@@ -1420,6 +1450,16 @@ columnify@^1.6.0:
strip-ansi "^6.0.1"
wcwidth "^1.0.0"
+command-line-args@^5.0.2:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
+ integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
+ dependencies:
+ array-back "^3.1.0"
+ find-replace "^3.0.0"
+ lodash.camelcase "^4.3.0"
+ typical "^4.0.0"
+
commander@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
@@ -1450,7 +1490,7 @@ concat-stream@^1.5.2:
readable-stream "^2.2.2"
typedarray "^0.0.6"
-config-chain@^1.1.12:
+config-chain@^1.1.12, config-chain@^1.1.13:
version "1.1.13"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
@@ -1541,7 +1581,7 @@ d@1, d@^1.0.1:
es5-ext "^0.10.50"
type "^1.0.1"
-debug@2.6.9:
+debug@2.6.9, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -1555,11 +1595,23 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
dependencies:
ms "2.1.2"
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
+deep-diff@^0.3.8:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
+ integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -1599,7 +1651,7 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-depd@^1.1.2, depd@~1.1.2:
+depd@^1.1.0, depd@^1.1.2, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
@@ -1654,7 +1706,7 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-dottie@^2.0.2:
+dottie@^2.0.0, dottie@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154"
integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==
@@ -2113,6 +2165,13 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
+find-replace@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
+ integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
+ dependencies:
+ array-back "^3.0.1"
+
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -2230,6 +2289,11 @@ generate-function@^2.3.1:
dependencies:
is-property "^1.0.2"
+generic-pool@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.5.0.tgz#acac4fd743a175ff20574f380910036464cb61f7"
+ integrity sha512-dEkxmX+egB2o4NR80c/q+xzLLzLX+k68/K8xv81XprD+Sk7ZtP14VugeCz+fUwv5FzpWq40pPtAkzPRqT8ka9w==
+
generic-pool@3.8.2:
version "3.8.2"
resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9"
@@ -2488,6 +2552,11 @@ infer-owner@^1.0.4:
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+inflection@1.12.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
+ integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=
+
inflection@^1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.2.tgz#15e8c797c6c3dadf31aa658f8df8a4ea024798b0"
@@ -2621,6 +2690,11 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
+is-bluebird@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2"
+ integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=
+
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
@@ -2794,6 +2868,16 @@ js-beautify@^1.14.0:
glob "^7.1.3"
nopt "^5.0.0"
+js-beautify@^1.8.9:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.3.tgz#3dd11c949178de7f3bdf3f6f752778d3bed95150"
+ integrity sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==
+ dependencies:
+ config-chain "^1.1.13"
+ editorconfig "^0.15.3"
+ glob "^7.1.3"
+ nopt "^5.0.0"
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3021,12 +3105,17 @@ loader-runner@^4.2.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21:
+lodash@4.17.21, lodash@^4.17.1, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -3293,14 +3382,14 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-moment-timezone@^0.5.34:
+moment-timezone@^0.5.14, moment-timezone@^0.5.34:
version "0.5.34"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c"
integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==
dependencies:
moment ">= 2.9.0"
-"moment@>= 2.9.0", moment@^2.29.1:
+"moment@>= 2.9.0", moment@^2.20.0, moment@^2.29.1:
version "2.29.2"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
@@ -3315,7 +3404,7 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@2.1.3, ms@^2.0.0, ms@^2.1.2:
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -3640,6 +3729,11 @@ object-hash@3.0.0:
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+object-hash@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+ integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
+
object-inspect@^1.12.0, object-inspect@^1.9.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
@@ -4250,6 +4344,14 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
+retry-as-promised@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7"
+ integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=
+ dependencies:
+ bluebird "^3.4.6"
+ debug "^2.6.9"
+
retry-as-promised@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-5.0.0.tgz#f4ecc25133603a2d2a7aff4a128691d7bc506d54"
@@ -4322,7 +4424,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
-semver@^5.6.0:
+semver@^5.5.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==
@@ -4358,6 +4460,19 @@ seq-queue@^0.0.5:
resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e"
integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=
+sequelize-auto-migrations@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sequelize-auto-migrations/-/sequelize-auto-migrations-1.0.3.tgz#558a370265c533d8c92f5156f813c5a9b21a09ab"
+ integrity sha512-CTh8073gqrthit5xl/ls2lKPzUHzRP/GCY8z99+dlu27oOSmSiFv+NcNHJjmfZvLBSzfif8Nwp3FNtph09Gxew==
+ dependencies:
+ async "^2.5.1"
+ command-line-args "^5.0.2"
+ deep-diff "^0.3.8"
+ js-beautify "^1.8.9"
+ lodash "^4.17.11"
+ object-hash "^1.3.1"
+ sequelize "^4.42.0"
+
sequelize-cli@^6.4.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-6.4.1.tgz#fb9fbbde733ae887970316a700d264fcf0683770"
@@ -4383,6 +4498,29 @@ sequelize-typescript@^2.1.3:
dependencies:
glob "7.2.0"
+sequelize@^4.42.0:
+ version "4.44.4"
+ resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.44.4.tgz#9607eaa3e59080d27d8b17481d2e449e87e58f18"
+ integrity sha512-nkHmYkbwQK7uwpgW9VBalCBnQqQ8mslTdgcBthtJLORuPvAYRPlfkXZMVUU9TLLJt9CX+/y0MYg0DpcP6ywsEQ==
+ dependencies:
+ bluebird "^3.5.0"
+ cls-bluebird "^2.1.0"
+ debug "^3.1.0"
+ depd "^1.1.0"
+ dottie "^2.0.0"
+ generic-pool "3.5.0"
+ inflection "1.12.0"
+ lodash "^4.17.1"
+ moment "^2.20.0"
+ moment-timezone "^0.5.14"
+ retry-as-promised "^2.3.2"
+ semver "^5.5.0"
+ terraformer-wkt-parser "^1.1.2"
+ toposort-class "^1.0.1"
+ uuid "^3.2.1"
+ validator "^10.4.0"
+ wkx "^0.4.1"
+
sequelize@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.18.0.tgz#0e99e0c07ee144eb456374a56e2bd501634c3d16"
@@ -4453,6 +4591,11 @@ shelljs@0.8.5:
interpret "^1.0.0"
rechoir "^0.6.2"
+shimmer@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
+ integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
+
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -4762,6 +4905,21 @@ tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
+terraformer-wkt-parser@^1.1.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.1.tgz#8041e2aeb0c9f2b4cbbec8ec2c5c00c45ddfee02"
+ integrity sha512-+CJyNLWb3lJ9RsZMTM66BY0MT3yIo4l4l22Jd9CrZuwzk54fsu4Sc7zejuS9fCITTuTQy3p06d4MZMVI7v5wSg==
+ dependencies:
+ "@types/geojson" "^1.0.0"
+ terraformer "~1.0.5"
+
+terraformer@~1.0.5:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.12.tgz#39e08f9c753606421acce02e122440c72dfa12d3"
+ integrity sha512-MokUp0+MFal4CmJDVL6VAO1bKegeXcBM2RnPVfqcFIp2IIv8EbPAjG0j/vEy/vuKB8NVMMSF2vfpVS/QLe4DBg==
+ optionalDependencies:
+ "@types/geojson" "^7946.0.0 || ^1.0.0"
+
terser-webpack-plugin@^5.1.3:
version "5.3.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
@@ -4965,6 +5123,11 @@ typescript@^4.6.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+typical@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
+ integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
+
umzug@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.3.0.tgz#0ef42b62df54e216b05dcaf627830a6a8b84a184"
@@ -5028,6 +5191,11 @@ uuid@8.3.2, uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+uuid@^3.2.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
v8-compile-cache-lib@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
@@ -5053,6 +5221,11 @@ validate-npm-package-name@^4.0.0:
dependencies:
builtins "^5.0.0"
+validator@^10.4.0:
+ version "10.11.0"
+ resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"
+ integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==
+
validator@^13.7.0:
version "13.7.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
@@ -5168,6 +5341,13 @@ windows-release@^4.0.0:
dependencies:
execa "^4.0.2"
+wkx@^0.4.1:
+ version "0.4.8"
+ resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003"
+ integrity sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==
+ dependencies:
+ "@types/node" "*"
+
wkx@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"
From 62e355bee7fa278a9470d9053417b8075ca1fd61 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 21:55:35 +0300
Subject: [PATCH 006/221] Remove redundant modules
---
newback/.sequelizerc | 7 -
newback/config/Config.d.ts | 2 -
newback/config/default.json | 2 +-
newback/config/sequelize.cli.config.js | 8 -
newback/package.json | 24 +-
newback/src/common/decorators/validators.ts | 0
newback/src/data/database/database.module.ts | 20 +-
newback/src/data/database/ormconfig.ts | 4 -
newback/src/migration.runner.ts | 15 +
newback/src/modules/auth/auth.module.ts | 2 +-
newback/src/modules/auth/interfaces.ts | 2 +-
newback/src/modules/logger/logger.module.ts | 10 +
newback/test.sql | 239 ++++++++++
newback/yarn.lock | 467 +------------------
14 files changed, 306 insertions(+), 496 deletions(-)
delete mode 100644 newback/.sequelizerc
delete mode 100644 newback/config/sequelize.cli.config.js
delete mode 100644 newback/src/common/decorators/validators.ts
create mode 100644 newback/src/migration.runner.ts
create mode 100644 newback/src/modules/logger/logger.module.ts
create mode 100644 newback/test.sql
diff --git a/newback/.sequelizerc b/newback/.sequelizerc
deleted file mode 100644
index 01f56f0aa..000000000
--- a/newback/.sequelizerc
+++ /dev/null
@@ -1,7 +0,0 @@
-const path = require('path');
-
-module.exports = {
- 'config': './config/sequelize.cli.config.js',
- 'models-path': path.resolve('src', 'data', 'database', 'model'),
- 'migrations-path': path.resolve('src', 'data', 'database', 'migration'),
-};
diff --git a/newback/config/Config.d.ts b/newback/config/Config.d.ts
index 59f8a250c..c4c675df6 100644
--- a/newback/config/Config.d.ts
+++ b/newback/config/Config.d.ts
@@ -12,9 +12,7 @@ declare module "node-config-ts" {
interface Mysql {
synchronize: boolean
logging: boolean
- dialect: string
host: string
- "default-character-set": string
port: number
username: string
password: string
diff --git a/newback/config/default.json b/newback/config/default.json
index 8f309b304..c4dfa7eae 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -36,7 +36,7 @@
}
},
"mysql": {
- "synchronize": false,
+ "synchronize": true,
"logging": true,
"host": "localhost",
"port": 3306,
diff --git a/newback/config/sequelize.cli.config.js b/newback/config/sequelize.cli.config.js
deleted file mode 100644
index 388895c46..000000000
--- a/newback/config/sequelize.cli.config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const {generateConfig} = require('../src/data/database/ormconfig');
-
-// fucking sequelize-cli hack
-const conf = generateConfig((sql) => console.log(sql));
-module.exports = {
- development: conf
-};
-
diff --git a/newback/package.json b/newback/package.json
index a39682806..f30fb8b5c 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -5,27 +5,12 @@
"repository": "https://github.com/akoidan/pychat",
"license": "MIT",
"scripts": {
- "makemigrations": " ./node_modules/.bin/ts-node -r tsconfig-paths/register ./node_modules/.bin/makemigration",
- "generate-configs": "node-config-ts",
- "prebuild": "rimraf dist",
+ "generate-configs": "node node_modules/node-config-ts/bin/cli",
+ "migrate": "ts-node ./src/migration.runner.ts \n",
"build": "nest build",
"start": "nest start",
"start:dev": "node --inspect=0.0.0.0 dist/src/main",
- "start:debug": "nest start --debug --watch",
- "start:local": "yarn generate-configs && yarn db:run:migrate && nest start --debug --watch",
- "start:prod": "node dist/src/main",
- "start:prod:migrate": "yarn db:run:migrate && node dist/src/main",
- "db:run:seeds": "npx sequelize-cli db:seed:all",
- "db:run:single": "npx sequelize-cli db:seed",
- "db:run:migrate": "npx sequelize-cli db:migrate",
- "db:run:revert": "npx sequelize-cli db:migrate:undo",
- "lint": "eslint '{src,apps,libs,test}/**/*.ts' --fix",
- "lint:check": "eslint '{src,apps,libs,test}/**/*.ts'",
- "test": "jest --coverage --runInBand --detectOpenHandles --testTimeout=10000 --passWithNoTests",
- "gstorage:upload": "node ./src/data/database/migration.helpers/00014-upload-files-to-bucket.js upload",
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
- "elastic:run:migration": "node elastic-migration.js migration up",
- "elastic:run:seed": "node elastic-migration.js seed up"
+ "start:debug": "nest start --debug --watch"
},
"dependencies": {
"@nestjs/common": "^8.4.4",
@@ -40,13 +25,13 @@
"lines-logger": "^2.1.2",
"mysql2": "^2.3.3",
"node-config-ts": "npm:node-config-ts-2",
+ "node-db-migration": "^1.3.3",
"npm": "^8.6.0",
"pg": "^8.7.3",
"redis": "^4.0.6",
"reflect-metadata": "^0.1.13",
"rxjs": "^7",
"sequelize": "^6.18.0",
- "sequelize-auto-migrations": "^1.0.3",
"sequelize-typescript": "^2.1.3",
"swagger-ui-express": "^4.3.0"
},
@@ -60,7 +45,6 @@
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
"eslint": "^8.12.0",
- "sequelize-cli": "^6.4.1",
"ts-loader": "^9.2.8",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
diff --git a/newback/src/common/decorators/validators.ts b/newback/src/common/decorators/validators.ts
deleted file mode 100644
index e69de29bb..000000000
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
index 3be0c8857..81312e0be 100644
--- a/newback/src/data/database/database.module.ts
+++ b/newback/src/data/database/database.module.ts
@@ -1,7 +1,11 @@
-import { Module } from '@nestjs/common';
+import {
+ ConsoleLogger,
+ Module
+} from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
-import {ormconfig } from '@/data/database/ormconfig';
+import {generateConfig } from '@/data/database/ormconfig';
+import { Sequelize } from 'sequelize-typescript';
import {ChannelModel} from '@/data/database/model/channel.model';
import {ImageModel} from '@/data/database/model/image.model';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
@@ -19,14 +23,24 @@ import {UserModel} from '@/data/database/model/user.model';
import {UserProfileModel} from '@/data/database/model/user.profile.model';
import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {VerificationModel} from '@/data/database/model/verification.model';
+import {
+ Logger,
+ LoggerService
+} from '@nestjs/common/services/logger.service';
+import {LoggerModule} from '@/modules/logger/logger.module';
const repositories = [
];
+
@Module({
imports: [
- SequelizeModule.forRoot(ormconfig),
+ SequelizeModule.forRootAsync({
+ inject: [Logger],
+ imports: [LoggerModule],
+ useFactory: (logger: Logger) => generateConfig((sql) => logger.debug(sql)),
+ }),
SequelizeModule.forFeature([
ChannelModel,
ImageModel,
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index 251556b7b..891155794 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -5,9 +5,6 @@ import {config} from 'node-config-ts';
export function generateConfig(logging: ((sql: string) => void)): SequelizeModuleOptions {
return {
synchronize: config.mysql.synchronize,
- sync: {
- force: true,
- },
logging: config.mysql.logging ? logging : false,
dialect: 'mysql',
host: config.mysql.host,
@@ -21,7 +18,6 @@ export function generateConfig(logging: ((sql: string) => void)): SequelizeModul
charset: 'utf8mb4',
paranoid: true,
timestamps: true,
- freezeTableName: true,
underscored: true,
}
};
diff --git a/newback/src/migration.runner.ts b/newback/src/migration.runner.ts
new file mode 100644
index 000000000..af7cb69e5
--- /dev/null
+++ b/newback/src/migration.runner.ts
@@ -0,0 +1,15 @@
+import mysql2 from 'mysql2';
+import {CommandsRunner, MysqlDriver} from 'node-db-migration';
+var connection = mysql2.createConnection({
+ "host" : "localhost",
+ "user" : "root",
+ "database" : "test8",
+ "multipleStatements" : true, // if you have multiple sql in your scripts
+});
+connection.connect(function(err) {
+ let migrations = new CommandsRunner({
+ driver: new MysqlDriver(connection),
+ directoryWithScripts: __dirname + '/diff',
+ });
+ migrations.run('init')
+});
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
index cb7a2acb5..1095d884b 100644
--- a/newback/src/modules/auth/auth.module.ts
+++ b/newback/src/modules/auth/auth.module.ts
@@ -8,6 +8,6 @@ import { AuthService } from '@/modules/auth/auth.service';
@Module({
imports: [],
controllers: [AuthController],
- providers: [AuthService],
+ providers: [AuthService, Logger],
})
export class AuthModule {}
diff --git a/newback/src/modules/auth/interfaces.ts b/newback/src/modules/auth/interfaces.ts
index c57790ebf..913c727cc 100644
--- a/newback/src/modules/auth/interfaces.ts
+++ b/newback/src/modules/auth/interfaces.ts
@@ -20,7 +20,7 @@ export default class LoginRequestValidator implements LoginRequest {
@Length(3, 128, {
message: "Passwords should contain 3-64 symbols"
})
- @Matches(/^[^\S].*[^\S]$/, {
+ @Matches(/^\S+$/, {
message: `Password can't contain whitespaces`
})
public password: string;
diff --git a/newback/src/modules/logger/logger.module.ts b/newback/src/modules/logger/logger.module.ts
new file mode 100644
index 000000000..b75d7e8d7
--- /dev/null
+++ b/newback/src/modules/logger/logger.module.ts
@@ -0,0 +1,10 @@
+import {
+ Logger,
+ Module
+} from '@nestjs/common';
+
+@Module({
+ providers: [Logger],
+ exports: [Logger],
+})
+export class LoggerModule {}
diff --git a/newback/test.sql b/newback/test.sql
new file mode 100644
index 000000000..c82ac4307
--- /dev/null
+++ b/newback/test.sql
@@ -0,0 +1,239 @@
+create or replace table ip_address
+(
+ id int auto_increment
+ primary key,
+ ip varchar(32) not null,
+ isp varchar(255) null,
+ country_code varchar(16) null,
+ country varchar(64) null,
+ region varchar(64) null,
+ city varchar(64) null,
+ lat double null,
+ lon double null,
+ zip varchar(32) null,
+ timezone varchar(32) null,
+ constraint id
+ unique (id),
+ constraint ip
+ unique (ip)
+);
+
+create or replace table channel
+(
+ id int auto_increment
+ primary key,
+ name varchar(16) not null,
+ creator_id int null,
+ constraint id
+ unique (id)
+);
+
+create or replace table user
+(
+ id int auto_increment
+ primary key (id),
+ last_time_online datetime not null,
+ username varchar(16) not null,
+ sex enum('MALE', 'FEMALE', 'OTHER') default 'OTHER' not null,
+ thumbnail varchar(100) null,
+ constraint id
+ unique (id),
+ constraint username
+ unique (username)
+);
+
+create or replace table room
+(
+ id int auto_increment
+ primary key,
+ name varchar(16) null,
+ is_main_in_channel tinyint(1) default 0 not null,
+ p2p tinyint(1) default 0 not null,
+ channel_id int null,
+ creator_id int null,
+ constraint id
+ unique (id)
+);
+
+create or replace table message
+(
+ id int auto_increment,
+ sender_id int not null,
+ room_id int not null,
+ time datetime not null,
+ content longtext null,
+ giphy varchar(255) null,
+ symbol varchar(1) null,
+ message_status enum('ON_SERVER', 'READ', 'RECEIVED') not null,
+ thread_message_count int default 0 not null,
+ parent_message_id int null,
+ constraint id
+ unique (id)
+);
+
+create or replace table image
+(
+ id int auto_increment
+ primary key,
+ type enum('VIDEO', 'IMAGE', 'GIPHY') not null,
+ symbol varchar(1) not null,
+ message_id int not null,
+ img varchar(255) null,
+ preview varchar(255) null,
+ absolute_url varchar(255) null,
+ webp_asbolute_url varchar(255) null,
+ constraint id
+ unique (id),
+ constraint unique_image_symbol_message
+ unique (symbol, message_id)
+);
+
+create or replace table message_history
+(
+ id int auto_increment
+ primary key,
+ message_id int not null,
+ time datetime not null,
+ content longtext not null,
+ constraint id
+ unique (id)
+);
+
+create or replace table message_mention
+(
+ id int not null
+ primary key,
+ user_id int not null,
+ message_id int not null,
+ symbol varchar(1) not null,
+ constraint id
+ unique (id),
+ constraint unique_message_mention_user_id_symbol_message_id
+ unique (user_id, message_id, symbol)
+);
+
+create or replace table room_user
+(
+ id int auto_increment
+ primary key,
+ room_id int not null,
+ user_id int not null,
+ volume int default 2 not null,
+ notifications tinyint(1) default 1 not null,
+ constraint id
+ unique (id),
+ constraint unique_room_user_room_id_user_id
+ unique (room_id, user_id)
+);
+
+create or replace table subscription
+(
+ id int auto_increment
+ primary key,
+ user_id int not null,
+ registration_id varchar(255) not null,
+ agent varchar(64) null,
+ is_mobile tinyint(1) default 0 not null,
+ ip_id int null,
+ constraint id
+ unique (id),
+ constraint registration_id
+ unique (registration_id)
+);
+
+create or replace table subscription_message
+(
+ id int auto_increment
+ primary key (id),
+ subscription_id int not null,
+ message_id int not null,
+ received tinyint(1) default 0 not null,
+ constraint id
+ unique (id),
+ constraint unique_subscription_message_subscription_id_message_id
+ unique (subscription_id, message_id)
+);
+
+create or replace table uploaded_file
+(
+ id int auto_increment
+ primary key,
+ type enum('VIDEO', 'FILE', 'MEDIA_RECORD', 'AUDIO_RECORD', 'IMAGE', 'PREVIEW', 'ISSUE') not null,
+ symbol varchar(1) not null,
+ user_id int not null,
+ file varchar(255) not null,
+ constraint id
+ unique (id)
+);
+
+create or replace table user_joined_info
+(
+ id int auto_increment,
+ ip_id int not null,
+ user_id int not null,
+ time datetime not null,
+ constraint id
+ unique (id),
+ constraint unique_user_joined_info_user_id_ip_id
+ unique (ip_id, user_id)
+);
+
+create or replace table verification
+(
+ id int auto_increment,
+ type enum('REGISTER', 'PASSWORD', 'EMAIL', 'CONFIRM_EMAIL') not null,
+ token varchar(17) not null,
+ user_id int not null,
+ time datetime not null,
+ verified tinyint(1) default 0 not null,
+ email varchar(190) null,
+ constraint id
+ unique (id)
+);
+
+create or replace table user_auth
+(
+ id int not null
+ primary key (id),
+ password varchar(255) not null,
+ email varchar(255) null,
+ facebook_id varchar(255) null,
+ google_id datetime null,
+ email_verification_id datetime null,
+ constraint email
+ unique (email),
+ constraint facebook_id
+ unique (facebook_id),
+ constraint google_id
+ unique (google_id),
+ constraint id
+ unique (id)
+);
+
+create or replace table user_settings
+(
+ id int not null,
+ suggestions tinyint(1) default 1 not null,
+ show_when_im_typing tinyint(1) default 1 not null,
+ embedded_youtube tinyint(1) default 1 not null,
+ highlight_code tinyint(1) default 1 not null,
+ message_sound tinyint(1) default 0 not null,
+ incoming_file_call_sound tinyint(1) default 0 not null,
+ online_change_messages tinyint(1) default 0 not null,
+ devtools_logs enum('log_raise_error', 'log_with_warnings', 'trace', 'debug', 'info', 'warn', 'error', 'disable') default 'error' not null,
+ theme enum('COLOR_LOR', 'COLOR_REG', 'COLOR_WHITE') default 'COLOR_REG' not null,
+ constraint id
+ unique (id)
+);
+
+create or replace table user_profile
+(
+ id int not null,
+ name varchar(30) null,
+ city varchar(50) null,
+ surname varchar(30) null,
+ birthday datetime not null,
+ contacts varchar(100) null,
+ constraint id
+ unique (id)
+);
diff --git a/newback/yarn.lock b/newback/yarn.lock
index b96bfc4be..e7af11ddd 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -541,16 +541,6 @@
"@types/qs" "*"
"@types/serve-static" "*"
-"@types/geojson@^1.0.0":
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf"
- integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==
-
-"@types/geojson@^7946.0.0 || ^1.0.0":
- version "7946.0.8"
- resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca"
- integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==
-
"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@@ -953,7 +943,7 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0:
+ansi-styles@^4.1.0, ansi-styles@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -1011,11 +1001,6 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-array-back@^3.0.1, array-back@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
- integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
-
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -1042,18 +1027,6 @@ asap@^2.0.0:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-async@^2.5.1:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
- dependencies:
- lodash "^4.17.14"
-
-at-least-node@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
- integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
-
axios@0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
@@ -1097,11 +1070,6 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
-bluebird@^3.4.6, bluebird@^3.5.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.2:
version "1.19.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
@@ -1329,17 +1297,6 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-cli-color@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.2.tgz#e295addbae470800def0254183c648531cdf4e3f"
- integrity sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==
- dependencies:
- d "^1.0.1"
- es5-ext "^0.10.59"
- es6-iterator "^2.0.3"
- memoizee "^0.4.15"
- timers-ext "^0.1.7"
-
cli-columns@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646"
@@ -1374,28 +1331,11 @@ cli-width@^3.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
-cliui@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
- integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^7.0.0"
-
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-cls-bluebird@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee"
- integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=
- dependencies:
- is-bluebird "^1.0.2"
- shimmer "^1.1.0"
-
cluster-key-slot@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
@@ -1450,22 +1390,12 @@ columnify@^1.6.0:
strip-ansi "^6.0.1"
wcwidth "^1.0.0"
-command-line-args@^5.0.2:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
- integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
- dependencies:
- array-back "^3.1.0"
- find-replace "^3.0.0"
- lodash.camelcase "^4.3.0"
- typical "^4.0.0"
-
commander@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-commander@^2.19.0, commander@^2.20.0:
+commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1490,14 +1420,6 @@ concat-stream@^1.5.2:
readable-stream "^2.2.2"
typedarray "^0.0.6"
-config-chain@^1.1.12, config-chain@^1.1.13:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
- integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
consola@^2.15.0:
version "2.15.3"
resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
@@ -1573,15 +1495,7 @@ csv-parse@^5.0.4:
resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3"
integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ==
-d@1, d@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
- integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
- dependencies:
- es5-ext "^0.10.50"
- type "^1.0.1"
-
-debug@2.6.9, debug@^2.6.9:
+debug@2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -1595,23 +1509,11 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
dependencies:
ms "2.1.2"
-debug@^3.1.0:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
- dependencies:
- ms "^2.1.1"
-
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
-deep-diff@^0.3.8:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
- integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=
-
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -1651,7 +1553,7 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-depd@^1.1.0, depd@^1.1.2, depd@~1.1.2:
+depd@^1.1.2, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
@@ -1706,21 +1608,11 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-dottie@^2.0.0, dottie@^2.0.2:
+dottie@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154"
integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==
-editorconfig@^0.15.3:
- version "0.15.3"
- resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
- integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
- dependencies:
- commander "^2.19.0"
- lru-cache "^4.1.5"
- semver "^5.6.0"
- sigmund "^1.0.1"
-
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -1820,42 +1712,6 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
-es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.59, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
- version "0.10.60"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.60.tgz#e8060a86472842b93019c31c34865012449883f4"
- integrity sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==
- dependencies:
- es6-iterator "^2.0.3"
- es6-symbol "^3.1.3"
- next-tick "^1.1.0"
-
-es6-iterator@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
- integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
- dependencies:
- d "1"
- es5-ext "^0.10.35"
- es6-symbol "^3.1.1"
-
-es6-symbol@^3.1.1, es6-symbol@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
- integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
- dependencies:
- d "^1.0.1"
- ext "^1.1.2"
-
-es6-weak-map@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
- integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
- dependencies:
- d "1"
- es5-ext "^0.10.46"
- es6-iterator "^2.0.3"
- es6-symbol "^3.1.1"
-
es7-shim@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/es7-shim/-/es7-shim-6.0.0.tgz#0c430b40b8505ad15570721a8d8dd4eb0c553155"
@@ -2008,14 +1864,6 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-event-emitter@^0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
- integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
events@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
@@ -2072,13 +1920,6 @@ express@4.17.3:
utils-merge "1.0.1"
vary "~1.1.2"
-ext@^1.1.2:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
- integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
- dependencies:
- type "^2.5.0"
-
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
@@ -2165,13 +2006,6 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
-find-replace@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
- integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
- dependencies:
- array-back "^3.0.1"
-
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -2226,16 +2060,6 @@ fs-extra@10.0.1, fs-extra@^10.0.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-extra@^9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
fs-minipass@^2.0.0, fs-minipass@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@@ -2289,21 +2113,11 @@ generate-function@^2.3.1:
dependencies:
is-property "^1.0.2"
-generic-pool@3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.5.0.tgz#acac4fd743a175ff20574f380910036464cb61f7"
- integrity sha512-dEkxmX+egB2o4NR80c/q+xzLLzLX+k68/K8xv81XprD+Sk7ZtP14VugeCz+fUwv5FzpWq40pPtAkzPRqT8ka9w==
-
generic-pool@3.8.2:
version "3.8.2"
resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9"
integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==
-get-caller-file@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
- integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
@@ -2552,11 +2366,6 @@ infer-owner@^1.0.4:
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-inflection@1.12.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
- integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=
-
inflection@^1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.2.tgz#15e8c797c6c3dadf31aa658f8df8a4ea024798b0"
@@ -2575,11 +2384,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, i
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-ini@^1.3.4:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
ini@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
@@ -2690,11 +2494,6 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
-is-bluebird@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2"
- integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=
-
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
@@ -2773,11 +2572,6 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-is-promise@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
- integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
-
is-property@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
@@ -2858,26 +2652,6 @@ jest-worker@^27.4.5:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-js-beautify@^1.14.0:
- version "1.14.2"
- resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.2.tgz#8180514fd4c7789c4ac4bcc327b6dda634c55666"
- integrity sha512-H85kX95a53os+q1OCqtYe8AXAmgy3BvtysA/V83S3fdhznm6WlUpGi14DqSPbKFsL3dXZFXYl7YQwW9U1+76ng==
- dependencies:
- config-chain "^1.1.12"
- editorconfig "^0.15.3"
- glob "^7.1.3"
- nopt "^5.0.0"
-
-js-beautify@^1.8.9:
- version "1.14.3"
- resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.3.tgz#3dd11c949178de7f3bdf3f6f752778d3bed95150"
- integrity sha512-f1ra8PHtOEu/70EBnmiUlV8nJePS58y9qKjl4JHfYWlFH6bo7ogZBz//FAZp7jDuXtYnGYKymZPlrg2I/9Zo4g==
- dependencies:
- config-chain "^1.1.13"
- editorconfig "^0.15.3"
- glob "^7.1.3"
- nopt "^5.0.0"
-
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3105,17 +2879,12 @@ loader-runner@^4.2.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
-lodash.camelcase@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
- integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
-
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@4.17.21, lodash@^4.17.1, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
+lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -3133,7 +2902,7 @@ long@^4.0.0:
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
-lru-cache@^4.1.3, lru-cache@^4.1.5:
+lru-cache@^4.1.3:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -3153,13 +2922,6 @@ lru-cache@^7.4.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747"
integrity sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==
-lru-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
- integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
- dependencies:
- es5-ext "~0.10.2"
-
macos-release@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2"
@@ -3211,20 +2973,6 @@ memfs@^3.4.1:
dependencies:
fs-monkey "1.0.3"
-memoizee@^0.4.15:
- version "0.4.15"
- resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
- integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
- dependencies:
- d "^1.0.1"
- es5-ext "^0.10.53"
- es6-weak-map "^2.0.3"
- event-emitter "^0.3.5"
- is-promise "^2.2.2"
- lru-queue "^0.1.0"
- next-tick "^1.1.0"
- timers-ext "^0.1.7"
-
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -3382,14 +3130,14 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-moment-timezone@^0.5.14, moment-timezone@^0.5.34:
+moment-timezone@^0.5.34:
version "0.5.34"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c"
integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==
dependencies:
moment ">= 2.9.0"
-"moment@>= 2.9.0", moment@^2.20.0, moment@^2.29.1:
+moment@*, "moment@>= 2.9.0", moment@^2.29.1:
version "2.29.2"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
@@ -3404,7 +3152,7 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2:
+ms@2.1.3, ms@^2.0.0, ms@^2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -3464,11 +3212,6 @@ neo-async@^2.6.2:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-next-tick@1, next-tick@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
- integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
-
"node-config-ts@npm:node-config-ts-2":
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-config-ts-2/-/node-config-ts-2-1.0.0.tgz#349f5dd10e8de8d75f279e2a1e1148f782e77fbe"
@@ -3479,6 +3222,13 @@ next-tick@1, next-tick@^1.1.0:
prettier "^1.19.1"
ramda "^0.27.0"
+node-db-migration@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/node-db-migration/-/node-db-migration-1.3.3.tgz#e930e39f352afefe90e98521169f4db30eba630c"
+ integrity sha512-OhiBy2+T5zGlenfaoNdh5raNEZEOunJwFAnK8cRZvj4m7Xu2PZrcekkyokhfD23/EC6tYK9IYOdzgFKMFejaoQ==
+ dependencies:
+ moment "*"
+
node-emoji@1.11.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c"
@@ -3729,11 +3479,6 @@ object-hash@3.0.0:
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
-object-hash@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
- integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
-
object-inspect@^1.12.0, object-inspect@^1.9.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
@@ -4102,11 +3847,6 @@ promzard@^0.3.0:
dependencies:
read "1"
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-
proxy-addr@~2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
@@ -4312,11 +4052,6 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
@@ -4327,7 +4062,7 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.1.6, resolve@^1.20.0:
+resolve@^1.1.6:
version "1.22.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
@@ -4344,14 +4079,6 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
-retry-as-promised@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7"
- integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=
- dependencies:
- bluebird "^3.4.6"
- debug "^2.6.9"
-
retry-as-promised@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-5.0.0.tgz#f4ecc25133603a2d2a7aff4a128691d7bc506d54"
@@ -4424,11 +4151,6 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
-semver@^5.5.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@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.3.4, semver@^7.3.5:
version "7.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
@@ -4460,32 +4182,6 @@ seq-queue@^0.0.5:
resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e"
integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=
-sequelize-auto-migrations@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sequelize-auto-migrations/-/sequelize-auto-migrations-1.0.3.tgz#558a370265c533d8c92f5156f813c5a9b21a09ab"
- integrity sha512-CTh8073gqrthit5xl/ls2lKPzUHzRP/GCY8z99+dlu27oOSmSiFv+NcNHJjmfZvLBSzfif8Nwp3FNtph09Gxew==
- dependencies:
- async "^2.5.1"
- command-line-args "^5.0.2"
- deep-diff "^0.3.8"
- js-beautify "^1.8.9"
- lodash "^4.17.11"
- object-hash "^1.3.1"
- sequelize "^4.42.0"
-
-sequelize-cli@^6.4.1:
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-6.4.1.tgz#fb9fbbde733ae887970316a700d264fcf0683770"
- integrity sha512-gIzzFitUGUErq6DYd1JDnsmx7z7XcxzRNe4Py3AqeaxcyjpCAZU2BQnsNPGPMKAaXfMtKi/d9Tu4MtLrehVzIQ==
- dependencies:
- cli-color "^2.0.1"
- fs-extra "^9.1.0"
- js-beautify "^1.14.0"
- lodash "^4.17.21"
- resolve "^1.20.0"
- umzug "^2.3.0"
- yargs "^16.2.0"
-
sequelize-pool@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768"
@@ -4498,29 +4194,6 @@ sequelize-typescript@^2.1.3:
dependencies:
glob "7.2.0"
-sequelize@^4.42.0:
- version "4.44.4"
- resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.44.4.tgz#9607eaa3e59080d27d8b17481d2e449e87e58f18"
- integrity sha512-nkHmYkbwQK7uwpgW9VBalCBnQqQ8mslTdgcBthtJLORuPvAYRPlfkXZMVUU9TLLJt9CX+/y0MYg0DpcP6ywsEQ==
- dependencies:
- bluebird "^3.5.0"
- cls-bluebird "^2.1.0"
- debug "^3.1.0"
- depd "^1.1.0"
- dottie "^2.0.0"
- generic-pool "3.5.0"
- inflection "1.12.0"
- lodash "^4.17.1"
- moment "^2.20.0"
- moment-timezone "^0.5.14"
- retry-as-promised "^2.3.2"
- semver "^5.5.0"
- terraformer-wkt-parser "^1.1.2"
- toposort-class "^1.0.1"
- uuid "^3.2.1"
- validator "^10.4.0"
- wkx "^0.4.1"
-
sequelize@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.18.0.tgz#0e99e0c07ee144eb456374a56e2bd501634c3d16"
@@ -4591,11 +4264,6 @@ shelljs@0.8.5:
interpret "^1.0.0"
rechoir "^0.6.2"
-shimmer@^1.1.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
- integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
-
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -4605,11 +4273,6 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
-sigmund@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
- integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
-
signal-exit@^3.0.2, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
@@ -4905,21 +4568,6 @@ tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
-terraformer-wkt-parser@^1.1.2:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.1.tgz#8041e2aeb0c9f2b4cbbec8ec2c5c00c45ddfee02"
- integrity sha512-+CJyNLWb3lJ9RsZMTM66BY0MT3yIo4l4l22Jd9CrZuwzk54fsu4Sc7zejuS9fCITTuTQy3p06d4MZMVI7v5wSg==
- dependencies:
- "@types/geojson" "^1.0.0"
- terraformer "~1.0.5"
-
-terraformer@~1.0.5:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.12.tgz#39e08f9c753606421acce02e122440c72dfa12d3"
- integrity sha512-MokUp0+MFal4CmJDVL6VAO1bKegeXcBM2RnPVfqcFIp2IIv8EbPAjG0j/vEy/vuKB8NVMMSF2vfpVS/QLe4DBg==
- optionalDependencies:
- "@types/geojson" "^7946.0.0 || ^1.0.0"
-
terser-webpack-plugin@^5.1.3:
version "5.3.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
@@ -4951,14 +4599,6 @@ through@^2.3.6:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-timers-ext@^0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
- integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
- dependencies:
- es5-ext "~0.10.46"
- next-tick "1"
-
tiny-relative-date@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
@@ -5098,16 +4738,6 @@ type-is@^1.6.4, type-is@~1.6.18:
media-typer "0.3.0"
mime-types "~2.1.24"
-type@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
- integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
-
-type@^2.5.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
- integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
-
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -5123,18 +4753,6 @@ typescript@^4.6.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
-typical@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
- integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
-
-umzug@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.3.0.tgz#0ef42b62df54e216b05dcaf627830a6a8b84a184"
- integrity sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==
- dependencies:
- bluebird "^3.7.2"
-
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
@@ -5191,11 +4809,6 @@ uuid@8.3.2, uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-uuid@^3.2.1:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
- integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-
v8-compile-cache-lib@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
@@ -5221,11 +4834,6 @@ validate-npm-package-name@^4.0.0:
dependencies:
builtins "^5.0.0"
-validator@^10.4.0:
- version "10.11.0"
- resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"
- integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==
-
validator@^13.7.0:
version "13.7.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
@@ -5341,13 +4949,6 @@ windows-release@^4.0.0:
dependencies:
execa "^4.0.2"
-wkx@^0.4.1:
- version "0.4.8"
- resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003"
- integrity sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==
- dependencies:
- "@types/node" "*"
-
wkx@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"
@@ -5360,15 +4961,6 @@ word-wrap@^1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -5387,11 +4979,6 @@ xtend@^4.0.0:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-y18n@^5.0.5:
- version "5.0.8"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
- integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
-
yallist@4.0.0, yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
@@ -5407,24 +4994,6 @@ yaml@^1.10.0:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-yargs-parser@^20.2.2:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
-
-yargs@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
- integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
- dependencies:
- 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"
-
yn@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
From c4f4a3dcc4e256f0ea95f038f470ef6695861719 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Sun, 10 Apr 2022 23:53:11 +0300
Subject: [PATCH 007/221] @BelongsTo is required to generate constraint
---
.../src/data/database/model/channel.model.ts | 6 ++--
.../src/data/database/model/image.model.ts | 6 ++--
.../data/database/model/ip.address.model.ts | 4 +--
.../database/model/message.history.model.ts | 13 +++++----
.../database/model/message.mention.model.ts | 10 +++++--
.../src/data/database/model/message.model.ts | 22 +++++++-------
newback/src/data/database/model/room.model.ts | 29 +++++++++----------
.../data/database/model/room.users.model.ts | 9 ++++--
.../model/subscription.message.model.ts | 10 +++++--
.../data/database/model/subscription.model.ts | 12 ++++++--
.../database/model/uploaded.file.model.ts | 7 +++--
.../data/database/model/user.auth.model.ts | 7 +++--
.../database/model/user.joined.info.model.ts | 9 ++++--
newback/src/data/database/model/user.model.ts | 2 --
.../data/database/model/user.profile.model.ts | 7 +++--
.../database/model/user.settings.model.ts | 6 ++--
.../data/database/model/verification.model.ts | 6 ++--
newback/src/data/database/ormconfig.ts | 3 ++
newback/src/modules/app/app.service.ts | 8 -----
newback/src/modules/auth/auth.controller.ts | 17 +++++++++++
20 files changed, 123 insertions(+), 70 deletions(-)
delete mode 100644 newback/src/modules/app/app.service.ts
diff --git a/newback/src/data/database/model/channel.model.ts b/newback/src/data/database/model/channel.model.ts
index a7738fd3d..025498e02 100644
--- a/newback/src/data/database/model/channel.model.ts
+++ b/newback/src/data/database/model/channel.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -14,9 +15,7 @@ import {UserModel} from '@/data/database/model/user.model';
export class ChannelModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
autoIncrement: true,
- unique: true,
primaryKey: true,
})
public id: number;
@@ -33,4 +32,7 @@ export class ChannelModel extends Model {
type: DataType.INTEGER,
})
public creatorId: number;
+
+ @BelongsTo(() => UserModel)
+ public creator: UserModel;
}
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
index c76e2751b..630de08bc 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/database/model/image.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -24,8 +25,6 @@ export class ImageModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -52,6 +51,9 @@ export class ImageModel extends Model {
})
public messageId: number;
+ @BelongsTo(() => MessageModel)
+ public message: MessageModel;
+
@Column({
type: DataType.STRING,
allowNull: true,
diff --git a/newback/src/data/database/model/ip.address.model.ts b/newback/src/data/database/model/ip.address.model.ts
index 75297b8eb..64a2333b8 100644
--- a/newback/src/data/database/model/ip.address.model.ts
+++ b/newback/src/data/database/model/ip.address.model.ts
@@ -12,8 +12,6 @@ export class IpAddressModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -27,7 +25,7 @@ export class IpAddressModel extends Model {
public ip: string;
@Column({
- type: DataType.STRING(255),
+ type: DataType.STRING,
allowNull: true,
})
public isp: string;
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/database/model/message.history.model.ts
index 480fadf30..53a44703e 100644
--- a/newback/src/data/database/model/message.history.model.ts
+++ b/newback/src/data/database/model/message.history.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -8,6 +9,7 @@ import {
import {Injectable} from '@nestjs/common';
import {config} from 'node-config-ts';
import {MessageModel} from '@/data/database/model/message.model';
+import {UserModel} from '@/data/database/model/user.model';
@Injectable()
@@ -15,9 +17,7 @@ import {MessageModel} from '@/data/database/model/message.model';
export class MessageHistoryModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
autoIncrement: true,
- unique: true,
primaryKey: true,
})
public id: number;
@@ -30,15 +30,18 @@ export class MessageHistoryModel extends Model {
})
public messageId: number;
+ @BelongsTo(() => MessageModel)
+ public message: MessageModel;
+
@Column({
allowNull: false,
- type: DataType.DATE,
+ type: DataType.BIGINT,
})
- public time: Date;
+ public time: number;
@Column({
type: DataType.TEXT('long'),
- allowNull: false,
+ allowNull: true, // idk but it contains null
})
public content: string;
}
diff --git a/newback/src/data/database/model/message.mention.model.ts b/newback/src/data/database/model/message.mention.model.ts
index 856ae7ad0..9d09b435b 100644
--- a/newback/src/data/database/model/message.mention.model.ts
+++ b/newback/src/data/database/model/message.mention.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -20,8 +21,7 @@ export class MessageMentionModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
+ autoIncrement: true,
primaryKey: true,
})
public id: number;
@@ -34,6 +34,9 @@ export class MessageMentionModel extends Model {
})
public userId: string;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@ForeignKey(() => MessageModel)
@Unique(uniqueUserIdSymbMess)
@Column({
@@ -42,6 +45,9 @@ export class MessageMentionModel extends Model {
})
public messageId: string;
+ @BelongsTo(() => MessageModel)
+ public message: MessageModel;
+
@Unique(uniqueUserIdSymbMess)
@Column({
type: DataType.STRING(1),
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
index 45b4c611d..bb9961e14 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/database/model/message.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -17,9 +18,7 @@ export class MessageModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
autoIncrement: true,
- unique: true,
primaryKey: true,
})
public id: number;
@@ -32,6 +31,9 @@ export class MessageModel extends Model {
})
public senderId: number;
+ @BelongsTo(() => UserModel)
+ public sender: UserModel;
+
@ForeignKey(() => RoomModel)
@Column({
type: DataType.INTEGER,
@@ -39,11 +41,14 @@ export class MessageModel extends Model {
})
public roomId: number;
+ @BelongsTo(() => RoomModel)
+ public room: RoomModel;
+
@Column({
- type: DataType.DATE,
+ type: DataType.BIGINT,
allowNull: false,
})
- public time: Date;
+ public time: number;
@Column({
type: DataType.TEXT('long'),
@@ -51,12 +56,6 @@ export class MessageModel extends Model {
})
public content: string;
- @Column({
- type: DataType.STRING(255),
- allowNull: true,
- })
- public giphy: string;
-
@Column({
type: DataType.STRING(1),
allowNull: true,
@@ -83,4 +82,7 @@ export class MessageModel extends Model {
allowNull: true,
})
public parentMessageId: number;
+
+ @BelongsTo(() => MessageModel)
+ public parentMessage: MessageModel;
}
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/database/model/room.model.ts
index 3d7b78767..0a73a79f5 100644
--- a/newback/src/data/database/model/room.model.ts
+++ b/newback/src/data/database/model/room.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -10,28 +11,18 @@ import {UserModel} from '@/data/database/model/user.model';
import {ChannelModel} from '@/data/database/model/channel.model';
-// constraints = [
-// CheckConstraint(
-// check=Q(Q(channel__isnull=True) & Q(name__isnull=True)) | Q(channel__isnull=False) & Q(name__isnull=False),
-// name='channel_should_exist_for_public_room_and_not_exist_for_private'
-// ),
-// CheckConstraint(
-// check=Q(creator__isnull=True) | Q(name__isnull=False),
-// name='admin_should_not_be_define_for_private_rooms'
-// ),
-// CheckConstraint(
-// check=Q(p2p=False) | Q(name__isnull=True),
-// name='p2p_only_if_private'
-// )
-// ]
+// constraint admin_should_not_be_define_for_private_rooms
+// check (`creator_id` is null or `name` is not null),
+// constraint channel_should_exist_for_public_room_and_not_exist_for_private
+// check (`channel_id` is null and `name` is null or `channel_id` is not n),
+// constraint p2p_only_if_private
+// check (`p2p` = 0x00 or `name` is null)
@Injectable()
@Table({ tableName: 'room'})
export class RoomModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -66,6 +57,9 @@ export class RoomModel extends Model {
})
public channelId: number;
+ @BelongsTo(() => ChannelModel)
+ public channel: ChannelModel;
+
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
@@ -73,4 +67,7 @@ export class RoomModel extends Model {
defaultValue: null,
})
public creatorId: number;
+
+ @BelongsTo(() => UserModel)
+ public creator: UserModel;
}
diff --git a/newback/src/data/database/model/room.users.model.ts b/newback/src/data/database/model/room.users.model.ts
index b8291ae33..7cca0dbd3 100644
--- a/newback/src/data/database/model/room.users.model.ts
+++ b/newback/src/data/database/model/room.users.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -18,8 +19,6 @@ export class RoomUsersModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -33,6 +32,9 @@ export class RoomUsersModel extends Model {
})
public roomId: number;
+ @BelongsTo(() => RoomModel)
+ public room: RoomModel;
+
@Unique(uniqueRoomUser)
@ForeignKey(() => UserModel)
@Column({
@@ -41,6 +43,9 @@ export class RoomUsersModel extends Model {
})
public userId: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.INTEGER,
defaultValue: 2,
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/database/model/subscription.message.model.ts
index 2593fc8f1..ae28f8e07 100644
--- a/newback/src/data/database/model/subscription.message.model.ts
+++ b/newback/src/data/database/model/subscription.message.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -9,6 +10,7 @@ import {
import {Injectable} from '@nestjs/common';
import {MessageModel} from '@/data/database/model/message.model';
import {SubscriptionModel} from '@/data/database/model/subscription.model';
+import {UserModel} from '@/data/database/model/user.model';
const uniqueSubscriptionMessage = 'unique_subscription_message_subscription_id_message_id';
@@ -18,8 +20,6 @@ export class SubscriptionMessageModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -33,6 +33,9 @@ export class SubscriptionMessageModel extends Model {
})
public subscriptionId: number;
+ @BelongsTo(() => SubscriptionModel)
+ public subscription: SubscriptionModel;
+
@Unique(uniqueSubscriptionMessage)
@ForeignKey(() => MessageModel)
@Column({
@@ -41,6 +44,9 @@ export class SubscriptionMessageModel extends Model {
})
public messageId: number;
+ @BelongsTo(() => MessageModel)
+ public message: MessageModel;
+
@Column({
type: DataType.BOOLEAN,
defaultValue: false,
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
index 7de1ff53d..5b09c3782 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -9,6 +10,7 @@ import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
import {UploadedFileChoices} from '@/data/types/dto/dto';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
+import {MessageModel} from '@/data/database/model/message.model';
@Injectable()
@Table({tableName: 'subscription'})
@@ -16,8 +18,6 @@ export class SubscriptionModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -30,8 +30,11 @@ export class SubscriptionModel extends Model {
})
public userId: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
- type: DataType.STRING(255),
+ type: DataType.STRING,
unique: true,
allowNull: false,
})
@@ -57,4 +60,7 @@ export class SubscriptionModel extends Model {
allowNull: true,
})
public ipId: number;
+
+ @BelongsTo(() => IpAddressModel)
+ public ip: IpAddressModel;
}
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
index 7f042f716..13f2b67b9 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -18,11 +19,8 @@ import {UserModel} from '@/data/database/model/user.model';
@Table({tableName: 'uploaded_file'})
export class UploadedFileModel extends Model {
-
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -47,6 +45,9 @@ export class UploadedFileModel extends Model {
})
public userId: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.STRING,
allowNull: false,
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index bd581bd0d..c3dd834d3 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -15,12 +16,14 @@ export class UserAuthModel extends Model {
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
+ autoIncrement: false,
primaryKey: true,
})
public id: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.STRING,
allowNull: false
diff --git a/newback/src/data/database/model/user.joined.info.model.ts b/newback/src/data/database/model/user.joined.info.model.ts
index 0620f1b71..51b4d7b95 100644
--- a/newback/src/data/database/model/user.joined.info.model.ts
+++ b/newback/src/data/database/model/user.joined.info.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -18,8 +19,6 @@ export class UserJoinedInfoModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -33,6 +32,9 @@ export class UserJoinedInfoModel extends Model {
})
public ipId: number;
+ @BelongsTo(() => IpAddressModel)
+ public ip: IpAddressModel;
+
@Unique(uniqueUserJoinedInfoUserIdIpId)
@ForeignKey(() => UserModel)
@Column({
@@ -41,6 +43,9 @@ export class UserJoinedInfoModel extends Model {
})
public userId: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.DATE,
allowNull: false,
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index d041810dd..4413eb44c 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -14,9 +14,7 @@ import {config} from 'node-config-ts';
export class UserModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
autoIncrement: true,
- unique: true,
primaryKey: true,
})
public id: number;
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
index 7a2d94015..dfae80c29 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -15,12 +16,14 @@ export class UserProfileModel extends Model {
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
+ autoIncrement: false,
primaryKey: true,
})
public id: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.STRING(30),
allowNull: true
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
index 3a25884e5..0eea57bcc 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -20,12 +21,13 @@ export class UserSettingsModel extends Model {
@ForeignKey(() => UserModel)
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
primaryKey: true,
})
public id: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.BOOLEAN,
allowNull: false,
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index a17201aff..633a125cb 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -1,4 +1,5 @@
import {
+ BelongsTo,
Column,
DataType,
ForeignKey,
@@ -15,8 +16,6 @@ export class VerificationModel extends Model {
@Column({
type: DataType.INTEGER,
- allowNull: false,
- unique: true,
autoIncrement: true,
primaryKey: true,
})
@@ -41,6 +40,9 @@ export class VerificationModel extends Model {
})
public userId: number;
+ @BelongsTo(() => UserModel)
+ public user: UserModel;
+
@Column({
type: DataType.DATE,
allowNull: false,
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index 891155794..45f8f9800 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -13,6 +13,9 @@ export function generateConfig(logging: ((sql: string) => void)): SequelizeModul
password: config.mysql.password,
database: config.mysql.database,
autoLoadModels: true,
+ sync: {
+ force: true,
+ },
define: {
collate: 'utf8mb4_general_ci',
charset: 'utf8mb4',
diff --git a/newback/src/modules/app/app.service.ts b/newback/src/modules/app/app.service.ts
deleted file mode 100644
index 927d7cca0..000000000
--- a/newback/src/modules/app/app.service.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { Injectable } from '@nestjs/common';
-
-@Injectable()
-export class AppService {
- getHello(): string {
- return 'Hello World!';
- }
-}
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
index 6eb75d1c1..0c4cb9a02 100644
--- a/newback/src/modules/auth/auth.controller.ts
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -6,6 +6,23 @@ import {
} from '@nestjs/common';
import { AuthService } from '@/modules/auth/auth.service';
import LoginRequestValidator from '@/modules/auth/interfaces';
+import {Sequelize} from 'sequelize';
+import {UserModel} from '@/data/database/model/user.model';
+import {UserSettingsModel} from '@/data/database/model/user.settings.model';
+import {ImageModel} from '@/data/database/model/image.model';
+import {IpAddressModel} from '@/data/database/model/ip.address.model';
+import {MessageHistoryModel} from '@/data/database/model/message.history.model';
+import {MessageMentionModel} from '@/data/database/model/message.mention.model';
+import {MessageModel} from '@/data/database/model/message.model';
+import {RoomModel} from '@/data/database/model/room.model';
+import {RoomUsersModel} from '@/data/database/model/room.users.model';
+import {SubscriptionModel} from '@/data/database/model/subscription.model';
+import {SubscriptionMessageModel} from '@/data/database/model/subscription.message.model';
+import {UploadedFileModel} from '@/data/database/model/uploaded.file.model';
+import {UserAuthModel} from '@/data/database/model/user.auth.model';
+import {UserJoinedInfoModel} from '@/data/database/model/user.joined.info.model';
+import {UserProfileModel} from '@/data/database/model/user.profile.model';
+import {VerificationModel} from '@/data/database/model/verification.model';
@Controller()
export class AuthController {
From e62fbb828f3be04731b1a71566c9071eb37a6401 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Mon, 11 Apr 2022 00:18:39 +0300
Subject: [PATCH 008/221] Finished creating ORM
---
.../data/database/model/user.auth.model.ts | 4 +
newback/test.sql | 239 ------------------
2 files changed, 4 insertions(+), 239 deletions(-)
delete mode 100644 newback/test.sql
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index c3dd834d3..8e94ae0e2 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -8,6 +8,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
+import {VerificationModel} from '@/data/database/model/verification.model';
@Injectable()
@Table({ tableName: 'user_auth'})
@@ -51,10 +52,13 @@ export class UserAuthModel extends Model {
})
public googleId: string;
+ @ForeignKey(() => VerificationModel)
@Column({
type: DataType.DATE,
allowNull: true,
})
public emailVerificationId: string;
+ @BelongsTo(() => VerificationModel)
+ public emailVerification: VerificationModel;
}
diff --git a/newback/test.sql b/newback/test.sql
deleted file mode 100644
index c82ac4307..000000000
--- a/newback/test.sql
+++ /dev/null
@@ -1,239 +0,0 @@
-create or replace table ip_address
-(
- id int auto_increment
- primary key,
- ip varchar(32) not null,
- isp varchar(255) null,
- country_code varchar(16) null,
- country varchar(64) null,
- region varchar(64) null,
- city varchar(64) null,
- lat double null,
- lon double null,
- zip varchar(32) null,
- timezone varchar(32) null,
- constraint id
- unique (id),
- constraint ip
- unique (ip)
-);
-
-create or replace table channel
-(
- id int auto_increment
- primary key,
- name varchar(16) not null,
- creator_id int null,
- constraint id
- unique (id)
-);
-
-create or replace table user
-(
- id int auto_increment
- primary key (id),
- last_time_online datetime not null,
- username varchar(16) not null,
- sex enum('MALE', 'FEMALE', 'OTHER') default 'OTHER' not null,
- thumbnail varchar(100) null,
- constraint id
- unique (id),
- constraint username
- unique (username)
-);
-
-create or replace table room
-(
- id int auto_increment
- primary key,
- name varchar(16) null,
- is_main_in_channel tinyint(1) default 0 not null,
- p2p tinyint(1) default 0 not null,
- channel_id int null,
- creator_id int null,
- constraint id
- unique (id)
-);
-
-create or replace table message
-(
- id int auto_increment,
- sender_id int not null,
- room_id int not null,
- time datetime not null,
- content longtext null,
- giphy varchar(255) null,
- symbol varchar(1) null,
- message_status enum('ON_SERVER', 'READ', 'RECEIVED') not null,
- thread_message_count int default 0 not null,
- parent_message_id int null,
- constraint id
- unique (id)
-);
-
-create or replace table image
-(
- id int auto_increment
- primary key,
- type enum('VIDEO', 'IMAGE', 'GIPHY') not null,
- symbol varchar(1) not null,
- message_id int not null,
- img varchar(255) null,
- preview varchar(255) null,
- absolute_url varchar(255) null,
- webp_asbolute_url varchar(255) null,
- constraint id
- unique (id),
- constraint unique_image_symbol_message
- unique (symbol, message_id)
-);
-
-create or replace table message_history
-(
- id int auto_increment
- primary key,
- message_id int not null,
- time datetime not null,
- content longtext not null,
- constraint id
- unique (id)
-);
-
-create or replace table message_mention
-(
- id int not null
- primary key,
- user_id int not null,
- message_id int not null,
- symbol varchar(1) not null,
- constraint id
- unique (id),
- constraint unique_message_mention_user_id_symbol_message_id
- unique (user_id, message_id, symbol)
-);
-
-create or replace table room_user
-(
- id int auto_increment
- primary key,
- room_id int not null,
- user_id int not null,
- volume int default 2 not null,
- notifications tinyint(1) default 1 not null,
- constraint id
- unique (id),
- constraint unique_room_user_room_id_user_id
- unique (room_id, user_id)
-);
-
-create or replace table subscription
-(
- id int auto_increment
- primary key,
- user_id int not null,
- registration_id varchar(255) not null,
- agent varchar(64) null,
- is_mobile tinyint(1) default 0 not null,
- ip_id int null,
- constraint id
- unique (id),
- constraint registration_id
- unique (registration_id)
-);
-
-create or replace table subscription_message
-(
- id int auto_increment
- primary key (id),
- subscription_id int not null,
- message_id int not null,
- received tinyint(1) default 0 not null,
- constraint id
- unique (id),
- constraint unique_subscription_message_subscription_id_message_id
- unique (subscription_id, message_id)
-);
-
-create or replace table uploaded_file
-(
- id int auto_increment
- primary key,
- type enum('VIDEO', 'FILE', 'MEDIA_RECORD', 'AUDIO_RECORD', 'IMAGE', 'PREVIEW', 'ISSUE') not null,
- symbol varchar(1) not null,
- user_id int not null,
- file varchar(255) not null,
- constraint id
- unique (id)
-);
-
-create or replace table user_joined_info
-(
- id int auto_increment,
- ip_id int not null,
- user_id int not null,
- time datetime not null,
- constraint id
- unique (id),
- constraint unique_user_joined_info_user_id_ip_id
- unique (ip_id, user_id)
-);
-
-create or replace table verification
-(
- id int auto_increment,
- type enum('REGISTER', 'PASSWORD', 'EMAIL', 'CONFIRM_EMAIL') not null,
- token varchar(17) not null,
- user_id int not null,
- time datetime not null,
- verified tinyint(1) default 0 not null,
- email varchar(190) null,
- constraint id
- unique (id)
-);
-
-create or replace table user_auth
-(
- id int not null
- primary key (id),
- password varchar(255) not null,
- email varchar(255) null,
- facebook_id varchar(255) null,
- google_id datetime null,
- email_verification_id datetime null,
- constraint email
- unique (email),
- constraint facebook_id
- unique (facebook_id),
- constraint google_id
- unique (google_id),
- constraint id
- unique (id)
-);
-
-create or replace table user_settings
-(
- id int not null,
- suggestions tinyint(1) default 1 not null,
- show_when_im_typing tinyint(1) default 1 not null,
- embedded_youtube tinyint(1) default 1 not null,
- highlight_code tinyint(1) default 1 not null,
- message_sound tinyint(1) default 0 not null,
- incoming_file_call_sound tinyint(1) default 0 not null,
- online_change_messages tinyint(1) default 0 not null,
- devtools_logs enum('log_raise_error', 'log_with_warnings', 'trace', 'debug', 'info', 'warn', 'error', 'disable') default 'error' not null,
- theme enum('COLOR_LOR', 'COLOR_REG', 'COLOR_WHITE') default 'COLOR_REG' not null,
- constraint id
- unique (id)
-);
-
-create or replace table user_profile
-(
- id int not null,
- name varchar(30) null,
- city varchar(50) null,
- surname varchar(30) null,
- birthday datetime not null,
- contacts varchar(100) null,
- constraint id
- unique (id)
-);
From 3d1680ca3b7577cb647f36be2405b3cb42f937ab Mon Sep 17 00:00:00 2001
From: akoidan
Date: Mon, 11 Apr 2022 14:03:47 +0300
Subject: [PATCH 009/221] Fixed patch + created name
---
newback/.gitignore | 5 +
.../migration-template/202204110326-init.sql | 290 ++++++++++++++++++
newback/config/migration/.gitkeep | 0
newback/package.json | 4 +-
.../data/database/model/user.auth.model.ts | 4 +-
newback/src/data/database/ormconfig.ts | 2 +-
newback/src/data/types/dto | 1 +
newback/src/migration.runner.ts | 41 ++-
newback/yarn.lock | 8 +-
9 files changed, 333 insertions(+), 22 deletions(-)
create mode 100644 newback/config/migration-template/202204110326-init.sql
create mode 100644 newback/config/migration/.gitkeep
create mode 120000 newback/src/data/types/dto
diff --git a/newback/.gitignore b/newback/.gitignore
index 14ec4464c..ef314b4c1 100644
--- a/newback/.gitignore
+++ b/newback/.gitignore
@@ -1,3 +1,8 @@
node_modules
yarn-error.log
dist
+# exclude everything
+config/migration/*
+
+# exception to the rule
+!config/migration/.gitkeep
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
new file mode 100644
index 000000000..b6c7b5819
--- /dev/null
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -0,0 +1,290 @@
+-- set force = true in sequelize.config.js
+
+CREATE TABLE `user`
+(
+ `id` INTEGER auto_increment,
+ `last_time_online` DATETIME NOT NULL,
+ `username` VARCHAR(16) NOT NULL UNIQUE,
+ `sex` ENUM ('MALE', 'FEMALE', 'OTHER') NOT NULL DEFAULT 'OTHER',
+ `thumbnail` VARCHAR(100) DEFAULT NULL,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`)
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `channel`
+(
+ `id` INTEGER auto_increment,
+ `name` VARCHAR(16) NOT NULL,
+ `creator_id` INTEGER,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`creator_id`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `room`
+(
+ `id` INTEGER auto_increment,
+ `name` VARCHAR(16),
+ `is_main_in_channel` TINYINT(1) NOT NULL DEFAULT false,
+ `p2p` TINYINT(1) NOT NULL DEFAULT false,
+ `channel_id` INTEGER DEFAULT NULL,
+ `creator_id` INTEGER DEFAULT NULL,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`channel_id`) REFERENCES `channel` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
+ FOREIGN KEY (`creator_id`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
+ constraint admin_should_not_be_define_for_private_rooms check (`creator_id` is null or `name` is not null),
+ constraint channel_should_exist_for_public_room_and_not_exist_for_private check (`channel_id` is null and `name` is null or `channel_id` is not null),
+ constraint p2p_only_if_private check (`p2p` = 0x00 or `name` is null)
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `message`
+(
+ `id` INTEGER auto_increment,
+ `sender_id` INTEGER NOT NULL,
+ `room_id` INTEGER NOT NULL,
+ `time` BIGINT NOT NULL,
+ `content` LONGTEXT,
+ `symbol` VARCHAR(1),
+ `message_status` ENUM ('ON_SERVER', 'READ', 'RECEIVED') NOT NULL,
+ `thread_message_count` INTEGER NOT NULL DEFAULT 0,
+ `parent_message_id` INTEGER,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`sender_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`room_id`) REFERENCES `room` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`parent_message_id`) REFERENCES `message` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `image`
+(
+ `id` INTEGER auto_increment,
+ `type` ENUM ('VIDEO', 'IMAGE', 'GIPHY') NOT NULL,
+ `symbol` VARCHAR(1) NOT NULL,
+ `message_id` INTEGER NOT NULL,
+ `img` VARCHAR(255),
+ `preview` VARCHAR(255),
+ `absolute_url` VARCHAR(255),
+ `webp_asbolute_url` VARCHAR(255),
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ UNIQUE `unique_image_symbol_message` (`symbol`, `message_id`),
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `ip_address`
+(
+ `id` INTEGER auto_increment,
+ `ip` VARCHAR(32) NOT NULL UNIQUE,
+ `isp` VARCHAR(255),
+ `country_code` VARCHAR(16),
+ `country` VARCHAR(64),
+ `region` VARCHAR(64),
+ `city` VARCHAR(64),
+ `lat` DOUBLE PRECISION,
+ `lon` DOUBLE PRECISION,
+ `zip` VARCHAR(32),
+ `timezone` VARCHAR(32),
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`)
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `message_history`
+(
+ `id` INTEGER auto_increment,
+ `message_id` INTEGER NOT NULL,
+ `time` BIGINT NOT NULL,
+ `content` LONGTEXT,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `message_mention`
+(
+ `id` INTEGER auto_increment,
+ `user_id` INTEGER NOT NULL,
+ `message_id` INTEGER NOT NULL,
+ `symbol` VARCHAR(1) NOT NULL,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ UNIQUE `unique_message_mention_user_id_symbol_message_id` (`user_id`, `message_id`, `symbol`),
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `room_user`
+(
+ `id` INTEGER auto_increment,
+ `room_id` INTEGER NOT NULL,
+ `user_id` INTEGER NOT NULL,
+ `volume` INTEGER NOT NULL DEFAULT 2,
+ `notifications` TINYINT(1) NOT NULL DEFAULT true,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ UNIQUE `unique_room_user_room_id_user_id` (`room_id`, `user_id`),
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`room_id`) REFERENCES `room` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `subscription`
+(
+ `id` INTEGER auto_increment,
+ `user_id` INTEGER NOT NULL,
+ `registration_id` VARCHAR(255) NOT NULL UNIQUE,
+ `agent` VARCHAR(64),
+ `is_mobile` TINYINT(1) NOT NULL DEFAULT false,
+ `ip_id` INTEGER,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`ip_id`) REFERENCES `ip_address` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `subscription_message`
+(
+ `id` INTEGER auto_increment,
+ `subscription_id` INTEGER NOT NULL,
+ `message_id` INTEGER NOT NULL,
+ `received` TINYINT(1) NOT NULL DEFAULT false,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ UNIQUE `unique_subscription_message_subscription_id_message_id` (`subscription_id`, `message_id`),
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`subscription_id`) REFERENCES `subscription` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `uploaded_file`
+(
+ `id` INTEGER auto_increment,
+ `type` ENUM ('VIDEO', 'FILE', 'MEDIA_RECORD', 'AUDIO_RECORD', 'IMAGE', 'PREVIEW', 'ISSUE') NOT NULL,
+ `symbol` VARCHAR(1) NOT NULL,
+ `user_id` INTEGER NOT NULL,
+ `file` VARCHAR(255) NOT NULL,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `verification`
+(
+ `id` INTEGER auto_increment,
+ `type` ENUM ('REGISTER', 'PASSWORD', 'EMAIL', 'CONFIRM_EMAIL') NOT NULL,
+ `token` VARCHAR(17) NOT NULL,
+ `user_id` INTEGER NOT NULL,
+ `time` DATETIME NOT NULL,
+ `verified` TINYINT(1) NOT NULL DEFAULT false,
+ `email` VARCHAR(190),
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `user_auth`
+(
+ `id` INTEGER,
+ `password` VARCHAR(255) NOT NULL,
+ `email` VARCHAR(255) UNIQUE,
+ `facebook_id` VARCHAR(255) UNIQUE,
+ `google_id` DATETIME UNIQUE,
+ `email_verification_id` INTEGER,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`email_verification_id`) REFERENCES `verification` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `user_joined_info`
+(
+ `id` INTEGER auto_increment,
+ `ip_id` INTEGER NOT NULL,
+ `user_id` INTEGER NOT NULL,
+ `time` DATETIME NOT NULL,
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ UNIQUE `unique_user_joined_info_user_id_ip_id` (`ip_id`, `user_id`),
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`ip_id`) REFERENCES `ip_address` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
+ FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `user_profile`
+(
+ `id` INTEGER,
+ `name` VARCHAR(30),
+ `city` VARCHAR(50),
+ `surname` VARCHAR(30),
+ `birthday` DATETIME NOT NULL,
+ `contacts` VARCHAR(100),
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
+CREATE TABLE `user_settings`
+(
+ `id` INTEGER,
+ `suggestions` TINYINT(1) NOT NULL DEFAULT true,
+ `show_when_im_typing` TINYINT(1) NOT NULL DEFAULT true,
+ `embedded_youtube` TINYINT(1) NOT NULL DEFAULT true,
+ `highlight_code` TINYINT(1) NOT NULL DEFAULT true,
+ `message_sound` TINYINT(1) NOT NULL DEFAULT false,
+ `incoming_file_call_sound` TINYINT(1) NOT NULL DEFAULT false,
+ `online_change_messages` TINYINT(1) NOT NULL DEFAULT false,
+ `devtools_logs` ENUM ('log_raise_error', 'log_with_warnings', 'trace', 'debug', 'info', 'warn', 'error', 'disable') NOT NULL DEFAULT 'error',
+ `theme` ENUM ('COLOR_LOR', 'COLOR_REG', 'COLOR_WHITE') NOT NULL DEFAULT 'COLOR_REG',
+ `created_at` DATETIME NOT NULL,
+ `updated_at` DATETIME NOT NULL,
+ `deleted_at` DATETIME,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE utf8mb4_general_ci;
diff --git a/newback/config/migration/.gitkeep b/newback/config/migration/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/newback/package.json b/newback/package.json
index f30fb8b5c..908cdb169 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -6,7 +6,7 @@
"license": "MIT",
"scripts": {
"generate-configs": "node node_modules/node-config-ts/bin/cli",
- "migrate": "ts-node ./src/migration.runner.ts \n",
+ "migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
"start:dev": "node --inspect=0.0.0.0 dist/src/main",
@@ -25,7 +25,7 @@
"lines-logger": "^2.1.2",
"mysql2": "^2.3.3",
"node-config-ts": "npm:node-config-ts-2",
- "node-db-migration": "^1.3.3",
+ "node-db-migration": "^1.4.0",
"npm": "^8.6.0",
"pg": "^8.7.3",
"redis": "^4.0.6",
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index 8e94ae0e2..cd5045f9f 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -54,10 +54,10 @@ export class UserAuthModel extends Model {
@ForeignKey(() => VerificationModel)
@Column({
- type: DataType.DATE,
+ type: DataType.INTEGER,
allowNull: true,
})
- public emailVerificationId: string;
+ public emailVerificationId: number;
@BelongsTo(() => VerificationModel)
public emailVerification: VerificationModel;
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index 45f8f9800..a5cd231f4 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -2,7 +2,7 @@ import type {SequelizeModuleOptions} from '@nestjs/sequelize';
import {config} from 'node-config-ts';
-export function generateConfig(logging: ((sql: string) => void)): SequelizeModuleOptions {
+export function generateConfig(logging: ((sql: string) => void)): Omit {
return {
synchronize: config.mysql.synchronize,
logging: config.mysql.logging ? logging : false,
diff --git a/newback/src/data/types/dto b/newback/src/data/types/dto
new file mode 120000
index 000000000..3f6330a4b
--- /dev/null
+++ b/newback/src/data/types/dto
@@ -0,0 +1 @@
+../../../../common/
\ No newline at end of file
diff --git a/newback/src/migration.runner.ts b/newback/src/migration.runner.ts
index af7cb69e5..fc706e3d1 100644
--- a/newback/src/migration.runner.ts
+++ b/newback/src/migration.runner.ts
@@ -1,15 +1,30 @@
-import mysql2 from 'mysql2';
-import {CommandsRunner, MysqlDriver} from 'node-db-migration';
-var connection = mysql2.createConnection({
- "host" : "localhost",
- "user" : "root",
- "database" : "test8",
- "multipleStatements" : true, // if you have multiple sql in your scripts
+import {createConnection} from 'mysql2';
+import {generateConfig} from '@/data/database/ormconfig';
+import {
+ CommandsRunner,
+ MysqlDriver
+} from 'node-db-migration';
+
+const {database, host, password, port, username, define} = generateConfig((sql) => console.log(sql))
+
+const connection = createConnection({
+ database,
+ host,
+ password,
+ port,
+ user: username,
+ multipleStatements: true,
+ charset: define.charset,
+ connectAttributes: {
+ 'collate': define.collate
+ }
});
-connection.connect(function(err) {
- let migrations = new CommandsRunner({
- driver: new MysqlDriver(connection),
- directoryWithScripts: __dirname + '/diff',
- });
- migrations.run('init')
+
+connection.connect(async function (err) {
+ let migrations = new CommandsRunner({
+ driver: new MysqlDriver(connection),
+ directoryWithScripts: `${__dirname}/../config/migration/`,
+ });
+ await migrations.run('init')
+ await migrations.run('migrate')
});
diff --git a/newback/yarn.lock b/newback/yarn.lock
index e7af11ddd..693a8427f 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -3222,10 +3222,10 @@ neo-async@^2.6.2:
prettier "^1.19.1"
ramda "^0.27.0"
-node-db-migration@^1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/node-db-migration/-/node-db-migration-1.3.3.tgz#e930e39f352afefe90e98521169f4db30eba630c"
- integrity sha512-OhiBy2+T5zGlenfaoNdh5raNEZEOunJwFAnK8cRZvj4m7Xu2PZrcekkyokhfD23/EC6tYK9IYOdzgFKMFejaoQ==
+node-db-migration@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/node-db-migration/-/node-db-migration-1.4.0.tgz#5616cca04f315fcb15121d60616233adc86db3c6"
+ integrity sha512-g5XDC7gbr6nCcbzBYZj3TojUMxY9YP07k8n1B4Fcgc+/CSPA0SUjK4hUTOrInwB352uaiplg6ijX7J1k7GFE6A==
dependencies:
moment "*"
From bc62f5ea9d443b0083e2f7b75d7173d3d8ed0ff4 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 00:37:50 +0300
Subject: [PATCH 010/221] Fixed patch + creatated name
---
backend/templates/sign_up_email.html | 5 +-
common/dto.ts | 21 +-
newback/config/default.json | 2 +-
.../migration-template/202204110326-init.sql | 2 +-
newback/config/migration/.gitkeep | 0
newback/jest.config.ts | 33 +
newback/package.json | 16 +-
newback/src/data/database/database.module.ts | 25 +-
...20410104137-modify_users_add_new_fields.js | 21 +
.../data/database/model/user.profile.model.ts | 2 +-
.../data/database/model/verification.model.ts | 6 -
newback/src/data/database/ormconfig.ts | 2 +-
.../database/repository/room.repository.ts | 27 +
.../database/repository/user.repository.ts | 84 +
newback/src/data/redis/RedisService.ts | 22 +
newback/src/data/utils/consts.ts | 2 +
newback/src/main.ts | 13 +-
newback/src/modules/app/app.module.ts | 28 +-
newback/src/modules/auth/auth.controller.ts | 45 +-
newback/src/modules/auth/auth.module.spec.ts | 103 +
newback/src/modules/auth/auth.module.ts | 8 +-
newback/src/modules/auth/auth.service.ts | 64 +-
.../validators/login.request.validator.ts | 28 +
.../sign.up.request.validator.ts} | 21 +-
.../validate.user.request.validator.ts | 26 +
newback/src/modules/email/email.service.ts | 30 +
newback/src/modules/html/html.service.spec.ts | 45 +
newback/src/modules/html/html.service.ts | 25 +
newback/src/modules/logger/interceptor.ts | 37 +
newback/src/modules/logger/logger.module.ts | 4 +-
.../src/modules/password/password.service.ts | 29 +
newback/src/templates/token_email.html | 4 +-
newback/yarn.lock | 3563 ++++++++++-------
package.json | 62 -
34 files changed, 2914 insertions(+), 1491 deletions(-)
delete mode 100644 newback/config/migration/.gitkeep
create mode 100644 newback/jest.config.ts
create mode 100644 newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
create mode 100644 newback/src/data/database/repository/room.repository.ts
create mode 100644 newback/src/data/database/repository/user.repository.ts
create mode 100644 newback/src/data/redis/RedisService.ts
create mode 100644 newback/src/data/utils/consts.ts
create mode 100644 newback/src/modules/auth/auth.module.spec.ts
create mode 100644 newback/src/modules/auth/validators/login.request.validator.ts
rename newback/src/modules/auth/{interfaces.ts => validators/sign.up.request.validator.ts} (68%)
create mode 100644 newback/src/modules/auth/validators/validate.user.request.validator.ts
create mode 100644 newback/src/modules/email/email.service.ts
create mode 100644 newback/src/modules/html/html.service.spec.ts
create mode 100644 newback/src/modules/html/html.service.ts
create mode 100644 newback/src/modules/logger/interceptor.ts
create mode 100644 newback/src/modules/password/password.service.ts
delete mode 100644 package.json
diff --git a/backend/templates/sign_up_email.html b/backend/templates/sign_up_email.html
index 2d75d6399..231574ba1 100644
--- a/backend/templates/sign_up_email.html
+++ b/backend/templates/sign_up_email.html
@@ -1,5 +1,6 @@
Hello, {{ username }}!
-{{ greetings }}
+You have registered in Pychat . If you find any bugs or propositions you can post them
+ here . To complete your registration please click on the link below.
\ No newline at end of file
+
diff --git a/common/dto.ts b/common/dto.ts
index 9a73b2bfa..fc8cd2bdb 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -3,6 +3,25 @@ export interface LoginRequest {
password: string;
}
+export interface ValidateUserRequest {
+ username: string;
+}
+
+export interface ValidateUserResponse {
+ ok: boolean;
+}
+
+export interface SignUpRequest {
+ username: string;
+ password: string;
+ email?: string;
+ sex?: Gender;
+}
+
+export interface SignUpResponse {
+ session: string;
+}
+
// ISO/IEC 5218 1 male, 2 - female
export enum Gender {
MALE = 'MALE',
@@ -24,7 +43,7 @@ export enum Theme {
export enum VerificationType {
REGISTER = 'REGISTER',
- PASSWORD = ' PASSWORD = \'p\',\n',
+ PASSWORD = 'PASSWORD',
EMAIL = 'EMAIL',
CONFIRM_EMAIL = 'CONFIRM_EMAIL',
}
diff --git a/newback/config/default.json b/newback/config/default.json
index c4dfa7eae..8f309b304 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -36,7 +36,7 @@
}
},
"mysql": {
- "synchronize": true,
+ "synchronize": false,
"logging": true,
"host": "localhost",
"port": 3306,
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
index b6c7b5819..b0753bd11 100644
--- a/newback/config/migration-template/202204110326-init.sql
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -258,7 +258,7 @@ CREATE TABLE `user_profile`
`name` VARCHAR(30),
`city` VARCHAR(50),
`surname` VARCHAR(30),
- `birthday` DATETIME NOT NULL,
+ `birthday` DATETIME NULL,
`contacts` VARCHAR(100),
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
diff --git a/newback/config/migration/.gitkeep b/newback/config/migration/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/newback/jest.config.ts b/newback/jest.config.ts
new file mode 100644
index 000000000..726f03b30
--- /dev/null
+++ b/newback/jest.config.ts
@@ -0,0 +1,33 @@
+import type {Config} from '@jest/types';
+const tsconfig = require("./tsconfig.json")
+const moduleNameMapper = require("tsconfig-paths-jest")(tsconfig)
+
+// Sync object
+const config: Config.InitialOptions = {
+ verbose: true,
+};
+
+export default async(): Promise => {
+ return {
+ "moduleFileExtensions": [
+ "js",
+ "json",
+ "ts"
+ ],
+ "testRegex": ".*\\.spec\\.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ },
+ "collectCoverageFrom": [
+ "**/*.(t|j)s"
+ ],
+ "coveragePathIgnorePatterns": [
+ "/node_modules/",
+ "/dist/",
+ ".dto.ts$"
+ ],
+ "coverageDirectory": "../coverage",
+ "testEnvironment": "node",
+ moduleNameMapper,
+ }
+};
diff --git a/newback/package.json b/newback/package.json
index 908cdb169..fd7b21bca 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -18,17 +18,15 @@
"@nestjs/platform-express": "^8.4.4",
"@nestjs/sequelize": "^8.0.0",
"@nestjs/swagger": "^5.2.1",
+ "@types/bcrypt": "^5.0.0",
+ "bcrypt": "^5.0.1",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
- "csv-parse": "^5.0.4",
- "i": "^0.3.7",
+ "ioredis": "^5.0.4",
"lines-logger": "^2.1.2",
"mysql2": "^2.3.3",
"node-config-ts": "npm:node-config-ts-2",
"node-db-migration": "^1.4.0",
- "npm": "^8.6.0",
- "pg": "^8.7.3",
- "redis": "^4.0.6",
"reflect-metadata": "^0.1.13",
"rxjs": "^7",
"sequelize": "^6.18.0",
@@ -36,17 +34,25 @@
"swagger-ui-express": "^4.3.0"
},
"devDependencies": {
+ "@nestjs-modules/ioredis": "^1.0.0",
"@nestjs/cli": "^8.2.5",
"@nestjs/schematics": "^8.0.10",
"@nestjs/testing": "^8.4.4",
"@types/express": "^4.17.13",
+ "@types/jest": "^27.4.1",
"@types/node": "^17.0.23",
"@types/sequelize": "^4.28.11",
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
"eslint": "^8.12.0",
+ "eslint-plugin-jest": "^26.1.4",
+ "jest": "^27.5.1",
+ "jest-runner-eslint": "^1.0.0",
+ "supertest": "^6.2.2",
+ "ts-jest": "^27.1.4",
"ts-loader": "^9.2.8",
"ts-node": "^10.7.0",
+ "tsconfig-paths-jest": "^0.0.1",
"typescript": "^4.6.3"
}
}
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
index 81312e0be..b135bcf43 100644
--- a/newback/src/data/database/database.module.ts
+++ b/newback/src/data/database/database.module.ts
@@ -1,11 +1,7 @@
-import {
- ConsoleLogger,
- Module
-} from '@nestjs/common';
-import { SequelizeModule } from '@nestjs/sequelize';
+import {Module} from '@nestjs/common';
+import {SequelizeModule} from '@nestjs/sequelize';
-import {generateConfig } from '@/data/database/ormconfig';
-import { Sequelize } from 'sequelize-typescript';
+import {generateConfig} from '@/data/database/ormconfig';
import {ChannelModel} from '@/data/database/model/channel.model';
import {ImageModel} from '@/data/database/model/image.model';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
@@ -23,26 +19,23 @@ import {UserModel} from '@/data/database/model/user.model';
import {UserProfileModel} from '@/data/database/model/user.profile.model';
import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {VerificationModel} from '@/data/database/model/verification.model';
-import {
- Logger,
- LoggerService
-} from '@nestjs/common/services/logger.service';
-import {LoggerModule} from '@/modules/logger/logger.module';
+import {Logger} from '@nestjs/common/services/logger.service';
+import {UserRepository} from '@/data/database/repository/user.repository';
+import {RoomRepository} from '@/data/database/repository/room.repository';
const repositories = [
-
+ UserRepository,
+ RoomRepository,
];
-
@Module({
imports: [
SequelizeModule.forRootAsync({
inject: [Logger],
- imports: [LoggerModule],
useFactory: (logger: Logger) => generateConfig((sql) => logger.debug(sql)),
}),
SequelizeModule.forFeature([
- ChannelModel,
+ ChannelModel,
ImageModel,
IpAddressModel,
MessageHistoryModel,
diff --git a/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js b/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
new file mode 100644
index 000000000..a740c9a27
--- /dev/null
+++ b/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
@@ -0,0 +1,21 @@
+'use strict';
+
+module.exports = {
+ async up (queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ },
+
+ async down (queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ }
+};
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
index dfae80c29..095a95d72 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -44,7 +44,7 @@ export class UserProfileModel extends Model {
@Column({
type: DataType.DATE,
- allowNull: false,
+ allowNull: true,
})
public birthday: Date;
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index 633a125cb..7947c7a5f 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -43,12 +43,6 @@ export class VerificationModel extends Model {
@BelongsTo(() => UserModel)
public user: UserModel;
- @Column({
- type: DataType.DATE,
- allowNull: false,
- })
- public time: Date;
-
@Column({
type: DataType.BOOLEAN,
allowNull: false,
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index a5cd231f4..4f65066d2 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -14,7 +14,7 @@ export function generateConfig(logging: ((sql: string) => void)): Omit {
+ let userModel = await this.userModel.create({
+ username: data.username,
+ lastTimeOnline: new Date(),
+ sex: data.sex
+ })
+ await Promise.all([
+ this.userProfileModel.create({
+ id: userModel.id
+ }),
+ this.userAuthModel.create({
+ password: data.password,
+ email: data.email,
+ id: userModel.id
+ }),
+ this.userSettingsModel.create({
+ id: userModel.id
+ })
+ ])
+ return userModel.id;
+ }
+
+ public async checkUserExistByUserName(username: string): Promise {
+ return await this.userModel.findOne({
+ where: {username},
+ }) != null
+ }
+
+ public async createVerification(email: string, userId: number, token: string): Promise {
+ let verification = await this.verificationModel.create({
+ type: VerificationType.REGISTER,
+ email,
+ userId,
+ token,
+ });
+ await this.userAuthModel.update( {
+ emailVerificationId: verification.id,
+ }, {
+ where: {
+ id: userId,
+ }
+ })
+ }
+
+ public async checkUserExistByEmail(email: string): Promise {
+ return await this.userAuthModel.findOne({
+ where: {email},
+ }) != null
+ }
+
+ public async getUserByEmail(email: string): Promise {
+ return this.userAuthModel.findOne({
+ where: {email},
+ include: [
+ 'user', // LEFT OUTER JOIN "id" = "user"."id"
+ ],
+ })
+ }
+
+}
diff --git a/newback/src/data/redis/RedisService.ts b/newback/src/data/redis/RedisService.ts
new file mode 100644
index 000000000..ac85e7d21
--- /dev/null
+++ b/newback/src/data/redis/RedisService.ts
@@ -0,0 +1,22 @@
+import {Injectable} from '@nestjs/common';
+import {SignUpRequest} from '@/data/types/dto/dto';
+import {REDIS_SESSIONS_KEY} from '@/data/utils/consts';
+import {
+ InjectRedis,
+ Redis
+} from '@nestjs-modules/ioredis';
+
+@Injectable()
+export class RedisService {
+
+ constructor(
+ @InjectRedis() private readonly redis: Redis,
+ ) {
+ }
+
+
+ public async saveSession(session: string, userId: number) {
+ await this.redis.hset(REDIS_SESSIONS_KEY, session, userId);
+ }
+
+}
diff --git a/newback/src/data/utils/consts.ts b/newback/src/data/utils/consts.ts
new file mode 100644
index 000000000..142842582
--- /dev/null
+++ b/newback/src/data/utils/consts.ts
@@ -0,0 +1,2 @@
+export const ALL_ROOM_ID = 1;
+export const REDIS_SESSIONS_KEY = 'sessions';
diff --git a/newback/src/main.ts b/newback/src/main.ts
index 8280df3ce..f38db42a0 100644
--- a/newback/src/main.ts
+++ b/newback/src/main.ts
@@ -1,17 +1,20 @@
-import { NestFactory } from '@nestjs/core';
-import { AppModule } from '@/modules/app/app.module';
-import { config } from 'node-config-ts';
+import {NestFactory} from '@nestjs/core';
+import {AppModule} from '@/modules/app/app.module';
+import {config} from 'node-config-ts';
import {
ConsoleLogger,
+ Logger,
ValidationPipe
} from '@nestjs/common';
-
+import {LoggerModule} from '@/modules/logger/logger.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: new ConsoleLogger(),
});
- app.useGlobalPipes(new ValidationPipe())
+ app.useGlobalPipes(new ValidationPipe());
+ app.useLogger(app.get(Logger))
await app.listen(config.application.port);
}
+
bootstrap();
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index d16cddd31..4e830fd3a 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -1,11 +1,27 @@
-import {
- Module
-} from '@nestjs/common';
+import {Module} from '@nestjs/common';
import {AuthModule} from '@/modules/auth/auth.module';
import {DatabaseModule} from '@/data/database/database.module';
+import {LoggingInterceptor} from '@/modules/logger/interceptor';
+import {APP_INTERCEPTOR} from '@nestjs/core';
+import {LoggerModule} from '@/modules/logger/logger.module';
+import {RedisModule} from '@nestjs-modules/ioredis';
+import {config} from 'node-config-ts';
@Module({
- imports: [AuthModule, DatabaseModule],
- exports: [DatabaseModule]
+ imports: [AuthModule, DatabaseModule, LoggerModule, RedisModule.forRoot({
+ config: {
+ host: config.redis.host,
+ port: config.redis.port,
+ db: config.redis.database,
+ }
+ })],
+ exports: [DatabaseModule],
+ providers: [
+ {
+ provide: APP_INTERCEPTOR,
+ useClass: LoggingInterceptor,
+ },
+ ],
})
-export class AppModule {}
+export class AppModule {
+}
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
index 0c4cb9a02..cfb88cf9a 100644
--- a/newback/src/modules/auth/auth.controller.ts
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -1,35 +1,38 @@
import {
Body,
+ ConflictException,
Controller,
- Get,
+ Logger,
Post
} from '@nestjs/common';
-import { AuthService } from '@/modules/auth/auth.service';
-import LoginRequestValidator from '@/modules/auth/interfaces';
-import {Sequelize} from 'sequelize';
-import {UserModel} from '@/data/database/model/user.model';
-import {UserSettingsModel} from '@/data/database/model/user.settings.model';
-import {ImageModel} from '@/data/database/model/image.model';
-import {IpAddressModel} from '@/data/database/model/ip.address.model';
-import {MessageHistoryModel} from '@/data/database/model/message.history.model';
-import {MessageMentionModel} from '@/data/database/model/message.mention.model';
-import {MessageModel} from '@/data/database/model/message.model';
-import {RoomModel} from '@/data/database/model/room.model';
-import {RoomUsersModel} from '@/data/database/model/room.users.model';
-import {SubscriptionModel} from '@/data/database/model/subscription.model';
-import {SubscriptionMessageModel} from '@/data/database/model/subscription.message.model';
-import {UploadedFileModel} from '@/data/database/model/uploaded.file.model';
-import {UserAuthModel} from '@/data/database/model/user.auth.model';
-import {UserJoinedInfoModel} from '@/data/database/model/user.joined.info.model';
-import {UserProfileModel} from '@/data/database/model/user.profile.model';
-import {VerificationModel} from '@/data/database/model/verification.model';
+import {AuthService} from '@/modules/auth/auth.service';
+import {LoginRequestValidator} from '@/modules/auth/validators/login.request.validator';
+import {SignUpRequestValidator} from '@/modules/auth/validators/sign.up.request.validator';
+import {ValidateUserRequestValidator} from '@/modules/auth/validators/validate.user.request.validator';
+import {SignUpResponse} from '@/data/types/dto/dto';
@Controller()
export class AuthController {
- constructor(private readonly appService: AuthService) {}
+ constructor(
+ private readonly appService: AuthService,
+ private readonly logger: Logger
+ ) {}
@Post('/auth')
public auth(@Body() body: LoginRequestValidator): string {
return 'asd';
}
+
+ @Post('/register')
+ public register(@Body() body: SignUpRequestValidator): SignUpResponse {
+ return this.appService.registerUser(body);
+ }
+
+
+ @Post('/validate_user')
+ public async validateUser(@Body() body: ValidateUserRequestValidator): Promise {
+ await this.appService.validateUser(body.username);
+ }
+
+
}
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/auth/auth.module.spec.ts
new file mode 100644
index 000000000..c55a7b6be
--- /dev/null
+++ b/newback/src/modules/auth/auth.module.spec.ts
@@ -0,0 +1,103 @@
+import {
+ INestApplication,
+ Logger,
+ ValidationPipe
+} from '@nestjs/common';
+import * as supertest from 'supertest';
+import {Test} from '@nestjs/testing';
+import {AuthService} from '@/modules/auth/auth.service';
+import {AuthController} from '@/modules/auth/auth.controller';
+import {LoggerModule} from '@/modules/logger/logger.module';
+import {PasswordService} from '@/modules/password/password.service';
+import {UserRepository} from '@/data/database/repository/user.repository';
+
+describe('AuthModule', () => {
+ let app: INestApplication;
+ let request: () => supertest.SuperTest;
+ let userRepository: UserRepository;
+ beforeEach(async() => {
+
+ userRepository = {} as UserRepository;
+ const moduleFixture = await Test.createTestingModule({
+ imports: [LoggerModule],
+ providers: [
+ AuthService,
+ {
+ provide: UserRepository,
+ useValue: userRepository,
+ },
+ Logger,
+ PasswordService,
+ ],
+ controllers: [AuthController]
+ }).compile();
+ app = moduleFixture.createNestApplication();
+ app.useGlobalPipes(new ValidationPipe());
+ await app.init();
+
+ const requestToServer = supertest(app.getHttpServer());
+ request = (): supertest.SuperTest => requestToServer;
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ afterAll(() => app.close());
+
+ describe('signup', () => {
+ it('validate request', async() => {
+ const {body} = await request()
+ .post('/register').send({
+ username: 'a',
+ password: 'as$'
+ });
+
+ await expect(body).toStrictEqual({'a': 3});
+ });
+ });
+ describe('validate user', () => {
+ it('should give error on invalid character for username', async() => {
+ const {body} = await request()
+ .post('/validate_user').send({
+ username: '%',
+ });
+
+ await expect(body).toStrictEqual({
+ "error": "Bad Request",
+ "message": [
+ "Username can only contain latin characters, numbers and symbols '-' '_'",
+ ],
+ "statusCode": 400,
+ });
+ });
+ it('should give error if username has great length', async() => {
+ const {body} = await request()
+ .post('/validate_user').send({
+ username: '1234567890123456789',
+ });
+
+ await expect(body).toStrictEqual({
+ "error": "Bad Request",
+ "message": [
+ "Username should be 1-16 characters",
+ ],
+ "statusCode": 400,
+ });
+ });
+ it('should throw an error if user exists', async() => {
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
+
+ const {body} = await request()
+ .post('/validate_user').send({
+ username: 'asd',
+ });
+
+ await expect(body).toStrictEqual({
+ "error": "Conflict",
+ "message": "This user already exist",
+ "statusCode": 409,
+ });
+ });
+ });
+});
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
index 1095d884b..296bfb122 100644
--- a/newback/src/modules/auth/auth.module.ts
+++ b/newback/src/modules/auth/auth.module.ts
@@ -1,13 +1,15 @@
import {
- Logger,
Module
} from '@nestjs/common';
import { AuthController } from '@/modules/auth/auth.controller';
import { AuthService } from '@/modules/auth/auth.service';
+import {DatabaseModule} from '@/data/database/database.module';
+import {PasswordService} from '@/modules/password/password.service';
+import {RedisService} from '@/data/redis/RedisService';
@Module({
- imports: [],
+ imports: [DatabaseModule],
controllers: [AuthController],
- providers: [AuthService, Logger],
+ providers: [AuthService, PasswordService, RedisService],
})
export class AuthModule {}
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/auth/auth.service.ts
index 53400c8b7..0fd565648 100644
--- a/newback/src/modules/auth/auth.service.ts
+++ b/newback/src/modules/auth/auth.service.ts
@@ -1,8 +1,66 @@
-import { Injectable } from '@nestjs/common';
+import {
+ ConflictException,
+ Injectable
+} from '@nestjs/common';
+import {UserRepository} from '@/data/database/repository/user.repository';
+import {PasswordService} from '@/modules/password/password.service';
+import {SignUpRequest} from '@/data/types/dto/dto';
+import {RoomRepository} from '@/data/database/repository/room.repository';
+import {ALL_ROOM_ID} from '@/data/utils/consts';
+import {RedisService} from '@/data/redis/RedisService';
+import {EmailService} from '@/modules/email/email.service';
@Injectable()
export class AuthService {
- getHello(): string {
- return 'Hello World!';
+
+ constructor(
+ private readonly userRepository: UserRepository,
+ private readonly roomRepository: RoomRepository,
+ private readonly passwordService: PasswordService,
+ private readonly redisService: RedisService,
+ private readonly emailService: EmailService,
+ ) {
+ }
+
+ public async authorize(email: string): Promise {
+ let user = await this.userRepository.getUserByEmail(email);
+ return user.user.username;
+ }
+
+ private async createUser(data: SignUpRequest) {
+ await this.validateUser(data.username);
+ if (data.email) {
+ await this.validateEmail(data.email)
+ }
+ const password = await this.passwordService.createPassword(data.password);
+ let userId = await this.userRepository.createUser({...data, password})
+ await this.roomRepository.createRoomUser(ALL_ROOM_ID, userId);
+ return userId;
+ }
+
+ public async registerUser(data: SignUpRequest) {
+ let userId = await this.createUser(data);
+ let session = await this.passwordService.generateRandomString(32);
+ await this.redisService.saveSession(session, userId);
+ if (data.email) {
+ let token = await this.passwordService.generateRandomString(32);
+ await this.userRepository.createVerification(data.email, userId, token)
+ await this.emailService.sendSignUpEmail(data.username, data.email, token)
+ }
+ return session;
+ }
+
+ public async validateEmail(email: string): Promise {
+ let exist = await this.userRepository.checkUserExistByEmail(email);
+ if (exist) {
+ throw new ConflictException("User with this email already exist");
+ }
+ }
+
+ public async validateUser(userName: string): Promise {
+ let exist = await this.userRepository.checkUserExistByUserName(userName);
+ if (exist) {
+ throw new ConflictException("User with this username already exist");
+ }
}
}
diff --git a/newback/src/modules/auth/validators/login.request.validator.ts b/newback/src/modules/auth/validators/login.request.validator.ts
new file mode 100644
index 000000000..84e84300c
--- /dev/null
+++ b/newback/src/modules/auth/validators/login.request.validator.ts
@@ -0,0 +1,28 @@
+import {
+ IsEmail,
+ IsEnum,
+ IsOptional,
+ IsString,
+ Length,
+ Matches,
+} from 'class-validator';
+import {
+ Gender,
+ LoginRequest,
+ SignUpRequest
+} from '@/data/types/dto/dto';
+import {config} from 'node-config-ts';
+
+export class LoginRequestValidator implements LoginRequest {
+ @IsString()
+ @Matches(/^\S+$/, {
+ message: `Username can't contain whitespaces`
+ })
+ public username: string;
+
+ @IsString()
+ @Matches(/^\S+$/, {
+ message: `Password can't contain whitespaces`
+ })
+ public password: string;
+}
diff --git a/newback/src/modules/auth/interfaces.ts b/newback/src/modules/auth/validators/sign.up.request.validator.ts
similarity index 68%
rename from newback/src/modules/auth/interfaces.ts
rename to newback/src/modules/auth/validators/sign.up.request.validator.ts
index 913c727cc..9f45ec69b 100644
--- a/newback/src/modules/auth/interfaces.ts
+++ b/newback/src/modules/auth/validators/sign.up.request.validator.ts
@@ -1,12 +1,19 @@
import {
+ IsEmail,
+ IsEnum,
+ IsOptional,
IsString,
Length,
Matches,
} from 'class-validator';
-import {LoginRequest} from '@/data/types/dto/dto';
+import {
+ Gender,
+ SignUpRequest,
+} from '@/data/types/dto/dto';
import {config} from 'node-config-ts';
-export default class LoginRequestValidator implements LoginRequest {
+export class SignUpRequestValidator implements SignUpRequest {
+
@IsString()
@Length(1, config.frontend.maxUserNameLength, {
message: `Username should be 1-${config.frontend.maxUserNameLength} characters`
@@ -16,6 +23,7 @@ export default class LoginRequestValidator implements LoginRequest {
})
public username: string;
+
@IsString()
@Length(3, 128, {
message: "Passwords should contain 3-64 symbols"
@@ -24,4 +32,13 @@ export default class LoginRequestValidator implements LoginRequest {
message: `Password can't contain whitespaces`
})
public password: string;
+
+ @IsOptional()
+ @IsEnum(Gender)
+ public sex?: Gender;
+
+ @IsOptional()
+ @IsEmail()
+ public email?: string;
+
}
diff --git a/newback/src/modules/auth/validators/validate.user.request.validator.ts b/newback/src/modules/auth/validators/validate.user.request.validator.ts
new file mode 100644
index 000000000..6fe0bad3f
--- /dev/null
+++ b/newback/src/modules/auth/validators/validate.user.request.validator.ts
@@ -0,0 +1,26 @@
+import {
+ IsEmail,
+ IsEnum,
+ IsOptional,
+ IsString,
+ Length,
+ Matches,
+} from 'class-validator';
+import {
+ Gender,
+ LoginRequest,
+ SignUpRequest,
+ ValidateUserRequest
+} from '@/data/types/dto/dto';
+import {config} from 'node-config-ts';
+
+export class ValidateUserRequestValidator implements ValidateUserRequest {
+ @IsString()
+ @Length(1, config.frontend.maxUserNameLength, {
+ message: `Username should be 1-${config.frontend.maxUserNameLength} characters`
+ })
+ @Matches(/[a-zA-Z-_0-9]+/, {
+ message: `Username can only contain latin characters, numbers and symbols '-' '_'`
+ })
+ public username: string;
+}
diff --git a/newback/src/modules/email/email.service.ts b/newback/src/modules/email/email.service.ts
new file mode 100644
index 000000000..83d0516bf
--- /dev/null
+++ b/newback/src/modules/email/email.service.ts
@@ -0,0 +1,30 @@
+import {Injectable} from '@nestjs/common';
+import {config} from 'node-config-ts';
+
+@Injectable()
+export class EmailService {
+ public constructor() {
+ }
+
+
+ public sendSignUpEmail(username: string, email: string, token) {
+ const link = `${config.frontend.address}/#/confirm_email?token=${token}`;
+ const text = `Hi ${username}, you have registered pychat` +
+ `\nTo complete your registration please click on the url bellow: ${link}` +
+ `\n\nIf you find any bugs or propositions you can post them ${config.frontend.issueReportLink}`;
+)
+ self.logger.info('Sending verification email to userId %s (email %s)', user.id, user.email)
+ yield self.__send_mail(
+ "Confirm chat registration",
+ text,
+ user.email,
+ html_message,
+ True
+ )
+
+ }
+
+ public async sendEmail(templateId: 'change_email' | 'change_password' | 'sign_up_email' | 'token_email', params: Record): Promise {
+ void 0;
+ }
+}
diff --git a/newback/src/modules/html/html.service.spec.ts b/newback/src/modules/html/html.service.spec.ts
new file mode 100644
index 000000000..24010478f
--- /dev/null
+++ b/newback/src/modules/html/html.service.spec.ts
@@ -0,0 +1,45 @@
+import {HtmlService} from '@/modules/html/html.service';
+
+describe('HtmlService', () => {
+
+ describe('replaceTemplate', () => {
+ it('should replace single param', () => {
+ let service = new HtmlService();
+ let result = service.replaceTemplate('aa {{ blah }} bbbb', {blah: 3})
+ expect(result).toEqual('aa 3 bbbb');
+ });
+
+ it('should replace multiple params', () => {
+ let service = new HtmlService();
+ let result = service.replaceTemplate('aa {{ blah }} {{koko}}', {blah: 3, koko: 4})
+ expect(result).toEqual('aa 3 4');
+ });
+
+ it('should not fail when empty', () => {
+ let service = new HtmlService();
+ let result = service.replaceTemplate('aa', {})
+ expect(result).toEqual('aa');
+ });
+
+ it('should throw an exception when param is missing', () => {
+ let service = new HtmlService();
+ expect(() => service.replaceTemplate('aa {{ adas }}', {blah: 4})).toThrow(Error("Unable to render template. 'adas' is missing in {\"blah\":4}"))
+ });
+ });
+ describe('renderTemplate', () => {
+ it('should replace single param', async () => {
+ let service = new HtmlService();
+ let result = await service.renderTemplate('token_email', {sign_up_email: 'include', timeCreated: 'now', 'ip': 'localhost', 'ipInfo': 'Chernihiv'})
+ expect(result).toEqual(`include
+
+ Note : Your magic link will expire in 1 day, and can only be used one time.
+
+
+ Link was generated now
+ IP: localhost
+ Chernihiv
+
+`);
+ });
+ });
+});
diff --git a/newback/src/modules/html/html.service.ts b/newback/src/modules/html/html.service.ts
new file mode 100644
index 000000000..355b32bb0
--- /dev/null
+++ b/newback/src/modules/html/html.service.ts
@@ -0,0 +1,25 @@
+import {Injectable} from '@nestjs/common';
+import {readFile} from 'fs';
+import {promisify} from 'util';
+import {resolve} from "path";
+@Injectable()
+export class HtmlService {
+
+
+ public replaceTemplate(content: string, params: Record): string {
+ const replaceHtmlRegex = /\{\{\s?(\w+)\s?\}\}/g;
+ const html = content.replace(replaceHtmlRegex, (_, v) => {
+ if (!params[v]) {
+ throw Error(`Unable to render template. '${v}' is missing in ${JSON.stringify(params)}`)
+ }
+ return params[v] as string
+ });
+ return html;
+ }
+
+ public async renderTemplate(template: string, params: Record) {
+ let filePath = resolve(__dirname, '..' , '..', 'templates',`${template}.html`);
+ const content = await promisify(readFile)(filePath, 'utf-8');
+ return this.replaceTemplate(content, params);
+ }
+}
diff --git a/newback/src/modules/logger/interceptor.ts b/newback/src/modules/logger/interceptor.ts
new file mode 100644
index 000000000..333d540c1
--- /dev/null
+++ b/newback/src/modules/logger/interceptor.ts
@@ -0,0 +1,37 @@
+import {
+ CallHandler,
+ ExecutionContext,
+ Injectable,
+ Logger,
+ NestInterceptor
+} from '@nestjs/common';
+import {
+ Observable,
+ tap,
+ throwError
+} from 'rxjs';
+import {catchError} from 'rxjs/operators';
+
+@Injectable()
+export class LoggingInterceptor implements NestInterceptor {
+
+ private id: number = 0;
+ constructor(private readonly logger: Logger) {
+
+ }
+
+ public intercept(context: ExecutionContext, next: CallHandler): Observable {
+ let request = context.switchToHttp().getRequest();
+ let thisId = this.id++;
+ if (request.body) {
+ this.logger.debug(`Request[${thisId}]: body=${JSON.stringify(request.body)}, headers=${JSON.stringify(request.headers)}`, 'Http');
+ }
+ return next.handle().pipe(tap((responseBody) => {
+ this.logger.debug(`Response[${thisId}]: body=${JSON.stringify(responseBody)}`, 'Http')
+ })).pipe(catchError(err => {
+ this.logger.error(`Response[${thisId}]]: err='${err.message}', body=${JSON.stringify(err.response)}`, err.stack, 'Http');
+ return throwError(err)
+ }));
+ }
+
+}
diff --git a/newback/src/modules/logger/logger.module.ts b/newback/src/modules/logger/logger.module.ts
index b75d7e8d7..8346ea555 100644
--- a/newback/src/modules/logger/logger.module.ts
+++ b/newback/src/modules/logger/logger.module.ts
@@ -1,10 +1,12 @@
import {
+ Global,
Logger,
Module
} from '@nestjs/common';
+@Global()
@Module({
providers: [Logger],
- exports: [Logger],
+ exports: [Logger]
})
export class LoggerModule {}
diff --git a/newback/src/modules/password/password.service.ts b/newback/src/modules/password/password.service.ts
new file mode 100644
index 000000000..1ea0be2c0
--- /dev/null
+++ b/newback/src/modules/password/password.service.ts
@@ -0,0 +1,29 @@
+import {Injectable} from '@nestjs/common';
+import {
+ compare,
+ hash
+} from 'bcrypt';
+
+@Injectable()
+export class PasswordService {
+ public constructor() {
+ }
+
+ public async createPassword(password: string): Promise {
+ return hash(password, 10);
+ }
+
+ public async generateRandomString(length: number): Promise {
+ let result = '';
+ const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
+ for (let i = 0; i < length; i++) {
+ result += characters.charAt(Math.floor(Math.random() *
+ characters.length));
+ }
+ return result;
+ }
+
+ public async checkPassword(password: string, hash: string): Promise {
+ return compare(password, hash);
+ }
+}
diff --git a/newback/src/templates/token_email.html b/newback/src/templates/token_email.html
index 72273e51f..734da4a18 100644
--- a/newback/src/templates/token_email.html
+++ b/newback/src/templates/token_email.html
@@ -1,4 +1,4 @@
-{% include "sign_up_email.html" %}
+{{ sign_up_email }}
Note : Your magic link will expire in 1 day, and can only be used one time.
@@ -6,4 +6,4 @@
Link was generated {{ timeCreated }}
IP: {{ ip }}
{{ ipInfo }}
-
\ No newline at end of file
+
diff --git a/newback/yarn.lock b/newback/yarn.lock
index 693a8427f..b344e0367 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -2,6 +2,13 @@
# yarn lockfile v1
+"@ampproject/remapping@^2.1.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
+ integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.0"
+
"@angular-devkit/core@13.3.2":
version "13.3.2"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.3.2.tgz#b2e7a9a6457d587a59d5f6df799bebb6930a5ddc"
@@ -37,18 +44,139 @@
ora "5.4.1"
rxjs "6.6.7"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
dependencies:
"@babel/highlight" "^7.16.7"
+"@babel/compat-data@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
+ integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==
+
+"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe"
+ integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.9"
+ "@babel/helper-compilation-targets" "^7.17.7"
+ "@babel/helper-module-transforms" "^7.17.7"
+ "@babel/helpers" "^7.17.9"
+ "@babel/parser" "^7.17.9"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.9"
+ "@babel/types" "^7.17.0"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.17.9", "@babel/generator@^7.7.2":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc"
+ integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==
+ dependencies:
+ "@babel/types" "^7.17.0"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-compilation-targets@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46"
+ integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==
+ dependencies:
+ "@babel/compat-data" "^7.17.7"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.17.5"
+ semver "^6.3.0"
+
+"@babel/helper-environment-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
+ integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
+ integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd"
+ integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
+ integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
+
+"@babel/helper-simple-access@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367"
+ integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==
+ dependencies:
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
"@babel/helper-validator-identifier@^7.16.7":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helpers@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a"
+ integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.9"
+ "@babel/types" "^7.17.0"
+
"@babel/highlight@^7.16.7":
version "7.17.9"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
@@ -58,6 +186,140 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
+ integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8"
+ integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/template@^7.16.7", "@babel/template@^7.3.3":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d"
+ integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.9"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.17.9"
+ "@babel/types" "^7.17.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+ integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
"@cspotcode/source-map-consumer@0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
@@ -85,11 +347,6 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@gar/promisify@^1.1.3":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
- integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
-
"@humanwhocodes/config-array@^0.9.2":
version "0.9.5"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
@@ -104,10 +361,233 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
-"@isaacs/string-locale-compare@^1.1.0":
+"@ioredis/commands@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.1.1.tgz#2ba4299ea624a6bfac15b35f6df90b0015691ec3"
+ integrity sha512-fsR4P/ROllzf/7lXYyElUJCheWdTJVJvOTps8v9IWKFATxR61ANOlnoPqhH099xYLrJGpc2ZQ28B3rMeUt5VQg==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
- resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
- integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ 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"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
+ integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+
+"@jest/core@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
+ integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/reporters" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^27.5.1"
+ jest-config "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-resolve-dependencies "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ jest-watcher "^27.5.1"
+ micromatch "^4.0.4"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
+ integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
+ dependencies:
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+
+"@jest/fake-timers@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
+ integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@sinonjs/fake-timers" "^8.0.1"
+ "@types/node" "*"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+"@jest/globals@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
+ integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
+
+"@jest/reporters@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
+ integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^5.1.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-haste-map "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ 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"
+
+"@jest/source-map@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
+ integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+ source-map "^0.6.0"
+
+"@jest/test-result@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
+ integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
+ integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
+
+"@jest/transform@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
+ integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^27.5.1"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-util "^27.5.1"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
+ integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.11"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
+ integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+
+"@jridgewell/trace-mapping@^0.3.0":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
+ integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@mapbox/node-pre-gyp@^1.0.0":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc"
+ integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==
+ dependencies:
+ detect-libc "^2.0.0"
+ https-proxy-agent "^5.0.0"
+ make-dir "^3.1.0"
+ node-fetch "^2.6.7"
+ nopt "^5.0.0"
+ npmlog "^5.0.1"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.11"
+
+"@nestjs-modules/ioredis@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@nestjs-modules/ioredis/-/ioredis-1.0.0.tgz#4b2560f450047ea6cb044ebce5dd4363a24cc416"
+ integrity sha512-4y35a1VtNS3+RofrLWdPe9FiEhpji05wdgnkO97VUu9kxFe8y2Ck5UorRsu3dDzYn5BdumHg8kB9Qbb220gxSg==
"@nestjs/cli@^8.2.5":
version "8.2.5"
@@ -211,41 +691,6 @@
optional "0.1.4"
tslib "2.3.1"
-"@node-redis/bloom@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@node-redis/bloom/-/bloom-1.0.1.tgz#144474a0b7dc4a4b91badea2cfa9538ce0a1854e"
- integrity sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw==
-
-"@node-redis/client@1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@node-redis/client/-/client-1.0.5.tgz#ebac5e2bbf12214042a37621604973a954ede755"
- integrity sha512-ESZ3bd1f+od62h4MaBLKum+klVJfA4wAeLHcVQBkoXa1l0viFesOWnakLQqKg+UyrlJhZmXJWtu0Y9v7iTMrig==
- dependencies:
- cluster-key-slot "1.1.0"
- generic-pool "3.8.2"
- redis-parser "3.0.0"
- yallist "4.0.0"
-
-"@node-redis/graph@1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@node-redis/graph/-/graph-1.0.0.tgz#baf8eaac4a400f86ea04d65ec3d65715fd7951ab"
- integrity sha512-mRSo8jEGC0cf+Rm7q8mWMKKKqkn6EAnA9IA2S3JvUv/gaWW/73vil7GLNwion2ihTptAm05I9LkepzfIXUKX5g==
-
-"@node-redis/json@1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@node-redis/json/-/json-1.0.2.tgz#8ad2d0f026698dc1a4238cc3d1eb099a3bee5ab8"
- integrity sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==
-
-"@node-redis/search@1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@node-redis/search/-/search-1.0.5.tgz#96050007eb7c50a7e47080320b4f12aca8cf94c4"
- integrity sha512-MCOL8iCKq4v+3HgEQv8zGlSkZyXSXtERgrAJ4TSryIG/eLFy84b57KmNNa/V7M1Q2Wd2hgn2nPCGNcQtk1R1OQ==
-
-"@node-redis/time-series@1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@node-redis/time-series/-/time-series-1.0.2.tgz#5dd3638374edd85ebe0aa6b0e87addc88fb9df69"
- integrity sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==
-
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -267,172 +712,6 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@npmcli/arborist@^5.0.0", "@npmcli/arborist@^5.0.4":
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.0.5.tgz#e38b63cabc496840bb329182fe6bee18ad9f3ee2"
- integrity sha512-96UwbW4ASOMg/ltORxx36njDiIy5HYdWR5HOvroYeVhoSOLYKwlixALowNK7ZBt49MOaJVCfLMyu9on71gQC/g==
- dependencies:
- "@isaacs/string-locale-compare" "^1.1.0"
- "@npmcli/installed-package-contents" "^1.0.7"
- "@npmcli/map-workspaces" "^2.0.0"
- "@npmcli/metavuln-calculator" "^3.0.1"
- "@npmcli/move-file" "^2.0.0"
- "@npmcli/name-from-folder" "^1.0.1"
- "@npmcli/node-gyp" "^2.0.0"
- "@npmcli/package-json" "^2.0.0"
- "@npmcli/run-script" "^3.0.0"
- bin-links "^3.0.0"
- cacache "^16.0.0"
- common-ancestor-path "^1.0.1"
- json-parse-even-better-errors "^2.3.1"
- json-stringify-nice "^1.1.4"
- mkdirp "^1.0.4"
- mkdirp-infer-owner "^2.0.0"
- nopt "^5.0.0"
- npm-install-checks "^5.0.0"
- npm-package-arg "^9.0.0"
- npm-pick-manifest "^7.0.0"
- npm-registry-fetch "^13.0.0"
- npmlog "^6.0.1"
- pacote "^13.0.5"
- parse-conflict-json "^2.0.1"
- proc-log "^2.0.0"
- promise-all-reject-late "^1.0.0"
- promise-call-limit "^1.0.1"
- read-package-json-fast "^2.0.2"
- readdir-scoped-modules "^1.1.0"
- rimraf "^3.0.2"
- semver "^7.3.5"
- ssri "^9.0.0"
- treeverse "^2.0.0"
- walk-up-path "^1.0.0"
-
-"@npmcli/ci-detect@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89"
- integrity sha512-8yQtQ9ArHh/TzdUDKQwEvwCgpDuhSWTDAbiKMl3854PcT+Dk4UmWaiawuFTLy9n5twzXOBXVflWe+90/ffXQrA==
-
-"@npmcli/config@^4.0.1":
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-4.0.2.tgz#cecb171225d8325cee30ee45893eebd9503bb203"
- integrity sha512-UqD4h4LgyNOb7xRmAK7QXiMu0/k2x7wEzrEqXZ1wGIQVmCl3vamsAprDjAhi7IKlgRulg09hpwYs2/57OP22xw==
- dependencies:
- "@npmcli/map-workspaces" "^2.0.2"
- ini "^3.0.0"
- mkdirp-infer-owner "^2.0.0"
- nopt "^5.0.0"
- proc-log "^2.0.0"
- read-package-json-fast "^2.0.3"
- semver "^7.3.5"
- walk-up-path "^1.0.0"
-
-"@npmcli/disparity-colors@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-2.0.0.tgz#cb518166ee21573b96241a3613fef70acb2a60ba"
- integrity sha512-FFXGrIjhvd2qSZ8iS0yDvbI7nbjdyT2VNO7wotosjYZM2p2r8PN3B7Om3M5NO9KqW/OVzfzLB3L0V5Vo5QXC7A==
- dependencies:
- ansi-styles "^4.3.0"
-
-"@npmcli/fs@^2.1.0":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109"
- integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==
- dependencies:
- "@gar/promisify" "^1.1.3"
- semver "^7.3.5"
-
-"@npmcli/git@^3.0.0":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.1.tgz#049b99b1381a2ddf7dc56ba3e91eaf76ca803a8d"
- integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==
- dependencies:
- "@npmcli/promise-spawn" "^3.0.0"
- lru-cache "^7.4.4"
- mkdirp "^1.0.4"
- npm-pick-manifest "^7.0.0"
- proc-log "^2.0.0"
- promise-inflight "^1.0.1"
- promise-retry "^2.0.1"
- semver "^7.3.5"
- which "^2.0.2"
-
-"@npmcli/installed-package-contents@^1.0.7":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa"
- integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==
- dependencies:
- npm-bundled "^1.1.1"
- npm-normalize-package-bin "^1.0.1"
-
-"@npmcli/map-workspaces@^2.0.0", "@npmcli/map-workspaces@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.2.tgz#dfc87ced615afeb98a081da2aa9bba072bf6712d"
- integrity sha512-ED54EslGsHFWBPN5x8JAOszuWywuoXYSi9E3HQRsgVkWnqsdTBJDSM4IFMRwmmBUbCHAxmP3wGLu1WMm4fhrOw==
- dependencies:
- "@npmcli/name-from-folder" "^1.0.1"
- glob "^7.2.0"
- minimatch "^5.0.1"
- read-package-json-fast "^2.0.3"
-
-"@npmcli/metavuln-calculator@^3.0.1":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.0.tgz#b1c2f0991c4f2d992b1615a54d4358c05efc3702"
- integrity sha512-Q5fbQqGDlYqk7kWrbg6E2j/mtqQjZop0ZE6735wYA1tYNHguIDjAuWs+kFb5rJCkLIlXllfapvsyotYKiZOTBA==
- dependencies:
- cacache "^16.0.0"
- json-parse-even-better-errors "^2.3.1"
- pacote "^13.0.3"
- semver "^7.3.5"
-
-"@npmcli/move-file@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02"
- integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==
- dependencies:
- mkdirp "^1.0.4"
- rimraf "^3.0.2"
-
-"@npmcli/name-from-folder@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a"
- integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==
-
-"@npmcli/node-gyp@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35"
- integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==
-
-"@npmcli/package-json@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-1.0.1.tgz#1ed42f00febe5293c3502fd0ef785647355f6e89"
- integrity sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==
- dependencies:
- json-parse-even-better-errors "^2.3.1"
-
-"@npmcli/package-json@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a"
- integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==
- dependencies:
- json-parse-even-better-errors "^2.3.1"
-
-"@npmcli/promise-spawn@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573"
- integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==
- dependencies:
- infer-owner "^1.0.4"
-
-"@npmcli/run-script@^3.0.0", "@npmcli/run-script@^3.0.1":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-3.0.2.tgz#3e9116d831f4539bf292d18b015977a6118997ee"
- integrity sha512-vdjD/PMBl+OX9j9C9irx5sCCIKfp2PWkpPNH9zxvlJAfSZ3Qp5aU412v+O3PFJl3R1PFNwuyChCqHg4ma6ci2Q==
- dependencies:
- "@npmcli/node-gyp" "^2.0.0"
- "@npmcli/promise-spawn" "^3.0.0"
- node-gyp "^9.0.0"
- read-package-json-fast "^2.0.3"
-
"@nuxtjs/opencollective@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c"
@@ -442,10 +721,24 @@
consola "^2.15.0"
node-fetch "^2.6.1"
-"@tootallnate/once@2":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
- integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^8.0.1":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7"
+ integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@tsconfig/node10@^1.0.7":
version "1.0.8"
@@ -467,6 +760,46 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
+ version "7.1.19"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
+ integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
+ dependencies:
+ "@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.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
+ integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
+ integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43"
+ integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==
+ dependencies:
+ "@babel/types" "^7.3.0"
+
+"@types/bcrypt@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-5.0.0.tgz#a835afa2882d165aff5690893db314eaa98b9f20"
+ integrity sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==
+ dependencies:
+ "@types/node" "*"
+
"@types/bluebird@*":
version "3.5.36"
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.36.tgz#00d9301d4dc35c2f6465a8aec634bb533674c652"
@@ -541,6 +874,40 @@
"@types/qs" "*"
"@types/serve-static" "*"
+"@types/graceful-fs@^4.1.2":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@^27.4.1":
+ version "27.4.1"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d"
+ integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==
+ dependencies:
+ jest-matcher-utils "^27.0.0"
+ pretty-format "^27.0.0"
+
"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@@ -576,6 +943,11 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+"@types/prettier@^2.1.5":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759"
+ integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==
+
"@types/qs@*":
version "6.9.7"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
@@ -604,11 +976,28 @@
"@types/mime" "^1"
"@types/node" "*"
+"@types/stack-utils@^2.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
+ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+
"@types/validator@*", "@types/validator@^13.7.1":
version "13.7.2"
resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.2.tgz#a2114225d9be743fb154b06c29b8257aaca42922"
integrity sha512-KFcchQ3h0OPQgFirBRPZr5F/sVjxZsOrQHedj3zi8AH3Zv/hOLx2OLR4hxR5HcfoU+33n69ZuOfzthKVdMoTiw==
+"@types/yargs-parser@*":
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
+ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+
+"@types/yargs@^16.0.0":
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
+ integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@typescript-eslint/eslint-plugin@^5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz#950df411cec65f90d75d6320a03b2c98f6c3af7d"
@@ -669,7 +1058,7 @@
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.18.0":
+"@typescript-eslint/utils@5.18.0", "@typescript-eslint/utils@^5.10.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.18.0.tgz#27fc84cf95c1a96def0aae31684cb43a37e76855"
integrity sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==
@@ -820,7 +1209,12 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-abbrev@1, abbrev@~1.1.1:
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+ integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
+abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
@@ -833,6 +1227,14 @@ accepts@~1.3.8:
mime-types "~2.1.34"
negotiator "0.6.3"
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
acorn-import-assertions@^1.7.6:
version "1.8.0"
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
@@ -843,40 +1245,33 @@ acorn-jsx@^5.3.1:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
+acorn@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
-agent-base@6, agent-base@^6.0.2:
+agent-base@6:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
dependencies:
debug "4"
-agentkeepalive@^4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
- integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
- dependencies:
- debug "^4.1.0"
- depd "^1.1.2"
- humanize-ms "^1.2.1"
-
-aggregate-error@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
- integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
- dependencies:
- clean-stack "^2.0.0"
- indent-string "^4.0.0"
-
ajv-formats@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
@@ -943,24 +1338,19 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.1.0, ansi-styles@^4.3.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
-ansicolors@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
- integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
-
-ansistyles@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
- integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
-anymatch@~3.1.2:
+anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
@@ -973,20 +1363,15 @@ append-field@^1.0.0:
resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=
-"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0:
+"aproba@^1.0.3 || ^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-archy@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
-
-are-we-there-yet@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d"
- integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
+are-we-there-yet@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
+ integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
dependencies:
delegates "^1.0.0"
readable-stream "^3.6.0"
@@ -996,6 +1381,13 @@ arg@^4.1.0:
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
@@ -1027,6 +1419,11 @@ asap@^2.0.0:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
axios@0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
@@ -1034,6 +1431,67 @@ axios@0.26.1:
dependencies:
follow-redirects "^1.14.8"
+babel-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
+ integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
+ dependencies:
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@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"
+
+babel-plugin-jest-hoist@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
+ integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
+ dependencies:
+ "@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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@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@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
+ integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
+ dependencies:
+ babel-plugin-jest-hoist "^27.5.1"
+ babel-preset-current-node-syntax "^1.0.0"
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -1044,19 +1502,15 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-bin-links@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.1.tgz#cc70ffb481988b22c527d3e6e454787876987a49"
- integrity sha512-9vx+ypzVhASvHTS6K+YSGf7nwQdANoz7v6MTC0aCtYnOEZ87YvMf81aY737EZnGZdpbRM3sfWjO9oWkKmuIvyQ==
+bcrypt@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71"
+ integrity sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==
dependencies:
- cmd-shim "^5.0.0"
- mkdirp-infer-owner "^2.0.0"
- npm-normalize-package-bin "^1.0.0"
- read-cmd-shim "^3.0.0"
- rimraf "^3.0.0"
- write-file-atomic "^4.0.0"
+ "@mapbox/node-pre-gyp" "^1.0.0"
+ node-addon-api "^3.1.0"
-binary-extensions@^2.0.0, binary-extensions@^2.2.0:
+binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
@@ -1112,13 +1566,6 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
-brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
- dependencies:
- balanced-match "^1.0.0"
-
braces@^3.0.2, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -1126,7 +1573,12 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-browserslist@^4.14.5:
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.14.5, browserslist@^4.17.5:
version "4.20.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88"
integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==
@@ -1137,16 +1589,25 @@ browserslist@^4.14.5:
node-releases "^2.0.2"
picocolors "^1.0.0"
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-buffer-writer@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
- integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
-
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
@@ -1155,13 +1616,6 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
-builtins@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.0.tgz#20d87e7f95d46481b1abe4adc616a9cb6b492cba"
- integrity sha512-aizhtbxgT1Udg0Fj6GssXshAVK+nxbtCV+1OtTrMNy67jffDFBY6CUBAkhO4owbleAx6fdbnWdpsmmcXydbzNw==
- dependencies:
- semver "^7.0.0"
-
busboy@^0.2.11:
version "0.2.14"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
@@ -1175,30 +1629,6 @@ bytes@3.1.2:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
-cacache@^16.0.0, cacache@^16.0.2, cacache@^16.0.3:
- version "16.0.4"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.0.4.tgz#66877ae82717ade4d1416d5b3caa3a870f2c6d0c"
- integrity sha512-U0D4wF3/W8ZgK4qDA5fTtOVSr0gaDfd5aa7tUdAV0uukVWKsAIn6SzXQCoVlg7RWZiJa+bcsM3/pXLumGaL2Ug==
- dependencies:
- "@npmcli/fs" "^2.1.0"
- "@npmcli/move-file" "^2.0.0"
- chownr "^2.0.0"
- fs-minipass "^2.1.0"
- glob "^7.2.0"
- infer-owner "^1.0.4"
- lru-cache "^7.7.1"
- minipass "^3.1.6"
- minipass-collect "^1.0.2"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.4"
- mkdirp "^1.0.4"
- p-map "^4.0.0"
- promise-inflight "^1.0.1"
- rimraf "^3.0.2"
- ssri "^9.0.0"
- tar "^6.1.11"
- unique-filename "^1.1.1"
-
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -1212,12 +1642,22 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
caniuse-lite@^1.0.30001317:
version "1.0.30001327"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz#c1546d7d7bb66506f0ccdad6a7d07fc6d668c858"
integrity sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==
-chalk@3.0.0:
+chalk@3.0.0, chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
@@ -1242,6 +1682,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -1272,12 +1717,15 @@ chrome-trace-event@^1.0.2:
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
-cidr-regex@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d"
- integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw==
- dependencies:
- ip-regex "^4.1.0"
+ci-info@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+
+cjs-module-lexer@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
+ integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
class-transformer@^0.5.1:
version "0.5.1"
@@ -1292,19 +1740,6 @@ class-validator@^0.13.2:
libphonenumber-js "^1.9.43"
validator "^13.7.0"
-clean-stack@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
- integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
-cli-columns@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646"
- integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==
- dependencies:
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
-
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
@@ -1317,7 +1752,7 @@ cli-spinners@^2.5.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
-cli-table3@0.6.1, cli-table3@^0.6.1:
+cli-table3@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8"
integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==
@@ -1331,22 +1766,34 @@ cli-width@^3.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-cluster-key-slot@1.1.0:
+cluster-key-slot@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==
-cmd-shim@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724"
- integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==
- dependencies:
- mkdirp-infer-owner "^2.0.0"
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
+ integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
color-convert@^1.9.0:
version "1.9.3"
@@ -1372,7 +1819,7 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-color-support@^1.1.3:
+color-support@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
@@ -1382,13 +1829,12 @@ colors@1.4.0:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-columnify@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3"
- integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
- strip-ansi "^6.0.1"
- wcwidth "^1.0.0"
+ delayed-stream "~1.0.0"
commander@4.1.1:
version "4.1.1"
@@ -1400,10 +1846,10 @@ commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-common-ancestor-path@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7"
- integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==
+component-emitter@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
concat-map@0.0.1:
version "0.0.1"
@@ -1425,7 +1871,7 @@ consola@^2.15.0:
resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
-console-control-strings@^1.1.0:
+console-control-strings@^1.0.0, console-control-strings@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
@@ -1442,6 +1888,13 @@ content-type@~1.0.4:
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
@@ -1452,6 +1905,11 @@ cookie@0.4.2:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+cookiejar@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc"
+ integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==
+
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
@@ -1465,6 +1923,17 @@ cors@2.8.5:
object-assign "^4"
vary "^1"
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@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"
+
cosmiconfig@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
@@ -1476,12 +1945,21 @@ cosmiconfig@^7.0.1:
path-type "^4.0.0"
yaml "^1.10.0"
+create-jest-runner@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/create-jest-runner/-/create-jest-runner-0.6.0.tgz#9ca6583d969acc15cdc21cd07d430945daf83de6"
+ integrity sha512-9ibH8XA4yOJwDLRlzIUv5Ceg2DZFrQFjEtRKplVP6scGKwoz28V27xPHTbXziq2LePAD/xXlJlywhUq1dtF+nw==
+ dependencies:
+ chalk "^3.0.0"
+ jest-worker "^25.1.0"
+ throat "^5.0.0"
+
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -1490,10 +1968,31 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
-csv-parse@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3"
- integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ==
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
debug@2.6.9:
version "2.6.9"
@@ -1502,19 +2001,24 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
-debuglog@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
- integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
+decimal.js@^10.2.1:
+ version "10.3.1"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+ integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
-deep-is@^0.1.3:
+deep-is@^0.1.3, deep-is@~0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
@@ -1538,6 +2042,11 @@ define-properties@^1.1.3:
dependencies:
object-keys "^1.0.12"
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -1553,7 +2062,7 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-depd@^1.1.2, depd@~1.1.2:
+depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
@@ -1568,10 +2077,20 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-dezalgo@^1.0.0:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
- integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==
+detect-libc@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
+ integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+dezalgo@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+ integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
dependencies:
asap "^2.0.0"
wrappy "1"
@@ -1584,16 +2103,16 @@ dicer@0.2.5:
readable-stream "1.1.x"
streamsearch "0.1.2"
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-diff@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
- integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
-
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -1608,6 +2127,20 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
+dot-prop@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
dottie@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154"
@@ -1623,6 +2156,11 @@ electron-to-chromium@^1.4.84:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a"
integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==
+emittery@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860"
+ integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==
+
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -1633,13 +2171,6 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-encoding@^0.1.13:
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
- integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
- dependencies:
- iconv-lite "^0.6.2"
-
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -1651,19 +2182,9 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2:
version "5.9.2"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9"
integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
-env-paths@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-err-code@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
- integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
error-ex@^1.3.1:
version "1.3.2"
@@ -1742,11 +2263,35 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+escodegen@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+ integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-plugin-jest@^26.1.4:
+ version "26.1.4"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.1.4.tgz#8e3410093ff4439d0c3a371add5bf9e05623a57a"
+ integrity sha512-wgqxujmqc2qpvZqMFWCh6Cniqc8lWpapvXt9j/19DmBDqeDaYhJrSRezYR1SKyemvjx+9e9kny/dgRahraHImA==
+ dependencies:
+ "@typescript-eslint/utils" "^5.10.0"
+
eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
@@ -1830,6 +2375,11 @@ espree@^9.3.1:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^3.3.0"
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
@@ -1884,6 +2434,36 @@ execa@^4.0.2:
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ 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"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+expect@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
+ integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+
express@4.17.3:
version "4.17.3"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
@@ -1945,26 +2525,21 @@ fast-glob@^3.2.9:
merge2 "^1.3.0"
micromatch "^4.0.4"
-fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0:
+fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@^2.0.6:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
-fast-safe-stringify@2.1.1:
+fast-safe-stringify@2.1.1, fast-safe-stringify@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
-fastest-levenshtein@^1.0.12:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
- integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
-
fastq@^1.6.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
@@ -1972,6 +2547,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
figures@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
@@ -2006,6 +2588,14 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -2041,6 +2631,34 @@ fork-ts-checker-webpack-plugin@7.2.3:
semver "^7.3.5"
tapable "^2.2.1"
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+formidable@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff"
+ integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==
+ dependencies:
+ dezalgo "1.0.3"
+ hexoid "1.0.0"
+ once "1.4.0"
+ qs "6.9.3"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -2060,7 +2678,7 @@ fs-extra@10.0.1, fs-extra@^10.0.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-minipass@^2.0.0, fs-minipass@^2.1.0:
+fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
@@ -2077,7 +2695,7 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-fsevents@~2.3.2:
+fsevents@^2.3.2, fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
@@ -2092,19 +2710,20 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-gauge@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
- integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
+gauge@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
+ integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
dependencies:
aproba "^1.0.3 || ^2.0.0"
- color-support "^1.1.3"
- console-control-strings "^1.1.0"
+ color-support "^1.1.2"
+ console-control-strings "^1.0.0"
has-unicode "^2.0.1"
- signal-exit "^3.0.7"
+ object-assign "^4.1.1"
+ signal-exit "^3.0.0"
string-width "^4.2.3"
strip-ansi "^6.0.1"
- wide-align "^1.1.5"
+ wide-align "^1.1.2"
generate-function@^2.3.1:
version "2.3.1"
@@ -2113,10 +2732,15 @@ generate-function@^2.3.1:
dependencies:
is-property "^1.0.2"
-generic-pool@3.8.2:
- version "3.8.2"
- resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9"
- integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
version "1.1.1"
@@ -2127,6 +2751,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
has "^1.0.3"
has-symbols "^1.0.1"
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
get-stream@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
@@ -2134,6 +2763,11 @@ get-stream@^5.0.0:
dependencies:
pump "^3.0.0"
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
get-symbol-description@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
@@ -2161,7 +2795,7 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-glob@7.2.0, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
+glob@7.2.0, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -2173,6 +2807,11 @@ glob@7.2.0, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
once "^1.3.0"
path-is-absolute "^1.0.0"
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
globals@^13.6.0, globals@^13.9.0:
version "13.13.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b"
@@ -2192,7 +2831,7 @@ globby@^11.0.4:
merge2 "^1.4.1"
slash "^3.0.0"
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
@@ -2244,17 +2883,22 @@ hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
-hosted-git-info@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.0.0.tgz#df7a06678b4ebd722139786303db80fdf302ea56"
- integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==
+hexoid@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18"
+ integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
dependencies:
- lru-cache "^7.5.1"
+ whatwg-encoding "^1.0.5"
-http-cache-semantics@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
http-errors@1.8.1:
version "1.8.1"
@@ -2278,12 +2922,12 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
-http-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
- integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
dependencies:
- "@tootallnate/once" "2"
+ "@tootallnate/once" "1"
agent-base "6"
debug "4"
@@ -2300,17 +2944,10 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
- dependencies:
- ms "^2.0.0"
-
-i@^0.3.7:
- version "0.3.7"
- resolved "https://registry.yarnpkg.com/i/-/i-0.3.7.tgz#2a7437a923d59c14b17243dc63a549af24d85799"
- integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
@@ -2319,7 +2956,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-iconv-lite@^0.6.2, iconv-lite@^0.6.3:
+iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -2331,19 +2968,12 @@ ieee754@^1.1.13:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-ignore-walk@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776"
- integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==
- dependencies:
- minimatch "^5.0.1"
-
ignore@^5.1.8, ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
-import-fresh@^3.0.0, import-fresh@^3.2.1:
+import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -2351,21 +2981,19 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-
-infer-owner@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
- integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
inflection@^1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.2.tgz#15e8c797c6c3dadf31aa658f8df8a4ea024798b0"
@@ -2384,29 +3012,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, i
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-ini@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
- integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
-
-ini@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.0.tgz#2f6de95006923aa75feed8894f5686165adc08f1"
- integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==
-
-init-package-json@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69"
- integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==
- dependencies:
- npm-package-arg "^9.0.1"
- promzard "^0.3.0"
- read "^1.0.7"
- read-package-json "^5.0.0"
- semver "^7.3.5"
- validate-npm-package-license "^3.0.4"
- validate-npm-package-name "^4.0.0"
-
inquirer@7.3.3:
version "7.3.3"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
@@ -2460,15 +3065,20 @@ interpret@^1.0.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
-ip-regex@^4.1.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
- integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==
-
-ip@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
- integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+ioredis@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.0.4.tgz#0d4abfd818adfc5ef5029fddac4b8f503a1433b7"
+ integrity sha512-qFJw3MnPNsJF1lcIOP3vztbsasOXK3nDdNAgjQj7t7/Bn/w10PGchTOpqylQNxjzPbLoYDu34LjeJtSWiKBntQ==
+ dependencies:
+ "@ioredis/commands" "^1.1.1"
+ cluster-key-slot "^1.1.0"
+ debug "^4.3.4"
+ denque "^2.0.1"
+ lodash.defaults "^4.2.0"
+ lodash.isarguments "^3.1.0"
+ redis-errors "^1.2.0"
+ redis-parser "^3.0.0"
+ standard-as-callback "^2.1.0"
ipaddr.js@1.9.1:
version "1.9.1"
@@ -2507,13 +3117,6 @@ is-callable@^1.1.4, is-callable@^1.2.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
-is-cidr@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814"
- integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==
- dependencies:
- cidr-regex "^3.1.1"
-
is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
@@ -2538,6 +3141,11 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -2550,100 +3158,557 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
-is-lambda@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
- integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-property@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+ integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
+ integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+
+istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a"
+ integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==
+ dependencies:
+ "@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"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
+ integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^3.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
+ integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+iterare@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042"
+ integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==
+
+jest-changed-files@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
+ integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ execa "^5.0.0"
+ throat "^6.0.1"
+
+jest-circus@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
+ integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^0.7.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+ throat "^6.0.1"
+
+jest-cli@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
+ integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ import-local "^3.0.2"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ prompts "^2.0.1"
+ yargs "^16.2.0"
+
+jest-config@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
+ integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
+ dependencies:
+ "@babel/core" "^7.8.0"
+ "@jest/test-sequencer" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ babel-jest "^27.5.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.1"
+ graceful-fs "^4.2.9"
+ jest-circus "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-jasmine2 "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-docblock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
+ integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
+ integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-environment-jsdom@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
+ integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+ jsdom "^16.6.0"
+
+jest-environment-node@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
+ integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-haste-map@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
+ integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^27.5.1"
+ jest-serializer "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ micromatch "^4.0.4"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-jasmine2@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
+ integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ throat "^6.0.1"
+
+jest-leak-detector@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
+ integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+ dependencies:
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
-is-negative-zero@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
- integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+jest-message-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^27.5.1"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
-is-number-object@^1.0.4:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
- integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+jest-mock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
+ integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
dependencies:
- has-tostringtag "^1.0.0"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+jest-pnp-resolver@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+ integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
-is-property@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
- integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
+jest-regex-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
-is-regex@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
- integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+jest-resolve-dependencies@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
+ integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
-is-shared-array-buffer@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
- integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+jest-resolve@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
+ integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
dependencies:
- call-bind "^1.0.2"
-
-is-stream@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
- integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ resolve "^1.20.0"
+ resolve.exports "^1.1.0"
+ slash "^3.0.0"
-is-string@^1.0.5, is-string@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
- integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+jest-runner-eslint@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jest-runner-eslint/-/jest-runner-eslint-1.0.0.tgz#5cede321ed5ed57233462c5204a0fa8d90f993bd"
+ integrity sha512-LMlAaIQqIIySEThv651bfvzwX6J4nOu91RaEUYmXJgn4XXbM40rSMlBaC8ZrrFcFemu88MFlnrCLuYf7ZHE2sQ==
dependencies:
- has-tostringtag "^1.0.0"
+ chalk "^3.0.0"
+ cosmiconfig "^6.0.0"
+ create-jest-runner "^0.6.0"
+ dot-prop "^5.3.0"
-is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
- integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+jest-runner@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
+ integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-leak-detector "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ source-map-support "^0.5.6"
+ throat "^6.0.1"
+
+jest-runtime@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
+ integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/globals" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ execa "^5.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-serializer@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
+ integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
dependencies:
- has-symbols "^1.0.2"
+ "@types/node" "*"
+ graceful-fs "^4.2.9"
-is-unicode-supported@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
- integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+jest-snapshot@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
+ integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
+ dependencies:
+ "@babel/core" "^7.7.2"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.0.0"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@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.5.1"
+ graceful-fs "^4.2.9"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^27.5.1"
+ semver "^7.3.2"
-is-weakref@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
- integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+jest-util@^27.0.0, jest-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
dependencies:
- call-bind "^1.0.2"
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+jest-validate@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
+ integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ leven "^3.1.0"
+ pretty-format "^27.5.1"
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+jest-watcher@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
+ integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ jest-util "^27.5.1"
+ string-length "^4.0.1"
-iterare@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042"
- integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==
+jest-worker@^25.1.0:
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
+ integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==
+ dependencies:
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
-jest-worker@^27.4.5:
+jest-worker@^27.4.5, jest-worker@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
@@ -2652,11 +3717,28 @@ jest-worker@^27.4.5:
merge-stream "^2.0.0"
supports-color "^8.0.0"
+jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
+ integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ import-local "^3.0.2"
+ jest-cli "^27.5.1"
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
@@ -2664,12 +3746,50 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
+jsdom@^16.6.0:
+ version "16.7.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+ integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+ dependencies:
+ 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"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
+json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@@ -2689,11 +3809,6 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-json-stringify-nice@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67"
- integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==
-
json-to-ts@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/json-to-ts/-/json-to-ts-1.7.0.tgz#896a4eaa3d1ed3fef0c9e73ba98b3e8b25c1e02d"
@@ -2703,6 +3818,11 @@ json-to-ts@^1.6.0:
hash.js "^1.0.3"
pluralize "^3.1.0"
+json5@2.x, json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
@@ -2724,20 +3844,15 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
-jsonparse@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
- integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
-
-just-diff-apply@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.2.0.tgz#15da3888ab3acecc14ce9a067f2d7589c653cb89"
- integrity sha512-unjtin7rnng0KUpE4RPWwTl8iwWiZuyZqOQ+vm8orV6aIXX8mHN8zlKCPPbOycfDNuLh2PBazbFhNoDJv4S/FA==
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-just-diff@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.0.1.tgz#db8fe1cfeea1156f2374bfb289826dca28e7e390"
- integrity sha512-X00TokkRIDotUIf3EV4xUm6ELc/IkqhS/vPSHdWnsM5y0HoNMfEqrazizI7g78lpHvnRSRt/PFfKtRqJCOGIuQ==
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
levn@^0.4.1:
version "0.4.1"
@@ -2747,117 +3862,13 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-libnpmaccess@^6.0.2:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded"
- integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg==
- dependencies:
- aproba "^2.0.0"
- minipass "^3.1.1"
- npm-package-arg "^9.0.1"
- npm-registry-fetch "^13.0.0"
-
-libnpmdiff@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-4.0.3.tgz#ad3997330c887c1098ac42682f1e5ad014d49cec"
- integrity sha512-AiwBtXtH7HjfmT7FbTf9LFzJB347RrIA4I+IewMfhq8vYXaUveHwJMVNgMM2H/o2J+7Hf12JCBoOF5bTwlmGyw==
- dependencies:
- "@npmcli/disparity-colors" "^2.0.0"
- "@npmcli/installed-package-contents" "^1.0.7"
- binary-extensions "^2.2.0"
- diff "^5.0.0"
- minimatch "^5.0.1"
- npm-package-arg "^9.0.1"
- pacote "^13.0.5"
- tar "^6.1.0"
-
-libnpmexec@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-4.0.3.tgz#8f1af808d228766d046b24632304137d64630e1c"
- integrity sha512-71QeTdmiR/nUyNhaSdVuquD65cDrEY2lKHyewlZSmQGX5k4ApimbLnpQkAjeEB7Y9/AVPNAM7F9nrHyb/aExjQ==
- dependencies:
- "@npmcli/arborist" "^5.0.0"
- "@npmcli/ci-detect" "^2.0.0"
- "@npmcli/run-script" "^3.0.0"
- chalk "^4.1.0"
- mkdirp-infer-owner "^2.0.0"
- npm-package-arg "^9.0.1"
- npmlog "^6.0.1"
- pacote "^13.0.5"
- proc-log "^2.0.0"
- read "^1.0.7"
- read-package-json-fast "^2.0.2"
- walk-up-path "^1.0.0"
-
-libnpmfund@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-3.0.2.tgz#7da0827950f0db2cce0acb0dc7652d1834a8b239"
- integrity sha512-wmFMP/93Wjy+jDg5LaSldDgAhSgCyA64JUUmp806Kae7y3YP9Qv5m1vUhPxT4yebxgB2v/I6G1/RUcNb1y0kVg==
- dependencies:
- "@npmcli/arborist" "^5.0.0"
-
-libnpmhook@^8.0.2:
- version "8.0.3"
- resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-8.0.3.tgz#9628518a63455d21dafda312ee46175275707ff5"
- integrity sha512-TEdNI1mC5zS+w/juCgxrwwQnpbq9lY76NDOS0N37pn6pWIUxB1Yq8mwy6MUEXR1TgH4HurSQyKT6I6Kp9Wjm4A==
- dependencies:
- aproba "^2.0.0"
- npm-registry-fetch "^13.0.0"
-
-libnpmorg@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-4.0.3.tgz#a85cbdb3665ad4f7c7279d239a4581ec2eeef5a6"
- integrity sha512-r4CpmCEF+e5PbFMBi64xSXmqn0uGgV4T7NWpGL4/A6KT/DTtIxALILQZq+l0ZdN1xm4RjOvqSDR22oT4il8rAQ==
- dependencies:
- aproba "^2.0.0"
- npm-registry-fetch "^13.0.0"
-
-libnpmpack@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-4.0.3.tgz#0de60120a2456524b0cdb25bac58f454a1441c2e"
- integrity sha512-/H4XXJp5S74palJfVhM5za/4dw8/1DRfU5g+t2taAojjr5+cSKyEoxxnHOnSRWu7zqqMeT8e4jX6Cz8lNUsbAw==
- dependencies:
- "@npmcli/run-script" "^3.0.0"
- npm-package-arg "^9.0.1"
- pacote "^13.0.5"
-
-libnpmpublish@^6.0.2:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.3.tgz#b10cd9c8b2ebeccadc05aea78f11acb28fe606c4"
- integrity sha512-slJ5XuTR3DIF669K7MLVSdhvkatoM3/D+wvryKxVtquKnEbfFORESI1w0lYD4tvrPEy6AU9y/qEMDqhUW712HQ==
- dependencies:
- normalize-package-data "^4.0.0"
- npm-package-arg "^9.0.1"
- npm-registry-fetch "^13.0.0"
- semver "^7.1.3"
- ssri "^9.0.0"
-
-libnpmsearch@^5.0.2:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-5.0.3.tgz#ed502a4c2c70ea36723180455fae1357546b2184"
- integrity sha512-Ofq76qKAPhxbiyzPf/5LPjJln26VTKwU9hIU0ACxQ6tNtBJ1CHmI7iITrdp7vNezhZc0FlkXwrIpqXjhBJZgLQ==
- dependencies:
- npm-registry-fetch "^13.0.0"
-
-libnpmteam@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-4.0.3.tgz#9335fbbd032b3770f5c9b7ffc6203f47d1ed144a"
- integrity sha512-LsYYLz4TlTpcqkusInY5MhKjiHFaCx1GV0LmydXJ/QMh+3IWBJpUhes4ynTZuFoJKkDIFjxyMU09ul+RZixgdg==
- dependencies:
- aproba "^2.0.0"
- npm-registry-fetch "^13.0.0"
-
-libnpmversion@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-3.0.2.tgz#02e517ee2a6454010ab81fd47d26fa1e328f356d"
- integrity sha512-W76aMbL6NWkvOCoBpbWEoypCBsaXU95vhYY2eqBg0Ev11lwpjLIGC78ZCzT/M2hI00ena+yoCpGXGnAk949KOQ==
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
dependencies:
- "@npmcli/git" "^3.0.0"
- "@npmcli/run-script" "^3.0.0"
- json-parse-even-better-errors "^2.3.1"
- proc-log "^2.0.0"
- semver "^7.3.5"
- stringify-package "^1.0.1"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
libphonenumber-js@^1.9.43:
version "1.9.50"
@@ -2879,12 +3890,34 @@ loader-runner@^4.2.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+ integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
+
+lodash.isarguments@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+ integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
+
+lodash.memoize@4.x:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21:
+lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -2917,7 +3950,7 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
-lru-cache@^7.4.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
+lru-cache@^7.4.0:
version "7.8.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747"
integrity sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==
@@ -2934,32 +3967,24 @@ magic-string@0.25.7:
dependencies:
sourcemap-codec "^1.4.4"
-make-error@^1.1.1:
+make-dir@^3.0.0, make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-error@1.x, make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
-make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6, make-fetch-happen@^10.1.1:
- version "10.1.2"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz#acffef43f86250602b932eecc0ad3acc992ae233"
- integrity sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
dependencies:
- agentkeepalive "^4.2.1"
- cacache "^16.0.2"
- http-cache-semantics "^4.1.0"
- http-proxy-agent "^5.0.0"
- https-proxy-agent "^5.0.0"
- is-lambda "^1.0.1"
- lru-cache "^7.7.1"
- minipass "^3.1.6"
- minipass-collect "^1.0.2"
- minipass-fetch "^2.0.3"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.4"
- negotiator "^0.6.3"
- promise-retry "^2.0.1"
- socks-proxy-agent "^6.1.1"
- ssri "^9.0.0"
+ tmpl "1.0.5"
media-typer@0.3.0:
version "0.3.0"
@@ -2988,7 +4013,7 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-methods@~1.1.2:
+methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -3006,7 +4031,7 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -3018,6 +4043,11 @@ mime@1.6.0:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+mime@^2.5.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -3035,73 +4065,19 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
- integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
- dependencies:
- brace-expansion "^2.0.1"
-
minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-minipass-collect@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
- integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
- dependencies:
- minipass "^3.0.0"
-
-minipass-fetch@^2.0.3:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8"
- integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==
- dependencies:
- minipass "^3.1.6"
- minipass-sized "^1.0.3"
- minizlib "^2.1.2"
- optionalDependencies:
- encoding "^0.1.13"
-
-minipass-flush@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
- integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
- dependencies:
- minipass "^3.0.0"
-
-minipass-json-stream@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7"
- integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==
- dependencies:
- jsonparse "^1.3.1"
- minipass "^3.0.0"
-
-minipass-pipeline@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
- integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
- dependencies:
- minipass "^3.0.0"
-
-minipass-sized@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
- integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
- dependencies:
- minipass "^3.0.0"
-
-minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6:
+minipass@^3.0.0:
version "3.1.6"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
dependencies:
yallist "^4.0.0"
-minizlib@^2.1.1, minizlib@^2.1.2:
+minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
@@ -3109,15 +4085,6 @@ minizlib@^2.1.1, minizlib@^2.1.2:
minipass "^3.0.0"
yallist "^4.0.0"
-mkdirp-infer-owner@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316"
- integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==
- dependencies:
- chownr "^2.0.0"
- infer-owner "^1.0.4"
- mkdirp "^1.0.3"
-
mkdirp@^0.5.4:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
@@ -3125,7 +4092,7 @@ mkdirp@^0.5.4:
dependencies:
minimist "^1.2.6"
-mkdirp@^1.0.3, mkdirp@^1.0.4:
+mkdirp@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -3152,7 +4119,7 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@2.1.3, ms@^2.0.0, ms@^2.1.2:
+ms@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -3171,7 +4138,7 @@ multer@1.4.4:
type-is "^1.6.4"
xtend "^4.0.0"
-mute-stream@0.0.8, mute-stream@~0.0.4:
+mute-stream@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
@@ -3202,7 +4169,7 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-negotiator@0.6.3, negotiator@^0.6.3:
+negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
@@ -3212,6 +4179,11 @@ neo-async@^2.6.2:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+node-addon-api@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
+ integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+
"node-config-ts@npm:node-config-ts-2":
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-config-ts-2/-/node-config-ts-2-1.0.0.tgz#349f5dd10e8de8d75f279e2a1e1148f782e77fbe"
@@ -3236,28 +4208,17 @@ node-emoji@1.11.0:
dependencies:
lodash "^4.17.21"
-node-fetch@^2.6.1:
+node-fetch@^2.6.1, node-fetch@^2.6.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
dependencies:
whatwg-url "^5.0.0"
-node-gyp@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089"
- integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==
- dependencies:
- env-paths "^2.2.0"
- glob "^7.1.4"
- graceful-fs "^4.2.6"
- make-fetch-happen "^10.0.3"
- nopt "^5.0.0"
- npmlog "^6.0.0"
- rimraf "^3.0.2"
- semver "^7.3.5"
- tar "^6.1.2"
- which "^2.0.2"
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
node-releases@^2.0.2:
version "2.0.2"
@@ -3271,204 +4232,33 @@ nopt@^5.0.0:
dependencies:
abbrev "1"
-normalize-package-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c"
- integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==
- dependencies:
- hosted-git-info "^5.0.0"
- is-core-module "^2.8.1"
- semver "^7.3.5"
- validate-npm-package-license "^3.0.4"
-
normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-npm-audit-report@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-3.0.0.tgz#1bf3e531208b5f77347c8d00c3d9badf5be30cd6"
- integrity sha512-tWQzfbwz1sc4244Bx2BVELw0EmZlCsCF0X93RDcmmwhonCsPMoEviYsi+32R+mdRvOWXolPce9zo64n2xgPESw==
- dependencies:
- chalk "^4.0.0"
-
-npm-bundled@^1.1.1, npm-bundled@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1"
- integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==
- dependencies:
- npm-normalize-package-bin "^1.0.1"
-
-npm-install-checks@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4"
- integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==
- dependencies:
- semver "^7.1.1"
-
-npm-install-checks@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234"
- integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==
- dependencies:
- semver "^7.1.1"
-
-npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
- integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
-
-npm-package-arg@^9.0.0, npm-package-arg@^9.0.1:
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.0.2.tgz#f3ef7b1b3b02e82564af2d5228b4c36567dcd389"
- integrity sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g==
- dependencies:
- hosted-git-info "^5.0.0"
- semver "^7.3.5"
- validate-npm-package-name "^4.0.0"
-
-npm-packlist@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.0.0.tgz#74795ebbbf91bd5a2db6ecff4d6fe1f1c1a07e11"
- integrity sha512-uU20UwM4Hogfab1Q7htJbhcyafM9lGHxOrDjkKvR2S3z7Ds0uRaESk0cXctczk+ABT4DZWNwjB10xlurFdEwZg==
- dependencies:
- glob "^7.2.0"
- ignore-walk "^5.0.1"
- npm-bundled "^1.1.2"
- npm-normalize-package-bin "^1.0.1"
-
-npm-pick-manifest@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c"
- integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==
- dependencies:
- npm-install-checks "^5.0.0"
- npm-normalize-package-bin "^1.0.1"
- npm-package-arg "^9.0.0"
- semver "^7.3.5"
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-npm-profile@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-6.0.2.tgz#b2da9887d16d1f0d1ce8a9c3b37a48454a372919"
- integrity sha512-0Fq8l+A10YXnnS63E3HThWjOb7+19Wsh1nOVutC2fKuowar8t/5PpINsbcm5xQ2dA28uAu+wjFfUyiEVSMz4Jw==
- dependencies:
- npm-registry-fetch "^13.0.0"
- proc-log "^2.0.0"
-
-npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.1.0:
- version "13.1.0"
- resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.0.tgz#71bed52e30a4b27441604bbba79c7db8e0e34cb5"
- integrity sha512-TIYL5X8CcwDhbFMXFDShNcpG6OMCYK6VzvSr6MUWP20tCU2DJ4ao2qQg3DT+3Pet8mO6/cgbZpon4LMh3duYLg==
- dependencies:
- make-fetch-happen "^10.0.6"
- minipass "^3.1.6"
- minipass-fetch "^2.0.3"
- minipass-json-stream "^1.0.1"
- minizlib "^2.1.2"
- npm-package-arg "^9.0.1"
- proc-log "^2.0.0"
-
-npm-run-path@^4.0.0:
+npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
-npm-user-validate@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561"
- integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==
-
-npm@^8.6.0:
- version "8.6.0"
- resolved "https://registry.yarnpkg.com/npm/-/npm-8.6.0.tgz#46a601fdffa80b018e1dcf08e10d5efb625e5c9e"
- integrity sha512-icekvN8FJFESIFkLaFEVl05Nocl5Id5HnoVhJzhCUvtNY8tj9kfUlH/J527fZq/8ltsAUqpettfutwRjQYS2fA==
- dependencies:
- "@isaacs/string-locale-compare" "^1.1.0"
- "@npmcli/arborist" "^5.0.4"
- "@npmcli/ci-detect" "^2.0.0"
- "@npmcli/config" "^4.0.1"
- "@npmcli/fs" "^2.1.0"
- "@npmcli/map-workspaces" "^2.0.2"
- "@npmcli/package-json" "^1.0.1"
- "@npmcli/run-script" "^3.0.1"
- abbrev "~1.1.1"
- ansicolors "~0.3.2"
- ansistyles "~0.1.3"
- archy "~1.0.0"
- cacache "^16.0.3"
- chalk "^4.1.2"
- chownr "^2.0.0"
- cli-columns "^4.0.0"
- cli-table3 "^0.6.1"
- columnify "^1.6.0"
- fastest-levenshtein "^1.0.12"
- glob "^7.2.0"
- graceful-fs "^4.2.9"
- hosted-git-info "^5.0.0"
- ini "^2.0.0"
- init-package-json "^3.0.2"
- is-cidr "^4.0.2"
- json-parse-even-better-errors "^2.3.1"
- libnpmaccess "^6.0.2"
- libnpmdiff "^4.0.2"
- libnpmexec "^4.0.2"
- libnpmfund "^3.0.1"
- libnpmhook "^8.0.2"
- libnpmorg "^4.0.2"
- libnpmpack "^4.0.2"
- libnpmpublish "^6.0.2"
- libnpmsearch "^5.0.2"
- libnpmteam "^4.0.2"
- libnpmversion "^3.0.1"
- make-fetch-happen "^10.1.1"
- minipass "^3.1.6"
- minipass-pipeline "^1.2.4"
- mkdirp "^1.0.4"
- mkdirp-infer-owner "^2.0.0"
- ms "^2.1.2"
- node-gyp "^9.0.0"
- nopt "^5.0.0"
- npm-audit-report "^3.0.0"
- npm-install-checks "^4.0.0"
- npm-package-arg "^9.0.1"
- npm-pick-manifest "^7.0.0"
- npm-profile "^6.0.2"
- npm-registry-fetch "^13.1.0"
- npm-user-validate "^1.0.1"
- npmlog "^6.0.1"
- opener "^1.5.2"
- pacote "^13.0.5"
- parse-conflict-json "^2.0.2"
- proc-log "^2.0.1"
- qrcode-terminal "^0.12.0"
- read "~1.0.7"
- read-package-json "^5.0.0"
- read-package-json-fast "^2.0.3"
- readdir-scoped-modules "^1.1.0"
- rimraf "^3.0.2"
- semver "^7.3.5"
- ssri "^8.0.1"
- tar "^6.1.11"
- text-table "~0.2.0"
- tiny-relative-date "^1.3.0"
- treeverse "^1.0.4"
- validate-npm-package-name "^4.0.0"
- which "^2.0.2"
- write-file-atomic "^4.0.1"
-
-npmlog@^6.0.0, npmlog@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17"
- integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==
+npmlog@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
+ integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
dependencies:
- are-we-there-yet "^3.0.0"
+ are-we-there-yet "^2.0.0"
console-control-strings "^1.1.0"
- gauge "^4.0.0"
+ gauge "^3.0.0"
set-blocking "^2.0.0"
+nwsapi@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+ integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
object-assign@^4, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -3540,30 +4330,37 @@ on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
-onetime@^5.1.0:
+onetime@^5.1.0, onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
-opener@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
- integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
-
optional@0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3"
integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ 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"
+
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@@ -3604,44 +4401,24 @@ os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-p-map@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
- integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
- aggregate-error "^3.0.0"
+ p-try "^2.0.0"
-packet-reader@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74"
- integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==
-
-pacote@^13.0.3, pacote@^13.0.5:
- version "13.1.1"
- resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.1.1.tgz#d3e6e27ffc5137d2a07233ed6fba2a209ecb2b7b"
- integrity sha512-MTT3k1OhUo+IpvoHGp25OwsRU0L+kJQM236OCywxvY4OIJ/YfloNW2/Yc3HMASH10BkfZaGMVK/pxybB7fWcLw==
- dependencies:
- "@npmcli/git" "^3.0.0"
- "@npmcli/installed-package-contents" "^1.0.7"
- "@npmcli/promise-spawn" "^3.0.0"
- "@npmcli/run-script" "^3.0.1"
- cacache "^16.0.0"
- chownr "^2.0.0"
- fs-minipass "^2.1.0"
- infer-owner "^1.0.4"
- minipass "^3.1.6"
- mkdirp "^1.0.4"
- npm-package-arg "^9.0.0"
- npm-packlist "^5.0.0"
- npm-pick-manifest "^7.0.0"
- npm-registry-fetch "^13.0.1"
- proc-log "^2.0.0"
- promise-retry "^2.0.1"
- read-package-json "^5.0.0"
- read-package-json-fast "^2.0.3"
- rimraf "^3.0.2"
- ssri "^9.0.0"
- tar "^6.1.11"
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
parent-module@^1.0.0:
version "1.0.1"
@@ -3650,16 +4427,7 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323"
- integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==
- dependencies:
- json-parse-even-better-errors "^2.3.1"
- just-diff "^5.0.1"
- just-diff-apply "^5.2.0"
-
-parse-json@^5.0.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -3669,11 +4437,21 @@ parse-json@^5.0.0:
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -3709,62 +4487,28 @@ pg-connection-string@^2.5.0:
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
-pg-int8@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
- integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
-
-pg-pool@^3.5.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.1.tgz#f499ce76f9bf5097488b3b83b19861f28e4ed905"
- integrity sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==
-
-pg-protocol@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0"
- integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==
-
-pg-types@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
- integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
- dependencies:
- 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"
-
-pg@^8.7.3:
- version "8.7.3"
- resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.3.tgz#8a5bdd664ca4fda4db7997ec634c6e5455b27c44"
- integrity sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==
- dependencies:
- buffer-writer "2.0.0"
- packet-reader "1.0.0"
- pg-connection-string "^2.5.0"
- pg-pool "^3.5.1"
- pg-protocol "^1.5.0"
- pg-types "^2.1.0"
- pgpass "1.x"
-
-pgpass@1.x:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
- integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
- dependencies:
- split2 "^4.1.0"
-
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+pirates@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+ integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
pluralize@8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
@@ -3775,77 +4519,42 @@ pluralize@^3.1.0:
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.1.0.tgz#84213d0a12356069daa84060c559242633161368"
integrity sha1-hCE9ChI1YGnaqEBgxVkkJjMWE2g=
-postgres-array@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
- integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
-
-postgres-bytea@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
- integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
-
-postgres-date@~1.0.4:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
- integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
-
-postgres-interval@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
- integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
- dependencies:
- xtend "^4.0.0"
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
prettier@^1.19.1:
version "1.19.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
-proc-log@^2.0.0, proc-log@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685"
- integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==
+pretty-format@^27.0.0, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-promise-all-reject-late@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2"
- integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==
-
-promise-call-limit@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24"
- integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==
-
-promise-inflight@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-
-promise-retry@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
- integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
- dependencies:
- err-code "^2.0.2"
- retry "^0.12.0"
-
-promzard@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
- integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
dependencies:
- read "1"
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
proxy-addr@~2.0.7:
version "2.0.7"
@@ -3860,6 +4569,11 @@ pseudomap@^1.0.2:
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+psl@^1.1.33:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -3868,23 +4582,23 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-punycode@^2.1.0:
+punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-qrcode-terminal@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
- integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
-
-qs@6.10.3:
+qs@6.10.3, qs@^6.10.1:
version "6.10.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
dependencies:
side-channel "^1.0.4"
+qs@6.9.3:
+ version "6.9.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e"
+ integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==
+
qs@6.9.7:
version "6.9.7"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
@@ -3932,35 +4646,10 @@ raw-body@2.5.1:
iconv-lite "0.4.24"
unpipe "1.0.0"
-read-cmd-shim@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155"
- integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==
-
-read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83"
- integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==
- dependencies:
- json-parse-even-better-errors "^2.3.0"
- npm-normalize-package-bin "^1.0.1"
-
-read-package-json@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.0.tgz#d62602755547e152a3923c220238d9a7f0b60745"
- integrity sha512-1cjk2MV5ONDMn34uxSID3X8NY7VKsXfJnjbcVdFMvHEnJOBzU6MJ7/3yg6QFVZDq5/1yFNrKBUK9kGnonyGP2Q==
- dependencies:
- glob "^7.2.0"
- json-parse-even-better-errors "^2.3.1"
- normalize-package-data "^4.0.0"
- npm-normalize-package-bin "^1.0.1"
-
-read@1, read@^1.0.7, read@~1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
- integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
- dependencies:
- mute-stream "~0.0.4"
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
readable-stream@1.1.x:
version "1.1.14"
@@ -3994,16 +4683,6 @@ readable-stream@^3.4.0, readable-stream@^3.6.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readdir-scoped-modules@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
- integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
- dependencies:
- debuglog "^1.0.1"
- dezalgo "^1.0.0"
- graceful-fs "^4.1.2"
- once "^1.3.0"
-
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -4018,30 +4697,18 @@ rechoir@^0.6.2:
dependencies:
resolve "^1.1.6"
-redis-errors@^1.0.0:
+redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=
-redis-parser@3.0.0:
+redis-parser@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=
dependencies:
redis-errors "^1.0.0"
-redis@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/redis/-/redis-4.0.6.tgz#a2ded4d9f4f4bad148e54781051618fc684cd858"
- integrity sha512-IaPAxgF5dV0jx+A9l6yd6R9/PAChZIoAskDVRzUODeLDNhsMlq7OLLTmu0AwAr0xjrJ1bibW5xdpRwqIQ8Q0Xg==
- dependencies:
- "@node-redis/bloom" "1.0.1"
- "@node-redis/client" "1.0.5"
- "@node-redis/graph" "1.0.0"
- "@node-redis/json" "1.0.2"
- "@node-redis/search" "1.0.5"
- "@node-redis/time-series" "1.0.2"
-
reflect-metadata@^0.1.13:
version "0.1.13"
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
@@ -4052,17 +4719,39 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.1.6:
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
+ integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
+
+resolve@^1.1.6, resolve@^1.20.0:
version "1.22.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
@@ -4084,11 +4773,6 @@ retry-as-promised@^5.0.0:
resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-5.0.0.tgz#f4ecc25133603a2d2a7aff4a128691d7bc506d54"
integrity sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==
-retry@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
- integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
-
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@@ -4142,6 +4826,13 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
schema-utils@^3.1.0, schema-utils@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
@@ -4151,13 +4842,18 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
-semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.3.4, semver@^7.3.5:
+semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
version "7.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==
dependencies:
lru-cache "^7.4.0"
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
send@0.17.2:
version "0.17.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
@@ -4273,39 +4969,22 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
-signal-exit@^3.0.2, signal-exit@^3.0.7:
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-smart-buffer@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
- integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-
-socks-proxy-agent@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
- integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
- dependencies:
- agent-base "^6.0.2"
- debug "^4.3.1"
- socks "^2.6.1"
-
-socks@^2.6.1:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
- integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
- dependencies:
- ip "^1.1.5"
- smart-buffer "^4.2.0"
-
-source-map-support@0.5.21, source-map-support@~0.5.20:
+source-map-support@0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -4313,12 +4992,17 @@ source-map-support@0.5.21, source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@0.7.3, source-map@~0.7.2:
+source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2:
version "0.7.3"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-source-map@^0.6.0, source-map@^0.6.1:
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -4328,55 +5012,27 @@ sourcemap-codec@^1.4.4:
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-spdx-correct@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
- integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
- dependencies:
- spdx-expression-parse "^3.0.0"
- spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
-
-spdx-expression-parse@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
- integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
- dependencies:
- spdx-exceptions "^2.1.0"
- spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
- version "3.0.11"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
- integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
-
-split2@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809"
- integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sqlstring@^2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c"
integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==
-ssri@^8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
- integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+stack-utils@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
+ integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
dependencies:
- minipass "^3.1.1"
+ escape-string-regexp "^2.0.0"
-ssri@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.0.tgz#70ad90e339eb910f1a7ff1dcf4afc268326c4547"
- integrity sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==
- dependencies:
- minipass "^3.1.1"
+standard-as-callback@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45"
+ integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==
statuses@2.0.1:
version "2.0.1"
@@ -4401,6 +5057,14 @@ string-at@^1.0.1:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@@ -4481,11 +5145,6 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
-stringify-package@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
- integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
-
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -4498,6 +5157,11 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
@@ -4508,6 +5172,31 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+superagent@^7.1.0:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.2.tgz#71393141edd086ccf2544a29a4a609e46b7911f3"
+ integrity sha512-o9/fP6dww7a4xmEF5a484o2rG34UUGo8ztDlv7vbCWuqPhpndMi0f7eXxdlryk5U12Kzy46nh8eNpLAJ93Alsg==
+ dependencies:
+ component-emitter "^1.3.0"
+ cookiejar "^2.1.3"
+ debug "^4.3.3"
+ fast-safe-stringify "^2.1.1"
+ form-data "^4.0.0"
+ formidable "^2.0.1"
+ methods "^1.1.2"
+ mime "^2.5.0"
+ qs "^6.10.1"
+ readable-stream "^3.6.0"
+ semver "^7.3.5"
+
+supertest@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.2.2.tgz#04a5998fd3efaff187cb69f07a169755d655b001"
+ integrity sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==
+ dependencies:
+ methods "^1.1.2"
+ superagent "^7.1.0"
+
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -4515,7 +5204,7 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -4529,6 +5218,14 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
+supports-hyperlinks@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+ integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@@ -4551,12 +5248,17 @@ symbol-observable@4.0.0:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
+tar@^6.1.11:
version "6.1.11"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
@@ -4568,6 +5270,14 @@ tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
terser-webpack-plugin@^5.1.3:
version "5.3.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
@@ -4589,21 +5299,35 @@ terser@^5.7.2:
source-map "~0.7.2"
source-map-support "~0.5.20"
-text-table@^0.2.0, text-table@~0.2.0:
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+throat@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
+ integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
+
+throat@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
+ integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
+
through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-tiny-relative-date@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
- integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
-
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -4611,6 +5335,16 @@ tmp@^0.0.33:
dependencies:
os-tmpdir "~1.0.2"
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -4628,6 +5362,22 @@ toposort-class@^1.0.1:
resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=
+tough-cookie@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+ integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.1.2"
+
+tr46@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+ integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+ dependencies:
+ punycode "^2.1.1"
+
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
@@ -4638,15 +5388,19 @@ tree-kill@1.2.2:
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
-treeverse@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f"
- integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==
-
-treeverse@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca"
- integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==
+ts-jest@^27.1.4:
+ version "27.1.4"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00"
+ integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==
+ dependencies:
+ bs-logger "0.x"
+ 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"
ts-loader@^9.2.8:
version "9.2.8"
@@ -4677,6 +5431,11 @@ ts-node@^10.7.0:
v8-compile-cache-lib "^3.0.0"
yn "3.1.1"
+tsconfig-paths-jest@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths-jest/-/tsconfig-paths-jest-0.0.1.tgz#a977a5648c434037b69884e644ce1b82bf025b68"
+ integrity sha1-qXelZIxDQDe2mITmRM4bgr8CW2g=
+
tsconfig-paths-webpack-plugin@3.5.2:
version "3.5.2"
resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a"
@@ -4720,6 +5479,18 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
@@ -4738,6 +5509,13 @@ type-is@^1.6.4, type-is@~1.6.18:
media-typer "0.3.0"
mime-types "~2.1.24"
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -4763,19 +5541,10 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
-unique-filename@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
- integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
- dependencies:
- unique-slug "^2.0.0"
-
-unique-slug@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
- integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
- dependencies:
- imurmurhash "^0.1.4"
+universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
universalify@^2.0.0:
version "2.0.0"
@@ -4819,20 +5588,14 @@ v8-compile-cache@^2.0.3:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-validate-npm-package-license@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
- integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
- dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
-
-validate-npm-package-name@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747"
- integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==
+v8-to-istanbul@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
+ integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==
dependencies:
- builtins "^5.0.0"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
validator@^13.7.0:
version "13.7.0"
@@ -4844,10 +5607,26 @@ vary@^1, vary@~1.1.2:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-walk-up-path@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e"
- integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
watchpack@^2.3.1:
version "2.3.1"
@@ -4857,7 +5636,7 @@ watchpack@^2.3.1:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-wcwidth@^1.0.0, wcwidth@^1.0.1:
+wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
@@ -4869,6 +5648,16 @@ webidl-conversions@^3.0.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
webpack-node-externals@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917"
@@ -4909,6 +5698,18 @@ webpack@5.71.0:
watchpack "^2.3.1"
webpack-sources "^3.2.3"
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
@@ -4917,6 +5718,15 @@ whatwg-url@^5.0.0:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+ integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.1.0"
+ webidl-conversions "^6.1.0"
+
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
@@ -4928,14 +5738,14 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which@^2.0.1, which@^2.0.2:
+which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
-wide-align@^1.1.5:
+wide-align@^1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
@@ -4956,44 +5766,93 @@ wkx@^0.5.0:
dependencies:
"@types/node" "*"
-word-wrap@^1.2.3:
+word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^4.0.0, write-file-atomic@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
- integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
dependencies:
imurmurhash "^0.1.4"
- signal-exit "^3.0.7"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+ws@^7.4.6:
+ version "7.5.7"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
+ integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
xtend@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-yallist@4.0.0, yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-yaml@^1.10.0:
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0, yaml@^1.7.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+yargs-parser@20.x, yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ 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"
+
yn@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
diff --git a/package.json b/package.json
deleted file mode 100644
index 43c7353ef..000000000
--- a/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "name": "pychat",
- "version": "1.0.0",
- "description": "Opensource chat",
- "scripts": {
- "build": "vite --config build/vite.config.ts build",
- "start": "vite --config build/vite.config.ts",
- "cp-prod-files": "tar c dist/ | ssh http@pychat.org -p 8886 \"rm -rf /srv/http/pychat/frontend/dist && tar x -C /srv/http/pychat/frontend/\"",
- "serve": "yarn build && node build/static-server.js",
- "postinstall": "patch -p1 -i patches/vue-class-component+8.0.0-rc.1.patch"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/akoidan/pychat.git"
- },
- "author": "Andrew Koidan
Date: Tue, 12 Apr 2022 02:08:27 +0300
Subject: [PATCH 011/221] Register works
---
common/dto.ts | 8 +-
newback/config/Config.d.ts | 16 +
newback/config/default.json | 10 +
.../migration-template/202204110326-init.sql | 3 +-
newback/package.json | 3 +
...20410104137-modify_users_add_new_fields.js | 21 -
.../src/data/database/model/image.model.ts | 8 +-
.../database/model/message.history.model.ts | 2 -
.../src/data/database/model/message.model.ts | 3 +-
newback/src/data/database/model/room.model.ts | 2 +-
.../model/subscription.message.model.ts | 1 -
.../data/database/model/subscription.model.ts | 1 -
.../database/model/uploaded.file.model.ts | 7 +-
.../data/database/model/user.auth.model.ts | 2 +-
.../data/database/model/user.profile.model.ts | 2 +-
.../database/model/user.settings.model.ts | 2 +-
.../data/database/model/verification.model.ts | 4 +-
.../database/repository/room.repository.ts | 10 +-
.../database/repository/user.repository.ts | 23 +-
newback/src/data/redis/RedisService.ts | 1 -
newback/src/main.ts | 1 -
newback/src/modules/auth/auth.controller.ts | 9 +-
newback/src/modules/auth/auth.module.spec.ts | 2 +-
newback/src/modules/auth/auth.module.ts | 15 +-
newback/src/modules/auth/auth.service.ts | 66 +-
.../validators/login.request.validator.ts | 11 +-
.../validate.user.request.validator.ts | 10 +-
.../src/modules/email.render/email.module.ts | 23 +
.../email.render/email.sender.service.ts | 47 +
newback/src/modules/email/email.service.ts | 30 -
newback/src/modules/html/html.service.spec.ts | 27 +-
newback/src/modules/html/html.service.ts | 14 +-
newback/src/modules/logger/interceptor.ts | 1 +
newback/src/modules/logger/logger.module.ts | 3 +-
newback/src/templates/change_email.html | 8 +-
newback/src/templates/change_password.html | 8 +-
newback/src/templates/sign_up_email.html | 17 +-
newback/src/templates/token_email.html | 10 +-
newback/yarn.lock | 1025 ++++++++++++++++-
39 files changed, 1241 insertions(+), 215 deletions(-)
delete mode 100644 newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
create mode 100644 newback/src/modules/email.render/email.module.ts
create mode 100644 newback/src/modules/email.render/email.sender.service.ts
delete mode 100644 newback/src/modules/email/email.service.ts
diff --git a/common/dto.ts b/common/dto.ts
index fc8cd2bdb..50ff656b9 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -34,6 +34,7 @@ export enum MessageStatus {
READ = 'READ',
RECEIVED = 'RECEIVED', //sent
}
+
export enum Theme {
COLOR_LOR = 'COLOR_LOR',
COLOR_REG = 'COLOR_REG',
@@ -51,12 +52,13 @@ export enum VerificationType {
export enum ImageType {
VIDEO = 'VIDEO',
IMAGE = 'IMAGE',
- GIPHY= 'GIPHY'
+ GIPHY = 'GIPHY'
}
-export enum UploadedFileChoices {
+
+export enum UploadedFileChoices {
VIDEO = 'VIDEO',
FILE = 'FILE',
- MEDIA_RECORD= 'MEDIA_RECORD',
+ MEDIA_RECORD = 'MEDIA_RECORD',
AUDIO_RECORD = 'AUDIO_RECORD',
IMAGE = 'IMAGE',
PREVIEW = 'PREVIEW',
diff --git a/newback/config/Config.d.ts b/newback/config/Config.d.ts
index c4c675df6..fb4b488e1 100644
--- a/newback/config/Config.d.ts
+++ b/newback/config/Config.d.ts
@@ -5,6 +5,7 @@ declare module "node-config-ts" {
name: string
application: Application
settings: Settings
+ email: Email
redis: Redis
frontend: Frontend
mysql: Mysql
@@ -35,6 +36,21 @@ declare module "node-config-ts" {
port: number
database: number
}
+ interface Email {
+ host: string
+ port: number
+ secure: boolean
+ tls: Tls
+ auth: Auth
+ from: string
+ }
+ interface Auth {
+ user: string
+ password: string
+ }
+ interface Tls {
+ ciphers: string
+ }
interface Settings {
wsIdCharLength: number
allRedisRoom: string
diff --git a/newback/config/default.json b/newback/config/default.json
index 8f309b304..77bad58d7 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -19,6 +19,16 @@
"pingInterval": 300000,
"clientNoServerPingCloseTimeout": 320000
},
+ "email": {
+ "host": "smtp.gmail.com",
+ "port": 587,
+ "auth": {
+ "type": "login",
+ "user": "chat.django@gmail.com",
+ "password": "Ilovepython"
+ },
+ "from": "root@pychat.org"
+ },
"redis": {
"host": "localhost",
"port": 6379,
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
index b0753bd11..90bc4cc0d 100644
--- a/newback/config/migration-template/202204110326-init.sql
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -206,9 +206,8 @@ CREATE TABLE `verification`
(
`id` INTEGER auto_increment,
`type` ENUM ('REGISTER', 'PASSWORD', 'EMAIL', 'CONFIRM_EMAIL') NOT NULL,
- `token` VARCHAR(17) NOT NULL,
+ `token` VARCHAR(32) NOT NULL,
`user_id` INTEGER NOT NULL,
- `time` DATETIME NOT NULL,
`verified` TINYINT(1) NOT NULL DEFAULT false,
`email` VARCHAR(190),
`created_at` DATETIME NOT NULL,
diff --git a/newback/package.json b/newback/package.json
index fd7b21bca..d48d42485 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -13,12 +13,14 @@
"start:debug": "nest start --debug --watch"
},
"dependencies": {
+ "@nestjs-modules/mailer": "^1.6.1",
"@nestjs/common": "^8.4.4",
"@nestjs/core": "^8.4.4",
"@nestjs/platform-express": "^8.4.4",
"@nestjs/sequelize": "^8.0.0",
"@nestjs/swagger": "^5.2.1",
"@types/bcrypt": "^5.0.0",
+ "@types/nodemailer": "^6.4.4",
"bcrypt": "^5.0.1",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
@@ -27,6 +29,7 @@
"mysql2": "^2.3.3",
"node-config-ts": "npm:node-config-ts-2",
"node-db-migration": "^1.4.0",
+ "nodemailer": "^6.7.3",
"reflect-metadata": "^0.1.13",
"rxjs": "^7",
"sequelize": "^6.18.0",
diff --git a/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js b/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
deleted file mode 100644
index a740c9a27..000000000
--- a/newback/src/data/database/migration/20220410104137-modify_users_add_new_fields.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-module.exports = {
- async up (queryInterface, Sequelize) {
- /**
- * Add altering commands here.
- *
- * Example:
- * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
- */
- },
-
- async down (queryInterface, Sequelize) {
- /**
- * Add reverting commands here.
- *
- * Example:
- * await queryInterface.dropTable('users');
- */
- }
-};
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
index 630de08bc..493879770 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/database/model/image.model.ts
@@ -8,18 +8,14 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {
- ImageType,
- UploadedFileChoices
-} from '@/data/types/dto/dto';
+import {ImageType} from '@/data/types/dto/dto';
import {MessageModel} from '@/data/database/model/message.model';
const uniqueUserIdSymbMess = 'unique_image_symbol_message';
@Injectable()
-@Table({ tableName: 'image'})
+@Table({tableName: 'image'})
export class ImageModel extends Model {
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/database/model/message.history.model.ts
index 53a44703e..8d99046b8 100644
--- a/newback/src/data/database/model/message.history.model.ts
+++ b/newback/src/data/database/model/message.history.model.ts
@@ -7,9 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {config} from 'node-config-ts';
import {MessageModel} from '@/data/database/model/message.model';
-import {UserModel} from '@/data/database/model/user.model';
@Injectable()
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
index bb9961e14..98c930e53 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/database/model/message.model.ts
@@ -10,10 +10,9 @@ import {Injectable} from '@nestjs/common';
import {MessageStatus,} from '@/data/types/dto/dto';
import {UserModel} from '@/data/database/model/user.model';
import {RoomModel} from '@/data/database/model/room.model';
-import {config} from 'node-config-ts';
@Injectable()
-@Table({ tableName: 'message'})
+@Table({tableName: 'message'})
export class MessageModel extends Model {
@Column({
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/database/model/room.model.ts
index 0a73a79f5..0ff516521 100644
--- a/newback/src/data/database/model/room.model.ts
+++ b/newback/src/data/database/model/room.model.ts
@@ -18,7 +18,7 @@ import {ChannelModel} from '@/data/database/model/channel.model';
// constraint p2p_only_if_private
// check (`p2p` = 0x00 or `name` is null)
@Injectable()
-@Table({ tableName: 'room'})
+@Table({tableName: 'room'})
export class RoomModel extends Model {
@Column({
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/database/model/subscription.message.model.ts
index ae28f8e07..5baea7833 100644
--- a/newback/src/data/database/model/subscription.message.model.ts
+++ b/newback/src/data/database/model/subscription.message.model.ts
@@ -10,7 +10,6 @@ import {
import {Injectable} from '@nestjs/common';
import {MessageModel} from '@/data/database/model/message.model';
import {SubscriptionModel} from '@/data/database/model/subscription.model';
-import {UserModel} from '@/data/database/model/user.model';
const uniqueSubscriptionMessage = 'unique_subscription_message_subscription_id_message_id';
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
index 5b09c3782..bb117732b 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -10,7 +10,6 @@ import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
import {UploadedFileChoices} from '@/data/types/dto/dto';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
-import {MessageModel} from '@/data/database/model/message.model';
@Injectable()
@Table({tableName: 'subscription'})
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
index 13f2b67b9..0c7df2067 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -5,14 +5,9 @@ import {
ForeignKey,
Model,
Table,
- Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {
- ImageType,
- UploadedFileChoices
-} from '@/data/types/dto/dto';
-import {MessageModel} from '@/data/database/model/message.model';
+import {UploadedFileChoices} from '@/data/types/dto/dto';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index cd5045f9f..1e7bb23f3 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -11,7 +11,7 @@ import {UserModel} from '@/data/database/model/user.model';
import {VerificationModel} from '@/data/database/model/verification.model';
@Injectable()
-@Table({ tableName: 'user_auth'})
+@Table({tableName: 'user_auth'})
export class UserAuthModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/database/model/user.profile.model.ts
index 095a95d72..c7e605fc3 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/database/model/user.profile.model.ts
@@ -10,7 +10,7 @@ import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
-@Table({ tableName: 'user_profile'})
+@Table({tableName: 'user_profile'})
export class UserProfileModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
index 0eea57bcc..ef70f7405 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -15,7 +15,7 @@ import {
} from 'lines-logger'
@Injectable()
-@Table({ tableName: 'user_settings'})
+@Table({tableName: 'user_settings'})
export class UserSettingsModel extends Model {
@ForeignKey(() => UserModel)
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index 7947c7a5f..95d996bba 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -11,7 +11,7 @@ import {UserModel} from '@/data/database/model/user.model';
import {VerificationType} from '@/data/types/dto/dto';
@Injectable()
-@Table({ tableName: 'verification'})
+@Table({tableName: 'verification'})
export class VerificationModel extends Model {
@Column({
@@ -28,7 +28,7 @@ export class VerificationModel extends Model {
public type: VerificationType;
@Column({
- type: DataType.STRING(17),
+ type: DataType.STRING(32),
allowNull: false,
})
public token: string;
diff --git a/newback/src/data/database/repository/room.repository.ts b/newback/src/data/database/repository/room.repository.ts
index 099bc737f..4db96ee92 100644
--- a/newback/src/data/database/repository/room.repository.ts
+++ b/newback/src/data/database/repository/room.repository.ts
@@ -1,12 +1,8 @@
import {Injectable} from '@nestjs/common';
import {InjectModel} from '@nestjs/sequelize';
-import {UserModel} from '@/data/database/model/user.model';
-import {UserAuthModel} from '@/data/database/model/user.auth.model';
-import {SignUpRequest} from '@/data/types/dto/dto';
-import {UserProfileModel} from '@/data/database/model/user.profile.model';
-import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {RoomModel} from '@/data/database/model/room.model';
import {RoomUsersModel} from '@/data/database/model/room.users.model';
+import {Transaction} from 'sequelize';
@Injectable()
@@ -17,11 +13,11 @@ export class RoomRepository {
) {
}
- public async createRoomUser(roomId: number, userId: number) {
+ public async createRoomUser(roomId: number, userId: number, transaction: Transaction) {
await this.roomUsersModel.create({
roomId,
userId,
notifications: false,
- })
+ }, {transaction})
}
}
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index 80e78102d..3bbbd947e 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -9,6 +9,7 @@ import {
import {UserProfileModel} from '@/data/database/model/user.profile.model';
import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {VerificationModel} from '@/data/database/model/verification.model';
+import {Transaction} from 'sequelize';
@Injectable()
@@ -22,47 +23,51 @@ export class UserRepository {
) {
}
- public async createUser(data: SignUpRequest): Promise {
+ public async createUser(data: SignUpRequest, transaction: Transaction): Promise {
let userModel = await this.userModel.create({
username: data.username,
lastTimeOnline: new Date(),
sex: data.sex
- })
+ }, {transaction})
await Promise.all([
this.userProfileModel.create({
id: userModel.id
- }),
+ }, {transaction}),
this.userAuthModel.create({
password: data.password,
email: data.email,
id: userModel.id
- }),
+ }, {transaction}),
this.userSettingsModel.create({
id: userModel.id
- })
+ }, {transaction})
])
return userModel.id;
}
- public async checkUserExistByUserName(username: string): Promise {
+ public async checkUserExistByUserName(username: string, transaction?: Transaction): Promise {
return await this.userModel.findOne({
where: {username},
+ transaction
}) != null
}
- public async createVerification(email: string, userId: number, token: string): Promise {
+ public async createVerification(email: string, userId: number, token: string, transaction?: Transaction): Promise {
let verification = await this.verificationModel.create({
type: VerificationType.REGISTER,
email,
userId,
token,
+ }, {
+ transaction
});
- await this.userAuthModel.update( {
+ await this.userAuthModel.update({
emailVerificationId: verification.id,
}, {
where: {
id: userId,
- }
+ },
+ transaction
})
}
diff --git a/newback/src/data/redis/RedisService.ts b/newback/src/data/redis/RedisService.ts
index ac85e7d21..7f57f4451 100644
--- a/newback/src/data/redis/RedisService.ts
+++ b/newback/src/data/redis/RedisService.ts
@@ -1,5 +1,4 @@
import {Injectable} from '@nestjs/common';
-import {SignUpRequest} from '@/data/types/dto/dto';
import {REDIS_SESSIONS_KEY} from '@/data/utils/consts';
import {
InjectRedis,
diff --git a/newback/src/main.ts b/newback/src/main.ts
index f38db42a0..1dd3f24d4 100644
--- a/newback/src/main.ts
+++ b/newback/src/main.ts
@@ -6,7 +6,6 @@ import {
Logger,
ValidationPipe
} from '@nestjs/common';
-import {LoggerModule} from '@/modules/logger/logger.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
index cfb88cf9a..905096ae7 100644
--- a/newback/src/modules/auth/auth.controller.ts
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -1,7 +1,7 @@
import {
Body,
- ConflictException,
Controller,
+ Ip,
Logger,
Post
} from '@nestjs/common';
@@ -16,7 +16,8 @@ export class AuthController {
constructor(
private readonly appService: AuthService,
private readonly logger: Logger
- ) {}
+ ) {
+ }
@Post('/auth')
public auth(@Body() body: LoginRequestValidator): string {
@@ -24,8 +25,8 @@ export class AuthController {
}
@Post('/register')
- public register(@Body() body: SignUpRequestValidator): SignUpResponse {
- return this.appService.registerUser(body);
+ public async register(@Body() body: SignUpRequestValidator, @Ip() ip): Promise {
+ return this.appService.registerUser(body, ip);
}
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/auth/auth.module.spec.ts
index c55a7b6be..fda24377b 100644
--- a/newback/src/modules/auth/auth.module.spec.ts
+++ b/newback/src/modules/auth/auth.module.spec.ts
@@ -85,7 +85,7 @@ describe('AuthModule', () => {
"statusCode": 400,
});
});
- it('should throw an error if user exists', async() => {
+ it('should throw an error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
const {body} = await request()
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
index 296bfb122..8d0288455 100644
--- a/newback/src/modules/auth/auth.module.ts
+++ b/newback/src/modules/auth/auth.module.ts
@@ -1,15 +1,16 @@
-import {
- Module
-} from '@nestjs/common';
-import { AuthController } from '@/modules/auth/auth.controller';
-import { AuthService } from '@/modules/auth/auth.service';
+import {Module} from '@nestjs/common';
+import {AuthController} from '@/modules/auth/auth.controller';
+import {AuthService} from '@/modules/auth/auth.service';
import {DatabaseModule} from '@/data/database/database.module';
import {PasswordService} from '@/modules/password/password.service';
import {RedisService} from '@/data/redis/RedisService';
+import {EmailModule} from '@/modules/email.render/email.module';
+import {SequelizeModule} from '@nestjs/sequelize';
@Module({
- imports: [DatabaseModule],
+ imports: [DatabaseModule, EmailModule, SequelizeModule],
controllers: [AuthController],
providers: [AuthService, PasswordService, RedisService],
})
-export class AuthModule {}
+export class AuthModule {
+}
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/auth/auth.service.ts
index 0fd565648..1ac40df37 100644
--- a/newback/src/modules/auth/auth.service.ts
+++ b/newback/src/modules/auth/auth.service.ts
@@ -1,14 +1,20 @@
import {
ConflictException,
- Injectable
+ Injectable,
+ Logger
} from '@nestjs/common';
import {UserRepository} from '@/data/database/repository/user.repository';
import {PasswordService} from '@/modules/password/password.service';
-import {SignUpRequest} from '@/data/types/dto/dto';
+import {
+ SignUpRequest,
+ SignUpResponse
+} from '@/data/types/dto/dto';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {ALL_ROOM_ID} from '@/data/utils/consts';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailService} from '@/modules/email/email.service';
+import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {Transaction} from 'sequelize';
+import {Sequelize} from 'sequelize-typescript';
@Injectable()
export class AuthService {
@@ -18,7 +24,9 @@ export class AuthService {
private readonly roomRepository: RoomRepository,
private readonly passwordService: PasswordService,
private readonly redisService: RedisService,
- private readonly emailService: EmailService,
+ private readonly emailService: EmailSenderService,
+ private readonly sequelize: Sequelize,
+ private readonly logger: Logger,
) {
}
@@ -27,27 +35,30 @@ export class AuthService {
return user.user.username;
}
- private async createUser(data: SignUpRequest) {
- await this.validateUser(data.username);
- if (data.email) {
- await this.validateEmail(data.email)
+ public async sendVerificationEmail(email: string, userId: number, username: string, ip: string) {
+ try {
+ await this.sequelize.transaction(async(t) => {
+ let token = await this.passwordService.generateRandomString(32);
+ await this.userRepository.createVerification(email, userId, token, t)
+ await this.emailService.sendSignUpEmail(username, userId, email, token, ip, ip)
+ });
+ } catch (e) {
+ this.logger.error(`Can't send email to userid ${userId} ${email} because ${e.message}`, e.stack, 'Mail')
}
- const password = await this.passwordService.createPassword(data.password);
- let userId = await this.userRepository.createUser({...data, password})
- await this.roomRepository.createRoomUser(ALL_ROOM_ID, userId);
- return userId;
+
}
- public async registerUser(data: SignUpRequest) {
- let userId = await this.createUser(data);
- let session = await this.passwordService.generateRandomString(32);
- await this.redisService.saveSession(session, userId);
+ public async registerUser(data: SignUpRequest, ip: string): Promise {
+ const {session, userId} = await this.sequelize.transaction(async(t) => {
+ let userId = await this.createUser(data, t);
+ let session = await this.passwordService.generateRandomString(32);
+ await this.redisService.saveSession(session, userId);
+ return {session, userId};
+ });
if (data.email) {
- let token = await this.passwordService.generateRandomString(32);
- await this.userRepository.createVerification(data.email, userId, token)
- await this.emailService.sendSignUpEmail(data.username, data.email, token)
+ void this.sendVerificationEmail(data.email, userId, data.username, ip);
}
- return session;
+ return {session};
}
public async validateEmail(email: string): Promise {
@@ -57,10 +68,21 @@ export class AuthService {
}
}
- public async validateUser(userName: string): Promise {
- let exist = await this.userRepository.checkUserExistByUserName(userName);
+ public async validateUser(userName: string, transaction?: Transaction): Promise {
+ let exist = await this.userRepository.checkUserExistByUserName(userName, transaction);
if (exist) {
throw new ConflictException("User with this username already exist");
}
}
+
+ private async createUser(data: SignUpRequest, transaction: Transaction) {
+ await this.validateUser(data.username, transaction);
+ if (data.email) {
+ await this.validateEmail(data.email)
+ }
+ const password = await this.passwordService.createPassword(data.password);
+ let userId = await this.userRepository.createUser({...data, password}, transaction)
+ await this.roomRepository.createRoomUser(ALL_ROOM_ID, userId, transaction);
+ return userId;
+ }
}
diff --git a/newback/src/modules/auth/validators/login.request.validator.ts b/newback/src/modules/auth/validators/login.request.validator.ts
index 84e84300c..20cc51911 100644
--- a/newback/src/modules/auth/validators/login.request.validator.ts
+++ b/newback/src/modules/auth/validators/login.request.validator.ts
@@ -1,17 +1,8 @@
import {
- IsEmail,
- IsEnum,
- IsOptional,
IsString,
- Length,
Matches,
} from 'class-validator';
-import {
- Gender,
- LoginRequest,
- SignUpRequest
-} from '@/data/types/dto/dto';
-import {config} from 'node-config-ts';
+import {LoginRequest} from '@/data/types/dto/dto';
export class LoginRequestValidator implements LoginRequest {
@IsString()
diff --git a/newback/src/modules/auth/validators/validate.user.request.validator.ts b/newback/src/modules/auth/validators/validate.user.request.validator.ts
index 6fe0bad3f..0da6a85ad 100644
--- a/newback/src/modules/auth/validators/validate.user.request.validator.ts
+++ b/newback/src/modules/auth/validators/validate.user.request.validator.ts
@@ -1,17 +1,9 @@
import {
- IsEmail,
- IsEnum,
- IsOptional,
IsString,
Length,
Matches,
} from 'class-validator';
-import {
- Gender,
- LoginRequest,
- SignUpRequest,
- ValidateUserRequest
-} from '@/data/types/dto/dto';
+import {ValidateUserRequest} from '@/data/types/dto/dto';
import {config} from 'node-config-ts';
export class ValidateUserRequestValidator implements ValidateUserRequest {
diff --git a/newback/src/modules/email.render/email.module.ts b/newback/src/modules/email.render/email.module.ts
new file mode 100644
index 000000000..14a9ed093
--- /dev/null
+++ b/newback/src/modules/email.render/email.module.ts
@@ -0,0 +1,23 @@
+import {Module} from '@nestjs/common';
+import {MailerModule} from '@nestjs-modules/mailer';
+import {config} from 'node-config-ts';
+import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {HtmlService} from '@/modules/html/html.service';
+
+
+@Module({
+ imports: [
+ MailerModule.forRoot({
+ transport: config.email
+ })
+ ],
+ providers: [
+ EmailSenderService,
+ HtmlService
+ ],
+ exports: [
+ EmailSenderService
+ ]
+})
+export class EmailModule {
+}
diff --git a/newback/src/modules/email.render/email.sender.service.ts b/newback/src/modules/email.render/email.sender.service.ts
new file mode 100644
index 000000000..bb399aa0a
--- /dev/null
+++ b/newback/src/modules/email.render/email.sender.service.ts
@@ -0,0 +1,47 @@
+import {
+ Injectable,
+ Logger
+} from '@nestjs/common';
+import {config} from 'node-config-ts';
+import {HtmlService} from '@/modules/html/html.service';
+import {MailerService} from '@nestjs-modules/mailer';
+
+@Injectable()
+export class EmailSenderService {
+ public constructor(
+ private readonly htmlService: HtmlService,
+ private readonly loggerService: Logger,
+ private readonly mailerService: MailerService
+ ) {
+ }
+
+ public async sendSignUpEmail(username: string, userId: number, email: string, token, ip: string, ipInfo: string) {
+ const magicLink = `${config.frontend.address}/#/confirm_email?token=${token}`;
+ let issueReportLink = config.frontend.issueReportLink;
+ const text = `Hi ${username}, you have registered pychat` +
+ `\nTo complete your registration please click on the url bellow: ${magicLink}` +
+ `\n\nIf you find any bugs or propositions you can post them ${issueReportLink}`;
+
+ let signUpEmail = await this.htmlService.renderTemplate('sign_up_email', {
+ issueReportLink,
+ magicLink,
+ username,
+ btnText: "Confirm chat registration",
+ })
+ const html = await this.htmlService.renderTemplate('token_email', {
+ signUpEmail,
+ ip,
+ timeCreated: new Date().getTime(),
+ ipInfo
+ })
+ this.loggerService.log(`Sending verification email to userId ${userId} ${email}`)
+ await this.mailerService.sendMail({
+ to: email,
+ html,
+ text,
+ subject: 'Confirm pychat registration'
+ })
+
+ }
+
+}
diff --git a/newback/src/modules/email/email.service.ts b/newback/src/modules/email/email.service.ts
deleted file mode 100644
index 83d0516bf..000000000
--- a/newback/src/modules/email/email.service.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import {Injectable} from '@nestjs/common';
-import {config} from 'node-config-ts';
-
-@Injectable()
-export class EmailService {
- public constructor() {
- }
-
-
- public sendSignUpEmail(username: string, email: string, token) {
- const link = `${config.frontend.address}/#/confirm_email?token=${token}`;
- const text = `Hi ${username}, you have registered pychat` +
- `\nTo complete your registration please click on the url bellow: ${link}` +
- `\n\nIf you find any bugs or propositions you can post them ${config.frontend.issueReportLink}`;
-)
- self.logger.info('Sending verification email to userId %s (email %s)', user.id, user.email)
- yield self.__send_mail(
- "Confirm chat registration",
- text,
- user.email,
- html_message,
- True
- )
-
- }
-
- public async sendEmail(templateId: 'change_email' | 'change_password' | 'sign_up_email' | 'token_email', params: Record): Promise {
- void 0;
- }
-}
diff --git a/newback/src/modules/html/html.service.spec.ts b/newback/src/modules/html/html.service.spec.ts
index 24010478f..7983daf14 100644
--- a/newback/src/modules/html/html.service.spec.ts
+++ b/newback/src/modules/html/html.service.spec.ts
@@ -3,41 +3,46 @@ import {HtmlService} from '@/modules/html/html.service';
describe('HtmlService', () => {
describe('replaceTemplate', () => {
- it('should replace single param', () => {
+ it('should replace single param', () => {
let service = new HtmlService();
let result = service.replaceTemplate('aa {{ blah }} bbbb', {blah: 3})
expect(result).toEqual('aa 3 bbbb');
});
- it('should replace multiple params', () => {
+ it('should replace multiple params', () => {
let service = new HtmlService();
let result = service.replaceTemplate('aa {{ blah }} {{koko}}', {blah: 3, koko: 4})
expect(result).toEqual('aa 3 4');
});
- it('should not fail when empty', () => {
+ it('should not fail when empty', () => {
let service = new HtmlService();
let result = service.replaceTemplate('aa', {})
expect(result).toEqual('aa');
});
- it('should throw an exception when param is missing', () => {
+ it('should throw an exception when param is missing', () => {
let service = new HtmlService();
expect(() => service.replaceTemplate('aa {{ adas }}', {blah: 4})).toThrow(Error("Unable to render template. 'adas' is missing in {\"blah\":4}"))
});
});
describe('renderTemplate', () => {
- it('should replace single param', async () => {
+ it('should replace single param', async() => {
let service = new HtmlService();
- let result = await service.renderTemplate('token_email', {sign_up_email: 'include', timeCreated: 'now', 'ip': 'localhost', 'ipInfo': 'Chernihiv'})
- expect(result).toEqual(`include
+ let result = await service.renderTemplate('token_email', {
+ signUpEmail: 'include',
+ timeCreated: 'now',
+ ip: 'localhost',
+ ipInfo: 'Chernihiv'
+ })
+ expect(result).toEqual(`include
- Note : Your magic link will expire in 1 day, and can only be used one time.
+ Note : Your magic link will expire in 1 day, and can only be used one time.
- Link was generated now
- IP: localhost
- Chernihiv
+ Link was generated now
+ IP: localhost
+ Chernihiv
`);
});
diff --git a/newback/src/modules/html/html.service.ts b/newback/src/modules/html/html.service.ts
index 355b32bb0..3999f25f5 100644
--- a/newback/src/modules/html/html.service.ts
+++ b/newback/src/modules/html/html.service.ts
@@ -1,25 +1,25 @@
import {Injectable} from '@nestjs/common';
import {readFile} from 'fs';
import {promisify} from 'util';
-import {resolve} from "path";
+import {sep} from "path";
+
@Injectable()
export class HtmlService {
-
- public replaceTemplate(content: string, params: Record): string {
+ public replaceTemplate(content: string, params: Record): string {
const replaceHtmlRegex = /\{\{\s?(\w+)\s?\}\}/g;
const html = content.replace(replaceHtmlRegex, (_, v) => {
if (!params[v]) {
throw Error(`Unable to render template. '${v}' is missing in ${JSON.stringify(params)}`)
}
- return params[v] as string
+ return params[v] as string
});
return html;
}
- public async renderTemplate(template: string, params: Record) {
- let filePath = resolve(__dirname, '..' , '..', 'templates',`${template}.html`);
+ public async renderTemplate(template: string, params: Record) {
+ let filePath = ['src', 'templates', `${template}.html`].join(sep);
const content = await promisify(readFile)(filePath, 'utf-8');
return this.replaceTemplate(content, params);
- }
+ }
}
diff --git a/newback/src/modules/logger/interceptor.ts b/newback/src/modules/logger/interceptor.ts
index 333d540c1..3e2b1a863 100644
--- a/newback/src/modules/logger/interceptor.ts
+++ b/newback/src/modules/logger/interceptor.ts
@@ -16,6 +16,7 @@ import {catchError} from 'rxjs/operators';
export class LoggingInterceptor implements NestInterceptor {
private id: number = 0;
+
constructor(private readonly logger: Logger) {
}
diff --git a/newback/src/modules/logger/logger.module.ts b/newback/src/modules/logger/logger.module.ts
index 8346ea555..a38534b26 100644
--- a/newback/src/modules/logger/logger.module.ts
+++ b/newback/src/modules/logger/logger.module.ts
@@ -9,4 +9,5 @@ import {
providers: [Logger],
exports: [Logger]
})
-export class LoggerModule {}
+export class LoggerModule {
+}
diff --git a/newback/src/templates/change_email.html b/newback/src/templates/change_email.html
index e29393540..89c2c71a9 100644
--- a/newback/src/templates/change_email.html
+++ b/newback/src/templates/change_email.html
@@ -1,7 +1,7 @@
Hello, {{ username }}!
You just changed your email to {{ email }}
- on {{ timeCreated }}
- IP: {{ ip }}
- {{ ipInfo }}
-
\ No newline at end of file
+ on {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
+
diff --git a/newback/src/templates/change_password.html b/newback/src/templates/change_password.html
index a2b546148..5810c6938 100644
--- a/newback/src/templates/change_password.html
+++ b/newback/src/templates/change_password.html
@@ -1,7 +1,7 @@
Hello, {{ username }}!
You just changed your password, if it wasn't you we recommend to restore your account via email
- on {{ timeCreated }}
- IP: {{ ip }}
- {{ ipInfo }}
-
\ No newline at end of file
+ on {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
+
diff --git a/newback/src/templates/sign_up_email.html b/newback/src/templates/sign_up_email.html
index 2d75d6399..e1fba2af5 100644
--- a/newback/src/templates/sign_up_email.html
+++ b/newback/src/templates/sign_up_email.html
@@ -1,7 +1,8 @@
Hello, {{ username }}!
-{{ greetings }}
+
You have registered in Pychat . If you find any bugs or propositions you can post them
+ here . To complete your registration please click on the link below.
\ No newline at end of file
+
diff --git a/newback/src/templates/token_email.html b/newback/src/templates/token_email.html
index 734da4a18..6068498d3 100644
--- a/newback/src/templates/token_email.html
+++ b/newback/src/templates/token_email.html
@@ -1,9 +1,9 @@
-{{ sign_up_email }}
+{{ signUpEmail }}
- Note : Your magic link will expire in 1 day, and can only be used one time.
+ Note : Your magic link will expire in 1 day, and can only be used one time.
- Link was generated {{ timeCreated }}
- IP: {{ ip }}
- {{ ipInfo }}
+ Link was generated {{ timeCreated }}
+ IP: {{ ip }}
+ {{ ipInfo }}
diff --git a/newback/yarn.lock b/newback/yarn.lock
index b344e0367..4a6e377ff 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -186,7 +186,7 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9":
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
version "7.17.9"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
@@ -307,7 +307,7 @@
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.6.1", "@babel/types@^7.9.6":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
@@ -551,6 +551,11 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
+"@jonkemp/package-utils@^1.0.8":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@jonkemp/package-utils/-/package-utils-1.0.8.tgz#4bce132a18f34407a88bb15c28bd3ed3030c4776"
+ integrity sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==
+
"@jridgewell/resolve-uri@^3.0.3":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
@@ -589,6 +594,21 @@
resolved "https://registry.yarnpkg.com/@nestjs-modules/ioredis/-/ioredis-1.0.0.tgz#4b2560f450047ea6cb044ebce5dd4363a24cc416"
integrity sha512-4y35a1VtNS3+RofrLWdPe9FiEhpji05wdgnkO97VUu9kxFe8y2Ck5UorRsu3dDzYn5BdumHg8kB9Qbb220gxSg==
+"@nestjs-modules/mailer@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@nestjs-modules/mailer/-/mailer-1.6.1.tgz#741a095e7450a19ec1925b733ce9b98bba0f51fb"
+ integrity sha512-ZfJFB3sIQyYr52g7HRUr3VOyZZSPBI+89hcm3hvLvP3flTJs/g98QbZxWR/mH2BzQVHdCAzlP98Qw/KQULPM4w==
+ dependencies:
+ glob "7.1.7"
+ inline-css "3.0.0"
+ preview-email "3.0.4"
+ optionalDependencies:
+ "@types/ejs" "^3.0.3"
+ "@types/pug" "2.0.5"
+ ejs "^3.1.2"
+ handlebars "^4.7.6"
+ pug "^3.0.1"
+
"@nestjs/cli@^8.2.5":
version "8.2.5"
resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-8.2.5.tgz#02094177f4eac576d1a559b259d541393e49e0bb"
@@ -721,6 +741,14 @@
consola "^2.15.0"
node-fetch "^2.6.1"
+"@selderee/plugin-htmlparser2@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz#27e994afd1c2cb647ceb5406a185a5574188069d"
+ integrity sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==
+ dependencies:
+ domhandler "^4.2.0"
+ selderee "^0.6.0"
+
"@sinonjs/commons@^1.7.0":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
@@ -834,6 +862,11 @@
dependencies:
"@types/ms" "*"
+"@types/ejs@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.0.tgz#ab8109208106b5e764e5a6c92b2ba1c625b73020"
+ integrity sha512-DCg+Ka+uDQ31lJ/UtEXVlaeV3d6t81gifaVWKJy4MYVVgvJttyX/viREy+If7fz+tK/gVxTGMtyrFPnm4gjrVA==
+
"@types/eslint-scope@^3.7.3":
version "3.7.3"
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
@@ -938,6 +971,13 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
+"@types/nodemailer@^6.4.4":
+ version "6.4.4"
+ resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.4.tgz#c265f7e7a51df587597b3a49a023acaf0c741f4b"
+ integrity sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==
+ dependencies:
+ "@types/node" "*"
+
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@@ -948,6 +988,11 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759"
integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==
+"@types/pug@2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.5.tgz#69bc700934dd473c7ab97270bd2dbacefe562231"
+ integrity sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==
+
"@types/qs@*":
version "6.9.7"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
@@ -1250,7 +1295,7 @@ acorn-walk@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-acorn-walk@^8.1.1:
+acorn-walk@^8.1.1, acorn-walk@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
@@ -1265,7 +1310,7 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
-agent-base@6:
+agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
@@ -1414,11 +1459,28 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-asap@^2.0.0:
+asap@^2.0.0, asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+assert-never@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
+ integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==
+
+ast-types@^0.13.2:
+ version "0.13.4"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
+ integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
+ dependencies:
+ tslib "^2.0.1"
+
+async@0.9.x:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+ integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
+
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -1492,6 +1554,13 @@ babel-preset-jest@^27.5.1:
babel-plugin-jest-hoist "^27.5.1"
babel-preset-current-node-syntax "^1.0.0"
+babel-walk@3.0.0-canary-5:
+ version "3.0.0-canary-5"
+ resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11"
+ integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==
+ dependencies:
+ "@babel/types" "^7.9.6"
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -1502,6 +1571,11 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+batch@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
+
bcrypt@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71"
@@ -1558,6 +1632,11 @@ body-parser@1.20.0:
type-is "~1.6.18"
unpipe "1.0.0"
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1674,7 +1753,7 @@ chalk@^2.0.0:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -1687,11 +1766,40 @@ char-regex@^1.0.2:
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+character-parser@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+ integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A=
+ dependencies:
+ is-regex "^1.0.3"
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+cheerio@^0.22.0:
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+ integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.0"
+ entities "~1.1.1"
+ htmlparser2 "^3.9.1"
+ lodash.assignin "^4.0.9"
+ lodash.bind "^4.1.4"
+ lodash.defaults "^4.0.1"
+ lodash.filter "^4.4.0"
+ lodash.flatten "^4.2.0"
+ lodash.foreach "^4.3.0"
+ lodash.map "^4.4.0"
+ lodash.merge "^4.4.0"
+ lodash.pick "^4.2.1"
+ lodash.reduce "^4.4.0"
+ lodash.reject "^4.4.0"
+ lodash.some "^4.4.0"
+
chokidar@3.5.3, chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
@@ -1841,7 +1949,7 @@ commander@4.1.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-commander@^2.20.0:
+commander@^2.19.0, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1876,6 +1984,14 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0:
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+constantinople@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151"
+ integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==
+ dependencies:
+ "@babel/parser" "^7.6.0"
+ "@babel/types" "^7.6.1"
+
content-disposition@0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
@@ -1968,11 +2084,38 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
+css-rules@^1.0.9:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-rules/-/css-rules-1.1.0.tgz#404b8b1f77bd775f6c6902b7a7b534f5c016b07f"
+ integrity sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==
+ dependencies:
+ cssom "^0.5.0"
+
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-what@2.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
cssom@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+cssom@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
+ integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
+
cssom@~0.3.6:
version "0.3.8"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
@@ -1985,6 +2128,11 @@ cssstyle@^2.3.0:
dependencies:
cssom "~0.3.6"
+data-uri-to-buffer@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
+ integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
+
data-urls@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
@@ -1994,6 +2142,11 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
+dayjs@^1.10.4:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805"
+ integrity sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug==
+
debug@2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -2001,7 +2154,7 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -2042,6 +2195,16 @@ define-properties@^1.1.3:
dependencies:
object-keys "^1.0.12"
+degenerator@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235"
+ integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==
+ dependencies:
+ ast-types "^0.13.2"
+ escodegen "^1.8.1"
+ esprima "^4.0.0"
+ vm2 "^3.9.8"
+
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -2120,6 +2283,11 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
+discontinuous-range@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
+ integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=
+
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -2127,6 +2295,46 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
+doctypes@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+ integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-serializer@^1.0.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
+ integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+dom-serializer@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
domexception@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@@ -2134,6 +2342,45 @@ domexception@^2.0.1:
dependencies:
webidl-conversions "^5.0.0"
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domhandler@^4.0.0, domhandler@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+ integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^2.5.2:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+ integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+ dependencies:
+ dom-serializer "^1.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+
dot-prop@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@@ -2151,6 +2398,13 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+ejs@^3.1.2:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
+ integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
+ dependencies:
+ jake "^10.6.1"
+
electron-to-chromium@^1.4.84:
version "1.4.106"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a"
@@ -2171,6 +2425,11 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+encoding-japanese@1.0.30:
+ version "1.0.30"
+ resolved "https://registry.yarnpkg.com/encoding-japanese/-/encoding-japanese-1.0.30.tgz#537c4d62881767925d601acb4c79fb14db81703a"
+ integrity sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg==
+
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -2186,6 +2445,16 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2:
graceful-fs "^4.2.4"
tapable "^2.2.0"
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@@ -2273,6 +2542,18 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+escodegen@^1.8.1:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+ integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
escodegen@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
@@ -2394,7 +2675,7 @@ esrecurse@^4.3.0:
dependencies:
estraverse "^5.2.0"
-estraverse@^4.1.1:
+estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
@@ -2509,6 +2790,16 @@ external-editor@^3.0.3:
iconv-lite "^0.4.24"
tmp "^0.0.33"
+extract-css@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-css/-/extract-css-2.0.1.tgz#34415305cf0dc6b18f7ce338e3b81af690d93cbf"
+ integrity sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==
+ dependencies:
+ batch "^0.6.1"
+ href-content "^2.0.1"
+ list-stylesheets "^1.2.10"
+ style-data "^1.4.8"
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -2568,6 +2859,18 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
+file-uri-to-path@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba"
+ integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==
+
+filelist@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b"
+ integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==
+ dependencies:
+ minimatch "^3.0.4"
+
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -2604,6 +2907,11 @@ flat-cache@^3.0.4:
flatted "^3.1.0"
rimraf "^3.0.2"
+flat-util@^1.1.6:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/flat-util/-/flat-util-1.1.9.tgz#87095653dcf77226a3bc99f7157794c2335b2b08"
+ integrity sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==
+
flatted@^3.1.0:
version "3.2.5"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
@@ -2678,6 +2986,15 @@ fs-extra@10.0.1, fs-extra@^10.0.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@@ -2700,6 +3017,14 @@ fsevents@^2.3.2, fsevents@~2.3.2:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+ftp@^0.3.10:
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+ integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=
+ dependencies:
+ readable-stream "1.1.x"
+ xregexp "2.0.0"
+
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@@ -2776,6 +3101,18 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+get-uri@3:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c"
+ integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==
+ dependencies:
+ "@tootallnate/once" "1"
+ data-uri-to-buffer "3"
+ debug "4"
+ file-uri-to-path "2"
+ fs-extra "^8.1.0"
+ ftp "^0.3.10"
+
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -2795,6 +3132,18 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+glob@7.1.7:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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@7.2.0, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -2836,6 +3185,18 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4,
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+handlebars@^4.7.6:
+ version "4.7.7"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+ integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+ dependencies:
+ minimist "^1.2.5"
+ neo-async "^2.6.0"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
has-bigints@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
@@ -2883,11 +3244,23 @@ hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
+he@1.2.0, he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
hexoid@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18"
integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==
+href-content@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/href-content/-/href-content-2.0.1.tgz#d1fb136e5b4c99b8ef44e4a9fe14e8863c1a939f"
+ integrity sha512-5uiAmBCvzCFVu70kli3Hp0BONbAOfwGqR7jKolV+bAh174sIAZBL8DHfg5SnxAhId2mQmYgyL7Y62msnWJ34Xg==
+ dependencies:
+ remote-content "^3.0.0"
+
html-encoding-sniffer@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
@@ -2900,6 +3273,40 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+html-to-text@8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-8.0.0.tgz#5848681a5a38d657a7bb58cf5006d1c29fe64ce3"
+ integrity sha512-fEtul1OerF2aMEV+Wpy+Ue20tug134jOY1GIudtdqZi7D0uTudB2tVJBKfVhTL03dtqeJoF8gk8EPX9SyMEvLg==
+ dependencies:
+ "@selderee/plugin-htmlparser2" "^0.6.0"
+ deepmerge "^4.2.2"
+ he "^1.2.0"
+ htmlparser2 "^6.1.0"
+ minimist "^1.2.5"
+ selderee "^0.6.0"
+
+htmlparser2@^3.9.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+htmlparser2@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
+ integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.0.0"
+ domutils "^2.5.2"
+ entities "^2.0.0"
+
http-errors@1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
@@ -2922,7 +3329,7 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
-http-proxy-agent@^4.0.1:
+http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
@@ -2931,7 +3338,7 @@ http-proxy-agent@^4.0.1:
agent-base "6"
debug "4"
-https-proxy-agent@^5.0.0:
+https-proxy-agent@5, https-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
@@ -2956,7 +3363,14 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-iconv-lite@^0.6.3:
+iconv-lite@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01"
+ integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+iconv-lite@0.6.3, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -3007,11 +3421,24 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+inline-css@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/inline-css/-/inline-css-3.0.0.tgz#f8ddcffab5693ab15c7dd10b05d35aebda90f8c4"
+ integrity sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==
+ dependencies:
+ cheerio "^0.22.0"
+ css-rules "^1.0.9"
+ extract-css "^2.0.0"
+ flat-util "^1.1.6"
+ pick-util "^1.1.3"
+ slick "^1.12.2"
+ specificity "^0.4.1"
+
inquirer@7.3.3:
version "7.3.3"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
@@ -3080,6 +3507,11 @@ ioredis@^5.0.4:
redis-parser "^3.0.0"
standard-as-callback "^2.1.0"
+ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
@@ -3131,6 +3563,19 @@ is-date-object@^1.0.1:
dependencies:
has-tostringtag "^1.0.0"
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-expression@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab"
+ integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==
+ dependencies:
+ acorn "^7.1.1"
+ object-assign "^4.1.1"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -3185,12 +3630,17 @@ is-potential-custom-element-name@^1.0.1:
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+is-promise@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
is-property@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
-is-regex@^1.1.4:
+is-regex@^1.0.3, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
@@ -3241,6 +3691,13 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -3303,6 +3760,16 @@ iterare@1.2.1:
resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042"
integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==
+jake@^10.6.1:
+ version "10.8.4"
+ resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.4.tgz#f6a8b7bf90c6306f768aa82bb7b98bf4ca15e84a"
+ integrity sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==
+ dependencies:
+ async "0.9.x"
+ chalk "^4.0.2"
+ filelist "^1.0.1"
+ minimatch "^3.0.4"
+
jest-changed-files@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
@@ -3726,6 +4193,11 @@ jest@^27.5.1:
import-local "^3.0.2"
jest-cli "^27.5.1"
+js-stringify@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+ integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3835,6 +4307,13 @@ jsonc-parser@3.0.0:
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@@ -3844,6 +4323,14 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
+jstransformer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+ integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=
+ dependencies:
+ is-promise "^2.0.0"
+ promise "^7.0.1"
+
kleur@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
@@ -3870,11 +4357,31 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+libbase64@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.2.1.tgz#fb93bf4cb6d730f29b92155b6408d1bd2176a8c8"
+ integrity sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==
+
+libmime@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.0.0.tgz#4759c76eb219985c5d4057b3a9359922194d9ff7"
+ integrity sha512-2Bm96d5ktnE217Ib1FldvUaPAaOst6GtZrsxJCwnJgi9lnsoAKIHyU0sae8rNx6DNYbjdqqh8lv5/b9poD8qOg==
+ dependencies:
+ encoding-japanese "1.0.30"
+ iconv-lite "0.6.2"
+ libbase64 "1.2.1"
+ libqp "1.1.0"
+
libphonenumber-js@^1.9.43:
version "1.9.50"
resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.50.tgz#f5028a2c4cc47a69d69a0de3629afad97a613712"
integrity sha512-cCzQPChw2XbordcO2LKiw5Htx5leHVfFk/EXkxNHqJfFo7Fndcb1kF5wPJpc316vCJhhikedYnVysMh3Sc7Ocw==
+libqp@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
+ integrity sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=
+
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@@ -3885,6 +4392,21 @@ lines-logger@^2.1.2:
resolved "https://registry.yarnpkg.com/lines-logger/-/lines-logger-2.1.2.tgz#85b619ee849938323615e40fa8cee76d24532de7"
integrity sha512-pSn6qr2K0tf28TgrVMMQxinADrZP3xObxxUBlhTNWWRZToRtrjHihzW7UOKlOypKDDiP3uk/DRjd6dqQsg1coA==
+linkify-it@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
+ integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
+ dependencies:
+ uc.micro "^1.0.1"
+
+list-stylesheets@^1.2.10:
+ version "1.2.10"
+ resolved "https://registry.yarnpkg.com/list-stylesheets/-/list-stylesheets-1.2.10.tgz#9537ed1ef26d1013c41f3ad3b913dae7729380f4"
+ integrity sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==
+ dependencies:
+ cheerio "^0.22.0"
+ pick-util "^1.1.4"
+
loader-runner@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
@@ -3897,26 +4419,76 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lodash.defaults@^4.2.0:
+lodash.assignin@^4.0.9:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+ integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI=
+
+lodash.bind@^4.1.4:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+ integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=
+
+lodash.defaults@^4.0.1, lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
+lodash.filter@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+ integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=
+
+lodash.flatten@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+ integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
+
+lodash.foreach@^4.3.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+ integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
+
lodash.isarguments@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
+lodash.map@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+ integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=
+
lodash.memoize@4.x:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
-lodash.merge@^4.6.2:
+lodash.merge@^4.4.0, lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+lodash.pick@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+ integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
+
+lodash.reduce@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+ integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=
+
+lodash.reject@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+ integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=
+
+lodash.some@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+ integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
+
lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -3943,6 +4515,13 @@ lru-cache@^4.1.3:
pseudomap "^1.0.2"
yallist "^2.1.2"
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -3967,6 +4546,30 @@ magic-string@0.25.7:
dependencies:
sourcemap-codec "^1.4.4"
+mailparser@^3.1.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.4.0.tgz#249869bc5a41af9e0eabbf005197789442fbac9e"
+ integrity sha512-u2pfpLg+xr7m2FKDl+ohQhy2gMok1QZ+S9E5umS9ez5DSJWttrqSmBGswyj9F68pZMVTwbhLpBt7Kd04q/W4Vw==
+ dependencies:
+ encoding-japanese "1.0.30"
+ he "1.2.0"
+ html-to-text "8.0.0"
+ iconv-lite "0.6.3"
+ libmime "5.0.0"
+ linkify-it "3.0.3"
+ mailsplit "5.3.1"
+ nodemailer "6.7.0"
+ tlds "1.224.0"
+
+mailsplit@5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-5.3.1.tgz#dd6d5c20a7b8a767fe9c9649dfcb26ee04f84c36"
+ integrity sha512-o6R6HCzqWYmI2/IYlB+v2IMPgYqC2EynmagZQICAhR7zAq0CO6fPcsO6CrYmVuYT+SSwvLAEZR5WniohBELcAA==
+ dependencies:
+ libbase64 "1.2.1"
+ libmime "5.0.0"
+ libqp "1.1.0"
+
make-dir@^3.0.0, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
@@ -3991,6 +4594,13 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+mediaquery-text@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mediaquery-text/-/mediaquery-text-1.2.0.tgz#266f7ca5a339c81ef17dc80f219a46e4a610ebce"
+ integrity sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==
+ dependencies:
+ cssom "^0.5.0"
+
memfs@^3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305"
@@ -4065,7 +4675,7 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
-minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.6:
+minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
@@ -4109,6 +4719,11 @@ moment@*, "moment@>= 2.9.0", moment@^2.29.1:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
+moo@^0.5.0, moo@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4"
+ integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -4169,16 +4784,31 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+nearley@^2.20.1:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474"
+ integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==
+ dependencies:
+ commander "^2.19.0"
+ moo "^0.5.0"
+ railroad-diagrams "^1.0.0"
+ randexp "0.4.6"
+
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-neo-async@^2.6.2:
+neo-async@^2.6.0, neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+netmask@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
+ integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
+
node-addon-api@^3.1.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
@@ -4225,6 +4855,16 @@ node-releases@^2.0.2:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+nodemailer@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.0.tgz#86614722c4e0c33d1b5b02aecb90d6d629932b0d"
+ integrity sha512-AtiTVUFHLiiDnMQ43zi0YgkzHOEWUkhDgPlBXrsDzJiJvB29Alo4OKxHQ0ugF3gRqRQIneCLtZU3yiUo7pItZw==
+
+nodemailer@^6.5.0, nodemailer@^6.7.3:
+ version "6.7.3"
+ resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.3.tgz#b73f9a81b9c8fa8acb4ea14b608f5e725ea8e018"
+ integrity sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==
+
nopt@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
@@ -4254,6 +4894,13 @@ npmlog@^5.0.1:
gauge "^3.0.0"
set-blocking "^2.0.0"
+nth-check@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
nwsapi@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
@@ -4344,6 +4991,14 @@ onetime@^5.1.0, onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
+open@7:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
optional@0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3"
@@ -4420,6 +5075,30 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+pac-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e"
+ integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+ get-uri "3"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "5"
+ pac-resolver "^5.0.0"
+ raw-body "^2.2.0"
+ socks-proxy-agent "5"
+
+pac-resolver@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.0.tgz#1d717a127b3d7a9407a16d6e1b012b13b9ba8dc0"
+ integrity sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==
+ dependencies:
+ degenerator "^3.0.1"
+ ip "^1.1.5"
+ netmask "^2.0.1"
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -4442,6 +5121,14 @@ parse5@6.0.1:
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+parseley@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.7.0.tgz#9949e3a0ed05c5072adb04f013c2810cf49171a8"
+ integrity sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==
+ dependencies:
+ moo "^0.5.1"
+ nearley "^2.20.1"
+
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -4487,6 +5174,13 @@ pg-connection-string@^2.5.0:
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
+pick-util@^1.1.3, pick-util@^1.1.4:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/pick-util/-/pick-util-1.1.5.tgz#514b11b1a49486d30c805a23125003a360175b6d"
+ integrity sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==
+ dependencies:
+ "@jonkemp/package-utils" "^1.0.8"
+
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -4543,11 +5237,31 @@ pretty-format@^27.0.0, pretty-format@^27.5.1:
ansi-styles "^5.0.0"
react-is "^17.0.1"
+preview-email@3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/preview-email/-/preview-email-3.0.4.tgz#3405c014dcd6890e1618f18d1b2973db71e7e60f"
+ integrity sha512-g9jbnFHI8QfQAcKeCsZpSzMJT/CeGuJoV311R/NLS6PTsalJkMKkUeirSJJgMJBUYOGJLrhM7MsNVWgk1b13BA==
+ dependencies:
+ dayjs "^1.10.4"
+ debug "^4.3.1"
+ mailparser "^3.1.0"
+ nodemailer "^6.5.0"
+ open "7"
+ pug "^3.0.2"
+ uuid "^8.3.2"
+
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+promise@^7.0.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
prompts@^2.0.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
@@ -4564,6 +5278,25 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
+proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b"
+ integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==
+ dependencies:
+ agent-base "^6.0.0"
+ debug "4"
+ http-proxy-agent "^4.0.0"
+ https-proxy-agent "^5.0.0"
+ lru-cache "^5.1.1"
+ pac-proxy-agent "^5.0.0"
+ proxy-from-env "^1.0.0"
+ socks-proxy-agent "^5.0.0"
+
+proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@@ -4574,6 +5307,109 @@ psl@^1.1.33:
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+pug-attrs@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41"
+ integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==
+ dependencies:
+ constantinople "^4.0.1"
+ js-stringify "^1.0.2"
+ pug-runtime "^3.0.0"
+
+pug-code-gen@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce"
+ integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==
+ dependencies:
+ constantinople "^4.0.1"
+ doctypes "^1.1.0"
+ js-stringify "^1.0.2"
+ pug-attrs "^3.0.0"
+ pug-error "^2.0.0"
+ pug-runtime "^3.0.0"
+ void-elements "^3.1.0"
+ with "^7.0.0"
+
+pug-error@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5"
+ integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==
+
+pug-filters@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e"
+ integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==
+ dependencies:
+ constantinople "^4.0.1"
+ jstransformer "1.0.0"
+ pug-error "^2.0.0"
+ pug-walk "^2.0.0"
+ resolve "^1.15.1"
+
+pug-lexer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5"
+ integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==
+ dependencies:
+ character-parser "^2.2.0"
+ is-expression "^4.0.0"
+ pug-error "^2.0.0"
+
+pug-linker@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708"
+ integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==
+ dependencies:
+ pug-error "^2.0.0"
+ pug-walk "^2.0.0"
+
+pug-load@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662"
+ integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==
+ dependencies:
+ object-assign "^4.1.1"
+ pug-walk "^2.0.0"
+
+pug-parser@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260"
+ integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==
+ dependencies:
+ pug-error "^2.0.0"
+ token-stream "1.0.0"
+
+pug-runtime@^3.0.0, pug-runtime@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7"
+ integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==
+
+pug-strip-comments@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e"
+ integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==
+ dependencies:
+ pug-error "^2.0.0"
+
+pug-walk@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe"
+ integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==
+
+pug@^3.0.1, pug@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535"
+ integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==
+ dependencies:
+ pug-code-gen "^3.0.2"
+ pug-filters "^4.0.0"
+ pug-lexer "^5.0.1"
+ pug-linker "^4.0.0"
+ pug-load "^3.0.0"
+ pug-parser "^6.0.0"
+ pug-runtime "^3.0.1"
+ pug-strip-comments "^2.0.0"
+
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -4609,11 +5445,24 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+railroad-diagrams@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
+ integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=
+
ramda@^0.27.0:
version "0.27.2"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1"
integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==
+randexp@0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
+ integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
+ dependencies:
+ discontinuous-range "1.0.0"
+ ret "~0.1.10"
+
randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -4636,7 +5485,7 @@ raw-body@2.4.3:
iconv-lite "0.4.24"
unpipe "1.0.0"
-raw-body@2.5.1:
+raw-body@2.5.1, raw-body@^2.2.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
@@ -4674,7 +5523,7 @@ readable-stream@^2.2.2:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -4719,6 +5568,15 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+remote-content@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remote-content/-/remote-content-3.0.0.tgz#78ac5d0723f8ddae0561774edb03edc23b9f585c"
+ integrity sha512-/hjCYVqWY/jYR07ptEJpClnYrGedSQ5AxCrEeMb3NlrxTgUK/7+iCOReE3z1QMYm3UL7sJX3o7cww/NC6UgyhA==
+ dependencies:
+ proxy-from-env "^1.1.0"
+ superagent "^7.0.2"
+ superagent-proxy "^3.0.0"
+
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
@@ -4751,7 +5609,7 @@ resolve.exports@^1.1.0:
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
-resolve@^1.1.6, resolve@^1.20.0:
+resolve@^1.1.6, resolve@^1.15.1, resolve@^1.20.0:
version "1.22.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
@@ -4768,6 +5626,11 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
retry-as-promised@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-5.0.0.tgz#f4ecc25133603a2d2a7aff4a128691d7bc506d54"
@@ -4842,6 +5705,13 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
+selderee@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.6.0.tgz#f3bee66cfebcb6f33df98e4a1df77388b42a96f7"
+ integrity sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==
+ dependencies:
+ parseley "^0.7.0"
+
semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
version "7.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
@@ -4984,6 +5854,33 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+slick@^1.12.2:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7"
+ integrity sha1-vQSN23TefRymkV+qSldXCzVQwtc=
+
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e"
+ integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==
+ dependencies:
+ agent-base "^6.0.2"
+ debug "4"
+ socks "^2.3.3"
+
+socks@^2.3.3:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
+ integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
+ dependencies:
+ ip "^1.1.5"
+ smart-buffer "^4.2.0"
+
source-map-support@0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
@@ -5012,6 +5909,11 @@ sourcemap-codec@^1.4.4:
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+specificity@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
+ integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
+
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -5172,7 +6074,24 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-superagent@^7.1.0:
+style-data@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/style-data/-/style-data-1.4.8.tgz#820d946812e4e8cdd3875a25cb839052e9059b92"
+ integrity sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==
+ dependencies:
+ cheerio "^0.22.0"
+ mediaquery-text "^1.2.0"
+ pick-util "^1.1.4"
+
+superagent-proxy@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-3.0.0.tgz#e1a17ccba25883599e18d2974020fe83ee7d95d1"
+ integrity sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==
+ dependencies:
+ debug "^4.3.2"
+ proxy-agent "^5.0.0"
+
+superagent@^7.0.2, superagent@^7.1.0:
version "7.1.2"
resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.2.tgz#71393141edd086ccf2544a29a4a609e46b7911f3"
integrity sha512-o9/fP6dww7a4xmEF5a484o2rG34UUGo8ztDlv7vbCWuqPhpndMi0f7eXxdlryk5U12Kzy46nh8eNpLAJ93Alsg==
@@ -5328,6 +6247,11 @@ through@^2.3.6:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+tlds@1.224.0:
+ version "1.224.0"
+ resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.224.0.tgz#dc9a5b0bda0708af0302114f6e24458770c5af01"
+ integrity sha512-Jgdc8SEijbDFUsmCn6Wk/f7E6jBLFZOG3U1xK0amGSfEH55Xx97ItUS/d2NngsuApjn11UeWCWj8Um3VRhseZQ==
+
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -5357,6 +6281,11 @@ toidentifier@1.0.1:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+token-stream@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4"
+ integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=
+
toposort-class@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
@@ -5455,7 +6384,7 @@ tsconfig-paths@3.14.1, tsconfig-paths@^3.9.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@2.3.1, tslib@^2.1.0:
+tslib@2.3.1, tslib@^2.0.1, tslib@^2.1.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
@@ -5531,6 +6460,16 @@ typescript@^4.6.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+uc.micro@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
+uglify-js@^3.1.4:
+ version "3.15.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.4.tgz#fa95c257e88f85614915b906204b9623d4fa340d"
+ integrity sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==
+
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
@@ -5541,7 +6480,7 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
-universalify@^0.1.2:
+universalify@^0.1.0, universalify@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
@@ -5607,6 +6546,19 @@ vary@^1, vary@~1.1.2:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+vm2@^3.9.8:
+ version "3.9.9"
+ resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.9.tgz#c0507bc5fbb99388fad837d228badaaeb499ddc5"
+ integrity sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==
+ dependencies:
+ acorn "^8.7.0"
+ acorn-walk "^8.2.0"
+
+void-elements@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
+ integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=
+
w3c-hr-time@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
@@ -5759,6 +6711,16 @@ windows-release@^4.0.0:
dependencies:
execa "^4.0.2"
+with@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac"
+ integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==
+ dependencies:
+ "@babel/parser" "^7.9.6"
+ "@babel/types" "^7.9.6"
+ assert-never "^1.2.1"
+ babel-walk "3.0.0-canary-5"
+
wkx@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"
@@ -5771,6 +6733,11 @@ word-wrap@^1.2.3, word-wrap@~1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -5810,6 +6777,11 @@ xmlchars@^2.2.0:
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+xregexp@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+ integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
+
xtend@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
@@ -5825,6 +6797,11 @@ yallist@^2.1.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
From 4064fcdb59fc9ff5006a98c904ba8e992e7d379f Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 03:08:49 +0300
Subject: [PATCH 012/221] added auth and some test
---
frontend/src/ts/types/backend | 1 +
newback/.gitignore | 2 +-
newback/jest.config.ts | 6 ++-
newback/package.json | 1 +
newback/src/data/database/database.module.ts | 3 +-
.../database/repository/room.repository.ts | 2 +-
newback/src/data/redis/RedisService.ts | 2 +-
newback/src/modules/app/app.module.ts | 3 +-
newback/src/modules/auth/auth.module.spec.ts | 46 +++++++++++++++++--
newback/src/modules/auth/auth.module.ts | 3 +-
10 files changed, 57 insertions(+), 12 deletions(-)
create mode 120000 frontend/src/ts/types/backend
diff --git a/frontend/src/ts/types/backend b/frontend/src/ts/types/backend
new file mode 120000
index 000000000..3f6330a4b
--- /dev/null
+++ b/frontend/src/ts/types/backend
@@ -0,0 +1 @@
+../../../../common/
\ No newline at end of file
diff --git a/newback/.gitignore b/newback/.gitignore
index ef314b4c1..f17e0e9f0 100644
--- a/newback/.gitignore
+++ b/newback/.gitignore
@@ -3,6 +3,6 @@ yarn-error.log
dist
# exclude everything
config/migration/*
-
+coverage
# exception to the rule
!config/migration/.gitkeep
diff --git a/newback/jest.config.ts b/newback/jest.config.ts
index 726f03b30..3c8f317df 100644
--- a/newback/jest.config.ts
+++ b/newback/jest.config.ts
@@ -23,10 +23,14 @@ export default async(): Promise => {
],
"coveragePathIgnorePatterns": [
"/node_modules/",
+ "/coverage/",
+ "/ormconfig.ts",
+ "/jest.config.ts",
"/dist/",
+ ".module.ts$",
".dto.ts$"
],
- "coverageDirectory": "../coverage",
+ "coverageDirectory": "./coverage",
"testEnvironment": "node",
moduleNameMapper,
}
diff --git a/newback/package.json b/newback/package.json
index d48d42485..c0882f8d4 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -9,6 +9,7 @@
"migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
+ "test": "jest --coverage --runInBand --detectOpenHandles --testTimeout=10000 --passWithNoTests",
"start:dev": "node --inspect=0.0.0.0 dist/src/main",
"start:debug": "nest start --debug --watch"
},
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
index b135bcf43..031edfdb8 100644
--- a/newback/src/data/database/database.module.ts
+++ b/newback/src/data/database/database.module.ts
@@ -22,6 +22,7 @@ import {VerificationModel} from '@/data/database/model/verification.model';
import {Logger} from '@nestjs/common/services/logger.service';
import {UserRepository} from '@/data/database/repository/user.repository';
import {RoomRepository} from '@/data/database/repository/room.repository';
+import {Sequelize} from 'sequelize-typescript';
const repositories = [
UserRepository,
@@ -32,7 +33,7 @@ const repositories = [
imports: [
SequelizeModule.forRootAsync({
inject: [Logger],
- useFactory: (logger: Logger) => generateConfig((sql) => logger.debug(sql)),
+ useFactory: (logger: Logger) => generateConfig((sql) => logger.debug(sql, 'sql')),
}),
SequelizeModule.forFeature([
ChannelModel,
diff --git a/newback/src/data/database/repository/room.repository.ts b/newback/src/data/database/repository/room.repository.ts
index 4db96ee92..dfd0183ed 100644
--- a/newback/src/data/database/repository/room.repository.ts
+++ b/newback/src/data/database/repository/room.repository.ts
@@ -13,7 +13,7 @@ export class RoomRepository {
) {
}
- public async createRoomUser(roomId: number, userId: number, transaction: Transaction) {
+ public async createRoomUser(roomId: number, userId: number, transaction: Transaction): Promise {
await this.roomUsersModel.create({
roomId,
userId,
diff --git a/newback/src/data/redis/RedisService.ts b/newback/src/data/redis/RedisService.ts
index 7f57f4451..f41a3daec 100644
--- a/newback/src/data/redis/RedisService.ts
+++ b/newback/src/data/redis/RedisService.ts
@@ -14,7 +14,7 @@ export class RedisService {
}
- public async saveSession(session: string, userId: number) {
+ public async saveSession(session: string, userId: number): Promise {
await this.redis.hset(REDIS_SESSIONS_KEY, session, userId);
}
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index 4e830fd3a..ddbc33db1 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -8,14 +8,13 @@ import {RedisModule} from '@nestjs-modules/ioredis';
import {config} from 'node-config-ts';
@Module({
- imports: [AuthModule, DatabaseModule, LoggerModule, RedisModule.forRoot({
+ imports: [AuthModule, LoggerModule, RedisModule.forRoot({
config: {
host: config.redis.host,
port: config.redis.port,
db: config.redis.database,
}
})],
- exports: [DatabaseModule],
providers: [
{
provide: APP_INTERCEPTOR,
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/auth/auth.module.spec.ts
index fda24377b..7043dfc41 100644
--- a/newback/src/modules/auth/auth.module.spec.ts
+++ b/newback/src/modules/auth/auth.module.spec.ts
@@ -10,22 +10,57 @@ import {AuthController} from '@/modules/auth/auth.controller';
import {LoggerModule} from '@/modules/logger/logger.module';
import {PasswordService} from '@/modules/password/password.service';
import {UserRepository} from '@/data/database/repository/user.repository';
+import {RoomRepository} from '@/data/database/repository/room.repository';
+import {RedisService} from '@/data/redis/RedisService';
+import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {
+ MailerModule,
+ MailerService
+} from '@nestjs-modules/mailer';
+import {Sequelize} from 'sequelize-typescript';
+import {HtmlService} from '@/modules/html/html.service';
describe('AuthModule', () => {
let app: INestApplication;
let request: () => supertest.SuperTest;
let userRepository: UserRepository;
+ let roomRepository: RoomRepository;
+ let redisService: RedisService;
+ let sequelize: Sequelize;
+ let mailerService: MailerService;
beforeEach(async() => {
userRepository = {} as UserRepository;
+ roomRepository = {} as RoomRepository;
+ redisService = {} as RedisService;
+ sequelize = {} as Sequelize;
+ mailerService = {} as MailerService;
const moduleFixture = await Test.createTestingModule({
- imports: [LoggerModule],
+ imports: [
+ LoggerModule,
+ ],
providers: [
+ {provide: MailerService, useValue: mailerService},
+ {provide: Sequelize, useValue: sequelize},
AuthService,
+ HtmlService,
+ EmailSenderService,
+ {
+ provide: MailerService,
+ useValue: mailerService,
+ },
+ {
+ provide: RedisService,
+ useValue: redisService,
+ },
{
provide: UserRepository,
useValue: userRepository,
},
+ {
+ provide: RoomRepository,
+ useValue: roomRepository,
+ },
Logger,
PasswordService,
],
@@ -47,13 +82,18 @@ describe('AuthModule', () => {
describe('signup', () => {
it('validate request', async() => {
+ sequelize.transaction = (resolve) =>resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.createUser = jest.fn().mockResolvedValue(3);
+ roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
const {body} = await request()
.post('/register').send({
username: 'a',
password: 'as$'
});
- await expect(body).toStrictEqual({'a': 3});
+ await expect(body).toMatchObject({session: expect.any(String)});
});
});
describe('validate user', () => {
@@ -95,7 +135,7 @@ describe('AuthModule', () => {
await expect(body).toStrictEqual({
"error": "Conflict",
- "message": "This user already exist",
+ "message": "User with this username already exist",
"statusCode": 409,
});
});
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
index 8d0288455..2e9a7216e 100644
--- a/newback/src/modules/auth/auth.module.ts
+++ b/newback/src/modules/auth/auth.module.ts
@@ -5,10 +5,9 @@ import {DatabaseModule} from '@/data/database/database.module';
import {PasswordService} from '@/modules/password/password.service';
import {RedisService} from '@/data/redis/RedisService';
import {EmailModule} from '@/modules/email.render/email.module';
-import {SequelizeModule} from '@nestjs/sequelize';
@Module({
- imports: [DatabaseModule, EmailModule, SequelizeModule],
+ imports: [DatabaseModule, EmailModule],
controllers: [AuthController],
providers: [AuthService, PasswordService, RedisService],
})
From aa7bafacfed9505ae5b4b831d00f1dac3c1d79b3 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 03:39:05 +0300
Subject: [PATCH 013/221] Auth works
---
common/dto.ts | 11 +++++-
newback/src/data/database/model/user.model.ts | 6 +++
.../database/repository/room.repository.ts | 2 +-
.../database/repository/user.repository.ts | 20 ++++++++--
newback/src/modules/auth/auth.controller.ts | 15 +++++---
newback/src/modules/auth/auth.service.ts | 38 ++++++++++++++++---
.../validators/login.request.validator.ts | 11 ++++++
7 files changed, 85 insertions(+), 18 deletions(-)
diff --git a/common/dto.ts b/common/dto.ts
index 50ff656b9..4889d0b11 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -1,6 +1,7 @@
export interface LoginRequest {
username: string;
password: string;
+ email: string;
}
export interface ValidateUserRequest {
@@ -18,10 +19,18 @@ export interface SignUpRequest {
sex?: Gender;
}
-export interface SignUpResponse {
+interface SessionResponse {
session: string;
}
+export interface SignInResponse extends SessionResponse {
+
+}
+
+export interface SignUpResponse extends SessionResponse{
+
+}
+
// ISO/IEC 5218 1 male, 2 - female
export enum Gender {
MALE = 'MALE',
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index 4413eb44c..64f522a9b 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -1,12 +1,15 @@
import {
Column,
DataType,
+ HasOne,
Model,
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {Gender} from '@/data/types/dto/dto';
import {config} from 'node-config-ts';
+import {UserSettingsModel} from '@/data/database/model/user.settings.model';
+import {UserAuthModel} from '@/data/database/model/user.auth.model';
@Injectable()
@@ -32,6 +35,9 @@ export class UserModel extends Model {
})
public username: string;
+ @HasOne(() => UserAuthModel, 'id')
+ public userAuth: UserAuthModel;
+
@Column({
type: DataType.ENUM(...Object.keys(Gender)),
allowNull: false,
diff --git a/newback/src/data/database/repository/room.repository.ts b/newback/src/data/database/repository/room.repository.ts
index dfd0183ed..633d6f3e6 100644
--- a/newback/src/data/database/repository/room.repository.ts
+++ b/newback/src/data/database/repository/room.repository.ts
@@ -18,6 +18,6 @@ export class RoomRepository {
roomId,
userId,
notifications: false,
- }, {transaction})
+ }, {transaction, raw: true})
}
}
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index 3bbbd947e..d23a62a65 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -28,19 +28,19 @@ export class UserRepository {
username: data.username,
lastTimeOnline: new Date(),
sex: data.sex
- }, {transaction})
+ }, {transaction, raw: true,})
await Promise.all([
this.userProfileModel.create({
id: userModel.id
- }, {transaction}),
+ }, {transaction, raw: true,}),
this.userAuthModel.create({
password: data.password,
email: data.email,
id: userModel.id
- }, {transaction}),
+ }, {transaction, raw: true,}),
this.userSettingsModel.create({
id: userModel.id
- }, {transaction})
+ }, {transaction, raw: true,})
])
return userModel.id;
}
@@ -48,6 +48,7 @@ export class UserRepository {
public async checkUserExistByUserName(username: string, transaction?: Transaction): Promise {
return await this.userModel.findOne({
where: {username},
+ raw: true,
transaction
}) != null
}
@@ -59,6 +60,7 @@ export class UserRepository {
userId,
token,
}, {
+ raw: true,
transaction
});
await this.userAuthModel.update({
@@ -74,6 +76,7 @@ export class UserRepository {
public async checkUserExistByEmail(email: string): Promise {
return await this.userAuthModel.findOne({
where: {email},
+ raw: true,
}) != null
}
@@ -86,4 +89,13 @@ export class UserRepository {
})
}
+ public async getUserByUserName(username: string): Promise {
+ return this.userModel.findOne({
+ where: {username},
+ include: [
+ 'userAuth',
+ ],
+ })
+ }
+
}
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
index 905096ae7..f8629f77b 100644
--- a/newback/src/modules/auth/auth.controller.ts
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -9,30 +9,33 @@ import {AuthService} from '@/modules/auth/auth.service';
import {LoginRequestValidator} from '@/modules/auth/validators/login.request.validator';
import {SignUpRequestValidator} from '@/modules/auth/validators/sign.up.request.validator';
import {ValidateUserRequestValidator} from '@/modules/auth/validators/validate.user.request.validator';
-import {SignUpResponse} from '@/data/types/dto/dto';
+import {
+ SignInResponse,
+ SignUpResponse
+} from '@/data/types/dto/dto';
@Controller()
export class AuthController {
constructor(
- private readonly appService: AuthService,
+ private readonly authservice: AuthService,
private readonly logger: Logger
) {
}
@Post('/auth')
- public auth(@Body() body: LoginRequestValidator): string {
- return 'asd';
+ public async auth(@Body() body: LoginRequestValidator): Promise {
+ return this.authservice.authorize(body);
}
@Post('/register')
public async register(@Body() body: SignUpRequestValidator, @Ip() ip): Promise {
- return this.appService.registerUser(body, ip);
+ return this.authservice.registerUser(body, ip);
}
@Post('/validate_user')
public async validateUser(@Body() body: ValidateUserRequestValidator): Promise {
- await this.appService.validateUser(body.username);
+ await this.authservice.validateUser(body.username);
}
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/auth/auth.service.ts
index 1ac40df37..3aac75fde 100644
--- a/newback/src/modules/auth/auth.service.ts
+++ b/newback/src/modules/auth/auth.service.ts
@@ -1,11 +1,14 @@
import {
ConflictException,
Injectable,
- Logger
+ Logger,
+ UnauthorizedException
} from '@nestjs/common';
import {UserRepository} from '@/data/database/repository/user.repository';
import {PasswordService} from '@/modules/password/password.service';
import {
+ LoginRequest,
+ SignInResponse,
SignUpRequest,
SignUpResponse
} from '@/data/types/dto/dto';
@@ -15,6 +18,7 @@ import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
+import {LoginRequestValidator} from '@/modules/auth/validators/login.request.validator';
@Injectable()
export class AuthService {
@@ -30,9 +34,26 @@ export class AuthService {
) {
}
- public async authorize(email: string): Promise {
- let user = await this.userRepository.getUserByEmail(email);
- return user.user.username;
+ public async authorize(body: LoginRequest): Promise {
+ let password, userId;
+ if (body.email) {
+ const result = await this.userRepository.getUserByEmail(body.email);
+ userId = result.user.id;
+ password = result?.password;
+ } else {
+ const result = await this.userRepository.getUserByUserName(body.username);
+ userId = result.id;
+ password = result?.userAuth?.password;
+ }
+ if (!password) {
+ throw new ConflictException("User with login doesn't exists");
+ }
+ let matches = await this.passwordService.checkPassword(body.password, password);
+ if (!matches) {
+ throw new UnauthorizedException("Invalid password");
+ }
+ const session = await this.createAndSaveSession(userId);
+ return {session}
}
public async sendVerificationEmail(email: string, userId: number, username: string, ip: string) {
@@ -51,8 +72,7 @@ export class AuthService {
public async registerUser(data: SignUpRequest, ip: string): Promise {
const {session, userId} = await this.sequelize.transaction(async(t) => {
let userId = await this.createUser(data, t);
- let session = await this.passwordService.generateRandomString(32);
- await this.redisService.saveSession(session, userId);
+ let session = await this.createAndSaveSession(userId);
return {session, userId};
});
if (data.email) {
@@ -61,6 +81,12 @@ export class AuthService {
return {session};
}
+ private async createAndSaveSession(userId: number) {
+ let session = await this.passwordService.generateRandomString(32);
+ await this.redisService.saveSession(session, userId);
+ return session;
+ }
+
public async validateEmail(email: string): Promise {
let exist = await this.userRepository.checkUserExistByEmail(email);
if (exist) {
diff --git a/newback/src/modules/auth/validators/login.request.validator.ts b/newback/src/modules/auth/validators/login.request.validator.ts
index 20cc51911..8d544bb25 100644
--- a/newback/src/modules/auth/validators/login.request.validator.ts
+++ b/newback/src/modules/auth/validators/login.request.validator.ts
@@ -1,16 +1,27 @@
import {
+ IsEmail,
IsString,
Matches,
+ ValidateIf,
} from 'class-validator';
import {LoginRequest} from '@/data/types/dto/dto';
export class LoginRequestValidator implements LoginRequest {
@IsString()
+ @ValidateIf(o => !o.email)
@Matches(/^\S+$/, {
message: `Username can't contain whitespaces`
})
public username: string;
+ @IsString()
+ @IsEmail()
+ @Matches(/^\S+$/, {
+ message: `email can't contain whitespaces`
+ })
+ @ValidateIf(o => !o.username)
+ public email: string;
+
@IsString()
@Matches(/^\S+$/, {
message: `Password can't contain whitespaces`
From bdc8c85f4314d135eef2f2a911f47f906cbcaadc Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 03:52:32 +0300
Subject: [PATCH 014/221] Fixed auth
---
newback/src/modules/auth/auth.service.ts | 8 +++++---
.../modules/auth/validators/login.request.validator.ts | 5 +++--
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/auth/auth.service.ts
index 3aac75fde..4e57089dd 100644
--- a/newback/src/modules/auth/auth.service.ts
+++ b/newback/src/modules/auth/auth.service.ts
@@ -18,7 +18,6 @@ import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
-import {LoginRequestValidator} from '@/modules/auth/validators/login.request.validator';
@Injectable()
export class AuthService {
@@ -38,11 +37,11 @@ export class AuthService {
let password, userId;
if (body.email) {
const result = await this.userRepository.getUserByEmail(body.email);
- userId = result.user.id;
+ userId = result?.user?.id;
password = result?.password;
} else {
const result = await this.userRepository.getUserByUserName(body.username);
- userId = result.id;
+ userId = result?.id;
password = result?.userAuth?.password;
}
if (!password) {
@@ -58,8 +57,10 @@ export class AuthService {
public async sendVerificationEmail(email: string, userId: number, username: string, ip: string) {
try {
+ this.logger.debug(`Preparing for sending verification email to userId ${userId}`)
await this.sequelize.transaction(async(t) => {
let token = await this.passwordService.generateRandomString(32);
+ this.logger.log(`Generated token for userId ${userId}: ${token}`)
await this.userRepository.createVerification(email, userId, token, t)
await this.emailService.sendSignUpEmail(username, userId, email, token, ip, ip)
});
@@ -83,6 +84,7 @@ export class AuthService {
private async createAndSaveSession(userId: number) {
let session = await this.passwordService.generateRandomString(32);
+ this.logger.log(`Generated session for userId ${userId}: ${session}`)
await this.redisService.saveSession(session, userId);
return session;
}
diff --git a/newback/src/modules/auth/validators/login.request.validator.ts b/newback/src/modules/auth/validators/login.request.validator.ts
index 8d544bb25..fd3dd7fa8 100644
--- a/newback/src/modules/auth/validators/login.request.validator.ts
+++ b/newback/src/modules/auth/validators/login.request.validator.ts
@@ -7,19 +7,20 @@ import {
import {LoginRequest} from '@/data/types/dto/dto';
export class LoginRequestValidator implements LoginRequest {
+
+ @ValidateIf(o => !o.email || o.username)
@IsString()
- @ValidateIf(o => !o.email)
@Matches(/^\S+$/, {
message: `Username can't contain whitespaces`
})
public username: string;
+ @ValidateIf(o => !o.username || o.email)
@IsString()
@IsEmail()
@Matches(/^\S+$/, {
message: `email can't contain whitespaces`
})
- @ValidateIf(o => !o.username)
public email: string;
@IsString()
From e89d60505f3a16fe4ea3ab84731960257cd0e11c Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 12:33:35 +0300
Subject: [PATCH 015/221] fix test
---
newback/package.json | 1 +
newback/src/modules/auth/auth.controller.ts | 2 +-
newback/src/modules/auth/auth.module.spec.ts | 107 ++++++++++++------
.../validators/sign.up.request.validator.ts | 1 +
newback/yarn.lock | 20 ++++
5 files changed, 96 insertions(+), 35 deletions(-)
diff --git a/newback/package.json b/newback/package.json
index c0882f8d4..a010354d8 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -22,6 +22,7 @@
"@nestjs/swagger": "^5.2.1",
"@types/bcrypt": "^5.0.0",
"@types/nodemailer": "^6.4.4",
+ "@types/supertest": "^2.0.12",
"bcrypt": "^5.0.1",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
index f8629f77b..bdd841713 100644
--- a/newback/src/modules/auth/auth.controller.ts
+++ b/newback/src/modules/auth/auth.controller.ts
@@ -1,6 +1,7 @@
import {
Body,
Controller,
+ HttpCode,
Ip,
Logger,
Post
@@ -38,5 +39,4 @@ export class AuthController {
await this.authservice.validateUser(body.username);
}
-
}
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/auth/auth.module.spec.ts
index 7043dfc41..3a647732d 100644
--- a/newback/src/modules/auth/auth.module.spec.ts
+++ b/newback/src/modules/auth/auth.module.spec.ts
@@ -14,7 +14,6 @@ import {RoomRepository} from '@/data/database/repository/room.repository';
import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {
- MailerModule,
MailerService
} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
@@ -22,19 +21,14 @@ import {HtmlService} from '@/modules/html/html.service';
describe('AuthModule', () => {
let app: INestApplication;
- let request: () => supertest.SuperTest;
- let userRepository: UserRepository;
- let roomRepository: RoomRepository;
- let redisService: RedisService;
- let sequelize: Sequelize;
- let mailerService: MailerService;
- beforeEach(async() => {
+ let request: supertest.SuperTest;
+ let userRepository: UserRepository = {} as UserRepository;
+ let roomRepository: RoomRepository = {} as RoomRepository;
+ let redisService: RedisService = {} as RedisService;
+ let sequelize: Sequelize = {} as Sequelize;
+ let mailerService: MailerService = {} as MailerService;
- userRepository = {} as UserRepository;
- roomRepository = {} as RoomRepository;
- redisService = {} as RedisService;
- sequelize = {} as Sequelize;
- mailerService = {} as MailerService;
+ beforeAll(async() => {
const moduleFixture = await Test.createTestingModule({
imports: [
LoggerModule,
@@ -69,41 +63,91 @@ describe('AuthModule', () => {
app = moduleFixture.createNestApplication();
app.useGlobalPipes(new ValidationPipe());
await app.init();
-
- const requestToServer = supertest(app.getHttpServer());
- request = (): supertest.SuperTest => requestToServer;
+ request = supertest(app.getHttpServer());
});
afterEach(() => {
jest.clearAllMocks();
+ Object.keys(userRepository).forEach(key => delete userRepository[key]);
+ Object.keys(roomRepository).forEach(key => delete roomRepository[key]);
+ Object.keys(redisService).forEach(key => delete redisService[key]);
+ Object.keys(sequelize).forEach(key => delete sequelize[key]);
+ Object.keys(mailerService).forEach(key => delete mailerService[key]);
});
- afterAll(() => app.close());
+ afterAll(async() => {
+ await app.close()
+ });
describe('signup', () => {
- it('validate request', async() => {
+ it('returns session', async() => {
sequelize.transaction = (resolve) =>resolve();
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
userRepository.createUser = jest.fn().mockResolvedValue(3);
roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
redisService.saveSession = jest.fn().mockResolvedValue(undefined)
- const {body} = await request()
+ const {body} = await request
.post('/register').send({
username: 'a',
password: 'as$'
- });
+ }).expect(201);
- await expect(body).toMatchObject({session: expect.any(String)});
+ expect(body).toMatchObject({session: expect.any(String)});
+ });
+ it('throws an error if user exists', async() => {
+ sequelize.transaction = (resolve) =>resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
+ const {body} = await request
+ .post('/register').send({
+ username: 'a',
+ password: 'as$'
+ }).expect(409,{
+ error: "Conflict",
+ message: "User with this username already exist",
+ statusCode: 409
+ });
+ });
+ it('throws an error if email exists', async() => {
+ sequelize.transaction = (resolve) =>resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
+ const {body} = await request
+ .post('/register').send({
+ username: 'a',
+ password: 'as$',
+ email: 'death@gmail.com'
+ }).expect(409, {
+ error: "Conflict",
+ message: "User with this email already exist",
+ statusCode: 409
+ });
});
});
describe('validate user', () => {
+
+ it('should return ok', async() => {
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ await request
+ .post('/validate_user').send({
+ username: 'a',
+ }).expect(201,{});
+ });
+ it('should error if user exists', async() => {
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
+ await request
+ .post('/validate_user').send({
+ username: 'a',
+ }).expect(409,{
+ "error": "Conflict",
+ "message": "User with this username already exist",
+ "statusCode": 409,
+ });
+ });
it('should give error on invalid character for username', async() => {
- const {body} = await request()
+ await request
.post('/validate_user').send({
username: '%',
- });
-
- await expect(body).toStrictEqual({
+ }).expect(400,{
"error": "Bad Request",
"message": [
"Username can only contain latin characters, numbers and symbols '-' '_'",
@@ -112,12 +156,10 @@ describe('AuthModule', () => {
});
});
it('should give error if username has great length', async() => {
- const {body} = await request()
+ await request
.post('/validate_user').send({
username: '1234567890123456789',
- });
-
- await expect(body).toStrictEqual({
+ }).expect(400, {
"error": "Bad Request",
"message": [
"Username should be 1-16 characters",
@@ -127,13 +169,10 @@ describe('AuthModule', () => {
});
it('should throw an error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
-
- const {body} = await request()
+ await request
.post('/validate_user').send({
username: 'asd',
- });
-
- await expect(body).toStrictEqual({
+ }).expect(409, {
"error": "Conflict",
"message": "User with this username already exist",
"statusCode": 409,
diff --git a/newback/src/modules/auth/validators/sign.up.request.validator.ts b/newback/src/modules/auth/validators/sign.up.request.validator.ts
index 9f45ec69b..af9969b8c 100644
--- a/newback/src/modules/auth/validators/sign.up.request.validator.ts
+++ b/newback/src/modules/auth/validators/sign.up.request.validator.ts
@@ -5,6 +5,7 @@ import {
IsString,
Length,
Matches,
+ ValidateIf,
} from 'class-validator';
import {
Gender,
diff --git a/newback/yarn.lock b/newback/yarn.lock
index 4a6e377ff..778d6e550 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -855,6 +855,11 @@
dependencies:
"@types/node" "*"
+"@types/cookiejar@*":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8"
+ integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==
+
"@types/debug@^4.1.7":
version "4.1.7"
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
@@ -1026,6 +1031,21 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+"@types/superagent@*":
+ version "4.1.15"
+ resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a"
+ integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==
+ dependencies:
+ "@types/cookiejar" "*"
+ "@types/node" "*"
+
+"@types/supertest@^2.0.12":
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc"
+ integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==
+ dependencies:
+ "@types/superagent" "*"
+
"@types/validator@*", "@types/validator@^13.7.1":
version "13.7.2"
resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.2.tgz#a2114225d9be743fb154b06c29b8257aaca42922"
From fa914fc04831d2bec25094dc19a2629c1154e5e5 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 13:16:29 +0300
Subject: [PATCH 016/221] tes
---
newback/package.json | 3 +-
newback/src/modules/auth/auth.module.spec.ts | 170 +++++++++++++------
newback/yarn.lock | 5 +
3 files changed, 128 insertions(+), 50 deletions(-)
diff --git a/newback/package.json b/newback/package.json
index a010354d8..199ff3714 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -58,6 +58,7 @@
"ts-loader": "^9.2.8",
"ts-node": "^10.7.0",
"tsconfig-paths-jest": "^0.0.1",
- "typescript": "^4.6.3"
+ "typescript": "^4.6.3",
+ "wait-for-expect": "^3.0.2"
}
}
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/auth/auth.module.spec.ts
index 3a647732d..87634ec96 100644
--- a/newback/src/modules/auth/auth.module.spec.ts
+++ b/newback/src/modules/auth/auth.module.spec.ts
@@ -13,11 +13,10 @@ import {UserRepository} from '@/data/database/repository/user.repository';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
-import {
- MailerService
-} from '@nestjs-modules/mailer';
+import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
import {HtmlService} from '@/modules/html/html.service';
+import waitForExpect from "wait-for-expect";
describe('AuthModule', () => {
let app: INestApplication;
@@ -76,16 +75,65 @@ describe('AuthModule', () => {
});
afterAll(async() => {
- await app.close()
+ await app.close()
});
- describe('signup', () => {
+ describe('auth', () => {
+ it('should throw if user not exists', async() => {
+ userRepository.getUserByUserName = jest.fn().mockResolvedValue(null);
+ await request
+ .post('/auth').send({
+ username: 'a',
+ password: 'as$'
+ }).expect(409, {
+ error: "Conflict",
+ message: "User with login doesn't exists",
+ statusCode: 409
+ });
+ });
+ it('should throw if password invalid', async() => {
+ userRepository.getUserByUserName = jest.fn().mockResolvedValue({
+ userAuth: {
+ password: 's'
+ },
+ id: 3
+ })
+ const {body} = await request
+ .post('/auth').send({
+ username: 'a',
+ password: 'as$'
+ }).expect(401, {
+ error: "Unauthorized",
+ message: "Invalid password",
+ statusCode: 401
+ });
+ })
+ it('should return session', async() => {
+ let passwordService = app.get(PasswordService);
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined);
+ let password = await passwordService.createPassword("koko");
+ userRepository.getUserByUserName = jest.fn().mockResolvedValue({
+ userAuth: {
+ password: password
+ },
+ id: 3
+ })
+ const {body} = await request
+ .post('/auth').send({
+ username: 'a',
+ password: 'koko'
+ });
+ expect(body).toMatchObject({session: expect.any(String)});
+ })
+ });
+
+ describe('register', () => {
it('returns session', async() => {
- sequelize.transaction = (resolve) =>resolve();
- userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
- userRepository.createUser = jest.fn().mockResolvedValue(3);
- roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
- redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+ sequelize.transaction = (resolve) => resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.createUser = jest.fn().mockResolvedValue(3);
+ roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
const {body} = await request
.post('/register').send({
username: 'a',
@@ -94,78 +142,102 @@ describe('AuthModule', () => {
expect(body).toMatchObject({session: expect.any(String)});
});
+ it('sends an email', async() => {
+ sequelize.transaction = (resolve) => resolve();
+ userRepository.createVerification = jest.fn().mockResolvedValue(undefined);
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(false);
+ userRepository.createUser = jest.fn().mockResolvedValue(3);
+ roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ mailerService.sendMail = jest.fn();
+ let spy = jest.spyOn(mailerService, 'sendMail').mockResolvedValue(true);
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+ const {body} = await request
+ .post('/register').send({
+ username: 'a',
+ password: 'as$',
+ email: 'death@gmail.com'
+ }).expect(201);
+
+ expect(body).toMatchObject({session: expect.any(String)});
+ await waitForExpect(() => {
+ expect(spy).toHaveBeenCalledTimes(1);
+ }, 30); // 30ms is more than enough
+ expect(spy).toHaveBeenCalledWith(expect.objectContaining({html: expect.any(String)}))
+
+ });
it('throws an error if user exists', async() => {
- sequelize.transaction = (resolve) =>resolve();
- userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
+ sequelize.transaction = (resolve) => resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
const {body} = await request
.post('/register').send({
username: 'a',
password: 'as$'
- }).expect(409,{
- error: "Conflict",
- message: "User with this username already exist",
- statusCode: 409
- });
+ }).expect(409, {
+ error: "Conflict",
+ message: "User with this username already exist",
+ statusCode: 409
+ });
});
it('throws an error if email exists', async() => {
- sequelize.transaction = (resolve) =>resolve();
- userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
- userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
+ sequelize.transaction = (resolve) => resolve();
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
const {body} = await request
.post('/register').send({
username: 'a',
password: 'as$',
email: 'death@gmail.com'
}).expect(409, {
- error: "Conflict",
- message: "User with this email already exist",
- statusCode: 409
- });
+ error: "Conflict",
+ message: "User with this email already exist",
+ statusCode: 409
+ });
});
});
- describe('validate user', () => {
+ describe('validate_user', () => {
it('should return ok', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
await request
.post('/validate_user').send({
username: 'a',
- }).expect(201,{});
+ }).expect(201, {});
});
- it('should error if user exists', async() => {
+ it('should error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
await request
.post('/validate_user').send({
username: 'a',
- }).expect(409,{
- "error": "Conflict",
- "message": "User with this username already exist",
- "statusCode": 409,
- });
+ }).expect(409, {
+ "error": "Conflict",
+ "message": "User with this username already exist",
+ "statusCode": 409,
+ });
});
it('should give error on invalid character for username', async() => {
await request
.post('/validate_user').send({
username: '%',
- }).expect(400,{
- "error": "Bad Request",
- "message": [
- "Username can only contain latin characters, numbers and symbols '-' '_'",
- ],
- "statusCode": 400,
- });
+ }).expect(400, {
+ "error": "Bad Request",
+ "message": [
+ "Username can only contain latin characters, numbers and symbols '-' '_'",
+ ],
+ "statusCode": 400,
+ });
});
it('should give error if username has great length', async() => {
await request
.post('/validate_user').send({
username: '1234567890123456789',
}).expect(400, {
- "error": "Bad Request",
- "message": [
- "Username should be 1-16 characters",
- ],
- "statusCode": 400,
- });
+ "error": "Bad Request",
+ "message": [
+ "Username should be 1-16 characters",
+ ],
+ "statusCode": 400,
+ });
});
it('should throw an error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
@@ -173,10 +245,10 @@ describe('AuthModule', () => {
.post('/validate_user').send({
username: 'asd',
}).expect(409, {
- "error": "Conflict",
- "message": "User with this username already exist",
- "statusCode": 409,
- });
+ "error": "Conflict",
+ "message": "User with this username already exist",
+ "statusCode": 409,
+ });
});
});
});
diff --git a/newback/yarn.lock b/newback/yarn.lock
index 778d6e550..aeb07f963 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -6593,6 +6593,11 @@ w3c-xmlserializer@^2.0.0:
dependencies:
xml-name-validator "^3.0.0"
+wait-for-expect@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463"
+ integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==
+
walker@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
From 43107b6ef86e916b502e4c1a15db7547a761871c Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 22:20:27 +0300
Subject: [PATCH 017/221] Aded more auth test and fe and be methods
---
common/dto.ts | 49 ++++-
frontend/build/development.json | 6 +-
frontend/build/vite.config.ts | 6 +-
frontend/package.json | 1 +
frontend/src/ts/classes/DatabaseWrapper.ts | 16 +-
frontend/src/ts/classes/DefaultStore.ts | 5 +-
frontend/src/ts/classes/Fetch.ts | 186 +++++++++---------
frontend/src/ts/classes/Http.ts | 2 +-
frontend/src/ts/classes/Xhr.ts | 164 ---------------
frontend/src/ts/instances/routerInstance.ts | 5 -
frontend/src/ts/main.ts | 15 +-
frontend/src/ts/message_handlers/Api.ts | 108 +++-------
frontend/src/ts/types/converters.ts | 46 +----
frontend/src/ts/types/db.ts | 6 +-
frontend/src/ts/types/dto.ts | 24 +--
frontend/src/ts/types/env.d.ts | 1 +
frontend/src/ts/types/model.ts | 11 +-
frontend/src/ts/types/types.ts | 11 +-
frontend/src/vue/pages/ReportIssue.vue | 121 ------------
frontend/src/vue/pages/UserProfileInfo.vue | 4 +-
frontend/src/vue/singup/AuthPage.vue | 5 +-
frontend/src/vue/singup/CaptchaComponent.vue | 58 ++++--
frontend/src/vue/singup/Login.vue | 22 ++-
frontend/src/vue/singup/SignUp.vue | 38 ++--
frontend/yarn.lock | 58 +++++-
newback/config/Config.d.ts | 23 ++-
newback/config/default.json | 12 +-
newback/config/env/local.json | 7 +
newback/config/env/test.json | 3 +
newback/package.json | 6 +-
newback/src/data/database/model/user.model.ts | 5 +-
newback/src/data/database/ormconfig.ts | 2 +-
.../database/repository/user.repository.ts | 10 +
newback/src/data/utils/consts.ts | 1 +
.../src/fixtures/google.response.fixture.json | 17 ++
newback/src/main.ts | 17 +-
.../src/modules/api/auth/auth.controller.ts | 67 +++++++
.../{ => api}/auth/auth.module.spec.ts | 171 +++++++++++++---
newback/src/modules/api/auth/auth.module.ts | 30 +++
.../modules/{ => api}/auth/auth.service.ts | 38 +++-
.../modules/api/auth/google.auth.service.ts | 47 +++++
.../auth}/password.service.ts | 0
.../google.auth.reques.validator.ts | 11 ++
.../validators/login.request.validator.ts | 8 +-
.../validators/sign.up.request.validator.ts | 6 +-
.../validate.email.request.validator.ts | 11 ++
.../validate.user.request.validator.ts | 6 +-
newback/src/modules/app/app.module.ts | 13 +-
newback/src/modules/auth/auth.controller.ts | 42 ----
newback/src/modules/auth/auth.module.ts | 15 --
newback/src/modules/captcha/index.ts | 48 +++++
newback/src/modules/config/config.module.ts | 17 ++
newback/src/modules/config/config.service.ts | 14 ++
.../src/modules/email.render/email.module.ts | 4 +-
.../email.render/email.sender.service.ts | 13 +-
newback/src/modules/http/http.module.ts | 19 ++
newback/src/modules/http/http.service.ts | 45 +++++
newback/tsconfig.json | 1 +
newback/yarn.lock | 169 ++++++++++++++--
59 files changed, 1085 insertions(+), 781 deletions(-)
delete mode 100644 frontend/src/ts/classes/Xhr.ts
delete mode 100644 frontend/src/vue/pages/ReportIssue.vue
create mode 100644 newback/config/env/local.json
create mode 100644 newback/config/env/test.json
create mode 100644 newback/src/fixtures/google.response.fixture.json
create mode 100644 newback/src/modules/api/auth/auth.controller.ts
rename newback/src/modules/{ => api}/auth/auth.module.spec.ts (61%)
create mode 100644 newback/src/modules/api/auth/auth.module.ts
rename newback/src/modules/{ => api}/auth/auth.service.ts (75%)
create mode 100644 newback/src/modules/api/auth/google.auth.service.ts
rename newback/src/modules/{password => api/auth}/password.service.ts (100%)
create mode 100644 newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
rename newback/src/modules/{ => api}/auth/validators/login.request.validator.ts (74%)
rename newback/src/modules/{ => api}/auth/validators/sign.up.request.validator.ts (80%)
create mode 100644 newback/src/modules/api/auth/validators/validate.email.request.validator.ts
rename newback/src/modules/{ => api}/auth/validators/validate.user.request.validator.ts (68%)
delete mode 100644 newback/src/modules/auth/auth.controller.ts
delete mode 100644 newback/src/modules/auth/auth.module.ts
create mode 100644 newback/src/modules/captcha/index.ts
create mode 100644 newback/src/modules/config/config.module.ts
create mode 100644 newback/src/modules/config/config.service.ts
create mode 100644 newback/src/modules/http/http.module.ts
create mode 100644 newback/src/modules/http/http.service.ts
diff --git a/common/dto.ts b/common/dto.ts
index 4889d0b11..d790baae0 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -1,15 +1,19 @@
-export interface LoginRequest {
- username: string;
+export interface SignInRequest extends CaptchaRequest{
+ username?: string;
password: string;
- email: string;
+ email?: string;
}
-export interface ValidateUserRequest {
- username: string;
+export interface CaptchaRequest {
+ captcha?: string;
}
-export interface ValidateUserResponse {
- ok: boolean;
+export interface GoogleAuthRequest {
+ token: string;
+}
+
+export interface ValidateUserRequest {
+ username: string;
}
export interface SignUpRequest {
@@ -19,7 +23,7 @@ export interface SignUpRequest {
sex?: Gender;
}
-interface SessionResponse {
+export interface SessionResponse {
session: string;
}
@@ -27,10 +31,39 @@ export interface SignInResponse extends SessionResponse {
}
+export interface OauthSessionResponse extends SessionResponse {
+ isNewAccount: boolean;
+ username: string;
+}
+
+export interface GoogleSignInResponse extends OauthSessionResponse {
+
+}
+
+export interface FacebookSignInResponse extends OauthSessionResponse {
+
+}
+
export interface SignUpResponse extends SessionResponse{
}
+export interface OkResponse {
+ ok: true;
+}
+
+export interface ValidateUserResponse extends OkResponse {
+
+}
+
+export interface ValidateEmailResponse extends OkResponse {
+
+}
+
+export interface ValidateUserEmailRequest {
+ email: string;
+}
+
// ISO/IEC 5218 1 male, 2 - female
export enum Gender {
MALE = 'MALE',
diff --git a/frontend/build/development.json b/frontend/build/development.json
index 95fdee33e..2d604106a 100644
--- a/frontend/build/development.json
+++ b/frontend/build/development.json
@@ -3,9 +3,9 @@
"IS_DEBUG": true,
"ELECTRON_IGNORE_SSL": true,
"PUBLIC_PATH": null,
- "GOOGLE_OAUTH_2_CLIENT_ID": false,
- "FACEBOOK_APP_ID": false,
- "RECAPTCHA_PUBLIC_KEY": false,
+ "GOOGLE_OAUTH_2_CLIENT_ID": "620421656154-8boctt2h7h5meskhe7vh8aiargj0nae9.apps.googleusercontent.com",
+ "FACEBOOK_APP_ID": "894051850700207",
+ "RECAPTCHA_PUBLIC_KEY": "6LchGhwTAAAAAJwCRgfNKraWrFtCdKPFo0Ri8DLt",
"AUTO_REGISTRATION": false,
"ISSUES": false,
"GIPHY_API_KEY": "thZMTtWsaBQAPDIAY461GzYTctuYIeIj",
diff --git a/frontend/build/vite.config.ts b/frontend/build/vite.config.ts
index b33ac8250..75181f870 100644
--- a/frontend/build/vite.config.ts
+++ b/frontend/build/vite.config.ts
@@ -15,6 +15,7 @@ import viteChecker from 'vite-plugin-checker'
import {viteStaticCopy} from 'vite-plugin-static-copy'
import viteCompression from 'vite-plugin-compression'
import viteVisualizer from 'rollup-plugin-visualizer'
+import Inspector from "vite-plugin-vue-inspector";
export default defineConfig(async({command, mode}) => {
let key, cert, ca, gitHash;
@@ -47,6 +48,9 @@ export default defineConfig(async({command, mode}) => {
},
plugins: [
vue(),
+ Inspector({
+ vue: 3,
+ }),
...(!process.env.VITE_LIGHT ? [
viteChecker({
typescript: !process.env.VITE_LIGHT,
@@ -128,7 +132,7 @@ export default defineConfig(async({command, mode}) => {
},
},
server: {
- port: 8080,
+ port: 443,
https: {
key,
cert,
diff --git a/frontend/package.json b/frontend/package.json
index ff8717769..82e1395e3 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -57,6 +57,7 @@
"vite-plugin-checker": "^0.4.4",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-static-copy": "https://github.com/akoidan/vite-plugin-static-copy",
+ "vite-plugin-vue-inspector": "^0.3.0",
"vue-tsc": "^0.33.9"
},
"dependencies": {
diff --git a/frontend/src/ts/classes/DatabaseWrapper.ts b/frontend/src/ts/classes/DatabaseWrapper.ts
index 69257c950..ace8e4eba 100644
--- a/frontend/src/ts/classes/DatabaseWrapper.ts
+++ b/frontend/src/ts/classes/DatabaseWrapper.ts
@@ -20,10 +20,6 @@ import type {
UserModel,
} from "@/ts/types/model";
import {
- convertNumberToSex,
- convertSexToNumber,
- convertSexToString,
- convertStringSexToNumber,
convertToBoolean,
getChannelDict,
getRoomsBaseDict,
@@ -61,7 +57,7 @@ export default class DatabaseWrapper implements IStorage {
if (!window.openDatabase) {
throw Error("DatabaseWrapper not supported");
}
- this.db = window.openDatabase("v157", "", "Messages database", 10 * 1024 * 1024);
+ this.db = window.openDatabase("v158", "", "Messages database", 10 * 1024 * 1024);
this.logger = loggerFactory.getLoggerColor("db", "#753e01");
}
@@ -71,7 +67,7 @@ export default class DatabaseWrapper implements IStorage {
let t: SQLTransaction = await new Promise((resolve, reject) => {
this.db.changeVersion(this.db.version, "1.0", resolve, reject);
});
- t = await this.runSql(t, "CREATE TABLE user (id integer primary key, user text, sex integer NOT NULL CHECK (sex IN (0,1,2)), deleted boolean NOT NULL CHECK (deleted IN (0,1)), country_code text, country text, region text, city text, thumbnail text, last_time_online integer)");
+ t = await this.runSql(t, "CREATE TABLE user (id integer primary key, user text, sex text NOT NULL CHECK (sex IN ('MALE', 'FEMALE','OTHER')), deleted boolean NOT NULL CHECK (deleted IN (0,1)), country_code text, country text, region text, city text, thumbnail text, last_time_online integer)");
t = await this.runSql(t, "CREATE TABLE channel (id integer primary key, name text, deleted boolean NOT NULL CHECK (deleted IN (0,1)), creator INTEGER REFERENCES user(id))");
t = await this.runSql(t, "CREATE TABLE room (id integer primary key, name text, p2p boolean NOT NULL CHECK (p2p IN (0,1)), notifications boolean NOT NULL CHECK (notifications IN (0,1)), volume integer, deleted boolean NOT NULL CHECK (deleted IN (0,1)), channel_id INTEGER REFERENCES channel(id), is_main_in_channel boolean NOT NULL CHECK (is_main_in_channel IN (0,1)), creator INTEGER REFERENCES user(id))");
t = await this.runSql(t, "CREATE TABLE message (id integer primary key, time integer, content text, symbol text, deleted boolean NOT NULL CHECK (deleted IN (0,1)), edited integer, room_id integer REFERENCES room(id), user_id integer REFERENCES user(id), status text, parent_message_id INTEGER REFERENCES message(id) ON UPDATE CASCADE, thread_messages_count INTEGER)");
@@ -246,7 +242,7 @@ export default class DatabaseWrapper implements IStorage {
public getInsertUser(user: UserModel): QueryObject {
return [
"insert or replace into user (id, user, sex, deleted, country_code, country, region, city, last_time_online, thumbnail) values (?, ?, ?, 0, ?, ?, ?, ?, ?, ?)",
- [user.id, user.user, convertSexToNumber(user.sex), user.location.countryCode, user.location.country, user.location.region, user.location.city, user.lastTimeOnline, user.image],
+ [user.id, user.user, user.sex, user.location.countryCode, user.location.country, user.location.region, user.location.city, user.lastTimeOnline, user.image],
];
}
@@ -271,7 +267,7 @@ export default class DatabaseWrapper implements IStorage {
public setUserProfile(user: CurrentUserInfoModel) {
this.write((t) => {
- this.executeSql(t, "insert or replace into profile (user_id, user, name, city, surname, email, birthday, contacts, sex, image) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", [user.userId, user.user, user.name, user.city, user.surname, user.email, user.birthday, user.contacts, convertStringSexToNumber(user.sex), user.image])();
+ this.executeSql(t, "insert or replace into profile (user_id, user, name, city, surname, email, birthday, contacts, sex, image) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", [user.userId, user.user, user.name, user.city, user.surname, user.email, user.birthday, user.contacts, user.sex, user.image])();
});
}
@@ -517,7 +513,7 @@ export default class DatabaseWrapper implements IStorage {
const user: UserModel = {
id: u.id,
lastTimeOnline: u.last_time_online,
- sex: convertNumberToSex(u.sex),
+ sex: u.sex,
image: u.thumbnail,
user: u.user,
location: {
@@ -562,7 +558,7 @@ export default class DatabaseWrapper implements IStorage {
private getProfileModel(dbProfile: ProfileDB): CurrentUserInfoModel {
return {
- sex: convertSexToString(dbProfile.sex),
+ sex: dbProfile.sex,
contacts: dbProfile.contacts,
image: dbProfile.image,
birthday: dbProfile.birthday,
diff --git a/frontend/src/ts/classes/DefaultStore.ts b/frontend/src/ts/classes/DefaultStore.ts
index 44c8ff35b..c78311f8a 100644
--- a/frontend/src/ts/classes/DefaultStore.ts
+++ b/frontend/src/ts/classes/DefaultStore.ts
@@ -12,7 +12,7 @@ import type {
PastingTextAreaElement,
RoomDictModel,
SendingFileTransfer,
- SexModelString,
+
UserDictModel,
} from "@/ts/types/model";
import {
@@ -79,6 +79,7 @@ import {
Mutation,
VuexModule,
} from "vuex-module-decorators";
+import {Gender} from '@/ts/types/backend/dto';
const logger = loggerFactory.getLogger("store");
@@ -885,7 +886,7 @@ export class DefaultStore extends VuexModule {
}
@Mutation
- public setUser(user: {id: number; sex: SexModelString; user: string; image: string}) {
+ public setUser(user: {id: number; sex: Gender; user: string; image: string}) {
this.allUsersDict[user.id].user = user.user;
this.allUsersDict[user.id].sex = user.sex;
this.allUsersDict[user.id].image = user.image;
diff --git a/frontend/src/ts/classes/Fetch.ts b/frontend/src/ts/classes/Fetch.ts
index 93fd94d00..0c08fd45f 100644
--- a/frontend/src/ts/classes/Fetch.ts
+++ b/frontend/src/ts/classes/Fetch.ts
@@ -1,99 +1,97 @@
-import type {SessionHolder} from "@/ts/types/types";
+import type {
+ GetData,
+ PostData,
+ SessionHolder,
+} from "@/ts/types/types";
+import Http from "@/ts/classes/Http";
+import {XHR_API_URL} from "@/ts/utils/runtimeConsts";
-/**
- * @param params : object dict of params or DOM form
- * @param callback : function calls on response
- * @param url : string url to post
- * @param formData : form in canse form is used
- *
- */
+export default class Fetch extends Http {
+ public constructor(sessionHolder: SessionHolder) {
+ super(sessionHolder);
+ }
-export default class Fetch /* Extends Http*/ {
- public constructor(apiUrl: string, sessionHolder: SessionHolder) {
- // Super(apiUrl, sessionHolder);
+ public async doGet(url: string, d?: GetData): Promise {
+ if (d?.process) {
+ debugger
+ throw Error("Unable to handle process");
+ }
+ if (d?.baseUrl) {
+ debugger
+ throw Error("Unable to handle baseUrl");
+ }
+ const fileUrl = `${d?.baseUrl ?? XHR_API_URL}${url}`;
+ let headers: Record = {
+ 'Content-Type': 'application/json'
+ };
+ if (!d?.baseUrl) {
+ headers['session_id'] = this.sessionHolder.session!;
+ }
+ try {
+ let response = await fetch(fileUrl, {
+ method: "GET",
+ mode: 'cors',
+ headers
+ });
+ let body = await response.json();
+ if (response.ok) {
+ return body as T;
+ }
+ if (typeof body.message === 'string') {
+ throw Error(body.message)
+ } else if (body?.message?.length && typeof body.message[0] === 'string') {
+ throw Error(body.message[0])
+ } else if (typeof body.error === 'string') {
+ throw Error(body.error)
+ } else {
+ throw Error("Network error");
+ }
+ } catch (e) {
+ debugger
+ throw new Error(e as any);
+ }
}
- //
- // /**
- // * Loads file from server on runtime */
- // Public doGet(fileUrl: string, callback: ErrorCB, isJsonDecoded: boolean = false) {
- // FileUrl = this.getUrl(fileUrl);
- // This.httpLogger.log('GET out {}', fileUrl)();
- // Let regexRes = /\.(\w+)(\?.*)?$/.exec(fileUrl);
- // Let fileType = regexRes != null && regexRes.length === 3 ? regexRes[1] : null;
- // Let xobj = new XMLHttpRequest();
- // // special for IE
- // If (xobj.overrideMimeType) {
- // Xobj.overrideMimeType('application/json');
- // }
- // Xobj.open('GET', fileUrl, true); // Replace 'my_data' with the path to your file
- //
- // Xobj.onreadystatechange = this.getOnreadystatechange(
- // Xobj,
- // FileUrl,
- // IsJsonDecoded || fileType === 'json',
- // 'GET',
- // Callback
- // );
- // Xobj.send(null);
- // }
- //
- // Async asyncPost(d: PostData) {
- // Let config: RequestInit = {
- // Cache: 'no-cache',
- // Headers: {
- // 'session-id': this.sessionHolder.session
- // },
- // };
- // If (d.isJsonEncoded) {
- // Config.headers['Content-Type'] = 'application/json';
- // } else {
- // Let body;
- // Let logOut: string = '';
- // Body = d.formData ? d.formData : new FormData();
- // If (d.params) {
- // For (let key in d.params) {
- // Body.append(key, d.params[key]);
- // }
- // }
- // If (body.entries) {
- // Let entries = body.entries();
- // If (entries && entries.next) {
- // Let d;
- // While (d = entries.next()) {
- // If (d.done) {
- // Break;
- // }
- // LogOut += `${d.value[0]}= ${d.value[1]};`;
- // }
- // }
- // }
- // }
- // Await fetch(d.url, config);
- // }
- //
- // DoPost(d: PostData): XMLHttpRequest {
- // Let r: XMLHttpRequest = new XMLHttpRequest();
- // R.onreadystatechange = this.getOnreadystatechange(r, d.url, d.isJsonDecoded, 'POST', d.cb);
- //
- // Let url = this.getUrl(d.url);
- //
- // R.open('POST', url, true);
- // Let data;
- // Let logOut: String = '';
- // If (d.isJsonEncoded) {
- // Data = JSON.stringify(d.params);
- // R.setRequestHeader('Content-Type', 'application/json');
- // } else {
- // /*Firefox doesn't accept null*/
- //
- // }
- //
- // This.httpLogger.log('POST out {} ::: {} ::: {}', url, d.params, logOut)();
- // If (d.process) {
- // D.process(r);
- // }
- // R.send(data);
- // Return r;
- // }
+ public async doPost(d: PostData): Promise {
+ if (d?.process) {
+ debugger
+ throw Error("Unable to handle process");
+ }
+ const fileUrl = `${XHR_API_URL}${d.url}`;
+ let headers: Record = {};
+ let signal = null;
+ if (d.onAbortController) {
+ const controller = new AbortController();
+ signal = controller.signal;
+ d.onAbortController(controller);
+ }
+ if (!d.formData) {
+ headers['Content-Type'] = 'application/json';
+ headers['session_id'] = this.sessionHolder.session!;
+ }
+ try {
+ let response = await fetch(fileUrl, {
+ method: "POST",
+ mode: 'cors',
+ signal,
+ body: d.params ? JSON.stringify(d.params) : d.formData,
+ headers
+ });
+ let body = await response.json();
+ if (response.ok) {
+ return body as T;
+ }
+ if (typeof body.message === 'string') {
+ throw Error(body.message)
+ } else if (body?.message?.length && typeof body.message[0] === 'string') {
+ throw Error(body.message[0])
+ } else if (typeof body.error === 'string') {
+ throw Error(body.error)
+ } else {
+ throw Error("Network error");
+ }
+ } catch (e) {
+ throw new Error(e as any);
+ }
+ }
}
diff --git a/frontend/src/ts/classes/Http.ts b/frontend/src/ts/classes/Http.ts
index 0f8a1bb3c..72380c8dd 100644
--- a/frontend/src/ts/classes/Http.ts
+++ b/frontend/src/ts/classes/Http.ts
@@ -16,7 +16,7 @@ export default abstract class Http {
this.httpLogger = loggerFactory.getLogger("http");
}
- public abstract doGet(d: GetData): Promise;
+ public abstract doGet(url: string, d?: GetData): Promise;
public abstract doPost(d: PostData): Promise;
diff --git a/frontend/src/ts/classes/Xhr.ts b/frontend/src/ts/classes/Xhr.ts
deleted file mode 100644
index a936cf0b6..000000000
--- a/frontend/src/ts/classes/Xhr.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-import type {
- GetData,
- PostData,
- SessionHolder,
-} from "@/ts/types/types";
-import {
- CONNECTION_ERROR,
- RESPONSE_SUCCESS,
-} from "@/ts/utils/consts";
-import Http from "@/ts/classes/Http";
-import {XHR_API_URL} from "@/ts/utils/runtimeConsts";
-
-/**
- * @param params : object dict of params or DOM form
- * @param callback : function calls on response
- * @param url : string url to post
- * @param formData : form in canse form is used
- *
- */
-
-export default class Xhr extends Http {
- public constructor(sessionHolder: SessionHolder) {
- super(sessionHolder);
- }
-
- /**
- * Loads file from server on runtime
- */
- public async doGet(d: GetData): Promise {
- return new Promise((resolve, reject) => {
- const fileUrl = `${d.baseUrl ?? XHR_API_URL}${d.url}`;
- this.httpLogger.log("GET out {}", fileUrl)();
- const xobj = new XMLHttpRequest();
- // Special for IE
- if (xobj.overrideMimeType) {
- xobj.overrideMimeType("application/json");
- }
- xobj.open("GET", fileUrl, true); // Replace 'my_data' with the path to your file
- if (!d.skipAuth) {
- xobj.setRequestHeader("session_id", this.sessionHolder.session!);
- }
- xobj.onreadystatechange = this.getOnreadystatechange(
- xobj,
- d.isJsonDecoded || false,
- d.checkOkString || false,
- fileUrl,
- undefined,
- reject,
- resolve,
- );
- xobj.send(null);
- });
- }
-
- public async doPost(d: PostData): Promise {
- return new Promise((resolve, reject) => {
- const r: XMLHttpRequest = new XMLHttpRequest();
- r.onreadystatechange = this.getOnreadystatechange(
- r,
- d.isJsonDecoded || false,
- d.checkOkString || false,
- d.url,
- d.errorDescription,
- reject,
- resolve,
- );
-
- const url = `${XHR_API_URL}${d.url}`;
- r.open("POST", url, true);
- let data;
- let logOut: string = "";
- if (d.isJsonEncoded) {
- data = JSON.stringify(d.params);
- r.setRequestHeader("Content-Type", "application/json");
- } else {
- /* Firefox doesn't accept null*/
- data = d.formData ? d.formData : new FormData();
-
- if (d.params) {
- for (const key in d.params) {
- data.append(key, d.params[key]); // TODO null putting?
- }
- }
- if (data.entries) {
- const entries = data.entries();
- if (entries && entries.next) {
- let d;
- while (d = entries.next()) {
- if (d.done) {
- break;
- }
- // @ts-expect-error: next-line
- logOut += `${d.value[0]}= ${d.value[1]};`;
- }
- }
- }
- }
- r.setRequestHeader("session_id", this.sessionHolder.session!);
-
- this.httpLogger.log("POST out {} ::: {} ::: {}", url, d.params, logOut)();
- if (d.process) {
- d.process(r);
- }
- r.send(data);
-
- return r;
- });
- }
-
- private getOnreadystatechange(
- r: XMLHttpRequest,
- isJsonDecoded: boolean,
- checkOkString: boolean,
- url: string,
- errorDescription: string | undefined,
- reject: (error: string) => void,
- resolve: (data: T) => void,
- ): () => void {
- return () => {
- if (r.readyState === 4) {
- if (r.status === 200) {
- this.httpLogger.log("{} in {} ::: {};", "GET", url, r.response)();
- } else {
- this.httpLogger.error("{} out: {} ::: {}, status: {}", "GET", url, r.response, r.status)();
- }
-
- let error: string | null = null;
- let data: T | null = null;
- if (r.status === 0) {
- error = CONNECTION_ERROR;
- } else if (r.status === 200) {
- if (isJsonDecoded) {
- try {
- data = JSON.parse(r.response);
- } catch (e) {
- error = `Unable to parse response ${e}`;
- }
- } else {
- data = r.response;
- }
- } else if (r.status >= 400 && r.status < 500 && r.response) {
- error = r.responseText;
- } else if (r.status === 404) {
- error = "Resource not found";
- } else if (r.status === 500) {
- error = "Server error";
- } else {
- error = "Unknown server error";
- }
- if (checkOkString && !error && r.response !== RESPONSE_SUCCESS) {
- error = r.response || "Invalid response";
- }
- if (errorDescription && error) {
- error = errorDescription + error;
- }
- if (error) {
- reject(error);
- } else {
- resolve(data); // If else data, could not be null there
- }
- }
- };
- }
-}
diff --git a/frontend/src/ts/instances/routerInstance.ts b/frontend/src/ts/instances/routerInstance.ts
index 120df7bee..76133166e 100644
--- a/frontend/src/ts/instances/routerInstance.ts
+++ b/frontend/src/ts/instances/routerInstance.ts
@@ -11,7 +11,6 @@ import ResetPassword from "@/vue/singup/ResetPassword.vue";
import Login from "@/vue/singup/Login.vue";
import SignUp from "@/vue/singup/SignUp.vue";
import UserProfile from "@/vue/pages/UserProfile.vue";
-import ReportIssue from "@/vue/pages/ReportIssue.vue";
import UserProfileChangePassword from "@/vue/pages/UserProfileChangePassword.vue";
import UserProfileImage from "@/vue/pages/UserProfileImage.vue";
import UserProfileInfo from "@/vue/pages/UserProfileInfo.vue";
@@ -151,10 +150,6 @@ export function routerFactory(sub: Subscription) {
component: CreatePrivateRoom,
path: "/create-private-room",
},
- {
- component: ReportIssue,
- path: "/report-issue",
- },
],
}, {
path: "/auth",
diff --git a/frontend/src/ts/main.ts b/frontend/src/ts/main.ts
index 7c2ea0502..f2e3c9af5 100644
--- a/frontend/src/ts/main.ts
+++ b/frontend/src/ts/main.ts
@@ -17,7 +17,6 @@ import loggerFactory from "@/ts/instances/loggerFactory";
import sessionHolder from "@/ts/instances/sessionInstance";
import type {App as VueApp} from "@vue/runtime-core";
import type {PlatformUtil} from "@/ts/types/model";
-import Xhr from "@/ts/classes/Xhr";
import "@/assets/icon.png"; // eslint-disable-line import/no-unassigned-import
import WsHandler from "@/ts/message_handlers/WsHandler";
import WsMessageHandler from "@/ts/message_handlers/WsMessageHandler";
@@ -43,6 +42,7 @@ import {
} from "@/ts/utils/directives";
import Subscription from "@/ts/classes/Subscription";
import type {Router} from "vue-router";
+import Fetch from '@/ts/classes/Fetch';
const logger: Logger = loggerFactory.getLoggerColor("main", "#007a70");
@@ -80,9 +80,6 @@ function bootstrapVue(
no-underscore-dangle
*/
const message = `Error occurred in ${vm?.$options?.__file}:${err}:\n${info}`;
- if (store?.userSettings?.sendLogs && api) {
- void api.sendLogs(`${vm?.$options?.__file}:${err}:${info}`, browserVersion, constants.GIT_HASH);
- }
/* eslint-enable
@typescript-eslint/restrict-template-expressions,
@typescript-eslint/restrict-template-expressions,
@@ -116,7 +113,7 @@ function init(): void {
});
const sub = new Subscription();
- const xhr: Http = /* Window.fetch ? new Fetch(XHR_API_URL, sessionHolder) :*/ new Xhr(sessionHolder);
+ const xhr: Http = new Fetch(sessionHolder);
const api: Api = new Api(xhr, sub);
let storage;
@@ -146,19 +143,11 @@ function init(): void {
window.onerror = function onerror(msg, url, linenumber, column, errorObj): boolean {
const message = `Error occurred in ${url!}:${linenumber!}\n${JSON.stringify(msg)}`;
- if (store?.userSettings?.sendLogs && api) {
- void api.sendLogs(
- `${url!}:${linenumber!}:${column ?? "?"}\n${JSON.stringify(msg)}\n\nOBJ: ${JSON.stringify(errorObj) ?? "?"}`,
- browserVersion,
- constants.GIT_HASH,
- );
- }
void store.growlError(message);
return false;
};
-
window.GIT_VERSION = constants.GIT_HASH;
if (constants.IS_DEBUG) {
window.vue = vue;
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index 29e36ac60..584b65296 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -23,7 +23,8 @@ import type {
import type {InternetAppearMessage} from "@/ts/types/messages/innerMessages";
import type {MultiResponse} from "giphy-api";
import type Subscription from "@/ts/classes/Subscription";
-import {LoginRequest} from '@/ts/types/dto';
+import {SignInRequest} from '@/ts/types/dto';
+import {ValidateUserResponse} from '@/ts/types/backend/dto';
export default class Api extends MessageHandler {
protected readonly handlers: HandlerTypes = {
@@ -43,27 +44,13 @@ export default class Api extends MessageHandler {
this.xhr = xhr;
}
- public async login(body: LoginRequest): Promise {
+ public async login(body: SignInRequest): Promise {
return this.xhr.doPost({
- url: "/auth",
- isJsonDecoded: true,
- isJsonEncoded: true,
+ url: "/auth/sign-in",
params: {...body}
});
}
- public async sendLogs(issue: string, browser: string, version: string): Promise {
- const result: string = await this.xhr.doPost({
- url: "/report_issue",
- params: {
- issue,
- browser,
- version,
- },
- checkOkString: true,
- });
- }
-
public async changePassword(old_password: string, password: string): Promise {
return this.xhr.doPost({
url: "/change_password",
@@ -71,7 +58,6 @@ export default class Api extends MessageHandler {
old_password,
password,
},
- checkOkString: true,
});
}
@@ -79,7 +65,6 @@ export default class Api extends MessageHandler {
await this.xhr.doPost({
url: "/logout",
params: {registration_id},
- errorDescription: "Error while logging out: ",
});
}
@@ -87,26 +72,13 @@ export default class Api extends MessageHandler {
return this.xhr.doPost({
url: "/send_restore_password",
formData: new FormData(form),
- checkOkString: true,
});
}
- public async register(form: HTMLFormElement): Promise {
+ public async register(data: SignInRequest): Promise {
return this.xhr.doPost({
- url: "/register",
- isJsonDecoded: true,
- formData: new FormData(form),
- });
- }
-
- public async registerDict(password: string, username: string): Promise {
- return this.xhr.doPost({
- url: "/register",
- isJsonDecoded: true,
- params: {
- username,
- password,
- },
+ url: "/auth/sign-up",
+ params: data as any,
});
}
@@ -118,20 +90,14 @@ export default class Api extends MessageHandler {
): Promise {
let response!: MultiResponse;
if ((/^\s*$/).exec(text)) {
- response = await this.xhr.doGet({
- isJsonDecoded: true,
- skipAuth: true,
- // https://developers.giphy.com/docs/api/endpoint#trending
- url: `/gifs/trending?api_key=${GIPHY_API_KEY}&limit=${limit}&offset=${offset}`,
+ // https://developers.giphy.com/docs/api/endpoint#trending
+ response = await this.xhr.doGet(`/gifs/trending?api_key=${GIPHY_API_KEY}&limit=${limit}&offset=${offset}`, {
baseUrl: GIPHY_URL,
process,
});
} else {
- response = await this.xhr.doGet({
- isJsonDecoded: true,
- skipAuth: true,
- // https://developers.giphy.com/docs/api/endpoint#search
- url: `/gifs/search?api_key=${GIPHY_API_KEY}&limit=12&q=${encodeURIComponent(text)}&offset=${offset}`,
+ // https://developers.giphy.com/docs/api/endpoint#search
+ response = await this.xhr.doGet(`/gifs/search?api_key=${GIPHY_API_KEY}&limit=12&q=${encodeURIComponent(text)}&offset=${offset}`, {
baseUrl: GIPHY_URL,
process,
});
@@ -144,16 +110,12 @@ export default class Api extends MessageHandler {
}
public async getOauthStatus(): Promise {
- return this.xhr.doGet({
- url: "/oauth_status",
- isJsonDecoded: true,
- });
+ return this.xhr.doGet( "/oauth_status");
}
public async setGoogleOauth(token: string): Promise {
return this.xhr.doPost({
url: "/set_google_oauth",
- checkOkString: true,
params: {token},
});
}
@@ -161,15 +123,13 @@ export default class Api extends MessageHandler {
public async setFacebookOauth(token: string): Promise {
return this.xhr.doPost({
url: "/set_facebook_oauth",
- checkOkString: true,
params: {token},
});
}
public async googleAuth(token: string): Promise {
return this.xhr.doPost({
- url: "/google_auth",
- isJsonDecoded: true,
+ url: "/auth/google-sign-in",
params: {
token,
},
@@ -178,8 +138,7 @@ export default class Api extends MessageHandler {
public async facebookAuth(token: string): Promise {
return this.xhr.doPost({
- url: "/facebook_auth",
- isJsonDecoded: true,
+ url: "/api/facebook_sign_in",
params: {
token,
},
@@ -194,8 +153,8 @@ export default class Api extends MessageHandler {
await this.xhr.loadJs("https://connect.facebook.net/en_US/sdk.js");
}
- public async loadRecaptcha(): Promise {
- await this.xhr.loadJs("https://www.google.com/recaptcha/api.js");
+ public async loadRecaptcha(callbackId: string): Promise {
+ await this.xhr.loadJs(`https://www.google.com/recaptcha/api.js?render=explicit&onload=${callbackId}`);
}
public async registerFCB(registration_id: string, agent: string, is_mobile: boolean): Promise {
@@ -207,8 +166,6 @@ export default class Api extends MessageHandler {
agent,
is_mobile,
},
- isJsonEncoded: true,
- checkOkString: true,
});
return;
} catch (e) {
@@ -223,12 +180,11 @@ export default class Api extends MessageHandler {
}
}
- public async validateUsername(username: string, process: (r: XMLHttpRequest) => void): Promise {
+ public async validateUsername(username: string, onAbortController: (controller: AbortController) => void): Promise {
return this.xhr.doPost({
- url: "/validate_user",
+ url: "/auth/validate-user",
params: {username},
- checkOkString: true,
- process,
+ onAbortController,
});
}
@@ -239,27 +195,20 @@ export default class Api extends MessageHandler {
return this.xhr.doPost({
url: "/upload_profile_image",
formData: fd,
- checkOkString: true,
});
}
public async showProfile(id: number): Promise {
- return this.xhr.doGet({
- url: `/profile?id=${id}`,
- isJsonDecoded: true,
- });
+ return this.xhr.doGet(`/profile?id=${id}`);
}
public async changeEmail(token: string): Promise {
- return this.xhr.doGet({
- url: `/change_email?token=${token}`,
- });
+ return this.xhr.doGet(`/change_email?token=${token}`);
}
public async changeEmailLogin(email: string, password: string): Promise {
return this.xhr.doPost({
url: "/change_email_login",
- checkOkString: true,
params: {
email,
password,
@@ -268,10 +217,7 @@ export default class Api extends MessageHandler {
}
public async confirmEmail(token: string): Promise {
- return this.xhr.doGet({
- url: `/confirm_email?token=${token}`,
- checkOkString: true,
- });
+ return this.xhr.doGet(`/confirm_email?token=${token}`);
}
public async uploadFiles(files: UploadFile[], progress: (e: ProgressEvent) => void, setXhr: (e: XMLHttpRequest) => void): Promise {
@@ -282,7 +228,6 @@ export default class Api extends MessageHandler {
return this.xhr.doPost({
url: "/upload_file",
- isJsonDecoded: true,
formData: fd,
process: (r) => {
setXhr(r);
@@ -291,19 +236,17 @@ export default class Api extends MessageHandler {
});
}
- public async validateEmail(email: string, process: (r: XMLHttpRequest) => void): Promise {
+ public async validateEmail(email: string, onAbortController: (controller: AbortController) => void): Promise {
return this.xhr.doPost({
- url: "/validate_email",
+ url: "/auth/validate-email",
params: {email},
- checkOkString: true,
- process,
+ onAbortController,
});
}
public async verifyToken(token: string): Promise {
const value: {message: string; restoreUser: string} = await this.xhr.doPost<{message: string; restoreUser: string}>({
url: "/verify_token",
- isJsonDecoded: true,
params: {token},
});
if (value && value.message === RESPONSE_SUCCESS) {
@@ -319,7 +262,6 @@ export default class Api extends MessageHandler {
token,
password,
},
- checkOkString: true,
});
}
diff --git a/frontend/src/ts/types/converters.ts b/frontend/src/ts/types/converters.ts
index 23517d64e..0e758f9ea 100644
--- a/frontend/src/ts/types/converters.ts
+++ b/frontend/src/ts/types/converters.ts
@@ -9,7 +9,6 @@ import type {
MessageStatus,
RoomModel,
RoomSettingsModel,
- SexModelString,
UserModel,
} from "@/ts/types/model";
import type {
@@ -19,7 +18,7 @@ import type {
MessageModelDto,
RoomDto,
RoomNoUsersDto,
- SexModelDto,
+ Gender,
UserDto,
UserProfileDtoWoImage,
UserSettingsDto,
@@ -42,7 +41,7 @@ export function currentUserInfoModelToDto(userInfo: CurrentUserInfoModel): UserP
return {...userInfo};
}
-export function convertSex(dto: SexModelDto): SexModelString {
+export function convertSex(dto: Gender): Gender {
return dto;
}
@@ -58,17 +57,6 @@ export function convertLocation(dto: LocationDto | null): Location {
return {...dto};
}
-export function convertSexToNumber(m: SexModelString): number {
- if (m === "Secret") {
- return 0;
- } else if (m === "Male") {
- return 1;
- } else if (m === "Female") {
- return 2;
- }
- throw Error(`Unknown gender ${m}`);
-}
-
export function getChannelDict(
{
channelName,
@@ -155,40 +143,10 @@ export function getRoomsBaseDict(
};
}
-export function convertNumberToSex(m: SexDB): SexModelString {
- const newVar: Record = {
- 0: "Secret",
- 1: "Male",
- 2: "Female",
- };
-
- return newVar[m];
-}
-
-export function convertSexToString(m: SexDB): SexModelString {
- const newVar: Record = {
- 0: "Secret",
- 1: "Male",
- 2: "Female",
- };
-
- return newVar[m];
-}
-
export function convertToBoolean(value: BooleanDB): boolean {
return value === 1;
}
-export function convertStringSexToNumber(m: SexModelString): SexDB {
- const newVar: Record = {
- Secret: 0,
- Male: 1,
- Female: 2,
- };
- return newVar[m];
-}
-
-
export function messageModelToP2p(m: MessageModel): MessageP2pDto {
return {
content: m.content,
diff --git a/frontend/src/ts/types/db.ts b/frontend/src/ts/types/db.ts
index 3cc801a59..b9d2ff41e 100644
--- a/frontend/src/ts/types/db.ts
+++ b/frontend/src/ts/types/db.ts
@@ -1,5 +1,6 @@
import type {LogLevel} from "lines-logger";
import type {MessageStatus} from "@/ts/types/model";
+import {Gender} from '@/ts/types/backend/dto';
export interface UserDB {
id: number;
@@ -14,10 +15,7 @@ export interface UserDB {
city: string;
}
-export type SexDB =
- 0
- | 1
- | 2;
+export type SexDB = Gender;
export type BooleanDB =
0
| 1;
diff --git a/frontend/src/ts/types/dto.ts b/frontend/src/ts/types/dto.ts
index 92c2b0466..6f7f14b6a 100644
--- a/frontend/src/ts/types/dto.ts
+++ b/frontend/src/ts/types/dto.ts
@@ -5,24 +5,13 @@ import type {
CurrentUserSettingsModel,
MessageStatus,
RoomDictModel,
- SexModelString,
UserModel,
} from "@/ts/types/model";
export * from './backend/dto';
-export interface SessionResponse {
- session: string;
-}
-
-
import type {LogLevel} from "lines-logger";
-
-export type SexModelDto =
- "Female"
- | "Male"
- | "Secret";
-
+import {Gender} from '@/ts/types/backend/dto';
export interface RoomNoUsersDto {
channelId: number | null;
@@ -35,13 +24,6 @@ export interface RoomNoUsersDto {
roomCreatorId: number;
}
-
-
-export interface OauthSessionResponse extends SessionResponse {
- isNewAccount: boolean;
- username: string;
-}
-
export interface RoomDto extends RoomNoUsersDto {
users: number[];
}
@@ -63,7 +45,7 @@ export interface UserDto {
userId: number;
userImage: string;
lastTimeOnline: number;
- sex: SexModelString;
+ sex: Gender;
}
export interface LocationDto {
@@ -108,7 +90,7 @@ export interface UserProfileDtoWoImage {
email: string;
birthday: string;
contacts: string;
- sex: SexModelDto;
+ sex: Gender;
userId: number;
}
diff --git a/frontend/src/ts/types/env.d.ts b/frontend/src/ts/types/env.d.ts
index 6f7dc210d..9c4d76bc8 100644
--- a/frontend/src/ts/types/env.d.ts
+++ b/frontend/src/ts/types/env.d.ts
@@ -24,6 +24,7 @@ declare global {
interface Window {
GIT_VERSION: string | undefined;
vue: VueApp;
+ onloadrecaptcha: () => any;
router: Router;
api: Api;
deferredPrompt: BeforeInstallPromptEvent;
diff --git a/frontend/src/ts/types/model.ts b/frontend/src/ts/types/model.ts
index b2dabbaac..3dff91623 100644
--- a/frontend/src/ts/types/model.ts
+++ b/frontend/src/ts/types/model.ts
@@ -1,4 +1,5 @@
import type {LogLevel} from "lines-logger";
+import {Gender} from '@/ts/types/backend/dto';
export enum GrowlType {
SUCCESS = "col-success", INFO = "col-info", ERROR = "col-error",
@@ -37,7 +38,7 @@ export interface CurrentUserSettingsModel {
}
export interface GoogleCaptcha {
- render(div: HTMLElement): void;
+ render(div: HTMLElement, options: any): void;
reset(): void;
}
@@ -63,18 +64,14 @@ export interface CurrentUserInfoWoImage {
email: string;
birthday: string;
contacts: string;
- sex: SexModelString;
+ sex: Gender;
}
-export type SexModelString =
- "Female"
- | "Male"
- | "Secret";
export interface UserModel {
user: string;
id: number;
- sex: SexModelString;
+ sex: Gender;
image: string;
lastTimeOnline: number;
location: Location;
diff --git a/frontend/src/ts/types/types.ts b/frontend/src/ts/types/types.ts
index aa0da90d3..f5885a108 100644
--- a/frontend/src/ts/types/types.ts
+++ b/frontend/src/ts/types/types.ts
@@ -231,21 +231,12 @@ export interface PostData {
url: string;
params?: Record;
formData?: FormData;
- isJsonEncoded?: boolean;
- isJsonDecoded?: boolean;
- checkOkString?: boolean;
- errorDescription?: string;
-
+ onAbortController?: (controller: AbortController) => void;
process?(R: XMLHttpRequest): void;
}
export interface GetData {
- url: string;
- isJsonDecoded?: boolean;
- checkOkString?: boolean;
baseUrl?: string;
- skipAuth?: boolean;
-
process?(R: XMLHttpRequest): void;
}
diff --git a/frontend/src/vue/pages/ReportIssue.vue b/frontend/src/vue/pages/ReportIssue.vue
deleted file mode 100644
index ec13d55b3..000000000
--- a/frontend/src/vue/pages/ReportIssue.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
diff --git a/frontend/src/vue/pages/UserProfileInfo.vue b/frontend/src/vue/pages/UserProfileInfo.vue
index f6f660cb1..f370371d4 100644
--- a/frontend/src/vue/pages/UserProfileInfo.vue
+++ b/frontend/src/vue/pages/UserProfileInfo.vue
@@ -121,7 +121,6 @@ import {
Vue,
} from "vue-property-decorator";
import AppSubmit from "@/vue/ui/AppSubmit.vue";
-import type {SexModelString} from "@/ts/types/model";
import {CurrentUserInfoModel} from "@/ts/types/model";
import type {UserProfileDtoWoImage} from "@/ts/types/dto";
@@ -129,6 +128,7 @@ import {currentUserInfoModelToDto} from "@/ts/types/converters";
import AppInputDate from "@/vue/ui/AppInputDate.vue";
import type {SetUserProfileMessage} from "@/ts/types/messages/wsInMessages";
import type {LogoutMessage} from "@/ts/types/messages/innerMessages";
+import {Gender} from '@/ts/types/backend/dto';
@Component({
name: "UserProfileInfo",
@@ -143,7 +143,7 @@ export default class UserProfileInfo extends Vue {
@State
public readonly userInfo!: CurrentUserInfoModel;
- public sex: SexModelString[] = ["Male", "Female", "Secret"];
+ public sex: Gender[] = [Gender.MALE, Gender.FEMALE, Gender.OTHER];
public model!: UserProfileDtoWoImage;
diff --git a/frontend/src/vue/singup/AuthPage.vue b/frontend/src/vue/singup/AuthPage.vue
index f4243a1f6..45eb3fe2e 100644
--- a/frontend/src/vue/singup/AuthPage.vue
+++ b/frontend/src/vue/singup/AuthPage.vue
@@ -38,7 +38,10 @@ export default class AuthPage extends Vue {
@ApplyGrowlErr({message: "Auto-registration error"})
public async created() {
if (AUTO_REGISTRATION) {
- const {session} = await this.$api.registerDict(this.getRandom(), this.getRandom());
+ const {session} = await this.$api.register({
+ username: this.getRandom(),
+ password: this.getRandom(),
+ });
const message: LoginMessage = {
action: "login",
handler: "router",
diff --git a/frontend/src/vue/singup/CaptchaComponent.vue b/frontend/src/vue/singup/CaptchaComponent.vue
index 70fc7ab18..944452eff 100644
--- a/frontend/src/vue/singup/CaptchaComponent.vue
+++ b/frontend/src/vue/singup/CaptchaComponent.vue
@@ -7,7 +7,7 @@
:src="ifIframeUrl"
/>
@@ -16,9 +16,7 @@
@@ -37,16 +35,20 @@ import {
RECAPTCHA_PUBLIC_KEY,
} from "@/ts/utils/consts";
import type {GoogleCaptcha} from "@/ts/types/model";
+import {ref} from "vue";
+
+const captchaInited = ref(false)
-const captchaInited: boolean = false; // Don't init captcha again, if it was inited in another component
let captchaId = 1; // Just random id to diff one comp fro another
+window.onloadrecaptcha = function () {
+ captchaInited.value = true;
+}
+
@Component({name: "CaptchaComponent"})
export default class CaptchaComponent extends Vue {
public captcha_key: string = RECAPTCHA_PUBLIC_KEY || "";
- public captchaInited: boolean = false; // If current component was initialized
-
public resettingAllowed: boolean = false; // Prevent resetting on initial load
public isIframe: boolean = window.location.protocol === "file:";
@@ -61,14 +63,16 @@ export default class CaptchaComponent extends Vue {
public id = captchaId++;
- @Prop() public value!: boolean;
+ @Prop() public loading!: boolean;
+
+ @Prop() public token!: string;
public ifIframeUrl: string = CAPTCHA_IFRAME ? `${CAPTCHA_IFRAME}?site_key=${RECAPTCHA_PUBLIC_KEY}` : "";
private event: ((E: MessageEvent) => void) | null = null;
public get grecaptcha(): GoogleCaptcha {
- if (window.grecaptcha) {
+ if (window.grecaptcha && (window.grecaptcha as any).reset) {
return window.grecaptcha;
}
return {
@@ -79,7 +83,7 @@ export default class CaptchaComponent extends Vue {
};
}
- @Watch("value")
+ @Watch("loading")
public onValueChange(newValue: boolean, oldValue: boolean) {
if (!newValue && newValue != oldValue) {
if (this.resettingAllowed) {
@@ -87,7 +91,7 @@ export default class CaptchaComponent extends Vue {
this.$logger.log("Resetting captcha")();
this.iframe.contentWindow!.postMessage("reset-captcha", "*");
} else {
- this.grecaptcha.reset && this.grecaptcha.reset();
+ this.grecaptcha.reset();
}
}
this.resettingAllowed = true;
@@ -95,9 +99,16 @@ export default class CaptchaComponent extends Vue {
this.skipInitReset = false;
}
+
+
public renderCaptcha() {
- this.$emit("input", false);
- this.captchaInited = true;
+ this.$emit("update:loading", false);
+ this.grecaptcha.render(this.repactha, {
+ sitekey: this.captcha_key,
+ theme: 'dark',
+ callback: (response: string) => this.$emit("update:token", response),
+ })
+ captchaInited.value = true
}
public destroyed(): void {
@@ -108,6 +119,17 @@ export default class CaptchaComponent extends Vue {
}
}
+ get captchaInited() {
+ return captchaInited.value;
+ }
+
+ @Watch('captchaInited')
+ public async oncatpchaChange() {
+ if (captchaInited.value) {
+ this.renderCaptcha();
+ }
+ }
+
public async created() {
this.$logger.debug("initing captcha with key {}", RECAPTCHA_PUBLIC_KEY)();
if (this.captcha_key) {
@@ -116,17 +138,17 @@ export default class CaptchaComponent extends Vue {
this.event = (event: MessageEvent) => {
this.$logger.log("On message {}", event)();
if (event.data && event.data["g-recaptcha-response"]) {
- this.captchaInited = true;
- this.value = event.data["g-recaptcha-response"]; // TODO emitting prop
+ captchaInited.value = true;
+ this.$emit("update:loading", true);
+ this.$emit("update:token", event.data["g-recaptcha-response"]);
}
};
window.addEventListener("message", this.event, false);
- } else if (captchaInited) {
+ } else if (captchaInited.value) {
this.renderCaptcha();
} else {
- this.$emit("input", true);
- await this.$api.loadRecaptcha();
- this.renderCaptcha();
+ this.$emit("update:loading", true);
+ await this.$api.loadRecaptcha('onloadrecaptcha');
}
}
}
diff --git a/frontend/src/vue/singup/Login.vue b/frontend/src/vue/singup/Login.vue
index 952b40679..cf0f99baa 100644
--- a/frontend/src/vue/singup/Login.vue
+++ b/frontend/src/vue/singup/Login.vue
@@ -36,7 +36,7 @@
-
+
@@ -132,10 +130,10 @@ import AppSubmit from "@/vue/ui/AppSubmit.vue";
import RegisterFieldSet from "@/vue/singup/RegisterFieldSet.vue";
import debounce from "lodash.debounce";
import {IconColor} from "@/ts/types/types";
-import {SexModelString} from "@/ts/types/model";
import type {LoginMessage} from "@/ts/types/messages/innerMessages";
import SocialAuthSignUp from "@/vue/singup/SocialAuthSignUp.vue";
import {USERNAME_REGEX} from "@/ts/utils/consts";
+import {Gender} from '@/ts/types/backend/dto';
@Component({
name: "SignUp",
@@ -151,9 +149,6 @@ export default class SignUp extends Vue {
running: boolean = false;
- @Ref()
- private form!: HTMLFormElement;
-
created() {
this.$store.setRegHeader("Create new account");
this.debouncedValidateUserName = debounce(this.checkUserName, 500);
@@ -180,7 +175,7 @@ export default class SignUp extends Vue {
debouncedValidateUserName!: Function;
- private currentValidateUsernameRequest: XMLHttpRequest | null = null;
+ private currentValidateUsernameRequest: AbortController | null = null;
async checkUserName(username: string) {
if (this.currentValidateUsernameRequest) {
@@ -188,7 +183,7 @@ export default class SignUp extends Vue {
this.currentValidateUsernameRequest = null;
}
try {
- await this.$api.validateUsername(username, (r) => this.currentValidateUsernameRequest = r);
+ await this.$api.validateUsername(username, (r: AbortController) => this.currentValidateUsernameRequest = r);
this.userCheckValue = IconColor.SUCCESS;
this.userDescription = "Username is ok!";
this.usernameValidity = "";
@@ -282,7 +277,7 @@ export default class SignUp extends Vue {
debouncedValidateEmail!: Function;
- private currentValidateEmailRequest: XMLHttpRequest | null = null;
+ private currentValidateEmailRequest: AbortController | null = null;
async checkEmail(username: string) {
if (this.currentValidateEmailRequest) {
@@ -290,7 +285,7 @@ export default class SignUp extends Vue {
this.currentValidateEmailRequest = null;
}
try {
- await this.$api.validateEmail(username, (r) => this.currentValidateEmailRequest = r);
+ await this.$api.validateEmail(username, (r:AbortController) => this.currentValidateEmailRequest = r);
this.emailCheckValue = IconColor.SUCCESS;
this.emailDescription = "Email is ok!";
this.emailValidity = "";
@@ -339,8 +334,8 @@ export default class SignUp extends Vue {
sexCheckValue: IconColor = IconColor.NOT_SET;
@Watch("sex")
- onSexChange(gender: SexModelString) {
- if (gender == "Secret") {
+ onSexChange(gender: Gender) {
+ if (gender == Gender.OTHER) {
this.sexDescription = "Need a help?";
this.sexCheckValue = IconColor.WARN;
} else {
@@ -349,13 +344,20 @@ export default class SignUp extends Vue {
}
}
- @ApplyGrowlErr({runningProp: "running",
- message: "Can't sign up"})
+ @ApplyGrowlErr({
+ runningProp: "running",
+ message: "Can't sign up"
+ })
async register() {
- const {session} = await this.$api.register(this.form);
- const message: LoginMessage = {action: "login",
- handler: "router",
- session};
+ const {session} = await this.$api.register({
+ username: this.username,
+ password: this.password,
+ });
+ const message: LoginMessage = {
+ action: "login",
+ handler: "router",
+ session
+ };
this.$messageBus.notify(message);
}
}
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 2aeb06244..ca787ceb4 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -361,6 +361,16 @@
estree-walker "^2.0.2"
source-map "^0.6.1"
+"@vue/compiler-core@3.2.32":
+ version "3.2.32"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.32.tgz#a0be08214c55ae48092b413d8b552c0573e3a883"
+ integrity sha512-bRQ8Rkpm/aYFElDWtKkTPHeLnX5pEkNxhPUcqu5crEJIilZH0yeFu/qUAcV4VfSE2AudNPkQSOwMZofhnuutmA==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/shared" "3.2.32"
+ estree-walker "^2.0.2"
+ source-map "^0.6.1"
+
"@vue/compiler-dom@3.2.31", "@vue/compiler-dom@^3.2.27":
version "3.2.31"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e"
@@ -369,6 +379,14 @@
"@vue/compiler-core" "3.2.31"
"@vue/shared" "3.2.31"
+"@vue/compiler-dom@^3.2.31":
+ version "3.2.32"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.32.tgz#8ddae1ee463c18c5c3353c4716ec7c84ee29e5ad"
+ integrity sha512-maa3PNB/NxR17h2hDQfcmS02o1f9r9QIpN1y6fe8tWPrS1E4+q8MqrvDDQNhYVPd84rc3ybtyumrgm9D5Rf/kg==
+ dependencies:
+ "@vue/compiler-core" "3.2.32"
+ "@vue/shared" "3.2.32"
+
"@vue/compiler-sfc@3.2.31", "@vue/compiler-sfc@^3.2.27":
version "3.2.31"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f"
@@ -455,6 +473,11 @@
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e"
integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==
+"@vue/shared@3.2.32":
+ version "3.2.32"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.32.tgz#1ca0c3b8c03a5e24129156e171df736b2c1d645f"
+ integrity sha512-bjcixPErUsAnTQRQX4Z5IQnICYjIfNCyCl8p29v1M6kfVzvwOICPw+dz48nNuWlTOOx2RHhzHdazJibE8GSnsw==
+
"@yarnpkg/lockfile@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
@@ -620,6 +643,14 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.1, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -629,14 +660,6 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0, chalk@^4.1.1, chalk@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
character-parser@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
@@ -2002,6 +2025,13 @@ magic-string@^0.25.7:
dependencies:
sourcemap-codec "^1.4.8"
+magic-string@^0.26.1:
+ version "0.26.1"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.1.tgz#ba9b651354fa9512474199acecf9c6dbe93f97fd"
+ integrity sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
matcher@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
@@ -2612,7 +2642,7 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-shell-quote@^1.6.1:
+shell-quote@^1.6.1, shell-quote@^1.7.3:
version "1.7.3"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
@@ -3005,6 +3035,16 @@ vite-plugin-compression@^0.5.1:
fs-extra "^10.0.1"
picocolors "^1.0.0"
+vite-plugin-vue-inspector@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-0.3.0.tgz#a1f2fb5d625f8d8fe4e4c5f7c5193c4d4b47caba"
+ integrity sha512-xyFMPZU8NOU4YYpGyruMGN3KX5pM8nXBdpIpQVMvfO6pgiqgdEzH6TJRQGZH7N85IWWCY/lR4QAZoAQNVIcUDg==
+ dependencies:
+ "@vue/compiler-dom" "^3.2.31"
+ chalk "4.1.2"
+ magic-string "^0.26.1"
+ shell-quote "^1.7.3"
+
vite@^2.9.1:
version "2.9.1"
resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.1.tgz#84bce95fae210a7beb566a0af06246748066b48f"
diff --git a/newback/config/Config.d.ts b/newback/config/Config.d.ts
index fb4b488e1..fa4fdcb49 100644
--- a/newback/config/Config.d.ts
+++ b/newback/config/Config.d.ts
@@ -1,10 +1,12 @@
/* tslint:disable */
/* eslint-disable */
-declare module "node-config-ts" {
+declare module "node-ts-config" {
interface IConfig {
name: string
application: Application
settings: Settings
+ auth: Auth
+ recaptcha: Recaptcha
email: Email
redis: Redis
frontend: Frontend
@@ -21,7 +23,6 @@ declare module "node-config-ts" {
}
interface Frontend {
address: string
- maxUserNameLength: number
jsConsoleLogs: string
maxMessageSize: number
issueReportLink: string
@@ -39,17 +40,23 @@ declare module "node-config-ts" {
interface Email {
host: string
port: number
- secure: boolean
- tls: Tls
- auth: Auth
+ auth: Auth2
from: string
}
- interface Auth {
+ interface Auth2 {
+ type: string
user: string
password: string
}
- interface Tls {
- ciphers: string
+ interface Recaptcha {
+ publicKey: string
+ privateKey: string
+ }
+ interface Auth {
+ google: Google
+ }
+ interface Google {
+ clientId: string
}
interface Settings {
wsIdCharLength: number
diff --git a/newback/config/default.json b/newback/config/default.json
index 77bad58d7..9a115d690 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -2,7 +2,7 @@
"name": "pychat",
"application": {
"env": "default",
- "port": 8889,
+ "port": 8888,
"logLevel": "debug",
"logOutput": "text",
"crtPath": "../frontend/build/certs/server.crt.pem",
@@ -19,6 +19,15 @@
"pingInterval": 300000,
"clientNoServerPingCloseTimeout": 320000
},
+ "auth": {
+ "google": {
+ "clientId": "620421656154-8boctt2h7h5meskhe7vh8aiargj0nae9.apps.googleusercontent.com"
+ }
+ },
+ "recaptcha": {
+ "publicKey": "6LchGhwTAAAAAJwCRgfNKraWrFtCdKPFo0Ri8DLt",
+ "privateKey": "6LchGhwTAAAAAIH_RuxyeJQn5Kv6XnHcLSc_68h_"
+ },
"email": {
"host": "smtp.gmail.com",
"port": 587,
@@ -36,7 +45,6 @@
},
"frontend": {
"address": "https://localhost:8080",
- "maxUserNameLength": 16,
"jsConsoleLogs": "debug",
"maxMessageSize": 100000,
"issueReportLink": "https://github.com/akoidan/pychat/issues/new",
diff --git a/newback/config/env/local.json b/newback/config/env/local.json
new file mode 100644
index 000000000..f6ea0830a
--- /dev/null
+++ b/newback/config/env/local.json
@@ -0,0 +1,7 @@
+{
+ "auth": {
+ "google": {
+ "clientId": "620421656154-8boctt2h7h5meskhe7vh8aiargj0nae9.apps.googleusercontent.com"
+ }
+ }
+}
diff --git a/newback/config/env/test.json b/newback/config/env/test.json
new file mode 100644
index 000000000..38174961f
--- /dev/null
+++ b/newback/config/env/test.json
@@ -0,0 +1,3 @@
+{
+ "recaptcha": null
+}
diff --git a/newback/package.json b/newback/package.json
index 199ff3714..ccba4be56 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -5,7 +5,7 @@
"repository": "https://github.com/akoidan/pychat",
"license": "MIT",
"scripts": {
- "generate-configs": "node node_modules/node-config-ts/bin/cli",
+ "generate-configs": "node-ts-config",
"migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
@@ -21,16 +21,18 @@
"@nestjs/sequelize": "^8.0.0",
"@nestjs/swagger": "^5.2.1",
"@types/bcrypt": "^5.0.0",
+ "@types/node-fetch": "^2.6.1",
"@types/nodemailer": "^6.4.4",
"@types/supertest": "^2.0.12",
"bcrypt": "^5.0.1",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
+ "google-auth-library": "^7.14.1",
"ioredis": "^5.0.4",
"lines-logger": "^2.1.2",
"mysql2": "^2.3.3",
- "node-config-ts": "npm:node-config-ts-2",
"node-db-migration": "^1.4.0",
+ "node-ts-config": "^1.0.4",
"nodemailer": "^6.7.3",
"reflect-metadata": "^0.1.13",
"rxjs": "^7",
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index 64f522a9b..c22d5ddc6 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -7,9 +7,8 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {Gender} from '@/data/types/dto/dto';
-import {config} from 'node-config-ts';
-import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {UserAuthModel} from '@/data/database/model/user.auth.model';
+import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
@Injectable()
@@ -31,7 +30,7 @@ export class UserModel extends Model {
@Column({
allowNull: false,
unique: true,
- type: DataType.STRING(config.frontend.maxUserNameLength),
+ type: DataType.STRING(MAX_USERNAME_LENGTH),
})
public username: string;
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/data/database/ormconfig.ts
index 4f65066d2..926977471 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/data/database/ormconfig.ts
@@ -1,5 +1,5 @@
import type {SequelizeModuleOptions} from '@nestjs/sequelize';
-import {config} from 'node-config-ts';
+import {config} from 'node-ts-config';
export function generateConfig(logging: ((sql: string) => void)): Omit {
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index d23a62a65..4259594a6 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -45,6 +45,16 @@ export class UserRepository {
return userModel.id;
}
+ public async getUserMyAuthGoogle(googleId: string, transaction: Transaction): Promise {
+ return this.userAuthModel.findOne({
+ where: {
+ googleId
+ },
+ include: 'user',
+ transaction
+ })
+ }
+
public async checkUserExistByUserName(username: string, transaction?: Transaction): Promise {
return await this.userModel.findOne({
where: {username},
diff --git a/newback/src/data/utils/consts.ts b/newback/src/data/utils/consts.ts
index 142842582..229996fc6 100644
--- a/newback/src/data/utils/consts.ts
+++ b/newback/src/data/utils/consts.ts
@@ -1,2 +1,3 @@
export const ALL_ROOM_ID = 1;
export const REDIS_SESSIONS_KEY = 'sessions';
+export const MAX_USERNAME_LENGTH = 16;
diff --git a/newback/src/fixtures/google.response.fixture.json b/newback/src/fixtures/google.response.fixture.json
new file mode 100644
index 000000000..fceb72462
--- /dev/null
+++ b/newback/src/fixtures/google.response.fixture.json
@@ -0,0 +1,17 @@
+{
+ "iss": "accounts.google.com",
+ "azp": "620421656154-xxxxxxxxxxxx.apps.googleusercontent.com",
+ "aud": "620421656154-8xxxxxxxxxxxx.apps.googleusercontent.com",
+ "sub": "22222222222222222",
+ "email": "death@gmail.com",
+ "email_verified": true,
+ "at_hash": "xxxxxxxxxxxx",
+ "name": "Andrew Superman",
+ "picture": "https://lh3.googleusercontent.com/a-/xxxxxxxxxxxx-xxxxxxxxxxxx",
+ "given_name": "Andrew",
+ "family_name": "Superman",
+ "locale": "en",
+ "iat": 1649783923,
+ "exp": 1649787523,
+ "jti": "xxxxxxxxxxxx"
+}
diff --git a/newback/src/main.ts b/newback/src/main.ts
index 1dd3f24d4..1cf017348 100644
--- a/newback/src/main.ts
+++ b/newback/src/main.ts
@@ -1,16 +1,31 @@
import {NestFactory} from '@nestjs/core';
import {AppModule} from '@/modules/app/app.module';
-import {config} from 'node-config-ts';
+import {config} from 'node-ts-config';
import {
ConsoleLogger,
Logger,
ValidationPipe
} from '@nestjs/common';
+import {readFile} from 'fs';
+import {promisify} from 'util';
async function bootstrap() {
+ const key = await promisify(readFile)(config.application.keyPath, 'utf-8');
+ const cert =await promisify(readFile)(config.application.crtPath, 'utf-8');
+
const app = await NestFactory.create(AppModule, {
logger: new ConsoleLogger(),
+ cors: {
+ allowedHeaders: ["x-requested-with", "session_id", "Content-Type"],
+ methods: ["POST", "GET", "OPTIONS"],
+ origin: "*"
+ },
+ httpsOptions: {
+ key,
+ cert
+ }
});
+
app.useGlobalPipes(new ValidationPipe());
app.useLogger(app.get(Logger))
await app.listen(config.application.port);
diff --git a/newback/src/modules/api/auth/auth.controller.ts b/newback/src/modules/api/auth/auth.controller.ts
new file mode 100644
index 000000000..9342deb8d
--- /dev/null
+++ b/newback/src/modules/api/auth/auth.controller.ts
@@ -0,0 +1,67 @@
+import {
+ Body,
+ Controller,
+ HttpCode,
+ Ip,
+ Logger,
+ Post,
+ UseGuards
+} from '@nestjs/common';
+import {AuthService} from '@/modules/api/auth/auth.service';
+import {LoginRequestValidator} from '@/modules/api/auth/validators/login.request.validator';
+import {SignUpRequestValidator} from '@/modules/api/auth/validators/sign.up.request.validator';
+import {ValidateUserRequestValidator} from '@/modules/api/auth/validators/validate.user.request.validator';
+import {
+ GoogleSignInResponse,
+ SignInResponse,
+ SignUpResponse,
+ ValidateUserEmailRequest,
+ ValidateUserResponse
+} from '@/data/types/dto/dto';
+import {GoogleAuthRequestValidator} from '@/modules/api/auth/validators/google.auth.reques.validator';
+import {CaptchaGuard} from '@/modules/captcha';
+import {ValidateEmailRequestValidator} from '@/modules/api/auth/validators/validate.email.request.validator';
+
+@Controller({
+ path: '/api/auth'
+})
+export class AuthController {
+ constructor(
+ private readonly authservice: AuthService,
+ private readonly logger: Logger
+ ) {
+ }
+
+ @UseGuards(CaptchaGuard)
+ @Post('/sign-in')
+ public async auth(@Body() body: LoginRequestValidator): Promise {
+ return this.authservice.authorize(body);
+ }
+
+ @Post('/google-sign-in')
+ public async googleAuth(@Body() body: GoogleAuthRequestValidator): Promise {
+ return this.authservice.authorizeGoogle(body);
+ }
+
+ @Post('/sign-up')
+ public async register(@Body() body: SignUpRequestValidator, @Ip() ip): Promise {
+ return this.authservice.registerUser(body, ip);
+ }
+
+ @Post('/validate-email')
+ public async validateEmail(@Body() body: ValidateEmailRequestValidator): Promise {
+ await this.authservice.validateEmail(body.email);
+ return {
+ ok: true
+ }
+ }
+
+ @Post('/validate-user')
+ public async validateUser(@Body() body: ValidateUserRequestValidator): Promise {
+ await this.authservice.validateUser(body.username);
+ return {
+ ok: true
+ }
+ }
+
+}
diff --git a/newback/src/modules/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
similarity index 61%
rename from newback/src/modules/auth/auth.module.spec.ts
rename to newback/src/modules/api/auth/auth.module.spec.ts
index 87634ec96..2608822f0 100644
--- a/newback/src/modules/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -5,10 +5,10 @@ import {
} from '@nestjs/common';
import * as supertest from 'supertest';
import {Test} from '@nestjs/testing';
-import {AuthService} from '@/modules/auth/auth.service';
-import {AuthController} from '@/modules/auth/auth.controller';
+import {AuthService} from '@/modules/api/auth/auth.service';
+import {AuthController} from '@/modules/api/auth/auth.controller';
import {LoggerModule} from '@/modules/logger/logger.module';
-import {PasswordService} from '@/modules/password/password.service';
+import {PasswordService} from '@/modules/api/auth/password.service';
import {UserRepository} from '@/data/database/repository/user.repository';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {RedisService} from '@/data/redis/RedisService';
@@ -17,6 +17,16 @@ import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
import {HtmlService} from '@/modules/html/html.service';
import waitForExpect from "wait-for-expect";
+import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
+import {OAuth2Client} from 'google-auth-library';
+import {HttpService} from '@/modules/http/http.service';
+import fetch from 'node-fetch';
+import * as googleResponseFixture from '@/fixtures/google.response.fixture.json';
+import {ConfigService} from '@/modules/config/config.service';
+import {
+ config,
+ IConfig
+} from 'node-ts-config';
describe('AuthModule', () => {
let app: INestApplication;
@@ -26,15 +36,46 @@ describe('AuthModule', () => {
let redisService: RedisService = {} as RedisService;
let sequelize: Sequelize = {} as Sequelize;
let mailerService: MailerService = {} as MailerService;
-
+ let oauth2Client: OAuth2Client = {} as OAuth2Client;
+ let nodeApply: (...args) => void = () => {
+ };
+ let configService: ConfigService = {} as ConfigService;
beforeAll(async() => {
+ //required to compile Guards like CaptchaGuard
+ configService.getConfig = jest.fn().mockReturnValue(config)
const moduleFixture = await Test.createTestingModule({
imports: [
LoggerModule,
],
providers: [
- {provide: MailerService, useValue: mailerService},
- {provide: Sequelize, useValue: sequelize},
+ {
+ provide: ConfigService,
+ useValue: configService,
+ },
+ {
+ provide: MailerService,
+ useValue: mailerService
+ },
+ {
+ provide: Sequelize,
+ useValue: sequelize
+ },
+ {
+ provide: HttpService,
+ inject: [Logger],
+ useFactory: (logger) => new HttpService(logger, new Proxy(() => {
+ }, {
+ apply: function (target: {}, thisArg: any, argArray: any[]): any {
+ return nodeApply(...argArray)
+ }
+ }) as typeof fetch)
+ },
+ {
+ provide: GoogleAuthService,
+ inject: [Logger],
+ useFactory: (logger) => new GoogleAuthService(logger, oauth2Client)
+ },
+ PasswordService,
AuthService,
HtmlService,
EmailSenderService,
@@ -54,17 +95,20 @@ describe('AuthModule', () => {
provide: RoomRepository,
useValue: roomRepository,
},
- Logger,
- PasswordService,
],
controllers: [AuthController]
- }).compile();
+ })
+ .compile();
app = moduleFixture.createNestApplication();
app.useGlobalPipes(new ValidationPipe());
await app.init();
request = supertest(app.getHttpServer());
});
+ beforeEach(() => {
+ configService.getConfig = jest.fn().mockReturnValue(config)
+ })
+
afterEach(() => {
jest.clearAllMocks();
Object.keys(userRepository).forEach(key => delete userRepository[key]);
@@ -72,17 +116,22 @@ describe('AuthModule', () => {
Object.keys(redisService).forEach(key => delete redisService[key]);
Object.keys(sequelize).forEach(key => delete sequelize[key]);
Object.keys(mailerService).forEach(key => delete mailerService[key]);
+ Object.keys(oauth2Client).forEach(key => delete oauth2Client[key]);
+ nodeApply = () => {
+ };
+ Object.keys(configService).forEach(key => delete configService[key]);
+
});
afterAll(async() => {
await app.close()
});
- describe('auth', () => {
+ describe('sign-in', () => {
it('should throw if user not exists', async() => {
userRepository.getUserByUserName = jest.fn().mockResolvedValue(null);
await request
- .post('/auth').send({
+ .post('/api/auth/sign-in').send({
username: 'a',
password: 'as$'
}).expect(409, {
@@ -91,6 +140,49 @@ describe('AuthModule', () => {
statusCode: 409
});
});
+ it('should throw exception that captcha missing', async() => {
+ configService.getConfig = jest.fn().mockReturnValue({
+ recaptcha: {
+ publicKey: "a",
+ privateKey: "a",
+ }
+ } as IConfig)
+ const {body} = await request
+ .post('/api/auth/sign-in').send({
+ username: 'a',
+ password: 'as$'
+ }).expect(400, {
+ statusCode: 400,
+ message: 'Captcha is missing',
+ error: 'Bad Request'
+ });
+ })
+ it('should go throw captcha when its presnt', async() => {
+ let passwordService = app.get(PasswordService);
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined);
+ let password = await passwordService.createPassword("koko");
+ userRepository.getUserByUserName = jest.fn().mockResolvedValue({
+ userAuth: {
+ password: password
+ },
+ id: 3
+ })
+ configService.getConfig = jest.fn().mockReturnValue({
+ recaptcha: {
+ publicKey: "a",
+ privateKey: "a",
+ }
+ } as IConfig);
+ nodeApply = jest.fn().mockReturnValue({json: jest.fn().mockResolvedValue({success: true})});
+ const {body} = await request
+ .post('/api/auth/sign-in').send({
+ username: 'a',
+ password: 'koko',
+ captcha: 'asd'
+ });
+ expect(body).toMatchObject({session: expect.any(String)});
+ })
+
it('should throw if password invalid', async() => {
userRepository.getUserByUserName = jest.fn().mockResolvedValue({
userAuth: {
@@ -99,7 +191,7 @@ describe('AuthModule', () => {
id: 3
})
const {body} = await request
- .post('/auth').send({
+ .post('/api/auth/sign-in').send({
username: 'a',
password: 'as$'
}).expect(401, {
@@ -119,7 +211,7 @@ describe('AuthModule', () => {
id: 3
})
const {body} = await request
- .post('/auth').send({
+ .post('/api/auth/sign-in').send({
username: 'a',
password: 'koko'
});
@@ -127,7 +219,32 @@ describe('AuthModule', () => {
})
});
- describe('register', () => {
+ describe('google-sign-in', () => {
+ it('should login if user exists', async() => {
+ sequelize.transaction = (resolve) => resolve();
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+ userRepository.getUserMyAuthGoogle = jest.fn().mockResolvedValue({
+ id: 1,
+ user: {
+ username: 'as'
+ }
+ });
+ oauth2Client.verifyIdToken = jest.fn().mockResolvedValue({
+ getPayload: jest.fn().mockReturnValue(googleResponseFixture)
+ });
+ const {body} = await request
+ .post('/api/auth/google-sign-in').send({
+ token: 'aasdasd',
+ }).expect(201);
+ expect(body).toMatchObject({
+ session: expect.any(String),
+ isNewAccount: false,
+ username: 'as'
+ })
+ });
+ });
+
+ describe('sign-up', () => {
it('returns session', async() => {
sequelize.transaction = (resolve) => resolve();
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
@@ -135,7 +252,7 @@ describe('AuthModule', () => {
roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
redisService.saveSession = jest.fn().mockResolvedValue(undefined)
const {body} = await request
- .post('/register').send({
+ .post('/api/auth/sign-up').send({
username: 'a',
password: 'as$'
}).expect(201);
@@ -144,16 +261,16 @@ describe('AuthModule', () => {
});
it('sends an email', async() => {
sequelize.transaction = (resolve) => resolve();
- userRepository.createVerification = jest.fn().mockResolvedValue(undefined);
+ userRepository.createVerification = jest.fn().mockResolvedValue(undefined);
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(false);
userRepository.createUser = jest.fn().mockResolvedValue(3);
roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
mailerService.sendMail = jest.fn();
- let spy = jest.spyOn(mailerService, 'sendMail').mockResolvedValue(true);
+ let spy = jest.spyOn(mailerService, 'sendMail').mockResolvedValue(true);
redisService.saveSession = jest.fn().mockResolvedValue(undefined)
const {body} = await request
- .post('/register').send({
+ .post('/api/auth/sign-up').send({
username: 'a',
password: 'as$',
email: 'death@gmail.com'
@@ -170,7 +287,7 @@ describe('AuthModule', () => {
sequelize.transaction = (resolve) => resolve();
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
const {body} = await request
- .post('/register').send({
+ .post('/api/auth/sign-up').send({
username: 'a',
password: 'as$'
}).expect(409, {
@@ -184,7 +301,7 @@ describe('AuthModule', () => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
const {body} = await request
- .post('/register').send({
+ .post('/api/auth/sign-up').send({
username: 'a',
password: 'as$',
email: 'death@gmail.com'
@@ -195,19 +312,19 @@ describe('AuthModule', () => {
});
});
});
- describe('validate_user', () => {
+ describe('validate-user', () => {
it('should return ok', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
await request
- .post('/validate_user').send({
+ .post('/api/auth/validate-user').send({
username: 'a',
- }).expect(201, {});
+ }).expect(201, {ok: true});
});
it('should error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
await request
- .post('/validate_user').send({
+ .post('/api/auth/validate-user').send({
username: 'a',
}).expect(409, {
"error": "Conflict",
@@ -217,7 +334,7 @@ describe('AuthModule', () => {
});
it('should give error on invalid character for username', async() => {
await request
- .post('/validate_user').send({
+ .post('/api/auth/validate-user').send({
username: '%',
}).expect(400, {
"error": "Bad Request",
@@ -229,7 +346,7 @@ describe('AuthModule', () => {
});
it('should give error if username has great length', async() => {
await request
- .post('/validate_user').send({
+ .post('/api/auth/validate-user').send({
username: '1234567890123456789',
}).expect(400, {
"error": "Bad Request",
@@ -242,7 +359,7 @@ describe('AuthModule', () => {
it('should throw an error if user exists', async() => {
userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
await request
- .post('/validate_user').send({
+ .post('/api/auth/validate-user').send({
username: 'asd',
}).expect(409, {
"error": "Conflict",
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
new file mode 100644
index 000000000..a0eeeb681
--- /dev/null
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -0,0 +1,30 @@
+import {
+ Logger,
+ Module
+} from '@nestjs/common';
+import {AuthController} from '@/modules/api/auth/auth.controller';
+import {AuthService} from '@/modules/api/auth/auth.service';
+import {DatabaseModule} from '@/data/database/database.module';
+import {RedisService} from '@/data/redis/RedisService';
+import {EmailModule} from '@/modules/email.render/email.module';
+import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
+import {PasswordService} from '@/modules/api/auth/password.service';
+import {OAuth2Client} from 'google-auth-library';
+import {config} from 'node-ts-config';
+import {HttpModule} from '@/modules/http/http.module';
+
+@Module({
+ imports: [DatabaseModule, EmailModule, HttpModule],
+ controllers: [AuthController],
+ providers: [AuthService, PasswordService, RedisService, {
+ provide: GoogleAuthService,
+ useFactory: (logger) => {
+ return new GoogleAuthService(logger, new OAuth2Client(
+ config.auth.google.clientId,
+ ))
+ },
+ inject: [Logger]
+ }],
+})
+export class AuthModule {
+}
diff --git a/newback/src/modules/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
similarity index 75%
rename from newback/src/modules/auth/auth.service.ts
rename to newback/src/modules/api/auth/auth.service.ts
index 4e57089dd..480260e93 100644
--- a/newback/src/modules/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -5,9 +5,11 @@ import {
UnauthorizedException
} from '@nestjs/common';
import {UserRepository} from '@/data/database/repository/user.repository';
-import {PasswordService} from '@/modules/password/password.service';
+import {PasswordService} from '@/modules/api/auth/password.service';
import {
- LoginRequest,
+ GoogleAuthRequest,
+ GoogleSignInResponse,
+ SignInRequest,
SignInResponse,
SignUpRequest,
SignUpResponse
@@ -18,6 +20,8 @@ import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
+import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
+import {TokenPayload} from 'google-auth-library';
@Injectable()
export class AuthService {
@@ -28,12 +32,40 @@ export class AuthService {
private readonly passwordService: PasswordService,
private readonly redisService: RedisService,
private readonly emailService: EmailSenderService,
+ private readonly googleAuthService: GoogleAuthService,
private readonly sequelize: Sequelize,
private readonly logger: Logger,
) {
}
- public async authorize(body: LoginRequest): Promise {
+ public async authorizeGoogle(body: GoogleAuthRequest): Promise {
+ let a: TokenPayload = await this.googleAuthService.validate(body.token);
+ return this.sequelize.transaction(async(t) => {
+ let userAuth = await this.userRepository.getUserMyAuthGoogle(a.email, t)
+ if (userAuth) {
+ let session = await this.createAndSaveSession(userAuth.id);
+ return {session, isNewAccount: false, username: userAuth.user.username};
+ } else {
+
+ }
+ });
+
+ // let googleId = a.email;
+ // response.get('given_name'),
+ // response.get('family_name'),
+ // email=response.get('email'),
+ // picture=response.get('picture'),
+ // google_id=response.get('id')
+
+ // username = re.sub('[^0-9a-zA-Z-_]+', '-', email.rsplit('@')[0])[:15]
+ // if email:
+ // username = re.sub('[^0-9a-zA-Z-_]+', '-', email.rsplit('@')[0])[:15]
+ // else:
+ // username = f'{name}_{surname}'
+ return undefined as any;
+ }
+
+ public async authorize(body: SignInRequest): Promise {
let password, userId;
if (body.email) {
const result = await this.userRepository.getUserByEmail(body.email);
diff --git a/newback/src/modules/api/auth/google.auth.service.ts b/newback/src/modules/api/auth/google.auth.service.ts
new file mode 100644
index 000000000..7084f8d30
--- /dev/null
+++ b/newback/src/modules/api/auth/google.auth.service.ts
@@ -0,0 +1,47 @@
+import { OAuth2Client, TokenPayload } from 'google-auth-library';
+import {
+ ForbiddenException,
+ Injectable,
+ Logger,
+} from '@nestjs/common';
+
+@Injectable()
+export class GoogleAuthService {
+
+ public constructor(
+ private readonly logger: Logger,
+ private readonly oauth2Client: OAuth2Client,
+ ) {
+
+ }
+
+ /**
+ * {
+ * "iss": "accounts.google.com",
+ * "azp": "620421656154-xxxxxxxxxxxxxxx.apps.googleusercontent.com",
+ * "aud": "620421656154-xxxxxxxxxxxxxxx.apps.googleusercontent.com",
+ * "sub": "12313131312312",
+ * "email": "deathangel908@gmail.com",
+ * "email_verified": true,
+ * "at_hash": "xxxxxxxxxxxxxxx",
+ * "name": "Andrew Koidan",
+ * "picture": "https://lh3.googleusercontent.com/a-/xxxxxxx",
+ * "given_name": "Andrew",
+ * "family_name": "Koidan",
+ * "locale": "en",
+ * "iat": 1649759247,
+ * "exp": 1649759247,
+ * "jti": "xxxxxxxxxxxxxxxxxxxxxxxxx"
+ * }
+ * */
+ public async validate(idToken: string): Promise {
+ const response = await this.oauth2Client.verifyIdToken({
+ idToken,
+ });
+ const payload = response.getPayload()!;
+ if (!payload) {
+ throw new ForbiddenException('Invalid google credentials')
+ }
+ return payload;
+ }
+}
diff --git a/newback/src/modules/password/password.service.ts b/newback/src/modules/api/auth/password.service.ts
similarity index 100%
rename from newback/src/modules/password/password.service.ts
rename to newback/src/modules/api/auth/password.service.ts
diff --git a/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts b/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
new file mode 100644
index 000000000..3bd5b8af5
--- /dev/null
+++ b/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
@@ -0,0 +1,11 @@
+
+
+import {IsString,} from 'class-validator';
+import {GoogleAuthRequest} from '@/data/types/dto/dto';
+
+export class GoogleAuthRequestValidator implements GoogleAuthRequest {
+
+ @IsString()
+ public token: string;
+
+}
diff --git a/newback/src/modules/auth/validators/login.request.validator.ts b/newback/src/modules/api/auth/validators/login.request.validator.ts
similarity index 74%
rename from newback/src/modules/auth/validators/login.request.validator.ts
rename to newback/src/modules/api/auth/validators/login.request.validator.ts
index fd3dd7fa8..c1220b671 100644
--- a/newback/src/modules/auth/validators/login.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/login.request.validator.ts
@@ -4,16 +4,16 @@ import {
Matches,
ValidateIf,
} from 'class-validator';
-import {LoginRequest} from '@/data/types/dto/dto';
+import {SignInRequest} from '@/data/types/dto/dto';
-export class LoginRequestValidator implements LoginRequest {
+export class LoginRequestValidator implements SignInRequest {
@ValidateIf(o => !o.email || o.username)
@IsString()
@Matches(/^\S+$/, {
message: `Username can't contain whitespaces`
})
- public username: string;
+ public username?: string;
@ValidateIf(o => !o.username || o.email)
@IsString()
@@ -21,7 +21,7 @@ export class LoginRequestValidator implements LoginRequest {
@Matches(/^\S+$/, {
message: `email can't contain whitespaces`
})
- public email: string;
+ public email?: string;
@IsString()
@Matches(/^\S+$/, {
diff --git a/newback/src/modules/auth/validators/sign.up.request.validator.ts b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
similarity index 80%
rename from newback/src/modules/auth/validators/sign.up.request.validator.ts
rename to newback/src/modules/api/auth/validators/sign.up.request.validator.ts
index af9969b8c..9ca5dc8aa 100644
--- a/newback/src/modules/auth/validators/sign.up.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
@@ -11,13 +11,13 @@ import {
Gender,
SignUpRequest,
} from '@/data/types/dto/dto';
-import {config} from 'node-config-ts';
+import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
export class SignUpRequestValidator implements SignUpRequest {
@IsString()
- @Length(1, config.frontend.maxUserNameLength, {
- message: `Username should be 1-${config.frontend.maxUserNameLength} characters`
+ @Length(1, MAX_USERNAME_LENGTH, {
+ message: `Username should be 1-${MAX_USERNAME_LENGTH} characters`
})
@Matches(/[a-zA-Z-_0-9]+/, {
message: `Username can only contain latin characters, numbers and symbols '-' '_'`
diff --git a/newback/src/modules/api/auth/validators/validate.email.request.validator.ts b/newback/src/modules/api/auth/validators/validate.email.request.validator.ts
new file mode 100644
index 000000000..2370dc421
--- /dev/null
+++ b/newback/src/modules/api/auth/validators/validate.email.request.validator.ts
@@ -0,0 +1,11 @@
+import {
+ IsEmail,
+ IsString,
+} from 'class-validator';
+import {ValidateUserEmailRequest} from '@/data/types/dto/dto';
+
+export class ValidateEmailRequestValidator implements ValidateUserEmailRequest {
+ @IsString()
+ @IsEmail()
+ public email: string;
+}
diff --git a/newback/src/modules/auth/validators/validate.user.request.validator.ts b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
similarity index 68%
rename from newback/src/modules/auth/validators/validate.user.request.validator.ts
rename to newback/src/modules/api/auth/validators/validate.user.request.validator.ts
index 0da6a85ad..f79c7f63a 100644
--- a/newback/src/modules/auth/validators/validate.user.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
@@ -4,12 +4,12 @@ import {
Matches,
} from 'class-validator';
import {ValidateUserRequest} from '@/data/types/dto/dto';
-import {config} from 'node-config-ts';
+import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
export class ValidateUserRequestValidator implements ValidateUserRequest {
@IsString()
- @Length(1, config.frontend.maxUserNameLength, {
- message: `Username should be 1-${config.frontend.maxUserNameLength} characters`
+ @Length(1, MAX_USERNAME_LENGTH, {
+ message: `Username should be 1-${MAX_USERNAME_LENGTH} characters`
})
@Matches(/[a-zA-Z-_0-9]+/, {
message: `Username can only contain latin characters, numbers and symbols '-' '_'`
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index ddbc33db1..a71129830 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -1,14 +1,17 @@
import {Module} from '@nestjs/common';
-import {AuthModule} from '@/modules/auth/auth.module';
-import {DatabaseModule} from '@/data/database/database.module';
+import {AuthModule} from '@/modules/api/auth/auth.module';
import {LoggingInterceptor} from '@/modules/logger/interceptor';
-import {APP_INTERCEPTOR} from '@nestjs/core';
+import {
+ APP_INTERCEPTOR,
+ RouterModule
+} from '@nestjs/core';
import {LoggerModule} from '@/modules/logger/logger.module';
import {RedisModule} from '@nestjs-modules/ioredis';
-import {config} from 'node-config-ts';
+import {config} from 'node-ts-config';
+import {ConfigModule} from '@/modules/config/config.module';
@Module({
- imports: [AuthModule, LoggerModule, RedisModule.forRoot({
+ imports: [AuthModule, LoggerModule, ConfigModule, RedisModule.forRoot({
config: {
host: config.redis.host,
port: config.redis.port,
diff --git a/newback/src/modules/auth/auth.controller.ts b/newback/src/modules/auth/auth.controller.ts
deleted file mode 100644
index bdd841713..000000000
--- a/newback/src/modules/auth/auth.controller.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import {
- Body,
- Controller,
- HttpCode,
- Ip,
- Logger,
- Post
-} from '@nestjs/common';
-import {AuthService} from '@/modules/auth/auth.service';
-import {LoginRequestValidator} from '@/modules/auth/validators/login.request.validator';
-import {SignUpRequestValidator} from '@/modules/auth/validators/sign.up.request.validator';
-import {ValidateUserRequestValidator} from '@/modules/auth/validators/validate.user.request.validator';
-import {
- SignInResponse,
- SignUpResponse
-} from '@/data/types/dto/dto';
-
-@Controller()
-export class AuthController {
- constructor(
- private readonly authservice: AuthService,
- private readonly logger: Logger
- ) {
- }
-
- @Post('/auth')
- public async auth(@Body() body: LoginRequestValidator): Promise {
- return this.authservice.authorize(body);
- }
-
- @Post('/register')
- public async register(@Body() body: SignUpRequestValidator, @Ip() ip): Promise {
- return this.authservice.registerUser(body, ip);
- }
-
-
- @Post('/validate_user')
- public async validateUser(@Body() body: ValidateUserRequestValidator): Promise {
- await this.authservice.validateUser(body.username);
- }
-
-}
diff --git a/newback/src/modules/auth/auth.module.ts b/newback/src/modules/auth/auth.module.ts
deleted file mode 100644
index 2e9a7216e..000000000
--- a/newback/src/modules/auth/auth.module.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {Module} from '@nestjs/common';
-import {AuthController} from '@/modules/auth/auth.controller';
-import {AuthService} from '@/modules/auth/auth.service';
-import {DatabaseModule} from '@/data/database/database.module';
-import {PasswordService} from '@/modules/password/password.service';
-import {RedisService} from '@/data/redis/RedisService';
-import {EmailModule} from '@/modules/email.render/email.module';
-
-@Module({
- imports: [DatabaseModule, EmailModule],
- controllers: [AuthController],
- providers: [AuthService, PasswordService, RedisService],
-})
-export class AuthModule {
-}
diff --git a/newback/src/modules/captcha/index.ts b/newback/src/modules/captcha/index.ts
new file mode 100644
index 000000000..c49331b81
--- /dev/null
+++ b/newback/src/modules/captcha/index.ts
@@ -0,0 +1,48 @@
+import {
+ Injectable,
+ CanActivate,
+ ExecutionContext,
+ BadRequestException,
+ Logger,
+ UnauthorizedException,
+
+} from '@nestjs/common';
+
+import {
+ Recaptcha
+} from 'node-ts-config';
+
+import {ConfigService} from '@/modules/config/config.service';
+import {HttpService} from '@/modules/http/http.service';
+@Injectable()
+export class CaptchaGuard implements CanActivate {
+ constructor(
+ private readonly logger: Logger,
+ private readonly httpService: HttpService,
+ private readonly configService: ConfigService,
+ ) {
+ }
+
+ public async canActivate(
+ context: ExecutionContext,
+ ): Promise {
+ if (!this.configService.getConfig().recaptcha) {
+ return true;
+ }
+ let captcha = context.switchToHttp().getRequest()?.body?.captcha;
+ let ip = context.switchToHttp().getRequest()?.ip
+ if (!captcha) {
+ throw new BadRequestException("Captcha is missing");
+ }
+
+ let response = await this.httpService.postUrlEncoded("https://www.google.com/recaptcha/api/siteverify", {
+ secret: this.configService.getConfig().recaptcha.privateKey,
+ response: captcha,
+ remoteip: ip
+ });
+ if (!response.success) {
+ throw new UnauthorizedException(response && response['error-codes'] ? `Captcha error: ${response['error-codes'][0]}` : 'Unable to validate captcha');
+ }
+ return true;
+ }
+}
diff --git a/newback/src/modules/config/config.module.ts b/newback/src/modules/config/config.module.ts
new file mode 100644
index 000000000..d8e1f9aa7
--- /dev/null
+++ b/newback/src/modules/config/config.module.ts
@@ -0,0 +1,17 @@
+import {
+ Global,
+ Module
+} from '@nestjs/common';
+import {ConfigService} from '@/modules/config/config.service';
+import {config} from 'node-ts-config';
+
+@Global()
+@Module({
+ providers: [{
+ provide: ConfigService,
+ useFactory: () => new ConfigService(config)
+ }],
+ exports: [ConfigService]
+})
+export class ConfigModule {
+}
diff --git a/newback/src/modules/config/config.service.ts b/newback/src/modules/config/config.service.ts
new file mode 100644
index 000000000..dd41b2835
--- /dev/null
+++ b/newback/src/modules/config/config.service.ts
@@ -0,0 +1,14 @@
+import {Injectable} from '@nestjs/common';
+import type {IConfig} from 'node-ts-config';
+
+@Injectable()
+export class ConfigService {
+
+ constructor(private readonly config: IConfig) {
+ }
+
+ public getConfig(): IConfig {
+ return this.config;
+ }
+
+}
diff --git a/newback/src/modules/email.render/email.module.ts b/newback/src/modules/email.render/email.module.ts
index 14a9ed093..4c6c9d1ed 100644
--- a/newback/src/modules/email.render/email.module.ts
+++ b/newback/src/modules/email.render/email.module.ts
@@ -1,6 +1,6 @@
import {Module} from '@nestjs/common';
import {MailerModule} from '@nestjs-modules/mailer';
-import {config} from 'node-config-ts';
+import {config} from 'node-ts-config';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {HtmlService} from '@/modules/html/html.service';
@@ -8,7 +8,7 @@ import {HtmlService} from '@/modules/html/html.service';
@Module({
imports: [
MailerModule.forRoot({
- transport: config.email
+ transport: config.email as any
})
],
providers: [
diff --git a/newback/src/modules/email.render/email.sender.service.ts b/newback/src/modules/email.render/email.sender.service.ts
index bb399aa0a..6b8ea57b8 100644
--- a/newback/src/modules/email.render/email.sender.service.ts
+++ b/newback/src/modules/email.render/email.sender.service.ts
@@ -2,22 +2,27 @@ import {
Injectable,
Logger
} from '@nestjs/common';
-import {config} from 'node-config-ts';
import {HtmlService} from '@/modules/html/html.service';
import {MailerService} from '@nestjs-modules/mailer';
+import {ConfigService} from '@/modules/config/config.service';
@Injectable()
export class EmailSenderService {
public constructor(
private readonly htmlService: HtmlService,
private readonly loggerService: Logger,
- private readonly mailerService: MailerService
+ private readonly mailerService: MailerService,
+ private readonly configService: ConfigService
) {
}
public async sendSignUpEmail(username: string, userId: number, email: string, token, ip: string, ipInfo: string) {
- const magicLink = `${config.frontend.address}/#/confirm_email?token=${token}`;
- let issueReportLink = config.frontend.issueReportLink;
+ if (!this.configService.getConfig().email) {
+ this.loggerService.warn(`Email to userId ${userId} ${email} won't be sent since email settings is not set in config`);
+ return
+ }
+ const magicLink = `${this.configService.getConfig().frontend.address}/#/confirm_email?token=${token}`;
+ let issueReportLink = this.configService.getConfig().frontend.issueReportLink;
const text = `Hi ${username}, you have registered pychat` +
`\nTo complete your registration please click on the url bellow: ${magicLink}` +
`\n\nIf you find any bugs or propositions you can post them ${issueReportLink}`;
diff --git a/newback/src/modules/http/http.module.ts b/newback/src/modules/http/http.module.ts
new file mode 100644
index 000000000..16bc3a5d1
--- /dev/null
+++ b/newback/src/modules/http/http.module.ts
@@ -0,0 +1,19 @@
+import {
+ Global,
+ Logger,
+ Module
+} from '@nestjs/common';
+import {HttpService} from '@/modules/http/http.service';
+import fetch from 'node-fetch';
+
+@Global()
+@Module({
+ providers: [{
+ provide: HttpService,
+ useFactory: (logger) => new HttpService(logger, fetch),
+ inject: [Logger]
+ }],
+ exports: [HttpService]
+})
+export class HttpModule {
+}
diff --git a/newback/src/modules/http/http.service.ts b/newback/src/modules/http/http.service.ts
new file mode 100644
index 000000000..ff2c529ed
--- /dev/null
+++ b/newback/src/modules/http/http.service.ts
@@ -0,0 +1,45 @@
+import {
+ Injectable,
+ Logger
+} from '@nestjs/common';
+
+import type fetch from 'node-fetch';
+
+@Injectable()
+export class HttpService {
+ private requestId: number = 0;
+
+ constructor(
+ private readonly logger: Logger,
+ private readonly nodeFetch: typeof fetch,
+ ) {
+ }
+
+ private async post>(url, body: any, headers: Record): Promise {
+ let requestId = ++this.requestId;
+ this.logger.debug(`POST[${requestId}]: url='${url}'; data=${body}; headers=${JSON.stringify(headers)} `)
+ const response = await this.nodeFetch(url, {
+ method: 'post',
+ body,
+ headers
+ });
+ const responseBody = await response.json();
+ this.logger.debug(`POST[${requestId}]: url='${url}'; status='${response.status}' data=${JSON.stringify(responseBody)};`)
+ return responseBody;
+ }
+
+ public async postUrlEncoded>(url: string, data: Record): Promise {
+ const body = new URLSearchParams();
+ Object.entries(data).forEach(([k,v]) => {
+ body.append(k, v);
+ })
+ return this.post(url, body, {})
+ }
+
+ public async postData>(url: string, data: Record): Promise {
+ let body = JSON.stringify(data);
+ let headers = {'Content-Type': 'application/json'};
+ return this.post(url, body, headers);
+ }
+
+}
diff --git a/newback/tsconfig.json b/newback/tsconfig.json
index b153e066c..e3bfec7c3 100644
--- a/newback/tsconfig.json
+++ b/newback/tsconfig.json
@@ -7,6 +7,7 @@
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
+ "resolveJsonModule": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
diff --git a/newback/yarn.lock b/newback/yarn.lock
index aeb07f963..a266495d1 100644
--- a/newback/yarn.lock
+++ b/newback/yarn.lock
@@ -609,6 +609,13 @@
handlebars "^4.7.6"
pug "^3.0.1"
+"@nestjs/axios@^0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@nestjs/axios/-/axios-0.0.7.tgz#7f134636db13c2c1e8299365c7eceb73cd782b67"
+ integrity sha512-at8nj+1Nb8UleHcIN5QqZYeWX54m4m9s9gxzVE1qWy00neX2rg0+h2TfbWsnDi2tc23zIxqexanxMOJZbzO0CA==
+ dependencies:
+ axios "0.26.0"
+
"@nestjs/cli@^8.2.5":
version "8.2.5"
resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-8.2.5.tgz#02094177f4eac576d1a559b259d541393e49e0bb"
@@ -971,6 +978,14 @@
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+"@types/node-fetch@^2.6.1":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
+ integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
"@types/node@*", "@types/node@^17.0.23":
version "17.0.23"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
@@ -1284,6 +1299,13 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
@@ -1479,6 +1501,11 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+arrify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
+ integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
+
asap@^2.0.0, asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@@ -1506,6 +1533,13 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+axios@0.26.0:
+ version "0.26.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928"
+ integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==
+ dependencies:
+ follow-redirects "^1.14.8"
+
axios@0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
@@ -1586,7 +1620,7 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-base64-js@^1.3.1:
+base64-js@^1.3.0, base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -1604,6 +1638,11 @@ bcrypt@^5.0.1:
"@mapbox/node-pre-gyp" "^1.0.0"
node-addon-api "^3.1.0"
+bignumber.js@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673"
+ integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -1702,6 +1741,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.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
@@ -2413,6 +2457,13 @@ dottie@^2.0.2:
resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154"
integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==
+ecdsa-sig-formatter@1.0.11, 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.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -2715,6 +2766,11 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
events@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
@@ -2801,6 +2857,11 @@ express@4.17.3:
utils-merge "1.0.1"
vary "~1.1.2"
+extend@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
@@ -2851,6 +2912,11 @@ fast-safe-stringify@2.1.1, fast-safe-stringify@^2.1.1:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+fast-text-encoding@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53"
+ integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==
+
fastq@^1.6.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
@@ -3070,6 +3136,25 @@ gauge@^3.0.0:
strip-ansi "^6.0.1"
wide-align "^1.1.2"
+gaxios@^4.0.0:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-4.3.3.tgz#d44bdefe52d34b6435cc41214fdb160b64abfc22"
+ integrity sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==
+ dependencies:
+ abort-controller "^3.0.0"
+ extend "^3.0.2"
+ https-proxy-agent "^5.0.0"
+ is-stream "^2.0.0"
+ node-fetch "^2.6.7"
+
+gcp-metadata@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.3.1.tgz#fb205fe6a90fef2fd9c85e6ba06e5559ee1eefa9"
+ integrity sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==
+ dependencies:
+ gaxios "^4.0.0"
+ json-bigint "^1.0.0"
+
generate-function@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
@@ -3200,11 +3285,42 @@ globby@^11.0.4:
merge2 "^1.4.1"
slash "^3.0.0"
+google-auth-library@^7.14.1:
+ version "7.14.1"
+ resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-7.14.1.tgz#e3483034162f24cc71b95c8a55a210008826213c"
+ integrity sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==
+ dependencies:
+ arrify "^2.0.0"
+ base64-js "^1.3.0"
+ ecdsa-sig-formatter "^1.0.11"
+ fast-text-encoding "^1.0.0"
+ gaxios "^4.0.0"
+ gcp-metadata "^4.2.0"
+ gtoken "^5.0.4"
+ jws "^4.0.0"
+ lru-cache "^6.0.0"
+
+google-p12-pem@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b"
+ integrity sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==
+ dependencies:
+ node-forge "^1.3.1"
+
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+gtoken@^5.0.4:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f"
+ integrity sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==
+ dependencies:
+ gaxios "^4.0.0"
+ google-p12-pem "^3.1.3"
+ jws "^4.0.0"
+
handlebars@^4.7.6:
version "4.7.7"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
@@ -4276,6 +4392,13 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+json-bigint@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1"
+ integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==
+ dependencies:
+ bignumber.js "^9.0.0"
+
json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@@ -4351,6 +4474,23 @@ jstransformer@1.0.0:
is-promise "^2.0.0"
promise "^7.0.1"
+jwa@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc"
+ integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==
+ dependencies:
+ buffer-equal-constant-time "1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
+ integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
+ dependencies:
+ jwa "^2.0.0"
+ 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"
@@ -4834,16 +4974,6 @@ node-addon-api@^3.1.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
-"node-config-ts@npm:node-config-ts-2":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-config-ts-2/-/node-config-ts-2-1.0.0.tgz#349f5dd10e8de8d75f279e2a1e1148f782e77fbe"
- integrity sha512-hnszqz2O74wrICiMsm+lIP8xVEeKrp48xebD6A8K7e5dEEOTa9HpUI5fvuXHLwiBwud3HeFGTuSutsKX4fTGKA==
- dependencies:
- json-to-ts "^1.6.0"
- minimist "^1.2.0"
- prettier "^1.19.1"
- ramda "^0.27.0"
-
node-db-migration@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/node-db-migration/-/node-db-migration-1.4.0.tgz#5616cca04f315fcb15121d60616233adc86db3c6"
@@ -4865,6 +4995,11 @@ node-fetch@^2.6.1, node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
+node-forge@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
+
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -4875,6 +5010,16 @@ node-releases@^2.0.2:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+node-ts-config@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/node-ts-config/-/node-ts-config-1.0.4.tgz#32f9ce6dca832ec73a2c1fc5da80cffcc93e73d2"
+ integrity sha512-2fFgqfDr8GICONUGBUvn8dniVWRon/Q6tbWZcZHfNsCsThY+rSAoLiHw9AbXQVHvSm2cPchfFJMqYsOrsgQmMA==
+ dependencies:
+ json-to-ts "^1.6.0"
+ minimist "^1.2.0"
+ prettier "^1.19.1"
+ ramda "^0.27.0"
+
nodemailer@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.0.tgz#86614722c4e0c33d1b5b02aecb90d6d629932b0d"
@@ -5694,7 +5839,7 @@ rxjs@^7, rxjs@^7.2.0:
dependencies:
tslib "^2.1.0"
-safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
From 7dff725ad4d679699932cf5e93159ba3efaa6784 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 22:40:46 +0300
Subject: [PATCH 018/221] fixed files lns
---
frontend/src/ts/types/backend | 1 -
frontend/src/ts/types/backend.ts | 1 +
newback/src/data/types/dto | 1 -
newback/src/data/types/frontend.ts | 1 +
newback/src/data/utils/helpers.spec.ts | 17 +++++++++++++++++
newback/src/data/utils/helpers.ts | 5 +++++
.../src/modules/api/auth/auth.module.spec.ts | 17 +++++++++++++++++
newback/src/modules/api/auth/auth.service.ts | 13 +++++++++++--
8 files changed, 52 insertions(+), 4 deletions(-)
delete mode 120000 frontend/src/ts/types/backend
create mode 120000 frontend/src/ts/types/backend.ts
delete mode 120000 newback/src/data/types/dto
create mode 120000 newback/src/data/types/frontend.ts
create mode 100644 newback/src/data/utils/helpers.spec.ts
create mode 100644 newback/src/data/utils/helpers.ts
diff --git a/frontend/src/ts/types/backend b/frontend/src/ts/types/backend
deleted file mode 120000
index 3f6330a4b..000000000
--- a/frontend/src/ts/types/backend
+++ /dev/null
@@ -1 +0,0 @@
-../../../../common/
\ No newline at end of file
diff --git a/frontend/src/ts/types/backend.ts b/frontend/src/ts/types/backend.ts
new file mode 120000
index 000000000..43385c905
--- /dev/null
+++ b/frontend/src/ts/types/backend.ts
@@ -0,0 +1 @@
+../../../../common/dto.ts
\ No newline at end of file
diff --git a/newback/src/data/types/dto b/newback/src/data/types/dto
deleted file mode 120000
index 3f6330a4b..000000000
--- a/newback/src/data/types/dto
+++ /dev/null
@@ -1 +0,0 @@
-../../../../common/
\ No newline at end of file
diff --git a/newback/src/data/types/frontend.ts b/newback/src/data/types/frontend.ts
new file mode 120000
index 000000000..43385c905
--- /dev/null
+++ b/newback/src/data/types/frontend.ts
@@ -0,0 +1 @@
+../../../../common/dto.ts
\ No newline at end of file
diff --git a/newback/src/data/utils/helpers.spec.ts b/newback/src/data/utils/helpers.spec.ts
new file mode 100644
index 000000000..ec5289dc0
--- /dev/null
+++ b/newback/src/data/utils/helpers.spec.ts
@@ -0,0 +1,17 @@
+import {generateUserName} from '@/data/utils/helpers';
+
+describe('helper', () => {
+
+ describe('generateUserName', () => {
+ it('should remove email domain', () => {
+ expect(generateUserName('deathangel@gmail.com')).toEqual('deathangel')
+ });
+
+ it('should cut to 16 symbolx', () => {
+ expect(generateUserName('deathangasdfasfasdfsadfasdfel@gmail.com')).toHaveLength(16)
+ });
+ it('should replace multiple invalid chars', () => {
+ expect(generateUserName('f#8f))c@gmail.com')).toEqual('f-8f-c')
+ });
+ });
+})
diff --git a/newback/src/data/utils/helpers.ts b/newback/src/data/utils/helpers.ts
new file mode 100644
index 000000000..09db2036e
--- /dev/null
+++ b/newback/src/data/utils/helpers.ts
@@ -0,0 +1,5 @@
+import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
+
+export function generateUserName(email: string) {
+ return email.split('@')[0].replace(/[^0-9a-zA-Z-_]+/g, '-').substring(0, MAX_USERNAME_LENGTH);
+}
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index 2608822f0..f6a2e92dd 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -242,6 +242,23 @@ describe('AuthModule', () => {
username: 'as'
})
});
+ it('should create a new user when email is new', async() => {
+ sequelize.transaction = (resolve) => resolve();
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+ userRepository.getUserMyAuthGoogle = jest.fn().mockResolvedValue(null);
+ oauth2Client.verifyIdToken = jest.fn().mockResolvedValue({
+ getPayload: jest.fn().mockReturnValue(googleResponseFixture)
+ });
+ const {body} = await request
+ .post('/api/auth/google-sign-in').send({
+ token: 'aasdasd',
+ }).expect(201);
+ expect(body).toMatchObject({
+ session: expect.any(String),
+ isNewAccount: false,
+ username: 'as'
+ })
+ });
});
describe('sign-up', () => {
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index 480260e93..228185e6e 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -15,13 +15,17 @@ import {
SignUpResponse
} from '@/data/types/dto/dto';
import {RoomRepository} from '@/data/database/repository/room.repository';
-import {ALL_ROOM_ID} from '@/data/utils/consts';
+import {
+ ALL_ROOM_ID,
+ MAX_USERNAME_LENGTH
+} from '@/data/utils/consts';
import {RedisService} from '@/data/redis/RedisService';
import {EmailSenderService} from '@/modules/email.render/email.sender.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {TokenPayload} from 'google-auth-library';
+import {generateUserName} from '@/data/utils/helpers';
@Injectable()
export class AuthService {
@@ -38,6 +42,7 @@ export class AuthService {
) {
}
+
public async authorizeGoogle(body: GoogleAuthRequest): Promise {
let a: TokenPayload = await this.googleAuthService.validate(body.token);
return this.sequelize.transaction(async(t) => {
@@ -46,10 +51,14 @@ export class AuthService {
let session = await this.createAndSaveSession(userAuth.id);
return {session, isNewAccount: false, username: userAuth.user.username};
} else {
-
+ let newUserName = generateUserName(a.email);
+ if (await this.userRepository.checkUserExistByUserName(newUserName)) {
+ newUserName = thi
+ }
}
});
+
// let googleId = a.email;
// response.get('given_name'),
// response.get('family_name'),
From 23714200bb00357cca18932f894cf3c243a6815a Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 22:44:19 +0300
Subject: [PATCH 019/221] fixd links
---
frontend/src/ts/classes/DefaultStore.ts | 2 +-
frontend/src/ts/message_handlers/Api.ts | 2 +-
frontend/src/ts/types/db.ts | 2 +-
frontend/src/ts/types/dto.ts | 4 ++--
frontend/src/ts/types/model.ts | 2 +-
frontend/src/vue/pages/UserProfileInfo.vue | 2 +-
frontend/src/vue/singup/SignUp.vue | 2 +-
7 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/frontend/src/ts/classes/DefaultStore.ts b/frontend/src/ts/classes/DefaultStore.ts
index c78311f8a..a0c977cd4 100644
--- a/frontend/src/ts/classes/DefaultStore.ts
+++ b/frontend/src/ts/classes/DefaultStore.ts
@@ -79,7 +79,7 @@ import {
Mutation,
VuexModule,
} from "vuex-module-decorators";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
const logger = loggerFactory.getLogger("store");
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index 584b65296..e9fa52d81 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -24,7 +24,7 @@ import type {InternetAppearMessage} from "@/ts/types/messages/innerMessages";
import type {MultiResponse} from "giphy-api";
import type Subscription from "@/ts/classes/Subscription";
import {SignInRequest} from '@/ts/types/dto';
-import {ValidateUserResponse} from '@/ts/types/backend/dto';
+import {ValidateUserResponse} from '@/ts/types/backend';
export default class Api extends MessageHandler {
protected readonly handlers: HandlerTypes = {
diff --git a/frontend/src/ts/types/db.ts b/frontend/src/ts/types/db.ts
index b9d2ff41e..ce343616b 100644
--- a/frontend/src/ts/types/db.ts
+++ b/frontend/src/ts/types/db.ts
@@ -1,6 +1,6 @@
import type {LogLevel} from "lines-logger";
import type {MessageStatus} from "@/ts/types/model";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
export interface UserDB {
id: number;
diff --git a/frontend/src/ts/types/dto.ts b/frontend/src/ts/types/dto.ts
index 6f7f14b6a..e2b6a04ac 100644
--- a/frontend/src/ts/types/dto.ts
+++ b/frontend/src/ts/types/dto.ts
@@ -8,10 +8,10 @@ import type {
UserModel,
} from "@/ts/types/model";
-export * from './backend/dto';
+export * from '@/ts/types/backend';
import type {LogLevel} from "lines-logger";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
export interface RoomNoUsersDto {
channelId: number | null;
diff --git a/frontend/src/ts/types/model.ts b/frontend/src/ts/types/model.ts
index 3dff91623..82181f3d9 100644
--- a/frontend/src/ts/types/model.ts
+++ b/frontend/src/ts/types/model.ts
@@ -1,5 +1,5 @@
import type {LogLevel} from "lines-logger";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
export enum GrowlType {
SUCCESS = "col-success", INFO = "col-info", ERROR = "col-error",
diff --git a/frontend/src/vue/pages/UserProfileInfo.vue b/frontend/src/vue/pages/UserProfileInfo.vue
index f370371d4..932a02bd9 100644
--- a/frontend/src/vue/pages/UserProfileInfo.vue
+++ b/frontend/src/vue/pages/UserProfileInfo.vue
@@ -128,7 +128,7 @@ import {currentUserInfoModelToDto} from "@/ts/types/converters";
import AppInputDate from "@/vue/ui/AppInputDate.vue";
import type {SetUserProfileMessage} from "@/ts/types/messages/wsInMessages";
import type {LogoutMessage} from "@/ts/types/messages/innerMessages";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
@Component({
name: "UserProfileInfo",
diff --git a/frontend/src/vue/singup/SignUp.vue b/frontend/src/vue/singup/SignUp.vue
index a0d3eea62..6a2ead6bf 100644
--- a/frontend/src/vue/singup/SignUp.vue
+++ b/frontend/src/vue/singup/SignUp.vue
@@ -133,7 +133,7 @@ import {IconColor} from "@/ts/types/types";
import type {LoginMessage} from "@/ts/types/messages/innerMessages";
import SocialAuthSignUp from "@/vue/singup/SocialAuthSignUp.vue";
import {USERNAME_REGEX} from "@/ts/utils/consts";
-import {Gender} from '@/ts/types/backend/dto';
+import {Gender} from '@/ts/types/backend';
@Component({
name: "SignUp",
From 41edae8101b0a8574701e59f82ae5fdd337da366 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 23:16:10 +0300
Subject: [PATCH 020/221] Google auth works
---
common/dto.ts | 15 +++--
frontend/src/ts/message_handlers/Api.ts | 7 +-
.../migration-template/202204110326-init.sql | 2 +-
.../src/data/database/model/image.model.ts | 2 +-
.../src/data/database/model/message.model.ts | 2 +-
.../data/database/model/subscription.model.ts | 2 +-
.../database/model/uploaded.file.model.ts | 2 +-
.../data/database/model/user.auth.model.ts | 2 +-
newback/src/data/database/model/user.model.ts | 2 +-
.../database/model/user.settings.model.ts | 2 +-
.../data/database/model/verification.model.ts | 2 +-
.../database/repository/user.repository.ts | 24 +++++--
.../src/modules/api/auth/auth.controller.ts | 2 +-
newback/src/modules/api/auth/auth.service.ts | 66 +++++++++++--------
.../google.auth.reques.validator.ts | 2 +-
.../validators/login.request.validator.ts | 2 +-
.../validators/sign.up.request.validator.ts | 2 +-
.../validate.email.request.validator.ts | 2 +-
.../validate.user.request.validator.ts | 2 +-
19 files changed, 84 insertions(+), 58 deletions(-)
diff --git a/common/dto.ts b/common/dto.ts
index d790baae0..468849492 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -31,18 +31,21 @@ export interface SignInResponse extends SessionResponse {
}
-export interface OauthSessionResponse extends SessionResponse {
- isNewAccount: boolean;
+
+interface TypeGeneratorForOauth1 extends SessionResponse{
+ isNewAccount: true;
username: string;
}
-export interface GoogleSignInResponse extends OauthSessionResponse {
-
+interface TypeGeneratorForOauth2 extends SessionResponse{
+ isNewAccount: false
}
-export interface FacebookSignInResponse extends OauthSessionResponse {
+export type OauthSessionResponse = TypeGeneratorForOauth1 | TypeGeneratorForOauth2;
-}
+
+export type GoogleSignInResponse = OauthSessionResponse;
+export type FacebookSignInResponse = OauthSessionResponse;
export interface SignUpResponse extends SessionResponse{
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index e9fa52d81..ecf5a8e6a 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -24,7 +24,10 @@ import type {InternetAppearMessage} from "@/ts/types/messages/innerMessages";
import type {MultiResponse} from "giphy-api";
import type Subscription from "@/ts/classes/Subscription";
import {SignInRequest} from '@/ts/types/dto';
-import {ValidateUserResponse} from '@/ts/types/backend';
+import {
+ GoogleSignInResponse,
+ ValidateUserResponse
+} from '@/ts/types/backend';
export default class Api extends MessageHandler {
protected readonly handlers: HandlerTypes = {
@@ -127,7 +130,7 @@ export default class Api extends MessageHandler {
});
}
- public async googleAuth(token: string): Promise {
+ public async googleAuth(token: string): Promise {
return this.xhr.doPost({
url: "/auth/google-sign-in",
params: {
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
index 90bc4cc0d..0e2feb71a 100644
--- a/newback/config/migration-template/202204110326-init.sql
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -224,7 +224,7 @@ CREATE TABLE `user_auth`
`password` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) UNIQUE,
`facebook_id` VARCHAR(255) UNIQUE,
- `google_id` DATETIME UNIQUE,
+ `google_id` VARCHAR(255) UNIQUE,
`email_verification_id` INTEGER,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/database/model/image.model.ts
index 493879770..c8232aa13 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/database/model/image.model.ts
@@ -8,7 +8,7 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {ImageType} from '@/data/types/dto/dto';
+import {ImageType} from '@/data/types/frontend';
import {MessageModel} from '@/data/database/model/message.model';
const uniqueUserIdSymbMess = 'unique_image_symbol_message';
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/database/model/message.model.ts
index 98c930e53..c500fcd0f 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/database/model/message.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {MessageStatus,} from '@/data/types/dto/dto';
+import {MessageStatus,} from '@/data/types/frontend';
import {UserModel} from '@/data/database/model/user.model';
import {RoomModel} from '@/data/database/model/room.model';
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/database/model/subscription.model.ts
index bb117732b..91f05e9f4 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/database/model/subscription.model.ts
@@ -8,7 +8,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {UploadedFileChoices} from '@/data/types/dto/dto';
+import {UploadedFileChoices} from '@/data/types/frontend';
import {IpAddressModel} from '@/data/database/model/ip.address.model';
@Injectable()
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/database/model/uploaded.file.model.ts
index 0c7df2067..6e7ae357a 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/database/model/uploaded.file.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UploadedFileChoices} from '@/data/types/dto/dto';
+import {UploadedFileChoices} from '@/data/types/frontend';
import {UserModel} from '@/data/database/model/user.model';
@Injectable()
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/database/model/user.auth.model.ts
index 1e7bb23f3..5699919c3 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/database/model/user.auth.model.ts
@@ -46,7 +46,7 @@ export class UserAuthModel extends Model {
public facebookId: string;
@Column({
- type: DataType.DATE,
+ type: DataType.STRING,
allowNull: true,
unique: true,
})
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/database/model/user.model.ts
index c22d5ddc6..f01f8114a 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/database/model/user.model.ts
@@ -6,7 +6,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {Gender} from '@/data/types/dto/dto';
+import {Gender} from '@/data/types/frontend';
import {UserAuthModel} from '@/data/database/model/user.auth.model';
import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/database/model/user.settings.model.ts
index ef70f7405..2f8dccad8 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/database/model/user.settings.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {Theme,} from '@/data/types/dto/dto';
+import {Theme,} from '@/data/types/frontend';
import {UserModel} from '@/data/database/model/user.model';
import {
LogLevel,
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/database/model/verification.model.ts
index 95d996bba..754523c39 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/database/model/verification.model.ts
@@ -8,7 +8,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UserModel} from '@/data/database/model/user.model';
-import {VerificationType} from '@/data/types/dto/dto';
+import {VerificationType} from '@/data/types/frontend';
@Injectable()
@Table({tableName: 'verification'})
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index 4259594a6..88de0210f 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -3,9 +3,9 @@ import {InjectModel} from '@nestjs/sequelize';
import {UserModel} from '@/data/database/model/user.model';
import {UserAuthModel} from '@/data/database/model/user.auth.model';
import {
- SignUpRequest,
+ Gender,
VerificationType
-} from '@/data/types/dto/dto';
+} from '@/data/types/frontend';
import {UserProfileModel} from '@/data/database/model/user.profile.model';
import {UserSettingsModel} from '@/data/database/model/user.settings.model';
import {VerificationModel} from '@/data/database/model/verification.model';
@@ -23,20 +23,31 @@ export class UserRepository {
) {
}
- public async createUser(data: SignUpRequest, transaction: Transaction): Promise {
+ public async createUser(data: {
+ username: string;
+ password: string;
+ email?: string;
+ sex?: Gender;
+ name?: string;
+ surname?: string;
+ thumbnail?: string;
+ googleId?: string;
+ }, transaction: Transaction): Promise {
let userModel = await this.userModel.create({
username: data.username,
lastTimeOnline: new Date(),
- sex: data.sex
+ sex: data.sex,
+ thumbnail: data.thumbnail
}, {transaction, raw: true,})
await Promise.all([
this.userProfileModel.create({
- id: userModel.id
+ id: userModel.id,
}, {transaction, raw: true,}),
this.userAuthModel.create({
password: data.password,
email: data.email,
- id: userModel.id
+ id: userModel.id,
+ googleId: data.googleId,
}, {transaction, raw: true,}),
this.userSettingsModel.create({
id: userModel.id
@@ -50,7 +61,6 @@ export class UserRepository {
where: {
googleId
},
- include: 'user',
transaction
})
}
diff --git a/newback/src/modules/api/auth/auth.controller.ts b/newback/src/modules/api/auth/auth.controller.ts
index 9342deb8d..86fc7aa12 100644
--- a/newback/src/modules/api/auth/auth.controller.ts
+++ b/newback/src/modules/api/auth/auth.controller.ts
@@ -17,7 +17,7 @@ import {
SignUpResponse,
ValidateUserEmailRequest,
ValidateUserResponse
-} from '@/data/types/dto/dto';
+} from '@/data/types/frontend';
import {GoogleAuthRequestValidator} from '@/modules/api/auth/validators/google.auth.reques.validator';
import {CaptchaGuard} from '@/modules/captcha';
import {ValidateEmailRequestValidator} from '@/modules/api/auth/validators/validate.email.request.validator';
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index 228185e6e..526605508 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -7,13 +7,14 @@ import {
import {UserRepository} from '@/data/database/repository/user.repository';
import {PasswordService} from '@/modules/api/auth/password.service';
import {
+ Gender,
GoogleAuthRequest,
GoogleSignInResponse,
SignInRequest,
SignInResponse,
SignUpRequest,
SignUpResponse
-} from '@/data/types/dto/dto';
+} from '@/data/types/frontend';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {
ALL_ROOM_ID,
@@ -44,34 +45,43 @@ export class AuthService {
public async authorizeGoogle(body: GoogleAuthRequest): Promise {
- let a: TokenPayload = await this.googleAuthService.validate(body.token);
- return this.sequelize.transaction(async(t) => {
- let userAuth = await this.userRepository.getUserMyAuthGoogle(a.email, t)
- if (userAuth) {
- let session = await this.createAndSaveSession(userAuth.id);
- return {session, isNewAccount: false, username: userAuth.user.username};
- } else {
- let newUserName = generateUserName(a.email);
- if (await this.userRepository.checkUserExistByUserName(newUserName)) {
- newUserName = thi
- }
- }
- });
+ let googleResponse: TokenPayload = await this.googleAuthService.validate(body.token);
+ return this.sequelize.transaction(async(t) => {
+ let userAuth = await this.userRepository.getUserMyAuthGoogle(googleResponse.email, t)
+ if (userAuth) {
+ let session = await this.createAndSaveSession(userAuth.id);
+ let response: GoogleSignInResponse = {session, isNewAccount: false};
+ return response;
+ } else {
+ let username = generateUserName(googleResponse.email);
+ if (await this.userRepository.checkUserExistByEmail(googleResponse.email)) {
+ throw new ConflictException("User with this email already exist, but has no connected google account." +
+ " If this is you, please login as this user and connect this google profile in profile settings")
+ }
+ if (await this.userRepository.checkUserExistByUserName(username)) {
+ // the chance that there will be a user with same id is insignificant
+ username = await this.passwordService.generateRandomString(MAX_USERNAME_LENGTH);
+ }
+ this.logger.log(`Generates username='${username}' for email ${googleResponse.email}`);
+ const password = await this.passwordService.createPassword(await this.passwordService.generateRandomString(16));
+ let userId = await this.userRepository.createUser({
+ googleId: googleResponse.email,
+ password,
+ email: googleResponse.email,
+ username,
+ thumbnail: googleResponse.picture,
+ name: googleResponse.given_name,
+ surname: googleResponse.family_name,
+ sex: Gender.OTHER,
+ }, t)
+ await this.roomRepository.createRoomUser(ALL_ROOM_ID, userId, t);
- // let googleId = a.email;
- // response.get('given_name'),
- // response.get('family_name'),
- // email=response.get('email'),
- // picture=response.get('picture'),
- // google_id=response.get('id')
-
- // username = re.sub('[^0-9a-zA-Z-_]+', '-', email.rsplit('@')[0])[:15]
- // if email:
- // username = re.sub('[^0-9a-zA-Z-_]+', '-', email.rsplit('@')[0])[:15]
- // else:
- // username = f'{name}_{surname}'
- return undefined as any;
+ let session = await this.createAndSaveSession(userId);
+ let response: GoogleSignInResponse = {session, isNewAccount: true, username};
+ return response;
+ }
+ });
}
public async authorize(body: SignInRequest): Promise {
@@ -86,7 +96,7 @@ export class AuthService {
password = result?.userAuth?.password;
}
if (!password) {
- throw new ConflictException("User with login doesn't exists");
+ throw new ConflictException("User with login doesn't exists");
}
let matches = await this.passwordService.checkPassword(body.password, password);
if (!matches) {
diff --git a/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts b/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
index 3bd5b8af5..253f52bbf 100644
--- a/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
+++ b/newback/src/modules/api/auth/validators/google.auth.reques.validator.ts
@@ -1,7 +1,7 @@
import {IsString,} from 'class-validator';
-import {GoogleAuthRequest} from '@/data/types/dto/dto';
+import {GoogleAuthRequest} from '@/data/types/frontend';
export class GoogleAuthRequestValidator implements GoogleAuthRequest {
diff --git a/newback/src/modules/api/auth/validators/login.request.validator.ts b/newback/src/modules/api/auth/validators/login.request.validator.ts
index c1220b671..4f02ece2a 100644
--- a/newback/src/modules/api/auth/validators/login.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/login.request.validator.ts
@@ -4,7 +4,7 @@ import {
Matches,
ValidateIf,
} from 'class-validator';
-import {SignInRequest} from '@/data/types/dto/dto';
+import {SignInRequest} from '@/data/types/frontend';
export class LoginRequestValidator implements SignInRequest {
diff --git a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
index 9ca5dc8aa..7f12a0f2f 100644
--- a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
@@ -10,7 +10,7 @@ import {
import {
Gender,
SignUpRequest,
-} from '@/data/types/dto/dto';
+} from '@/data/types/frontend';
import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
export class SignUpRequestValidator implements SignUpRequest {
diff --git a/newback/src/modules/api/auth/validators/validate.email.request.validator.ts b/newback/src/modules/api/auth/validators/validate.email.request.validator.ts
index 2370dc421..1c1cbfebd 100644
--- a/newback/src/modules/api/auth/validators/validate.email.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/validate.email.request.validator.ts
@@ -2,7 +2,7 @@ import {
IsEmail,
IsString,
} from 'class-validator';
-import {ValidateUserEmailRequest} from '@/data/types/dto/dto';
+import {ValidateUserEmailRequest} from '@/data/types/frontend';
export class ValidateEmailRequestValidator implements ValidateUserEmailRequest {
@IsString()
diff --git a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
index f79c7f63a..4c5087959 100644
--- a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
@@ -3,7 +3,7 @@ import {
Length,
Matches,
} from 'class-validator';
-import {ValidateUserRequest} from '@/data/types/dto/dto';
+import {ValidateUserRequest} from '@/data/types/frontend';
import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
export class ValidateUserRequestValidator implements ValidateUserRequest {
From 6e4d96c146b57afd72f7ec9119d7e97a09025d35 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 23:33:03 +0300
Subject: [PATCH 021/221] Added tests to validate email
---
.../src/modules/api/auth/auth.module.spec.ts | 91 +++++++++++++++----
1 file changed, 75 insertions(+), 16 deletions(-)
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index f6a2e92dd..49830be59 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -239,13 +239,17 @@ describe('AuthModule', () => {
expect(body).toMatchObject({
session: expect.any(String),
isNewAccount: false,
- username: 'as'
})
});
- it('should create a new user when email is new', async() => {
- sequelize.transaction = (resolve) => resolve();
+ it('should create a new user when email is new and user with email not exist', async() => {
+ sequelize.transaction = (resolve) => resolve('transaction');
redisService.saveSession = jest.fn().mockResolvedValue(undefined)
userRepository.getUserMyAuthGoogle = jest.fn().mockResolvedValue(null);
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(false);
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.createUser = jest.fn().mockResolvedValue(3);
+ roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ let createUserSpy = jest.spyOn(userRepository, 'createUser');
oauth2Client.verifyIdToken = jest.fn().mockResolvedValue({
getPayload: jest.fn().mockReturnValue(googleResponseFixture)
});
@@ -255,8 +259,40 @@ describe('AuthModule', () => {
}).expect(201);
expect(body).toMatchObject({
session: expect.any(String),
- isNewAccount: false,
- username: 'as'
+ isNewAccount: true,
+ username: 'death' // from fixture
+ })
+ expect(createUserSpy).toHaveBeenCalledWith(expect.objectContaining({
+ "email": "death@gmail.com",
+ "googleId": "death@gmail.com",
+ "name": "Andrew",
+ "password": expect.any(String),
+ "sex": "OTHER",
+ "surname": "Superman",
+ "thumbnail": "https://lh3.googleusercontent.com/a-/xxxxxxxxxxxx-xxxxxxxxxxxx",
+ "username": "death",
+ }), 'transaction')
+ });
+ it('should throw an error if email exists', async() => {
+ sequelize.transaction = (resolve) => resolve();
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+ userRepository.getUserMyAuthGoogle = jest.fn().mockResolvedValue(null);
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
+ // userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ // userRepository.createUser = jest.fn().mockResolvedValue(3);
+ // roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ oauth2Client.verifyIdToken = jest.fn().mockResolvedValue({
+ getPayload: jest.fn().mockReturnValue(googleResponseFixture)
+ });
+ const {body} = await request
+ .post('/api/auth/google-sign-in').send({
+ token: 'aasdasd',
+ }).expect(409);
+ expect(body).toMatchObject({
+ error: "Conflict",
+ statusCode: 409,
+ message: "User with this email already exist, but has no connected google account." +
+ " If this is you, please login as this user and connect this google profile in profile settings",
})
});
});
@@ -329,6 +365,40 @@ describe('AuthModule', () => {
});
});
});
+
+ describe('validate-email', () => {
+
+ it('should return ok', async() => {
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(false);
+ await request
+ .post('/api/auth/validate-email').send({
+ email: 'blah@gmail.com',
+ }).expect(201, {ok: true});
+ });
+ it('should error if email exists', async() => {
+ userRepository.checkUserExistByEmail = jest.fn().mockResolvedValue(true);
+ await request
+ .post('/api/auth/validate-email').send({
+ email: 'exist@gmail.com',
+ }).expect(409, {
+ "error": "Conflict",
+ "message": "User with this email already exist",
+ "statusCode": 409,
+ });
+ });
+ it('should give error on invalid email', async() => {
+ await request
+ .post('/api/auth/validate-email').send({
+ email: 'invalidemail',
+ }).expect(400, {
+ "error": "Bad Request",
+ "message": [
+ 'email must be an email',
+ ],
+ "statusCode": 400,
+ });
+ });
+ });
describe('validate-user', () => {
it('should return ok', async() => {
@@ -373,16 +443,5 @@ describe('AuthModule', () => {
"statusCode": 400,
});
});
- it('should throw an error if user exists', async() => {
- userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(true);
- await request
- .post('/api/auth/validate-user').send({
- username: 'asd',
- }).expect(409, {
- "error": "Conflict",
- "message": "User with this username already exist",
- "statusCode": 409,
- });
- });
});
});
From 858c4df5eb6fb156c7da75c21233614284abe270 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Tue, 12 Apr 2022 23:44:05 +0300
Subject: [PATCH 022/221] remove default.json
---
.excludeMAIN | 1 +
newback/config/default.json | 19 -------------------
newback/config/env/local.json | 7 -------
3 files changed, 1 insertion(+), 26 deletions(-)
delete mode 100644 newback/config/env/local.json
diff --git a/.excludeMAIN b/.excludeMAIN
index 898fb8298..21e1a8693 100644
--- a/.excludeMAIN
+++ b/.excludeMAIN
@@ -21,3 +21,4 @@ backend/chat/settings.py
backend/photos/*
!backend/photos/.gitkeep
frontend/build/production.json
+newback/config/env/default.json
diff --git a/newback/config/default.json b/newback/config/default.json
index 9a115d690..93a0d6f24 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -19,25 +19,6 @@
"pingInterval": 300000,
"clientNoServerPingCloseTimeout": 320000
},
- "auth": {
- "google": {
- "clientId": "620421656154-8boctt2h7h5meskhe7vh8aiargj0nae9.apps.googleusercontent.com"
- }
- },
- "recaptcha": {
- "publicKey": "6LchGhwTAAAAAJwCRgfNKraWrFtCdKPFo0Ri8DLt",
- "privateKey": "6LchGhwTAAAAAIH_RuxyeJQn5Kv6XnHcLSc_68h_"
- },
- "email": {
- "host": "smtp.gmail.com",
- "port": 587,
- "auth": {
- "type": "login",
- "user": "chat.django@gmail.com",
- "password": "Ilovepython"
- },
- "from": "root@pychat.org"
- },
"redis": {
"host": "localhost",
"port": 6379,
diff --git a/newback/config/env/local.json b/newback/config/env/local.json
deleted file mode 100644
index f6ea0830a..000000000
--- a/newback/config/env/local.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "auth": {
- "google": {
- "clientId": "620421656154-8boctt2h7h5meskhe7vh8aiargj0nae9.apps.googleusercontent.com"
- }
- }
-}
From 2fd9334869af259d8ac6886184971d0172fbcc22 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 00:57:34 +0300
Subject: [PATCH 023/221] Added facebooksignin test
---
common/dto.ts | 4 +
frontend/src/ts/message_handlers/Api.ts | 2 +-
newback/config/Config.d.ts | 52 ++++++-----
newback/config/env/test.json | 3 +-
.../database/repository/user.repository.ts | 11 +++
newback/src/data/types/api.ts | 5 +
.../fixtures/facebook.get.token.response.json | 16 ++++
.../fixtures/facebook.get.user.response.json | 5 +
.../src/modules/api/auth/auth.controller.ts | 7 ++
.../src/modules/api/auth/auth.module.spec.ts | 92 +++++++++++++++++--
newback/src/modules/api/auth/auth.module.ts | 24 +++--
newback/src/modules/api/auth/auth.service.ts | 40 ++++++++
.../modules/api/auth/facebook.auth.service.ts | 63 +++++++++++++
.../modules/api/auth/google.auth.service.ts | 6 +-
.../facebook.auth.request.validator.ts | 11 +++
newback/src/modules/http/http.service.ts | 20 ++++
16 files changed, 318 insertions(+), 43 deletions(-)
create mode 100644 newback/src/data/types/api.ts
create mode 100644 newback/src/fixtures/facebook.get.token.response.json
create mode 100644 newback/src/fixtures/facebook.get.user.response.json
create mode 100644 newback/src/modules/api/auth/facebook.auth.service.ts
create mode 100644 newback/src/modules/api/auth/validators/facebook.auth.request.validator.ts
diff --git a/common/dto.ts b/common/dto.ts
index 468849492..925b135eb 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -12,6 +12,10 @@ export interface GoogleAuthRequest {
token: string;
}
+export interface FaceBookAuthRequest {
+ token: string;
+}
+
export interface ValidateUserRequest {
username: string;
}
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index ecf5a8e6a..144ba7bc5 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -141,7 +141,7 @@ export default class Api extends MessageHandler {
public async facebookAuth(token: string): Promise {
return this.xhr.doPost({
- url: "/api/facebook_sign_in",
+ url: "/auth/facebook-sign-in",
params: {
token,
},
diff --git a/newback/config/Config.d.ts b/newback/config/Config.d.ts
index fa4fdcb49..0a75c345e 100644
--- a/newback/config/Config.d.ts
+++ b/newback/config/Config.d.ts
@@ -5,12 +5,37 @@ declare module "node-ts-config" {
name: string
application: Application
settings: Settings
- auth: Auth
- recaptcha: Recaptcha
- email: Email
redis: Redis
frontend: Frontend
mysql: Mysql
+ auth: Auth
+ recaptcha: Recaptcha
+ email: Email
+ }
+ interface Email {
+ host: string
+ port: number
+ auth: Auth2
+ from: string
+ }
+ interface Auth2 {
+ type: string
+ user: string
+ password: string
+ }
+ interface Recaptcha {
+ publicKey: string
+ privateKey: string
+ }
+ interface Auth {
+ google: Google
+ facebook: Facebook
+ }
+ interface Facebook {
+ accessToken: string
+ }
+ interface Google {
+ clientId: string
}
interface Mysql {
synchronize: boolean
@@ -37,27 +62,6 @@ declare module "node-ts-config" {
port: number
database: number
}
- interface Email {
- host: string
- port: number
- auth: Auth2
- from: string
- }
- interface Auth2 {
- type: string
- user: string
- password: string
- }
- interface Recaptcha {
- publicKey: string
- privateKey: string
- }
- interface Auth {
- google: Google
- }
- interface Google {
- clientId: string
- }
interface Settings {
wsIdCharLength: number
allRedisRoom: string
diff --git a/newback/config/env/test.json b/newback/config/env/test.json
index 38174961f..c89d3ce9c 100644
--- a/newback/config/env/test.json
+++ b/newback/config/env/test.json
@@ -1,3 +1,4 @@
{
- "recaptcha": null
+ "recaptcha": null,
+ "email": {}
}
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index 88de0210f..a6d151658 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -32,6 +32,7 @@ export class UserRepository {
surname?: string;
thumbnail?: string;
googleId?: string;
+ facebookId?: string;
}, transaction: Transaction): Promise {
let userModel = await this.userModel.create({
username: data.username,
@@ -48,6 +49,7 @@ export class UserRepository {
email: data.email,
id: userModel.id,
googleId: data.googleId,
+ facebookId: data.facebookId,
}, {transaction, raw: true,}),
this.userSettingsModel.create({
id: userModel.id
@@ -65,6 +67,15 @@ export class UserRepository {
})
}
+ public async getUserMyAuthFacebook(facebookId: string, transaction: Transaction): Promise {
+ return this.userAuthModel.findOne({
+ where: {
+ facebookId
+ },
+ transaction
+ })
+ }
+
public async checkUserExistByUserName(username: string, transaction?: Transaction): Promise {
return await this.userModel.findOne({
where: {username},
diff --git a/newback/src/data/types/api.ts b/newback/src/data/types/api.ts
new file mode 100644
index 000000000..e161dc05e
--- /dev/null
+++ b/newback/src/data/types/api.ts
@@ -0,0 +1,5 @@
+export interface FacebookGetUserResponse {
+ first_name: string;
+ last_name: string;
+ id: string;
+}
diff --git a/newback/src/fixtures/facebook.get.token.response.json b/newback/src/fixtures/facebook.get.token.response.json
new file mode 100644
index 000000000..e5df4e624
--- /dev/null
+++ b/newback/src/fixtures/facebook.get.token.response.json
@@ -0,0 +1,16 @@
+{
+ "data": {
+ "app_id": "894051850700207",
+ "type": "USER",
+ "application": "pychat",
+ "data_access_expires_at": 1657572316,
+ "expires_at": 1654980316,
+ "is_valid": true,
+ "issued_at": 1649796316,
+ "scopes": [
+ "email",
+ "public_profile"
+ ],
+ "user_id": "1096917160382471"
+ }
+}
diff --git a/newback/src/fixtures/facebook.get.user.response.json b/newback/src/fixtures/facebook.get.user.response.json
new file mode 100644
index 000000000..1a81bd4bc
--- /dev/null
+++ b/newback/src/fixtures/facebook.get.user.response.json
@@ -0,0 +1,5 @@
+{
+ "first_name": "Andrew",
+ "last_name": "Koidan",
+ "id": "1096917160382471"
+}
diff --git a/newback/src/modules/api/auth/auth.controller.ts b/newback/src/modules/api/auth/auth.controller.ts
index 86fc7aa12..6e315053e 100644
--- a/newback/src/modules/api/auth/auth.controller.ts
+++ b/newback/src/modules/api/auth/auth.controller.ts
@@ -12,6 +12,7 @@ import {LoginRequestValidator} from '@/modules/api/auth/validators/login.request
import {SignUpRequestValidator} from '@/modules/api/auth/validators/sign.up.request.validator';
import {ValidateUserRequestValidator} from '@/modules/api/auth/validators/validate.user.request.validator';
import {
+ FacebookSignInResponse,
GoogleSignInResponse,
SignInResponse,
SignUpResponse,
@@ -21,6 +22,7 @@ import {
import {GoogleAuthRequestValidator} from '@/modules/api/auth/validators/google.auth.reques.validator';
import {CaptchaGuard} from '@/modules/captcha';
import {ValidateEmailRequestValidator} from '@/modules/api/auth/validators/validate.email.request.validator';
+import {FacebookAuthRequestValidator} from '@/modules/api/auth/validators/facebook.auth.request.validator';
@Controller({
path: '/api/auth'
@@ -43,6 +45,11 @@ export class AuthController {
return this.authservice.authorizeGoogle(body);
}
+ @Post('/facebook-sign-in')
+ public async facebookAuh(@Body() body: FacebookAuthRequestValidator): Promise {
+ return this.authservice.authorizeFacebook(body);
+ }
+
@Post('/sign-up')
public async register(@Body() body: SignUpRequestValidator, @Ip() ip): Promise {
return this.authservice.registerUser(body, ip);
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index 49830be59..d5887f507 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -22,11 +22,14 @@ import {OAuth2Client} from 'google-auth-library';
import {HttpService} from '@/modules/http/http.service';
import fetch from 'node-fetch';
import * as googleResponseFixture from '@/fixtures/google.response.fixture.json';
+import * as facebookGetTokenResponseFixture from '@/fixtures/facebook.get.token.response.json';
+import * as facebookGetUserResponseFixture from '@/fixtures/facebook.get.user.response.json';
import {ConfigService} from '@/modules/config/config.service';
import {
config,
IConfig
} from 'node-ts-config';
+import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
describe('AuthModule', () => {
let app: INestApplication;
@@ -79,6 +82,7 @@ describe('AuthModule', () => {
AuthService,
HtmlService,
EmailSenderService,
+ FacebookAuthService,
{
provide: MailerService,
useValue: mailerService,
@@ -263,14 +267,14 @@ describe('AuthModule', () => {
username: 'death' // from fixture
})
expect(createUserSpy).toHaveBeenCalledWith(expect.objectContaining({
- "email": "death@gmail.com",
- "googleId": "death@gmail.com",
- "name": "Andrew",
- "password": expect.any(String),
- "sex": "OTHER",
- "surname": "Superman",
- "thumbnail": "https://lh3.googleusercontent.com/a-/xxxxxxxxxxxx-xxxxxxxxxxxx",
- "username": "death",
+ "email": "death@gmail.com",
+ "googleId": "death@gmail.com",
+ "name": "Andrew",
+ "password": expect.any(String),
+ "sex": "OTHER",
+ "surname": "Superman",
+ "thumbnail": "https://lh3.googleusercontent.com/a-/xxxxxxxxxxxx-xxxxxxxxxxxx",
+ "username": "death",
}), 'transaction')
});
it('should throw an error if email exists', async() => {
@@ -297,6 +301,78 @@ describe('AuthModule', () => {
});
});
+ describe('facebook-sign-in', () => {
+ it('should login if user exists', async() => {
+ sequelize.transaction = (resolve) => resolve();
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined);
+ nodeApply = jest.fn()
+ .mockReturnValueOnce({json: jest.fn().mockResolvedValue(facebookGetTokenResponseFixture)})
+ .mockReturnValueOnce({json: jest.fn().mockResolvedValue(facebookGetUserResponseFixture)});
+ configService.getConfig = jest.fn().mockReturnValue({
+ auth: {
+ facebook: {
+ accessToken: "test"
+ }
+ }
+ } as IConfig)
+ userRepository.getUserMyAuthFacebook = jest.fn().mockResolvedValue({
+ id: 1,
+ user: {
+ username: 'as'
+ }
+ });
+ const {body} = await request
+ .post('/api/auth/facebook-sign-in').send({
+ token: 'aasdasd',
+ }).expect(201);
+ expect(body).toMatchObject({
+ session: expect.any(String),
+ isNewAccount: false,
+ })
+ });
+ it('should create a new user when email is new and user with email not exist', async() => {
+ sequelize.transaction = (resolve) => resolve('transaction');
+ redisService.saveSession = jest.fn().mockResolvedValue(undefined)
+
+ nodeApply = jest.fn()
+ .mockReturnValueOnce({json: jest.fn().mockResolvedValue(facebookGetTokenResponseFixture)})
+ .mockReturnValueOnce({json: jest.fn().mockResolvedValue(facebookGetUserResponseFixture)});
+ configService.getConfig = jest.fn().mockReturnValue({
+ auth: {
+ facebook: {
+ accessToken: "test"
+ }
+ }
+ } as IConfig)
+ userRepository.getUserMyAuthFacebook = jest.fn().mockResolvedValue(null);
+
+ userRepository.checkUserExistByUserName = jest.fn().mockResolvedValue(false);
+ userRepository.createUser = jest.fn().mockResolvedValue(3);
+ roomRepository.createRoomUser = jest.fn().mockResolvedValue(undefined);
+ let createUserSpy = jest.spyOn(userRepository, 'createUser');
+ oauth2Client.verifyIdToken = jest.fn().mockResolvedValue({
+ getPayload: jest.fn().mockReturnValue(googleResponseFixture)
+ });
+ const {body} = await request
+ .post('/api/auth/facebook-sign-in').send({
+ token: 'aasdasd',
+ }).expect(201);
+ expect(body).toMatchObject({
+ session: expect.any(String),
+ isNewAccount: true,
+ username: 'Andrew_Koidan' // from fixture
+ })
+ expect(createUserSpy).toHaveBeenCalledWith(expect.objectContaining({
+ "facebookId": "1096917160382471",
+ "name": "Andrew",
+ "password": expect.any(String),
+ "sex": "OTHER",
+ "surname": "Koidan",
+ "username": "Andrew_Koidan"
+ }), 'transaction')
+ });
+ });
+
describe('sign-up', () => {
it('returns session', async() => {
sequelize.transaction = (resolve) => resolve();
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
index a0eeeb681..ff994a751 100644
--- a/newback/src/modules/api/auth/auth.module.ts
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -12,19 +12,27 @@ import {PasswordService} from '@/modules/api/auth/password.service';
import {OAuth2Client} from 'google-auth-library';
import {config} from 'node-ts-config';
import {HttpModule} from '@/modules/http/http.module';
+import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
+import {ConfigService} from '@/modules/config/config.service';
@Module({
imports: [DatabaseModule, EmailModule, HttpModule],
controllers: [AuthController],
- providers: [AuthService, PasswordService, RedisService, {
- provide: GoogleAuthService,
- useFactory: (logger) => {
- return new GoogleAuthService(logger, new OAuth2Client(
- config.auth.google.clientId,
- ))
+ providers: [
+ AuthService,
+ PasswordService,
+ RedisService,
+ FacebookAuthService,
+ {
+ provide: GoogleAuthService,
+ useFactory: (logger) => {
+ return new GoogleAuthService(logger, config.auth?.google?.clientId ? new OAuth2Client(
+ config.auth.google.clientId,
+ ): null)
+ },
+ inject: [Logger, ConfigService]
},
- inject: [Logger]
- }],
+ ],
})
export class AuthModule {
}
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index 526605508..7bc1e0fea 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -7,6 +7,8 @@ import {
import {UserRepository} from '@/data/database/repository/user.repository';
import {PasswordService} from '@/modules/api/auth/password.service';
import {
+ FaceBookAuthRequest,
+ FacebookSignInResponse,
Gender,
GoogleAuthRequest,
GoogleSignInResponse,
@@ -27,6 +29,8 @@ import {Sequelize} from 'sequelize-typescript';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {TokenPayload} from 'google-auth-library';
import {generateUserName} from '@/data/utils/helpers';
+import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
+import {FacebookGetUserResponse} from '@/data/types/api';
@Injectable()
export class AuthService {
@@ -38,12 +42,48 @@ export class AuthService {
private readonly redisService: RedisService,
private readonly emailService: EmailSenderService,
private readonly googleAuthService: GoogleAuthService,
+ private readonly facebookService: FacebookAuthService,
private readonly sequelize: Sequelize,
private readonly logger: Logger,
) {
}
+ public async authorizeFacebook(body: FaceBookAuthRequest): Promise {
+ let fbResponse: FacebookGetUserResponse = await this.facebookService.validate(body.token);
+ return this.sequelize.transaction(async(t) => {
+ let userAuth = await this.userRepository.getUserMyAuthFacebook(fbResponse.id, t)
+ if (userAuth) {
+ let session = await this.createAndSaveSession(userAuth.id);
+ let response: GoogleSignInResponse = {session, isNewAccount: false};
+ return response;
+ } else {
+ let username = generateUserName(`${fbResponse.first_name}_${fbResponse.last_name}`);
+ if (await this.userRepository.checkUserExistByUserName(username)) {
+ // the chance that there will be a user with same id is insignificant
+ username = await this.passwordService.generateRandomString(MAX_USERNAME_LENGTH);
+ }
+ this.logger.log(`Generates username='${username}' for fbId ${fbResponse.id}`);
+ const password = await this.passwordService.createPassword(await this.passwordService.generateRandomString(16));
+
+ let userId = await this.userRepository.createUser({
+ password,
+ username,
+ name: fbResponse.first_name,
+ surname: fbResponse.last_name,
+ sex: Gender.OTHER,
+ facebookId: fbResponse.id
+ }, t)
+ await this.roomRepository.createRoomUser(ALL_ROOM_ID, userId, t);
+
+ let session = await this.createAndSaveSession(userId);
+ let response: GoogleSignInResponse = {session, isNewAccount: true, username};
+ return response;
+ }
+ });
+ }
+
+
public async authorizeGoogle(body: GoogleAuthRequest): Promise {
let googleResponse: TokenPayload = await this.googleAuthService.validate(body.token);
return this.sequelize.transaction(async(t) => {
diff --git a/newback/src/modules/api/auth/facebook.auth.service.ts b/newback/src/modules/api/auth/facebook.auth.service.ts
new file mode 100644
index 000000000..148372fc5
--- /dev/null
+++ b/newback/src/modules/api/auth/facebook.auth.service.ts
@@ -0,0 +1,63 @@
+import {TokenPayload} from 'google-auth-library';
+import {
+ BadRequestException,
+ Injectable,
+ InternalServerErrorException,
+ Logger,
+ ServiceUnavailableException,
+} from '@nestjs/common';
+import {HttpService} from '@/modules/http/http.service';
+import {ConfigService} from '@/modules/config/config.service';
+import {FacebookGetUserResponse} from '@/data/types/api';
+
+@Injectable()
+export class FacebookAuthService {
+
+ public constructor(
+ private readonly logger: Logger,
+ private readonly httpService: HttpService,
+ private readonly configService: ConfigService,
+ ) {
+
+ }
+
+ public async validate(idToken: string): Promise {
+ let accessToken = this.configService.getConfig().auth?.facebook?.accessToken;
+ if (!accessToken) {
+ throw new ServiceUnavailableException("facebook access token is not specified");
+ }
+ const response = await this.httpService.getUrlEncoded(
+ 'https://graph.facebook.com/debug_token',
+ {
+ input_token: idToken,
+ access_token: accessToken
+ }
+ );
+ if (!response?.data) {
+ throw new InternalServerErrorException("facebook api is down")
+ }
+ if (!response.data.is_valid) {
+ if (response.data.error) {
+ throw new BadRequestException(`facebook api error down error=${response.data.error.message} code=${response.data.error.code}`)
+ } else {
+ throw new InternalServerErrorException("invalid facebook response")
+ }
+ }
+ let userId = response.data.user_id;
+ this.logger.log(`got userId='${userId}' for facebookToken='${idToken}'`);
+ if (!userId) {
+ throw new InternalServerErrorException("invalid facebook response, userId is missing")
+ }
+ let facebookUser: FacebookGetUserResponse = await this.httpService.getUrlEncoded(`https://graph.facebook.com/${userId}`,
+ {
+ 'access_token': accessToken,
+ 'fields': ['email', 'first_name', 'last_name'].join(',')
+ }
+ )
+ if (!facebookUser.id) {
+ throw new InternalServerErrorException("invalid facebook response, id is missing")
+ }
+ this.logger.log(`got userid='${facebookUser.id}' for facebookToken='${idToken}'`);
+ return facebookUser;
+ }
+}
diff --git a/newback/src/modules/api/auth/google.auth.service.ts b/newback/src/modules/api/auth/google.auth.service.ts
index 7084f8d30..2e25eef79 100644
--- a/newback/src/modules/api/auth/google.auth.service.ts
+++ b/newback/src/modules/api/auth/google.auth.service.ts
@@ -3,6 +3,7 @@ import {
ForbiddenException,
Injectable,
Logger,
+ ServiceUnavailableException,
} from '@nestjs/common';
@Injectable()
@@ -10,7 +11,7 @@ export class GoogleAuthService {
public constructor(
private readonly logger: Logger,
- private readonly oauth2Client: OAuth2Client,
+ private readonly oauth2Client: OAuth2Client|null,
) {
}
@@ -35,6 +36,9 @@ export class GoogleAuthService {
* }
* */
public async validate(idToken: string): Promise {
+ if (!this.oauth2Client) {
+ throw new ServiceUnavailableException("google client id not specifed");
+ }
const response = await this.oauth2Client.verifyIdToken({
idToken,
});
diff --git a/newback/src/modules/api/auth/validators/facebook.auth.request.validator.ts b/newback/src/modules/api/auth/validators/facebook.auth.request.validator.ts
new file mode 100644
index 000000000..6a83bd801
--- /dev/null
+++ b/newback/src/modules/api/auth/validators/facebook.auth.request.validator.ts
@@ -0,0 +1,11 @@
+import {IsString} from 'class-validator';
+import {
+ FaceBookAuthRequest,
+} from '@/data/types/frontend';
+
+export class FacebookAuthRequestValidator implements FaceBookAuthRequest {
+
+ @IsString()
+ public token: string;
+
+}
diff --git a/newback/src/modules/http/http.service.ts b/newback/src/modules/http/http.service.ts
index ff2c529ed..1dd8c04ce 100644
--- a/newback/src/modules/http/http.service.ts
+++ b/newback/src/modules/http/http.service.ts
@@ -28,6 +28,18 @@ export class HttpService {
return responseBody;
}
+ private async get>(url, headers: Record): Promise {
+ let requestId = ++this.requestId;
+ this.logger.debug(`GET[${requestId}]: url='${url}'; headers=${JSON.stringify(headers)} `)
+ const response = await this.nodeFetch(url, {
+ method: 'get',
+ headers
+ });
+ const responseBody = await response.json();
+ this.logger.debug(`GET[${requestId}]: url='${url}'; status='${response.status}' data=${JSON.stringify(responseBody)};`)
+ return responseBody;
+ }
+
public async postUrlEncoded>(url: string, data: Record): Promise {
const body = new URLSearchParams();
Object.entries(data).forEach(([k,v]) => {
@@ -36,6 +48,14 @@ export class HttpService {
return this.post(url, body, {})
}
+ public async getUrlEncoded>(url: string, data: Record): Promise {
+ const params = new URLSearchParams();
+ Object.entries(data).forEach(([k,v]) => {
+ params.append(k, v);
+ })
+ return this.get(`${url}?${params.toString()}`, {})
+ }
+
public async postData>(url: string, data: Record): Promise {
let body = JSON.stringify(data);
let headers = {'Content-Type': 'application/json'};
From 734f2d6a8f0b66fa8efc4b86dca8954a133a993a Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 03:29:12 +0300
Subject: [PATCH 024/221] Refactored email service added reset password works,
test is left
---
common/dto.ts | 25 ++++++
frontend/src/ts/message_handlers/Api.ts | 41 ++++-----
.../src/vue/singup/ApplyResetPassword.vue | 18 +++-
frontend/src/vue/singup/CaptchaComponent.vue | 12 +--
frontend/src/vue/singup/ResetPassword.vue | 15 ++--
.../database/repository/user.repository.ts | 36 ++++++--
.../rendered.send.restore.password.html | 45 ++++++++++
newback/src/fixtures/send.sign.up.email.html | 46 ++++++++++
.../src/modules/api/auth/auth.controller.ts | 25 ++++++
newback/src/modules/api/auth/auth.service.ts | 84 ++++++++++++++++++-
.../accept.token.request.validator.ts | 26 ++++++
.../send.restore.password.validator.ts | 24 ++++++
.../verify.token.request.validator.ts | 13 +++
.../email.render/email.sender.service.spec.ts | 68 +++++++++++++++
.../email.render/email.sender.service.ts | 61 ++++++++------
newback/src/modules/html/html.service.ts | 2 +-
.../src/templates/change_password_start.html | 45 ++++++++++
.../src/templates/change_password_start.txt | 4 +
newback/src/templates/sign_up_email.html | 10 ++-
newback/src/templates/sign_up_email.txt | 3 +
newback/src/templates/token_email.html | 9 --
21 files changed, 528 insertions(+), 84 deletions(-)
create mode 100644 newback/src/fixtures/rendered.send.restore.password.html
create mode 100644 newback/src/fixtures/send.sign.up.email.html
create mode 100644 newback/src/modules/api/auth/validators/accept.token.request.validator.ts
create mode 100644 newback/src/modules/api/auth/validators/send.restore.password.validator.ts
create mode 100644 newback/src/modules/api/auth/validators/verify.token.request.validator.ts
create mode 100644 newback/src/modules/email.render/email.sender.service.spec.ts
create mode 100644 newback/src/templates/change_password_start.html
create mode 100644 newback/src/templates/change_password_start.txt
create mode 100644 newback/src/templates/sign_up_email.txt
delete mode 100644 newback/src/templates/token_email.html
diff --git a/common/dto.ts b/common/dto.ts
index 925b135eb..d6ca0734f 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -4,6 +4,31 @@ export interface SignInRequest extends CaptchaRequest{
email?: string;
}
+export interface SendRestorePasswordRequest extends CaptchaRequest {
+ username?: string;
+ email?: string;
+}
+
+export interface VerifyTokenRequest {
+ token: string;
+}
+
+export interface AcceptTokenRequest {
+ token: string;
+ password: string;
+}
+
+export interface AcceptTokenResponse extends SessionResponse {
+
+}
+
+export interface VerifyTokenResponse extends OkResponse {
+ username: string;
+}
+
+export interface SendRestorePasswordResponse extends OkResponse {
+}
+
export interface CaptchaRequest {
captcha?: string;
}
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index 144ba7bc5..5b194057c 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -23,10 +23,18 @@ import type {
import type {InternetAppearMessage} from "@/ts/types/messages/innerMessages";
import type {MultiResponse} from "giphy-api";
import type Subscription from "@/ts/classes/Subscription";
-import {SignInRequest} from '@/ts/types/dto';
import {
+ OkResponse,
+ SendRestorePasswordRequest,
+ SignInRequest
+} from '@/ts/types/dto';
+import {
+ AcceptTokenRequest,
+ AcceptTokenResponse,
GoogleSignInResponse,
- ValidateUserResponse
+ ValidateUserResponse,
+ VerifyTokenRequest,
+ VerifyTokenResponse
} from '@/ts/types/backend';
export default class Api extends MessageHandler {
@@ -71,10 +79,10 @@ export default class Api extends MessageHandler {
});
}
- public async sendRestorePassword(form: HTMLFormElement): Promise {
- return this.xhr.doPost({
- url: "/send_restore_password",
- formData: new FormData(form),
+ public async sendRestorePassword(params: SendRestorePasswordRequest): Promise {
+ return this.xhr.doPost({
+ url: "/auth/send-restore-password",
+ params: params as any,
});
}
@@ -247,24 +255,17 @@ export default class Api extends MessageHandler {
});
}
- public async verifyToken(token: string): Promise {
- const value: {message: string; restoreUser: string} = await this.xhr.doPost<{message: string; restoreUser: string}>({
- url: "/verify_token",
- params: {token},
+ public async verifyToken(params: VerifyTokenRequest): Promise {
+ return this.xhr.doPost({
+ url: "/auth/verify-token",
+ params: params as any,
});
- if (value && value.message === RESPONSE_SUCCESS) {
- return value.restoreUser;
- }
- throw value.message;
}
- public async acceptToken(token: string, password: string): Promise {
+ public async acceptToken(params: AcceptTokenRequest): Promise {
return this.xhr.doPost({
- url: "/accept_token",
- params: {
- token,
- password,
- },
+ url: "/auth/accept-token",
+ params
});
}
diff --git a/frontend/src/vue/singup/ApplyResetPassword.vue b/frontend/src/vue/singup/ApplyResetPassword.vue
index ac5197337..dea556928 100644
--- a/frontend/src/vue/singup/ApplyResetPassword.vue
+++ b/frontend/src/vue/singup/ApplyResetPassword.vue
@@ -47,6 +47,7 @@ import {
} from "vue-property-decorator";
import {ApplyGrowlErr} from "@/ts/instances/storeInstance";
import AppSubmit from "@/vue/ui/AppSubmit.vue";
+import {LoginMessage} from '@/ts/types/messages/innerMessages';
@Component({
name: "ApplyResetPassword",
@@ -70,7 +71,8 @@ export default class ApplyResetPassword extends Vue {
vueProperty: "error",
})
async created() {
- this.restoreUser = await this.$api.verifyToken((this.$route.query.token) as string);
+ let data = await this.$api.verifyToken({token: (this.$route.query.token) as string});
+ this.restoreUser = data.username;
}
@ApplyGrowlErr({
@@ -82,9 +84,17 @@ export default class ApplyResetPassword extends Vue {
if (this.password !== this.repeatPassword) {
this.$store.growlError("Passords don't match");
} else {
- await this.$api.acceptToken(this.$route.query.token as string, this.password);
- this.$store.growlSuccess("Password has been reset");
- this.$router.replace("/auth/login");
+ let response = await this.$api.acceptToken({
+ token: this.$route.query.token as string,
+ password: this.password
+ });
+ const {session} = response;
+ const message: LoginMessage = {
+ action: "login",
+ handler: "router",
+ session,
+ };
+ this.$messageBus.notify(message);
}
}
}
diff --git a/frontend/src/vue/singup/CaptchaComponent.vue b/frontend/src/vue/singup/CaptchaComponent.vue
index 944452eff..2f76d8059 100644
--- a/frontend/src/vue/singup/CaptchaComponent.vue
+++ b/frontend/src/vue/singup/CaptchaComponent.vue
@@ -1,6 +1,6 @@
@@ -38,7 +38,7 @@ export default class AuthPage extends Vue {
@ApplyGrowlErr({message: "Auto-registration error"})
public async created() {
if (AUTO_REGISTRATION) {
- const {session} = await this.$api.register({
+ const {session} = await this.$api.signUp({
username: this.getRandom(),
password: this.getRandom(),
});
diff --git a/frontend/src/vue/singup/Login.vue b/frontend/src/vue/singup/SignIn.vue
similarity index 94%
rename from frontend/src/vue/singup/Login.vue
rename to frontend/src/vue/singup/SignIn.vue
index cf0f99baa..b364a7375 100644
--- a/frontend/src/vue/singup/Login.vue
+++ b/frontend/src/vue/singup/SignIn.vue
@@ -60,14 +60,14 @@ import type {LoginMessage} from "@/ts/types/messages/innerMessages";
import SocialAuthSignUp from "@/vue/singup/SocialAuthSignUp.vue";
@Component({
- name: "Login",
+ name: "SignIn",
components: {
SocialAuthSignUp,
CaptchaComponent,
AppSubmit,
},
})
-export default class Login extends Vue {
+export default class SignIn extends Vue {
@Ref()
public form!: HTMLFormElement;
@@ -87,12 +87,12 @@ export default class Login extends Vue {
public async login() {
let response;
if (this.username?.includes('@')) {
- response = await this.$api.login({
+ response = await this.$api.signIn({
email: this.username,
password: this.password,
});
} else {
- response = await this.$api.login({
+ response = await this.$api.signIn({
username: this.username,
password: this.password,
captcha: this.captcha,
diff --git a/frontend/src/vue/singup/SignUp.vue b/frontend/src/vue/singup/SignUp.vue
index 6a2ead6bf..e673e6e2c 100644
--- a/frontend/src/vue/singup/SignUp.vue
+++ b/frontend/src/vue/singup/SignUp.vue
@@ -92,17 +92,17 @@
@blur="sexFoc = true"
>
Gender
-
+
Male
-
+
Female
@@ -146,6 +146,9 @@ export default class SignUp extends Vue {
@Prop() public fb_app_id!: string;
+ signUpSexMale = Gender.MALE;
+ signUpSexFemale = Gender.FEMALE;
+ signUpSexOther = Gender.OTHER;
running: boolean = false;
@@ -327,7 +330,7 @@ export default class SignUp extends Vue {
sexFoc: boolean = true;
- sex: string = "";
+ sex: string = Gender.OTHER;
sexDescription: string = "Need a help?";
@@ -349,9 +352,11 @@ export default class SignUp extends Vue {
message: "Can't sign up"
})
async register() {
- const {session} = await this.$api.register({
+ const {session} = await this.$api.signUp({
username: this.username,
password: this.password,
+ email: this.email,
+
});
const message: LoginMessage = {
action: "login",
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index d5887f507..1470576ec 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -507,6 +507,18 @@ describe('AuthModule', () => {
"statusCode": 400,
});
});
+ it('should give error on invalid and also correct ones', async() => {
+ await request
+ .post('/api/auth/validate-user').send({
+ username: '%asfasdf',
+ }).expect(400, {
+ "error": "Bad Request",
+ "message": [
+ "Username can only contain latin characters, numbers and symbols '-' '_'",
+ ],
+ "statusCode": 400,
+ });
+ });
it('should give error if username has great length', async() => {
await request
.post('/api/auth/validate-user').send({
diff --git a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
index 7f12a0f2f..ebebb89cf 100644
--- a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
@@ -19,12 +19,11 @@ export class SignUpRequestValidator implements SignUpRequest {
@Length(1, MAX_USERNAME_LENGTH, {
message: `Username should be 1-${MAX_USERNAME_LENGTH} characters`
})
- @Matches(/[a-zA-Z-_0-9]+/, {
+ @Matches(/^[a-zA-Z-_0-9]+$/, {
message: `Username can only contain latin characters, numbers and symbols '-' '_'`
})
public username: string;
-
@IsString()
@Length(3, 128, {
message: "Passwords should contain 3-64 symbols"
diff --git a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
index 4c5087959..777323f73 100644
--- a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
@@ -11,7 +11,7 @@ export class ValidateUserRequestValidator implements ValidateUserRequest {
@Length(1, MAX_USERNAME_LENGTH, {
message: `Username should be 1-${MAX_USERNAME_LENGTH} characters`
})
- @Matches(/[a-zA-Z-_0-9]+/, {
+ @Matches(/^[a-zA-Z-_0-9]+$/, {
message: `Username can only contain latin characters, numbers and symbols '-' '_'`
})
public username: string;
diff --git a/newback/src/modules/email.render/email.sender.service.ts b/newback/src/modules/email.render/email.sender.service.ts
index fc9c4e0ff..d854d8235 100644
--- a/newback/src/modules/email.render/email.sender.service.ts
+++ b/newback/src/modules/email.render/email.sender.service.ts
@@ -36,12 +36,12 @@ export class EmailSenderService {
let html = await this.htmlService.renderTemplate(`${templateName}.html`, context);
let text = await this.htmlService.renderTemplate(`${templateName}.txt`, context);
this.loggerService.log(`Sending email to userId ${userId} ${email}`)
- // await this.mailerService.sendMail({
- // to: email,
- // html,
- // text,
- // subject
- // })
+ await this.mailerService.sendMail({
+ to: email,
+ html,
+ text,
+ subject
+ })
}
public async sendSignUpEmail(username: string, userId: number, email: string, token, ip: string, ipInfo: string) {
From 809df2f53363b60aa6cdd1f4da04e37d648c1335 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 13:35:11 +0300
Subject: [PATCH 026/221] added ci newback
---
.github/workflows/frontend.yml | 6 +++---
.github/workflows/newback.yml | 30 ++++++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 3 deletions(-)
create mode 100644 .github/workflows/newback.yml
diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml
index 6882a8a13..244d4099d 100644
--- a/.github/workflows/frontend.yml
+++ b/.github/workflows/frontend.yml
@@ -3,11 +3,11 @@ name: FE:pychat.org
on:
push:
branches: [ master ]
- paths:
+ paths:
- 'frontend/**'
jobs:
- upload_frontend:
+ upload-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
@@ -20,7 +20,7 @@ jobs:
path: |
frontend/node_modules
frontend/yarn-cache
- key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
+ key: ${{ runner.os }}-${{ hashFiles('frontend/yarn.lock') }}
- name: Install npm dependencies
run: |
cd frontend
diff --git a/.github/workflows/newback.yml b/.github/workflows/newback.yml
new file mode 100644
index 000000000..916aaabc4
--- /dev/null
+++ b/.github/workflows/newback.yml
@@ -0,0 +1,30 @@
+name: NEWBE:pychat.org
+
+on:
+ push:
+ branches: [ master ]
+ paths:
+ - 'newback/**'
+
+jobs:
+ test-backend:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v2-beta
+ with:
+ node-version: 'v16.14'
+ - name: Cache multiple paths
+ uses: actions/cache@v2
+ with:
+ path: |
+ newback/node_modules
+ newback/yarn-cache
+ key: ${{ runner.os }}-${{ hashFiles('newback/yarn.lock') }}
+ - name: Install npm dependencies
+ run: |
+ cd newback
+ yarn config set cache-folder `pwd`/yarn-cache
+ yarn install --frozen-lockfile
+ - name: Run tests
+ run: cd newback && yarn test
From 6f8d8bc45087aa079d2bfd0915ea7ca8ff845b73 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 13:35:57 +0300
Subject: [PATCH 027/221] fix
---
.github/workflows/newback.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/newback.yml b/.github/workflows/newback.yml
index 916aaabc4..13d1c56f3 100644
--- a/.github/workflows/newback.yml
+++ b/.github/workflows/newback.yml
@@ -2,7 +2,7 @@ name: NEWBE:pychat.org
on:
push:
- branches: [ master ]
+ branches: [ master, nestjs ]
paths:
- 'newback/**'
From d1ece96d7ff96d9c4e80ef6774979cd3845eb5bc Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 13:37:26 +0300
Subject: [PATCH 028/221] trigger
---
newback/src/main.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/newback/src/main.ts b/newback/src/main.ts
index 1cf017348..481403e67 100644
--- a/newback/src/main.ts
+++ b/newback/src/main.ts
@@ -11,7 +11,7 @@ import {promisify} from 'util';
async function bootstrap() {
const key = await promisify(readFile)(config.application.keyPath, 'utf-8');
- const cert =await promisify(readFile)(config.application.crtPath, 'utf-8');
+ const cert = await promisify(readFile)(config.application.crtPath, 'utf-8');
const app = await NestFactory.create(AppModule, {
logger: new ConsoleLogger(),
From 5b5d47839ef594527bb564a1570a46700fdb38a5 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 13:57:57 +0300
Subject: [PATCH 029/221] Fix
---
newback/package.json | 5 ++---
.../src/modules/api/auth/auth.module.spec.ts | 4 ++--
newback/src/modules/api/auth/auth.module.ts | 2 +-
newback/src/modules/api/auth/auth.service.ts | 4 ++--
.../{email.render => email}/email.module.ts | 6 +++---
.../email.service.spec.ts} | 10 ++++-----
.../email.service.ts} | 2 +-
newback/src/modules/html/html.service.spec.ts | 21 -------------------
8 files changed, 16 insertions(+), 38 deletions(-)
rename newback/src/modules/{email.render => email}/email.module.ts (74%)
rename newback/src/modules/{email.render/email.sender.service.spec.ts => email/email.service.spec.ts} (89%)
rename newback/src/modules/{email.render/email.sender.service.ts => email/email.service.ts} (98%)
diff --git a/newback/package.json b/newback/package.json
index ccba4be56..4a4cf0e19 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -9,9 +9,8 @@
"migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
- "test": "jest --coverage --runInBand --detectOpenHandles --testTimeout=10000 --passWithNoTests",
- "start:dev": "node --inspect=0.0.0.0 dist/src/main",
- "start:debug": "nest start --debug --watch"
+ "test:debug": "jest --runInBand --coverage --detectOpenHandles --testTimeout=100000",
+ "test": "jest --runInBand --coverage --coverageReporters text"
},
"dependencies": {
"@nestjs-modules/mailer": "^1.6.1",
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index 1470576ec..eeaa9f392 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -12,7 +12,7 @@ import {PasswordService} from '@/modules/api/auth/password.service';
import {UserRepository} from '@/data/database/repository/user.repository';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {EmailService} from '@/modules/email/email.service';
import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
import {HtmlService} from '@/modules/html/html.service';
@@ -81,7 +81,7 @@ describe('AuthModule', () => {
PasswordService,
AuthService,
HtmlService,
- EmailSenderService,
+ EmailService,
FacebookAuthService,
{
provide: MailerService,
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
index ff994a751..e75399d34 100644
--- a/newback/src/modules/api/auth/auth.module.ts
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -6,7 +6,7 @@ import {AuthController} from '@/modules/api/auth/auth.controller';
import {AuthService} from '@/modules/api/auth/auth.service';
import {DatabaseModule} from '@/data/database/database.module';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailModule} from '@/modules/email.render/email.module';
+import {EmailModule} from '@/modules/email/email.module';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {PasswordService} from '@/modules/api/auth/password.service';
import {OAuth2Client} from 'google-auth-library';
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index c9e1da545..c7b6d4853 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -29,7 +29,7 @@ import {
MAX_USERNAME_LENGTH
} from '@/data/utils/consts';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {EmailService} from '@/modules/email/email.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
@@ -47,7 +47,7 @@ export class AuthService {
private readonly roomRepository: RoomRepository,
private readonly passwordService: PasswordService,
private readonly redisService: RedisService,
- private readonly emailService: EmailSenderService,
+ private readonly emailService: EmailService,
private readonly googleAuthService: GoogleAuthService,
private readonly facebookService: FacebookAuthService,
private readonly sequelize: Sequelize,
diff --git a/newback/src/modules/email.render/email.module.ts b/newback/src/modules/email/email.module.ts
similarity index 74%
rename from newback/src/modules/email.render/email.module.ts
rename to newback/src/modules/email/email.module.ts
index 4c6c9d1ed..31e764f2f 100644
--- a/newback/src/modules/email.render/email.module.ts
+++ b/newback/src/modules/email/email.module.ts
@@ -1,7 +1,7 @@
import {Module} from '@nestjs/common';
import {MailerModule} from '@nestjs-modules/mailer';
import {config} from 'node-ts-config';
-import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {EmailService} from '@/modules/email/email.service';
import {HtmlService} from '@/modules/html/html.service';
@@ -12,11 +12,11 @@ import {HtmlService} from '@/modules/html/html.service';
})
],
providers: [
- EmailSenderService,
+ EmailService,
HtmlService
],
exports: [
- EmailSenderService
+ EmailService
]
})
export class EmailModule {
diff --git a/newback/src/modules/email.render/email.sender.service.spec.ts b/newback/src/modules/email/email.service.spec.ts
similarity index 89%
rename from newback/src/modules/email.render/email.sender.service.spec.ts
rename to newback/src/modules/email/email.service.spec.ts
index 123153c2a..ec7748a0c 100644
--- a/newback/src/modules/email.render/email.sender.service.spec.ts
+++ b/newback/src/modules/email/email.service.spec.ts
@@ -1,5 +1,5 @@
import {HtmlService} from '@/modules/html/html.service';
-import {EmailSenderService} from '@/modules/email.render/email.sender.service';
+import {EmailService} from '@/modules/email/email.service';
import {
Test,
TestingModule
@@ -13,7 +13,7 @@ import {resolve} from 'path';
describe('EmailSenderService', () => {
- let sender: EmailSenderService;
+ let sender: EmailService;
let moduleFixture: TestingModule;
let mailer: MailerService;
beforeAll(
@@ -27,13 +27,13 @@ describe('EmailSenderService', () => {
providers: [
{
provide: MailerService,
- useValue: { sendMail: (a) => console.log(a)}
+ useValue: { sendMail: () => jest.fn().mockResolvedValue(undefined)}
},
HtmlService,
- EmailSenderService,
+ EmailService,
]
}).compile();
- sender = moduleFixture.get(EmailSenderService);
+ sender = moduleFixture.get(EmailService);
mailer = moduleFixture.get(MailerService);
})
afterAll(async () => {
diff --git a/newback/src/modules/email.render/email.sender.service.ts b/newback/src/modules/email/email.service.ts
similarity index 98%
rename from newback/src/modules/email.render/email.sender.service.ts
rename to newback/src/modules/email/email.service.ts
index d854d8235..c4e1f0d90 100644
--- a/newback/src/modules/email.render/email.sender.service.ts
+++ b/newback/src/modules/email/email.service.ts
@@ -7,7 +7,7 @@ import {MailerService} from '@nestjs-modules/mailer';
import {ConfigService} from '@/modules/config/config.service';
@Injectable()
-export class EmailSenderService {
+export class EmailService {
public constructor(
private readonly htmlService: HtmlService,
private readonly loggerService: Logger,
diff --git a/newback/src/modules/html/html.service.spec.ts b/newback/src/modules/html/html.service.spec.ts
index 7983daf14..c65cf3a6f 100644
--- a/newback/src/modules/html/html.service.spec.ts
+++ b/newback/src/modules/html/html.service.spec.ts
@@ -26,25 +26,4 @@ describe('HtmlService', () => {
expect(() => service.replaceTemplate('aa {{ adas }}', {blah: 4})).toThrow(Error("Unable to render template. 'adas' is missing in {\"blah\":4}"))
});
});
- describe('renderTemplate', () => {
- it('should replace single param', async() => {
- let service = new HtmlService();
- let result = await service.renderTemplate('token_email', {
- signUpEmail: 'include',
- timeCreated: 'now',
- ip: 'localhost',
- ipInfo: 'Chernihiv'
- })
- expect(result).toEqual(`include
-
- Note : Your magic link will expire in 1 day, and can only be used one time.
-
-
- Link was generated now
- IP: localhost
- Chernihiv
-
-`);
- });
- });
});
From 08dc57f7a15a3870d3ffc3c45df6aad2cdf0d6fe Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 14:02:55 +0300
Subject: [PATCH 030/221] Rename auth
---
frontend/src/ts/instances/routerInstance.ts | 10 +++++-----
.../src/vue/{singup => auth}/ApplyResetPassword.vue | 0
frontend/src/vue/{singup => auth}/AuthPage.vue | 0
frontend/src/vue/{singup => auth}/CaptchaComponent.vue | 0
frontend/src/vue/{singup => auth}/FacebookAuth.vue | 0
frontend/src/vue/{singup => auth}/GoogleAuth.vue | 0
frontend/src/vue/{singup => auth}/RegisterFieldSet.vue | 0
frontend/src/vue/{singup => auth}/ResetPassword.vue | 2 +-
frontend/src/vue/{singup => auth}/SignIn.vue | 4 ++--
frontend/src/vue/{singup => auth}/SignUp.vue | 4 ++--
frontend/src/vue/{singup => auth}/SocialAuthSignUp.vue | 4 ++--
frontend/src/vue/pages/UserProfileOauthSettings.vue | 4 ++--
newback/package.json | 2 +-
13 files changed, 15 insertions(+), 15 deletions(-)
rename frontend/src/vue/{singup => auth}/ApplyResetPassword.vue (100%)
rename frontend/src/vue/{singup => auth}/AuthPage.vue (100%)
rename frontend/src/vue/{singup => auth}/CaptchaComponent.vue (100%)
rename frontend/src/vue/{singup => auth}/FacebookAuth.vue (100%)
rename frontend/src/vue/{singup => auth}/GoogleAuth.vue (100%)
rename frontend/src/vue/{singup => auth}/RegisterFieldSet.vue (100%)
rename frontend/src/vue/{singup => auth}/ResetPassword.vue (97%)
rename frontend/src/vue/{singup => auth}/SignIn.vue (95%)
rename frontend/src/vue/{singup => auth}/SignUp.vue (98%)
rename frontend/src/vue/{singup => auth}/SocialAuthSignUp.vue (94%)
diff --git a/frontend/src/ts/instances/routerInstance.ts b/frontend/src/ts/instances/routerInstance.ts
index 303f4c307..9d9d0db9e 100644
--- a/frontend/src/ts/instances/routerInstance.ts
+++ b/frontend/src/ts/instances/routerInstance.ts
@@ -6,10 +6,10 @@ import sessionHolder from "@/ts/instances/sessionInstance";
import {store} from "@/ts/instances/storeInstance";
import MainPage from "@/vue/pages/MainPage.vue";
import ChannelsPage from "@/vue/pages/ChannelsPage.vue";
-import AuthPage from "@/vue/singup/AuthPage.vue";
-import ResetPassword from "@/vue/singup/ResetPassword.vue";
-import SignIn from "@/vue/singup/SignIn.vue";
-import SignUp from "@/vue/singup/SignUp.vue";
+import AuthPage from "@/vue/auth/AuthPage.vue";
+import ResetPassword from "@/vue/auth/ResetPassword.vue";
+import SignIn from "@/vue/auth/SignIn.vue";
+import SignUp from "@/vue/auth/SignUp.vue";
import UserProfile from "@/vue/pages/UserProfile.vue";
import UserProfileChangePassword from "@/vue/pages/UserProfileChangePassword.vue";
import UserProfileImage from "@/vue/pages/UserProfileImage.vue";
@@ -18,7 +18,7 @@ import UserProfileSettings from "@/vue/pages/UserProfileSettings.vue";
import CreatePrivateRoom from "@/vue/pages/CreatePrivateRoom.vue";
import ViewProfilePage from "@/vue/pages/ViewProfilePage.vue";
import RoomSettings from "@/vue/pages/RoomSettings.vue";
-import ApplyResetPassword from "@/vue/singup/ApplyResetPassword.vue";
+import ApplyResetPassword from "@/vue/auth/ApplyResetPassword.vue";
import {
ACTIVE_ROOM_ID_LS_NAME,
ALL_ROOM_ID,
diff --git a/frontend/src/vue/singup/ApplyResetPassword.vue b/frontend/src/vue/auth/ApplyResetPassword.vue
similarity index 100%
rename from frontend/src/vue/singup/ApplyResetPassword.vue
rename to frontend/src/vue/auth/ApplyResetPassword.vue
diff --git a/frontend/src/vue/singup/AuthPage.vue b/frontend/src/vue/auth/AuthPage.vue
similarity index 100%
rename from frontend/src/vue/singup/AuthPage.vue
rename to frontend/src/vue/auth/AuthPage.vue
diff --git a/frontend/src/vue/singup/CaptchaComponent.vue b/frontend/src/vue/auth/CaptchaComponent.vue
similarity index 100%
rename from frontend/src/vue/singup/CaptchaComponent.vue
rename to frontend/src/vue/auth/CaptchaComponent.vue
diff --git a/frontend/src/vue/singup/FacebookAuth.vue b/frontend/src/vue/auth/FacebookAuth.vue
similarity index 100%
rename from frontend/src/vue/singup/FacebookAuth.vue
rename to frontend/src/vue/auth/FacebookAuth.vue
diff --git a/frontend/src/vue/singup/GoogleAuth.vue b/frontend/src/vue/auth/GoogleAuth.vue
similarity index 100%
rename from frontend/src/vue/singup/GoogleAuth.vue
rename to frontend/src/vue/auth/GoogleAuth.vue
diff --git a/frontend/src/vue/singup/RegisterFieldSet.vue b/frontend/src/vue/auth/RegisterFieldSet.vue
similarity index 100%
rename from frontend/src/vue/singup/RegisterFieldSet.vue
rename to frontend/src/vue/auth/RegisterFieldSet.vue
diff --git a/frontend/src/vue/singup/ResetPassword.vue b/frontend/src/vue/auth/ResetPassword.vue
similarity index 97%
rename from frontend/src/vue/singup/ResetPassword.vue
rename to frontend/src/vue/auth/ResetPassword.vue
index 0b80fff0e..d93aeddc7 100644
--- a/frontend/src/vue/singup/ResetPassword.vue
+++ b/frontend/src/vue/auth/ResetPassword.vue
@@ -34,7 +34,7 @@ import {
} from "vue-property-decorator";
import AppSubmit from "@/vue/ui/AppSubmit.vue";
import {ApplyGrowlErr} from "@/ts/instances/storeInstance";
-import CaptchaComponent from "@/vue/singup/CaptchaComponent.vue";
+import CaptchaComponent from "@/vue/auth/CaptchaComponent.vue";
@Component({
name: "ResetPassword",
diff --git a/frontend/src/vue/singup/SignIn.vue b/frontend/src/vue/auth/SignIn.vue
similarity index 95%
rename from frontend/src/vue/singup/SignIn.vue
rename to frontend/src/vue/auth/SignIn.vue
index b364a7375..7cd3c2d25 100644
--- a/frontend/src/vue/singup/SignIn.vue
+++ b/frontend/src/vue/auth/SignIn.vue
@@ -55,9 +55,9 @@ import {
import AppSubmit from "@/vue/ui/AppSubmit.vue";
import {ApplyGrowlErr} from "@/ts/instances/storeInstance";
-import CaptchaComponent from "@/vue/singup/CaptchaComponent.vue";
+import CaptchaComponent from "@/vue/auth/CaptchaComponent.vue";
import type {LoginMessage} from "@/ts/types/messages/innerMessages";
-import SocialAuthSignUp from "@/vue/singup/SocialAuthSignUp.vue";
+import SocialAuthSignUp from "@/vue/auth/SocialAuthSignUp.vue";
@Component({
name: "SignIn",
diff --git a/frontend/src/vue/singup/SignUp.vue b/frontend/src/vue/auth/SignUp.vue
similarity index 98%
rename from frontend/src/vue/singup/SignUp.vue
rename to frontend/src/vue/auth/SignUp.vue
index e673e6e2c..107d0d375 100644
--- a/frontend/src/vue/singup/SignUp.vue
+++ b/frontend/src/vue/auth/SignUp.vue
@@ -127,11 +127,11 @@ import {
} from "vue-property-decorator";
import {ApplyGrowlErr} from "@/ts/instances/storeInstance";
import AppSubmit from "@/vue/ui/AppSubmit.vue";
-import RegisterFieldSet from "@/vue/singup/RegisterFieldSet.vue";
+import RegisterFieldSet from "@/vue/auth/RegisterFieldSet.vue";
import debounce from "lodash.debounce";
import {IconColor} from "@/ts/types/types";
import type {LoginMessage} from "@/ts/types/messages/innerMessages";
-import SocialAuthSignUp from "@/vue/singup/SocialAuthSignUp.vue";
+import SocialAuthSignUp from "@/vue/auth/SocialAuthSignUp.vue";
import {USERNAME_REGEX} from "@/ts/utils/consts";
import {Gender} from '@/ts/types/backend';
diff --git a/frontend/src/vue/singup/SocialAuthSignUp.vue b/frontend/src/vue/auth/SocialAuthSignUp.vue
similarity index 94%
rename from frontend/src/vue/singup/SocialAuthSignUp.vue
rename to frontend/src/vue/auth/SocialAuthSignUp.vue
index e94baa996..9d1cab4c4 100644
--- a/frontend/src/vue/singup/SocialAuthSignUp.vue
+++ b/frontend/src/vue/auth/SocialAuthSignUp.vue
@@ -11,8 +11,8 @@ import {
Vue,
} from "vue-property-decorator";
import type {LoginMessage} from "@/ts/types/messages/innerMessages";
-import FacebookAuth from "@/vue/singup/FacebookAuth.vue";
-import GoogleAuth from "@/vue/singup/GoogleAuth.vue";
+import FacebookAuth from "@/vue/auth/FacebookAuth.vue";
+import GoogleAuth from "@/vue/auth/GoogleAuth.vue";
import {
FACEBOOK_APP_ID,
GOOGLE_OAUTH_2_CLIENT_ID,
diff --git a/frontend/src/vue/pages/UserProfileOauthSettings.vue b/frontend/src/vue/pages/UserProfileOauthSettings.vue
index 6af039300..33496061a 100644
--- a/frontend/src/vue/pages/UserProfileOauthSettings.vue
+++ b/frontend/src/vue/pages/UserProfileOauthSettings.vue
@@ -24,8 +24,8 @@ import {
} from "vue-property-decorator";
import type {OauthStatus} from "@/ts/types/dto";
import AppSubmit from "@/vue/ui/AppSubmit.vue";
-import FacebookAuth from "@/vue/singup/FacebookAuth.vue";
-import GoogleAuth from "@/vue/singup/GoogleAuth.vue";
+import FacebookAuth from "@/vue/auth/FacebookAuth.vue";
+import GoogleAuth from "@/vue/auth/GoogleAuth.vue";
@Component({
name: "UserProfileOauthSettings",
diff --git a/newback/package.json b/newback/package.json
index 4a4cf0e19..9aad1a885 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -9,7 +9,7 @@
"migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
- "test:debug": "jest --runInBand --coverage --detectOpenHandles --testTimeout=100000",
+ "test:debug": "jest --runInBand --coverage --detectOpenHandles --testTimeout=100000 --coverageReporters html",
"test": "jest --runInBand --coverage --coverageReporters text"
},
"dependencies": {
From 58659c06e6c234f5719f746fd38e014e5a33f579 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 14:52:11 +0300
Subject: [PATCH 031/221] refactor structure
---
common/dto.ts | 13 ++++++++----
frontend/src/ts/instances/routerInstance.ts | 2 +-
frontend/src/ts/message_handlers/Api.ts | 21 ++++++++++++-------
frontend/src/ts/types/types.ts | 2 +-
frontend/src/vue/auth/SignUp.vue | 4 ++--
frontend/src/vue/pages/ConfirmMail.vue | 2 +-
.../database/repository/user.repository.ts | 7 +++++++
newback/src/fixtures/send.sign.up.email.html | 6 +++---
.../src/modules/api/auth/auth.controller.ts | 17 ++++++++++++---
.../src/modules/api/auth/auth.module.spec.ts | 10 ++++-----
newback/src/modules/api/auth/auth.module.ts | 6 +++---
newback/src/modules/api/auth/auth.service.ts | 21 ++++++++++++++-----
.../modules/api/auth/facebook.auth.service.ts | 4 ++--
.../confirm.email.request.validator.ts | 8 +++++++
newback/src/modules/app/app.module.ts | 6 +++---
.../{ => util}/config/config.module.ts | 2 +-
.../{ => util}/config/config.service.ts | 0
.../modules/{ => util}/email/email.module.ts | 4 ++--
.../{ => util}/email/email.service.spec.ts | 8 +++----
.../modules/{ => util}/email/email.service.ts | 10 ++++-----
.../index.ts => util/guards/captcha.guard.ts} | 4 ++--
.../{ => util}/html/html.service.spec.ts | 2 +-
.../modules/{ => util}/html/html.service.ts | 0
.../modules/{ => util}/http/http.module.ts | 2 +-
.../modules/{ => util}/http/http.service.ts | 0
.../interceptors/logging.interceptor.ts} | 0
.../{ => util}/logger/logger.module.ts | 0
..._start.html => change.password.start.html} | 0
...rd_start.txt => change.password.start.txt} | 0
...{sign_up_email.html => sign.up.email.html} | 0
.../{sign_up_email.txt => sign.up.email.txt} | 0
31 files changed, 105 insertions(+), 56 deletions(-)
create mode 100644 newback/src/modules/api/auth/validators/confirm.email.request.validator.ts
rename newback/src/modules/{ => util}/config/config.module.ts (79%)
rename newback/src/modules/{ => util}/config/config.service.ts (100%)
rename newback/src/modules/{ => util}/email/email.module.ts (73%)
rename newback/src/modules/{ => util}/email/email.service.spec.ts (89%)
rename newback/src/modules/{ => util}/email/email.service.ts (83%)
rename newback/src/modules/{captcha/index.ts => util/guards/captcha.guard.ts} (90%)
rename newback/src/modules/{ => util}/html/html.service.spec.ts (93%)
rename newback/src/modules/{ => util}/html/html.service.ts (100%)
rename newback/src/modules/{ => util}/http/http.module.ts (82%)
rename newback/src/modules/{ => util}/http/http.service.ts (100%)
rename newback/src/modules/{logger/interceptor.ts => util/interceptors/logging.interceptor.ts} (100%)
rename newback/src/modules/{ => util}/logger/logger.module.ts (100%)
rename newback/src/templates/{change_password_start.html => change.password.start.html} (100%)
rename newback/src/templates/{change_password_start.txt => change.password.start.txt} (100%)
rename newback/src/templates/{sign_up_email.html => sign.up.email.html} (100%)
rename newback/src/templates/{sign_up_email.txt => sign.up.email.txt} (100%)
diff --git a/common/dto.ts b/common/dto.ts
index d6ca0734f..7e8ef44b3 100644
--- a/common/dto.ts
+++ b/common/dto.ts
@@ -52,6 +52,12 @@ export interface SignUpRequest {
sex?: Gender;
}
+export interface ConfirmEmailRequest {
+ token: string;
+}
+
+export interface ConfirmEmailResponse extends OkResponse {}
+
export interface SessionResponse {
session: string;
}
@@ -117,10 +123,9 @@ export enum Theme {
export enum VerificationType {
- REGISTER = 'REGISTER',
- PASSWORD = 'PASSWORD',
- EMAIL = 'EMAIL',
- CONFIRM_EMAIL = 'CONFIRM_EMAIL',
+ REGISTER = 'REGISTER', // when user sign up with email, we want to confirm that it's his/her email
+ PASSWORD = 'PASSWORD', // when user request a pasword change
+ EMAIL = 'EMAIL', // when user changes an email
}
export enum ImageType {
diff --git a/frontend/src/ts/instances/routerInstance.ts b/frontend/src/ts/instances/routerInstance.ts
index 9d9d0db9e..c4cc6aa7b 100644
--- a/frontend/src/ts/instances/routerInstance.ts
+++ b/frontend/src/ts/instances/routerInstance.ts
@@ -177,7 +177,7 @@ export function routerFactory(sub: Subscription) {
},
],
}, {
- path: "/confirm_email",
+ path: "/confirm-email",
component: ConfirmMail,
}, {
path: "/:catchAll(.*)",
diff --git a/frontend/src/ts/message_handlers/Api.ts b/frontend/src/ts/message_handlers/Api.ts
index 716e73968..1c69bc65e 100644
--- a/frontend/src/ts/message_handlers/Api.ts
+++ b/frontend/src/ts/message_handlers/Api.ts
@@ -27,13 +27,17 @@ import {
OkResponse,
SendRestorePasswordRequest,
SignInRequest,
- SignUpRequest
+ SignUpRequest,
+ ValidateEmailResponse
} from '@/ts/types/dto';
import {
AcceptTokenRequest,
AcceptTokenResponse,
+ ConfirmEmailRequest,
+ ConfirmEmailResponse,
GoogleSignInResponse,
SignUpResponse,
+ ValidateUserEmailRequest,
ValidateUserResponse,
VerifyTokenRequest,
VerifyTokenResponse
@@ -229,8 +233,11 @@ export default class Api extends MessageHandler {
});
}
- public async confirmEmail(token: string): Promise {
- return this.xhr.doGet(`/confirm_email?token=${token}`);
+ public async confirmEmail(params: ConfirmEmailRequest): Promise {
+ return this.xhr.doPost({
+ url: '/auth/confirm-email',
+ params
+ });
}
public async uploadFiles(files: UploadFile[], progress: (e: ProgressEvent) => void, setXhr: (e: XMLHttpRequest) => void): Promise {
@@ -249,10 +256,10 @@ export default class Api extends MessageHandler {
});
}
- public async validateEmail(email: string, onAbortController: (controller: AbortController) => void): Promise {
+ public async validateEmail(params: ValidateUserEmailRequest, onAbortController: (controller: AbortController) => void): Promise {
return this.xhr.doPost({
url: "/auth/validate-email",
- params: {email},
+ params,
onAbortController,
});
}
@@ -260,14 +267,14 @@ export default class Api extends MessageHandler {
public async verifyToken(params: VerifyTokenRequest): Promise {
return this.xhr.doPost({
url: "/auth/verify-token",
- params: params as any,
+ params,
});
}
public async acceptToken(params: AcceptTokenRequest): Promise {
return this.xhr.doPost({
url: "/auth/accept-token",
- params: params as any,
+ params,
});
}
diff --git a/frontend/src/ts/types/types.ts b/frontend/src/ts/types/types.ts
index f5885a108..fa985de6b 100644
--- a/frontend/src/ts/types/types.ts
+++ b/frontend/src/ts/types/types.ts
@@ -229,7 +229,7 @@ export interface IStorage {
export interface PostData {
url: string;
- params?: Record;
+ params?: any;
formData?: FormData;
onAbortController?: (controller: AbortController) => void;
process?(R: XMLHttpRequest): void;
diff --git a/frontend/src/vue/auth/SignUp.vue b/frontend/src/vue/auth/SignUp.vue
index 107d0d375..09c698d6e 100644
--- a/frontend/src/vue/auth/SignUp.vue
+++ b/frontend/src/vue/auth/SignUp.vue
@@ -282,13 +282,13 @@ export default class SignUp extends Vue {
private currentValidateEmailRequest: AbortController | null = null;
- async checkEmail(username: string) {
+ async checkEmail(email: string) {
if (this.currentValidateEmailRequest) {
this.currentValidateEmailRequest.abort();
this.currentValidateEmailRequest = null;
}
try {
- await this.$api.validateEmail(username, (r:AbortController) => this.currentValidateEmailRequest = r);
+ await this.$api.validateEmail({email}, (r:AbortController) => this.currentValidateEmailRequest = r);
this.emailCheckValue = IconColor.SUCCESS;
this.emailDescription = "Email is ok!";
this.emailValidity = "";
diff --git a/frontend/src/vue/pages/ConfirmMail.vue b/frontend/src/vue/pages/ConfirmMail.vue
index 41ea53c3d..255828c66 100644
--- a/frontend/src/vue/pages/ConfirmMail.vue
+++ b/frontend/src/vue/pages/ConfirmMail.vue
@@ -43,7 +43,7 @@ export default class ConfirmMail extends Vue {
message: "Confirming email error ",
})
public async created() {
- await this.$api.confirmEmail(this.$route.query.token as string);
+ await this.$api.confirmEmail({token: this.$route.query.token as string});
this.message = "Email has been confirmed";
}
}
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/data/database/repository/user.repository.ts
index 19e5e0b5b..fca146f49 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/data/database/repository/user.repository.ts
@@ -37,6 +37,13 @@ export class UserRepository {
})
}
+ public async setUserVerification(userId: number, emailVerificationId: number, transaction: Transaction) {
+ await this.userAuthModel.update({emailVerificationId}, {
+ where: {id: userId},
+ transaction
+ })
+ }
+
public async createUser(data: {
username: string;
password: string;
diff --git a/newback/src/fixtures/send.sign.up.email.html b/newback/src/fixtures/send.sign.up.email.html
index cb8fa1eca..b6863c5ba 100644
--- a/newback/src/fixtures/send.sign.up.email.html
+++ b/newback/src/fixtures/send.sign.up.email.html
@@ -2,7 +2,7 @@ Hello, a!
You have registered in Pychat . If you find any bugs or propositions you can post them
here . To complete your registration please click on the link below.
Note : Your magic link will expire in 1 day, and can only be used one time.
diff --git a/newback/src/modules/api/auth/auth.controller.ts b/newback/src/modules/api/auth/auth.controller.ts
index 70b710fa3..6e16d1cfc 100644
--- a/newback/src/modules/api/auth/auth.controller.ts
+++ b/newback/src/modules/api/auth/auth.controller.ts
@@ -13,22 +13,25 @@ import {SignUpRequestValidator} from '@/modules/api/auth/validators/sign.up.requ
import {ValidateUserRequestValidator} from '@/modules/api/auth/validators/validate.user.request.validator';
import {
AcceptTokenResponse,
+ ConfirmEmailResponse,
FacebookSignInResponse,
GoogleSignInResponse,
SendRestorePasswordResponse,
SignInResponse,
SignUpResponse,
+ ValidateEmailResponse,
ValidateUserEmailRequest,
ValidateUserResponse
} from '@/data/types/frontend';
import {GoogleAuthRequestValidator} from '@/modules/api/auth/validators/google.auth.reques.validator';
-import {CaptchaGuard} from '@/modules/captcha';
+import {CaptchaGuard} from '@/modules/util/guards/captcha.guard';
import {ValidateEmailRequestValidator} from '@/modules/api/auth/validators/validate.email.request.validator';
import {FacebookAuthRequestValidator} from '@/modules/api/auth/validators/facebook.auth.request.validator';
import {SendRestorePasswordValidator} from '@/modules/api/auth/validators/send.restore.password.validator';
import {VerifyTokenRequestValidator} from '@/modules/api/auth/validators/verify.token.request.validator';
import {VerifyTokenResponse} from '@/data/types/frontend';
import {AcceptTokenRequestValidator} from '@/modules/api/auth/validators/accept.token.request.validator';
+import {ConfirmEmailRequestValidator} from '@/modules/api/auth/validators/confirm.email.request.validator';
@Controller({
path: '/api/auth'
@@ -62,7 +65,7 @@ export class AuthController {
}
@Post('/validate-email')
- public async validateEmail(@Body() body: ValidateEmailRequestValidator): Promise {
+ public async validateEmail(@Body() body: ValidateEmailRequestValidator): Promise {
await this.authservice.validateEmail(body.email);
return {
ok: true
@@ -83,9 +86,17 @@ export class AuthController {
return this.authservice.verifyToken(body.token);
}
+ @Post('/confirm-email')
+ public async confirmEmail(@Body() body: ConfirmEmailRequestValidator): Promise {
+ await this.authservice.confirmEmail(body);
+ return {
+ ok: true,
+ }
+ }
+
@Post('/accept-token')
public async acceptToken(@Body() body: AcceptTokenRequestValidator): Promise {
- return this.authservice.acceptToken(body);
+ return this.authservice.acceptToken(body);
}
@Post('/validate-user')
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index eeaa9f392..2c4eb11bc 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -7,24 +7,24 @@ import * as supertest from 'supertest';
import {Test} from '@nestjs/testing';
import {AuthService} from '@/modules/api/auth/auth.service';
import {AuthController} from '@/modules/api/auth/auth.controller';
-import {LoggerModule} from '@/modules/logger/logger.module';
+import {LoggerModule} from '@/modules/util/logger/logger.module';
import {PasswordService} from '@/modules/api/auth/password.service';
import {UserRepository} from '@/data/database/repository/user.repository';
import {RoomRepository} from '@/data/database/repository/room.repository';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailService} from '@/modules/email/email.service';
+import {EmailService} from '@/modules/util/email/email.service';
import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
-import {HtmlService} from '@/modules/html/html.service';
+import {HtmlService} from '@/modules/util/html/html.service';
import waitForExpect from "wait-for-expect";
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {OAuth2Client} from 'google-auth-library';
-import {HttpService} from '@/modules/http/http.service';
+import {HttpService} from '@/modules/util/http/http.service';
import fetch from 'node-fetch';
import * as googleResponseFixture from '@/fixtures/google.response.fixture.json';
import * as facebookGetTokenResponseFixture from '@/fixtures/facebook.get.token.response.json';
import * as facebookGetUserResponseFixture from '@/fixtures/facebook.get.user.response.json';
-import {ConfigService} from '@/modules/config/config.service';
+import {ConfigService} from '@/modules/util/config/config.service';
import {
config,
IConfig
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
index e75399d34..0e5102ae7 100644
--- a/newback/src/modules/api/auth/auth.module.ts
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -6,14 +6,14 @@ import {AuthController} from '@/modules/api/auth/auth.controller';
import {AuthService} from '@/modules/api/auth/auth.service';
import {DatabaseModule} from '@/data/database/database.module';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailModule} from '@/modules/email/email.module';
+import {EmailModule} from '@/modules/util/email/email.module';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {PasswordService} from '@/modules/api/auth/password.service';
import {OAuth2Client} from 'google-auth-library';
import {config} from 'node-ts-config';
-import {HttpModule} from '@/modules/http/http.module';
+import {HttpModule} from '@/modules/util/http/http.module';
import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
-import {ConfigService} from '@/modules/config/config.service';
+import {ConfigService} from '@/modules/util/config/config.service';
@Module({
imports: [DatabaseModule, EmailModule, HttpModule],
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index c7b6d4853..6b7f4fe50 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -10,6 +10,8 @@ import {PasswordService} from '@/modules/api/auth/password.service';
import {
AcceptTokenRequest,
AcceptTokenResponse,
+ ConfirmEmailRequest,
+ ConfirmEmailResponse,
FaceBookAuthRequest,
FacebookSignInResponse,
Gender,
@@ -29,7 +31,7 @@ import {
MAX_USERNAME_LENGTH
} from '@/data/utils/consts';
import {RedisService} from '@/data/redis/RedisService';
-import {EmailService} from '@/modules/email/email.service';
+import {EmailService} from '@/modules/util/email/email.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
@@ -212,11 +214,11 @@ export class AuthService {
return userId;
}
- private doTokenVerification(data: VerificationModel): void {
+ private doTokenVerification(data: VerificationModel, typ: VerificationType): void {
if (!data) {
throw new BadRequestException("Invalid token");
}
- if (data.type != VerificationType.PASSWORD) {
+ if (data.type != typ) {
throw new BadRequestException("Invalid operation");
}
if (data.verified) {
@@ -230,7 +232,7 @@ export class AuthService {
public async verifyToken(token: string): Promise {
let verificationModel: VerificationModel = await this.userRepository.getVerification(token);
//https://pychat.org/#/auth/proceed-reset-password?token=evhv0zum3l8gavzql4xk5u16q2h9gqd2
- this.doTokenVerification(verificationModel)
+ this.doTokenVerification(verificationModel, VerificationType.PASSWORD)
return {
ok: true,
username: verificationModel.user.username
@@ -270,7 +272,7 @@ export class AuthService {
public async acceptToken(body: AcceptTokenRequest): Promise {
return this.sequelize.transaction(async(t) => {
let verificationModel: VerificationModel = await this.userRepository.getVerification(body.token, t);
- this.doTokenVerification(verificationModel);
+ this.doTokenVerification(verificationModel, VerificationType.PASSWORD);
let password = await this.passwordService.createPassword(body.password);
this.logger.log(`Generated newPassword='${password}' for verification='${verificationModel.id}' for userId=${verificationModel.userId}`);
await this.userRepository.updateUserPassword(verificationModel.userId, password, t)
@@ -282,4 +284,13 @@ export class AuthService {
return result;
})
}
+
+ public async confirmEmail(body: ConfirmEmailRequest): Promise {
+ this.sequelize.transaction(async(t) => {
+ let verificationModel: VerificationModel = await this.userRepository.getVerification(body.token, t);
+ this.doTokenVerification(verificationModel, VerificationType.REGISTER);
+ await this.userRepository.markVerificationVerified(verificationModel.id , t);
+ await this.userRepository.setUserVerification(verificationModel.userId, verificationModel.id , t);
+ })
+ }
}
diff --git a/newback/src/modules/api/auth/facebook.auth.service.ts b/newback/src/modules/api/auth/facebook.auth.service.ts
index 148372fc5..23da497f3 100644
--- a/newback/src/modules/api/auth/facebook.auth.service.ts
+++ b/newback/src/modules/api/auth/facebook.auth.service.ts
@@ -6,8 +6,8 @@ import {
Logger,
ServiceUnavailableException,
} from '@nestjs/common';
-import {HttpService} from '@/modules/http/http.service';
-import {ConfigService} from '@/modules/config/config.service';
+import {HttpService} from '@/modules/util/http/http.service';
+import {ConfigService} from '@/modules/util/config/config.service';
import {FacebookGetUserResponse} from '@/data/types/api';
@Injectable()
diff --git a/newback/src/modules/api/auth/validators/confirm.email.request.validator.ts b/newback/src/modules/api/auth/validators/confirm.email.request.validator.ts
new file mode 100644
index 000000000..4f61e8b12
--- /dev/null
+++ b/newback/src/modules/api/auth/validators/confirm.email.request.validator.ts
@@ -0,0 +1,8 @@
+import {IsString,} from 'class-validator';
+import {ConfirmEmailRequest,} from '@/data/types/frontend';
+
+
+export class ConfirmEmailRequestValidator implements ConfirmEmailRequest {
+ @IsString()
+ public token: string;
+}
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index a71129830..0840b59e9 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -1,14 +1,14 @@
import {Module} from '@nestjs/common';
import {AuthModule} from '@/modules/api/auth/auth.module';
-import {LoggingInterceptor} from '@/modules/logger/interceptor';
+import {LoggingInterceptor} from '@/modules/util/interceptors/logging.interceptor';
import {
APP_INTERCEPTOR,
RouterModule
} from '@nestjs/core';
-import {LoggerModule} from '@/modules/logger/logger.module';
+import {LoggerModule} from '@/modules/util/logger/logger.module';
import {RedisModule} from '@nestjs-modules/ioredis';
import {config} from 'node-ts-config';
-import {ConfigModule} from '@/modules/config/config.module';
+import {ConfigModule} from '@/modules/util/config/config.module';
@Module({
imports: [AuthModule, LoggerModule, ConfigModule, RedisModule.forRoot({
diff --git a/newback/src/modules/config/config.module.ts b/newback/src/modules/util/config/config.module.ts
similarity index 79%
rename from newback/src/modules/config/config.module.ts
rename to newback/src/modules/util/config/config.module.ts
index d8e1f9aa7..162de8b24 100644
--- a/newback/src/modules/config/config.module.ts
+++ b/newback/src/modules/util/config/config.module.ts
@@ -2,7 +2,7 @@ import {
Global,
Module
} from '@nestjs/common';
-import {ConfigService} from '@/modules/config/config.service';
+import {ConfigService} from '@/modules/util/config/config.service';
import {config} from 'node-ts-config';
@Global()
diff --git a/newback/src/modules/config/config.service.ts b/newback/src/modules/util/config/config.service.ts
similarity index 100%
rename from newback/src/modules/config/config.service.ts
rename to newback/src/modules/util/config/config.service.ts
diff --git a/newback/src/modules/email/email.module.ts b/newback/src/modules/util/email/email.module.ts
similarity index 73%
rename from newback/src/modules/email/email.module.ts
rename to newback/src/modules/util/email/email.module.ts
index 31e764f2f..a9ecbf9f2 100644
--- a/newback/src/modules/email/email.module.ts
+++ b/newback/src/modules/util/email/email.module.ts
@@ -1,8 +1,8 @@
import {Module} from '@nestjs/common';
import {MailerModule} from '@nestjs-modules/mailer';
import {config} from 'node-ts-config';
-import {EmailService} from '@/modules/email/email.service';
-import {HtmlService} from '@/modules/html/html.service';
+import {EmailService} from '@/modules/util/email/email.service';
+import {HtmlService} from '@/modules/util/html/html.service';
@Module({
diff --git a/newback/src/modules/email/email.service.spec.ts b/newback/src/modules/util/email/email.service.spec.ts
similarity index 89%
rename from newback/src/modules/email/email.service.spec.ts
rename to newback/src/modules/util/email/email.service.spec.ts
index ec7748a0c..cb46d50d4 100644
--- a/newback/src/modules/email/email.service.spec.ts
+++ b/newback/src/modules/util/email/email.service.spec.ts
@@ -1,12 +1,12 @@
-import {HtmlService} from '@/modules/html/html.service';
-import {EmailService} from '@/modules/email/email.service';
+import {HtmlService} from '@/modules/util/html/html.service';
+import {EmailService} from '@/modules/util/email/email.service';
import {
Test,
TestingModule
} from '@nestjs/testing';
-import {LoggerModule} from '@/modules/logger/logger.module';
+import {LoggerModule} from '@/modules/util/logger/logger.module';
import {MailerService} from '@nestjs-modules/mailer';
-import {ConfigModule} from '@/modules/config/config.module';
+import {ConfigModule} from '@/modules/util/config/config.module';
import {promisify} from 'util';
import {readFile} from 'fs';
import {resolve} from 'path';
diff --git a/newback/src/modules/email/email.service.ts b/newback/src/modules/util/email/email.service.ts
similarity index 83%
rename from newback/src/modules/email/email.service.ts
rename to newback/src/modules/util/email/email.service.ts
index c4e1f0d90..b37515c53 100644
--- a/newback/src/modules/email/email.service.ts
+++ b/newback/src/modules/util/email/email.service.ts
@@ -2,9 +2,9 @@ import {
Injectable,
Logger
} from '@nestjs/common';
-import {HtmlService} from '@/modules/html/html.service';
+import {HtmlService} from '@/modules/util/html/html.service';
import {MailerService} from '@nestjs-modules/mailer';
-import {ConfigService} from '@/modules/config/config.service';
+import {ConfigService} from '@/modules/util/config/config.service';
@Injectable()
export class EmailService {
@@ -25,7 +25,7 @@ export class EmailService {
site: this.configService.getConfig().frontend.address,
ipInfo
};
- await this.sendEmail('change_password_start', userId, email, 'Confirm pychat registration', context);
+ await this.sendEmail('change.password.start', userId, email, 'Reset pychat password', context);
}
private async sendEmail(templateName: string, userId, email, subject: string, context: Record) {
@@ -47,13 +47,13 @@ export class EmailService {
public async sendSignUpEmail(username: string, userId: number, email: string, token, ip: string, ipInfo: string) {
let context: Record = {
issueReportLink: this.configService.getConfig().frontend.issueReportLink,
- magicLink: `${this.configService.getConfig().frontend.address}/#/confirm_email?token=${token}`,
+ magicLink: `${this.configService.getConfig().frontend.address}/#/confirm-email?token=${token}`,
username,
ip,
timeCreated: (new Date() as any).toGMTString(),
ipInfo
};
- await this.sendEmail('sign_up_email', userId, email, 'Confirm pychat registration', context);
+ await this.sendEmail('sign.up.email', userId, email, 'Confirm Pychat registration', context);
}
}
diff --git a/newback/src/modules/captcha/index.ts b/newback/src/modules/util/guards/captcha.guard.ts
similarity index 90%
rename from newback/src/modules/captcha/index.ts
rename to newback/src/modules/util/guards/captcha.guard.ts
index c49331b81..d49c5e8cb 100644
--- a/newback/src/modules/captcha/index.ts
+++ b/newback/src/modules/util/guards/captcha.guard.ts
@@ -12,8 +12,8 @@ import {
Recaptcha
} from 'node-ts-config';
-import {ConfigService} from '@/modules/config/config.service';
-import {HttpService} from '@/modules/http/http.service';
+import {ConfigService} from '@/modules/util/config/config.service';
+import {HttpService} from '@/modules/util/http/http.service';
@Injectable()
export class CaptchaGuard implements CanActivate {
constructor(
diff --git a/newback/src/modules/html/html.service.spec.ts b/newback/src/modules/util/html/html.service.spec.ts
similarity index 93%
rename from newback/src/modules/html/html.service.spec.ts
rename to newback/src/modules/util/html/html.service.spec.ts
index c65cf3a6f..7641e3179 100644
--- a/newback/src/modules/html/html.service.spec.ts
+++ b/newback/src/modules/util/html/html.service.spec.ts
@@ -1,4 +1,4 @@
-import {HtmlService} from '@/modules/html/html.service';
+import {HtmlService} from '@/modules/util/html/html.service';
describe('HtmlService', () => {
diff --git a/newback/src/modules/html/html.service.ts b/newback/src/modules/util/html/html.service.ts
similarity index 100%
rename from newback/src/modules/html/html.service.ts
rename to newback/src/modules/util/html/html.service.ts
diff --git a/newback/src/modules/http/http.module.ts b/newback/src/modules/util/http/http.module.ts
similarity index 82%
rename from newback/src/modules/http/http.module.ts
rename to newback/src/modules/util/http/http.module.ts
index 16bc3a5d1..723b73e0c 100644
--- a/newback/src/modules/http/http.module.ts
+++ b/newback/src/modules/util/http/http.module.ts
@@ -3,7 +3,7 @@ import {
Logger,
Module
} from '@nestjs/common';
-import {HttpService} from '@/modules/http/http.service';
+import {HttpService} from '@/modules/util/http/http.service';
import fetch from 'node-fetch';
@Global()
diff --git a/newback/src/modules/http/http.service.ts b/newback/src/modules/util/http/http.service.ts
similarity index 100%
rename from newback/src/modules/http/http.service.ts
rename to newback/src/modules/util/http/http.service.ts
diff --git a/newback/src/modules/logger/interceptor.ts b/newback/src/modules/util/interceptors/logging.interceptor.ts
similarity index 100%
rename from newback/src/modules/logger/interceptor.ts
rename to newback/src/modules/util/interceptors/logging.interceptor.ts
diff --git a/newback/src/modules/logger/logger.module.ts b/newback/src/modules/util/logger/logger.module.ts
similarity index 100%
rename from newback/src/modules/logger/logger.module.ts
rename to newback/src/modules/util/logger/logger.module.ts
diff --git a/newback/src/templates/change_password_start.html b/newback/src/templates/change.password.start.html
similarity index 100%
rename from newback/src/templates/change_password_start.html
rename to newback/src/templates/change.password.start.html
diff --git a/newback/src/templates/change_password_start.txt b/newback/src/templates/change.password.start.txt
similarity index 100%
rename from newback/src/templates/change_password_start.txt
rename to newback/src/templates/change.password.start.txt
diff --git a/newback/src/templates/sign_up_email.html b/newback/src/templates/sign.up.email.html
similarity index 100%
rename from newback/src/templates/sign_up_email.html
rename to newback/src/templates/sign.up.email.html
diff --git a/newback/src/templates/sign_up_email.txt b/newback/src/templates/sign.up.email.txt
similarity index 100%
rename from newback/src/templates/sign_up_email.txt
rename to newback/src/templates/sign.up.email.txt
From 66bb447a73403bbe7c933a67bf067e31c8ce4e91 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 15:10:15 +0300
Subject: [PATCH 032/221] Another refactor of structure
---
newback/package.json | 2 +-
newback/src/data/database/database.module.ts | 65 -------------------
.../{database => }/model/channel.model.ts | 2 +-
.../data/{database => }/model/image.model.ts | 2 +-
.../{database => }/model/ip.address.model.ts | 0
.../model/message.history.model.ts | 2 +-
.../model/message.mention.model.ts | 4 +-
.../{database => }/model/message.model.ts | 4 +-
.../data/{database => }/model/room.model.ts | 4 +-
.../{database => }/model/room.users.model.ts | 4 +-
.../model/subscription.message.model.ts | 4 +-
.../model/subscription.model.ts | 4 +-
.../model/uploaded.file.model.ts | 2 +-
.../{database => }/model/user.auth.model.ts | 4 +-
.../model/user.joined.info.model.ts | 4 +-
.../data/{database => }/model/user.model.ts | 4 +-
.../model/user.profile.model.ts | 2 +-
.../model/user.settings.model.ts | 2 +-
.../model/verification.model.ts | 2 +-
newback/src/data/utils/helpers.ts | 5 --
.../src/modules/api/auth/auth.controller.ts | 2 +-
.../src/modules/api/auth/auth.module.spec.ts | 16 ++---
newback/src/modules/api/auth/auth.module.ts | 10 +--
newback/src/modules/api/auth/auth.service.ts | 14 ++--
.../modules/api/auth/facebook.auth.service.ts | 4 +-
.../validators/sign.up.request.validator.ts | 2 +-
.../validate.user.request.validator.ts | 2 +-
newback/src/modules/app/app.module.ts | 6 +-
.../{util => app}/guards/captcha.guard.ts | 4 +-
.../interceptors/logging.interceptor.ts | 0
.../{util => rest}/config/config.module.ts | 2 +-
.../{util => rest}/config/config.service.ts | 0
.../modules/rest/database/database.module.ts | 64 ++++++++++++++++++
.../database/repository/room.repository.ts | 4 +-
.../database/repository/user.repository.ts | 10 +--
.../{util => rest}/email/email.module.ts | 4 +-
.../email/email.service.spec.ts | 8 +--
.../{util => rest}/email/email.service.ts | 4 +-
.../{util => rest}/html/html.service.spec.ts | 2 +-
.../{util => rest}/html/html.service.ts | 0
.../{util => rest}/http/http.module.ts | 2 +-
.../{util => rest}/http/http.service.ts | 0
.../{util => rest}/logger/logger.module.ts | 0
.../rest}/redis/RedisService.ts | 2 +-
newback/src/{data => }/utils/consts.ts | 0
newback/src/{data => }/utils/helpers.spec.ts | 2 +-
.../ormconfig.ts => utils/helpers.ts} | 8 ++-
newback/src/{ => utils}/migration.runner.ts | 4 +-
48 files changed, 148 insertions(+), 150 deletions(-)
delete mode 100644 newback/src/data/database/database.module.ts
rename newback/src/data/{database => }/model/channel.model.ts (91%)
rename newback/src/data/{database => }/model/image.model.ts (95%)
rename newback/src/data/{database => }/model/ip.address.model.ts (100%)
rename newback/src/data/{database => }/model/message.history.model.ts (92%)
rename newback/src/data/{database => }/model/message.mention.model.ts (89%)
rename newback/src/data/{database => }/model/message.model.ts (92%)
rename newback/src/data/{database => }/model/room.model.ts (92%)
rename newback/src/data/{database => }/model/room.users.model.ts (90%)
rename newback/src/data/{database => }/model/subscription.message.model.ts (88%)
rename newback/src/data/{database => }/model/subscription.model.ts (89%)
rename newback/src/data/{database => }/model/uploaded.file.model.ts (94%)
rename newback/src/data/{database => }/model/user.auth.model.ts (89%)
rename newback/src/data/{database => }/model/user.joined.info.model.ts (88%)
rename newback/src/data/{database => }/model/user.model.ts (88%)
rename newback/src/data/{database => }/model/user.profile.model.ts (93%)
rename newback/src/data/{database => }/model/user.settings.model.ts (96%)
rename newback/src/data/{database => }/model/verification.model.ts (94%)
delete mode 100644 newback/src/data/utils/helpers.ts
rename newback/src/modules/{util => app}/guards/captcha.guard.ts (90%)
rename newback/src/modules/{util => app}/interceptors/logging.interceptor.ts (100%)
rename newback/src/modules/{util => rest}/config/config.module.ts (81%)
rename newback/src/modules/{util => rest}/config/config.service.ts (100%)
create mode 100644 newback/src/modules/rest/database/database.module.ts
rename newback/src/{data => modules/rest}/database/repository/room.repository.ts (82%)
rename newback/src/{data => modules/rest}/database/repository/user.repository.ts (92%)
rename newback/src/modules/{util => rest}/email/email.module.ts (73%)
rename newback/src/modules/{util => rest}/email/email.service.spec.ts (89%)
rename newback/src/modules/{util => rest}/email/email.service.ts (94%)
rename newback/src/modules/{util => rest}/html/html.service.spec.ts (93%)
rename newback/src/modules/{util => rest}/html/html.service.ts (100%)
rename newback/src/modules/{util => rest}/http/http.module.ts (82%)
rename newback/src/modules/{util => rest}/http/http.service.ts (100%)
rename newback/src/modules/{util => rest}/logger/logger.module.ts (100%)
rename newback/src/{data => modules/rest}/redis/RedisService.ts (87%)
rename newback/src/{data => }/utils/consts.ts (100%)
rename newback/src/{data => }/utils/helpers.spec.ts (89%)
rename newback/src/{data/database/ormconfig.ts => utils/helpers.ts} (67%)
rename newback/src/{ => utils}/migration.runner.ts (87%)
diff --git a/newback/package.json b/newback/package.json
index 9aad1a885..44d6dac45 100644
--- a/newback/package.json
+++ b/newback/package.json
@@ -6,7 +6,7 @@
"license": "MIT",
"scripts": {
"generate-configs": "node-ts-config",
- "migrate": "ts-node -r tsconfig-paths/register ./src/migration.runner.ts ",
+ "migrate": "ts-node -r tsconfig-paths/register ./src/utils/migration.runner.ts ",
"build": "nest build",
"start": "nest start",
"test:debug": "jest --runInBand --coverage --detectOpenHandles --testTimeout=100000 --coverageReporters html",
diff --git a/newback/src/data/database/database.module.ts b/newback/src/data/database/database.module.ts
deleted file mode 100644
index 031edfdb8..000000000
--- a/newback/src/data/database/database.module.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import {Module} from '@nestjs/common';
-import {SequelizeModule} from '@nestjs/sequelize';
-
-import {generateConfig} from '@/data/database/ormconfig';
-import {ChannelModel} from '@/data/database/model/channel.model';
-import {ImageModel} from '@/data/database/model/image.model';
-import {IpAddressModel} from '@/data/database/model/ip.address.model';
-import {MessageHistoryModel} from '@/data/database/model/message.history.model';
-import {MessageModel} from '@/data/database/model/message.model';
-import {RoomModel} from '@/data/database/model/room.model';
-import {RoomUsersModel} from '@/data/database/model/room.users.model';
-import {MessageMentionModel} from '@/data/database/model/message.mention.model';
-import {SubscriptionMessageModel} from '@/data/database/model/subscription.message.model';
-import {SubscriptionModel} from '@/data/database/model/subscription.model';
-import {UploadedFileModel} from '@/data/database/model/uploaded.file.model';
-import {UserAuthModel} from '@/data/database/model/user.auth.model';
-import {UserJoinedInfoModel} from '@/data/database/model/user.joined.info.model';
-import {UserModel} from '@/data/database/model/user.model';
-import {UserProfileModel} from '@/data/database/model/user.profile.model';
-import {UserSettingsModel} from '@/data/database/model/user.settings.model';
-import {VerificationModel} from '@/data/database/model/verification.model';
-import {Logger} from '@nestjs/common/services/logger.service';
-import {UserRepository} from '@/data/database/repository/user.repository';
-import {RoomRepository} from '@/data/database/repository/room.repository';
-import {Sequelize} from 'sequelize-typescript';
-
-const repositories = [
- UserRepository,
- RoomRepository,
-];
-
-@Module({
- imports: [
- SequelizeModule.forRootAsync({
- inject: [Logger],
- useFactory: (logger: Logger) => generateConfig((sql) => logger.debug(sql, 'sql')),
- }),
- SequelizeModule.forFeature([
- ChannelModel,
- ImageModel,
- IpAddressModel,
- MessageHistoryModel,
- MessageMentionModel,
- MessageModel,
- RoomModel,
- RoomUsersModel,
- SubscriptionMessageModel,
- SubscriptionModel,
- UploadedFileModel,
- UserAuthModel,
- UserJoinedInfoModel,
- UserModel,
- UserProfileModel,
- UserSettingsModel,
- VerificationModel,
- ]),
- ],
- providers: [...repositories],
- exports: [
- SequelizeModule,
- ...repositories,
- ],
-})
-export class DatabaseModule {
-}
diff --git a/newback/src/data/database/model/channel.model.ts b/newback/src/data/model/channel.model.ts
similarity index 91%
rename from newback/src/data/database/model/channel.model.ts
rename to newback/src/data/model/channel.model.ts
index 025498e02..24a2cf5d8 100644
--- a/newback/src/data/database/model/channel.model.ts
+++ b/newback/src/data/model/channel.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
@Injectable()
diff --git a/newback/src/data/database/model/image.model.ts b/newback/src/data/model/image.model.ts
similarity index 95%
rename from newback/src/data/database/model/image.model.ts
rename to newback/src/data/model/image.model.ts
index c8232aa13..b58f1a85e 100644
--- a/newback/src/data/database/model/image.model.ts
+++ b/newback/src/data/model/image.model.ts
@@ -9,7 +9,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {ImageType} from '@/data/types/frontend';
-import {MessageModel} from '@/data/database/model/message.model';
+import {MessageModel} from '@/data/model/message.model';
const uniqueUserIdSymbMess = 'unique_image_symbol_message';
diff --git a/newback/src/data/database/model/ip.address.model.ts b/newback/src/data/model/ip.address.model.ts
similarity index 100%
rename from newback/src/data/database/model/ip.address.model.ts
rename to newback/src/data/model/ip.address.model.ts
diff --git a/newback/src/data/database/model/message.history.model.ts b/newback/src/data/model/message.history.model.ts
similarity index 92%
rename from newback/src/data/database/model/message.history.model.ts
rename to newback/src/data/model/message.history.model.ts
index 8d99046b8..829cf0431 100644
--- a/newback/src/data/database/model/message.history.model.ts
+++ b/newback/src/data/model/message.history.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {MessageModel} from '@/data/database/model/message.model';
+import {MessageModel} from '@/data/model/message.model';
@Injectable()
diff --git a/newback/src/data/database/model/message.mention.model.ts b/newback/src/data/model/message.mention.model.ts
similarity index 89%
rename from newback/src/data/database/model/message.mention.model.ts
rename to newback/src/data/model/message.mention.model.ts
index 9d09b435b..9a1c4c672 100644
--- a/newback/src/data/database/model/message.mention.model.ts
+++ b/newback/src/data/model/message.mention.model.ts
@@ -8,8 +8,8 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {MessageModel} from '@/data/database/model/message.model';
+import {UserModel} from '@/data/model/user.model';
+import {MessageModel} from '@/data/model/message.model';
const uniqueUserIdSymbMess = 'unique_message_mention_user_id_symbol_message_id';
diff --git a/newback/src/data/database/model/message.model.ts b/newback/src/data/model/message.model.ts
similarity index 92%
rename from newback/src/data/database/model/message.model.ts
rename to newback/src/data/model/message.model.ts
index c500fcd0f..cc2c5389f 100644
--- a/newback/src/data/database/model/message.model.ts
+++ b/newback/src/data/model/message.model.ts
@@ -8,8 +8,8 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {MessageStatus,} from '@/data/types/frontend';
-import {UserModel} from '@/data/database/model/user.model';
-import {RoomModel} from '@/data/database/model/room.model';
+import {UserModel} from '@/data/model/user.model';
+import {RoomModel} from '@/data/model/room.model';
@Injectable()
@Table({tableName: 'message'})
diff --git a/newback/src/data/database/model/room.model.ts b/newback/src/data/model/room.model.ts
similarity index 92%
rename from newback/src/data/database/model/room.model.ts
rename to newback/src/data/model/room.model.ts
index 0ff516521..c39bf1689 100644
--- a/newback/src/data/database/model/room.model.ts
+++ b/newback/src/data/model/room.model.ts
@@ -7,8 +7,8 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {ChannelModel} from '@/data/database/model/channel.model';
+import {UserModel} from '@/data/model/user.model';
+import {ChannelModel} from '@/data/model/channel.model';
// constraint admin_should_not_be_define_for_private_rooms
diff --git a/newback/src/data/database/model/room.users.model.ts b/newback/src/data/model/room.users.model.ts
similarity index 90%
rename from newback/src/data/database/model/room.users.model.ts
rename to newback/src/data/model/room.users.model.ts
index 7cca0dbd3..4e466015a 100644
--- a/newback/src/data/database/model/room.users.model.ts
+++ b/newback/src/data/model/room.users.model.ts
@@ -8,8 +8,8 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {RoomModel} from '@/data/database/model/room.model';
+import {UserModel} from '@/data/model/user.model';
+import {RoomModel} from '@/data/model/room.model';
const uniqueRoomUser = 'unique_room_user_room_id_user_id';
diff --git a/newback/src/data/database/model/subscription.message.model.ts b/newback/src/data/model/subscription.message.model.ts
similarity index 88%
rename from newback/src/data/database/model/subscription.message.model.ts
rename to newback/src/data/model/subscription.message.model.ts
index 5baea7833..b37cfba86 100644
--- a/newback/src/data/database/model/subscription.message.model.ts
+++ b/newback/src/data/model/subscription.message.model.ts
@@ -8,8 +8,8 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {MessageModel} from '@/data/database/model/message.model';
-import {SubscriptionModel} from '@/data/database/model/subscription.model';
+import {MessageModel} from '@/data/model/message.model';
+import {SubscriptionModel} from '@/data/model/subscription.model';
const uniqueSubscriptionMessage = 'unique_subscription_message_subscription_id_message_id';
diff --git a/newback/src/data/database/model/subscription.model.ts b/newback/src/data/model/subscription.model.ts
similarity index 89%
rename from newback/src/data/database/model/subscription.model.ts
rename to newback/src/data/model/subscription.model.ts
index 91f05e9f4..0a4dd0740 100644
--- a/newback/src/data/database/model/subscription.model.ts
+++ b/newback/src/data/model/subscription.model.ts
@@ -7,9 +7,9 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
import {UploadedFileChoices} from '@/data/types/frontend';
-import {IpAddressModel} from '@/data/database/model/ip.address.model';
+import {IpAddressModel} from '@/data/model/ip.address.model';
@Injectable()
@Table({tableName: 'subscription'})
diff --git a/newback/src/data/database/model/uploaded.file.model.ts b/newback/src/data/model/uploaded.file.model.ts
similarity index 94%
rename from newback/src/data/database/model/uploaded.file.model.ts
rename to newback/src/data/model/uploaded.file.model.ts
index 6e7ae357a..11942e414 100644
--- a/newback/src/data/database/model/uploaded.file.model.ts
+++ b/newback/src/data/model/uploaded.file.model.ts
@@ -8,7 +8,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {UploadedFileChoices} from '@/data/types/frontend';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
@Injectable()
@Table({tableName: 'uploaded_file'})
diff --git a/newback/src/data/database/model/user.auth.model.ts b/newback/src/data/model/user.auth.model.ts
similarity index 89%
rename from newback/src/data/database/model/user.auth.model.ts
rename to newback/src/data/model/user.auth.model.ts
index 5699919c3..cd6690988 100644
--- a/newback/src/data/database/model/user.auth.model.ts
+++ b/newback/src/data/model/user.auth.model.ts
@@ -7,8 +7,8 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {VerificationModel} from '@/data/database/model/verification.model';
+import {UserModel} from '@/data/model/user.model';
+import {VerificationModel} from '@/data/model/verification.model';
@Injectable()
@Table({tableName: 'user_auth'})
diff --git a/newback/src/data/database/model/user.joined.info.model.ts b/newback/src/data/model/user.joined.info.model.ts
similarity index 88%
rename from newback/src/data/database/model/user.joined.info.model.ts
rename to newback/src/data/model/user.joined.info.model.ts
index 51b4d7b95..5b664672a 100644
--- a/newback/src/data/database/model/user.joined.info.model.ts
+++ b/newback/src/data/model/user.joined.info.model.ts
@@ -8,8 +8,8 @@ import {
Unique,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
-import {IpAddressModel} from '@/data/database/model/ip.address.model';
+import {UserModel} from '@/data/model/user.model';
+import {IpAddressModel} from '@/data/model/ip.address.model';
const uniqueUserJoinedInfoUserIdIpId = 'unique_user_joined_info_user_id_ip_id';
diff --git a/newback/src/data/database/model/user.model.ts b/newback/src/data/model/user.model.ts
similarity index 88%
rename from newback/src/data/database/model/user.model.ts
rename to newback/src/data/model/user.model.ts
index f01f8114a..061f9d85d 100644
--- a/newback/src/data/database/model/user.model.ts
+++ b/newback/src/data/model/user.model.ts
@@ -7,8 +7,8 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {Gender} from '@/data/types/frontend';
-import {UserAuthModel} from '@/data/database/model/user.auth.model';
-import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
+import {UserAuthModel} from '@/data/model/user.auth.model';
+import {MAX_USERNAME_LENGTH} from '@/utils/consts';
@Injectable()
diff --git a/newback/src/data/database/model/user.profile.model.ts b/newback/src/data/model/user.profile.model.ts
similarity index 93%
rename from newback/src/data/database/model/user.profile.model.ts
rename to newback/src/data/model/user.profile.model.ts
index c7e605fc3..ff5e838c8 100644
--- a/newback/src/data/database/model/user.profile.model.ts
+++ b/newback/src/data/model/user.profile.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
@Injectable()
@Table({tableName: 'user_profile'})
diff --git a/newback/src/data/database/model/user.settings.model.ts b/newback/src/data/model/user.settings.model.ts
similarity index 96%
rename from newback/src/data/database/model/user.settings.model.ts
rename to newback/src/data/model/user.settings.model.ts
index 2f8dccad8..101c551a9 100644
--- a/newback/src/data/database/model/user.settings.model.ts
+++ b/newback/src/data/model/user.settings.model.ts
@@ -8,7 +8,7 @@ import {
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
import {Theme,} from '@/data/types/frontend';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
import {
LogLevel,
logLevels
diff --git a/newback/src/data/database/model/verification.model.ts b/newback/src/data/model/verification.model.ts
similarity index 94%
rename from newback/src/data/database/model/verification.model.ts
rename to newback/src/data/model/verification.model.ts
index 754523c39..993a2721a 100644
--- a/newback/src/data/database/model/verification.model.ts
+++ b/newback/src/data/model/verification.model.ts
@@ -7,7 +7,7 @@ import {
Table,
} from 'sequelize-typescript';
import {Injectable} from '@nestjs/common';
-import {UserModel} from '@/data/database/model/user.model';
+import {UserModel} from '@/data/model/user.model';
import {VerificationType} from '@/data/types/frontend';
@Injectable()
diff --git a/newback/src/data/utils/helpers.ts b/newback/src/data/utils/helpers.ts
deleted file mode 100644
index 09db2036e..000000000
--- a/newback/src/data/utils/helpers.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
-
-export function generateUserName(email: string) {
- return email.split('@')[0].replace(/[^0-9a-zA-Z-_]+/g, '-').substring(0, MAX_USERNAME_LENGTH);
-}
diff --git a/newback/src/modules/api/auth/auth.controller.ts b/newback/src/modules/api/auth/auth.controller.ts
index 6e16d1cfc..5ac8d8766 100644
--- a/newback/src/modules/api/auth/auth.controller.ts
+++ b/newback/src/modules/api/auth/auth.controller.ts
@@ -24,7 +24,7 @@ import {
ValidateUserResponse
} from '@/data/types/frontend';
import {GoogleAuthRequestValidator} from '@/modules/api/auth/validators/google.auth.reques.validator';
-import {CaptchaGuard} from '@/modules/util/guards/captcha.guard';
+import {CaptchaGuard} from '@/modules/app/guards/captcha.guard';
import {ValidateEmailRequestValidator} from '@/modules/api/auth/validators/validate.email.request.validator';
import {FacebookAuthRequestValidator} from '@/modules/api/auth/validators/facebook.auth.request.validator';
import {SendRestorePasswordValidator} from '@/modules/api/auth/validators/send.restore.password.validator';
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index 2c4eb11bc..958d59688 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -7,24 +7,24 @@ import * as supertest from 'supertest';
import {Test} from '@nestjs/testing';
import {AuthService} from '@/modules/api/auth/auth.service';
import {AuthController} from '@/modules/api/auth/auth.controller';
-import {LoggerModule} from '@/modules/util/logger/logger.module';
+import {LoggerModule} from '@/modules/rest/logger/logger.module';
import {PasswordService} from '@/modules/api/auth/password.service';
-import {UserRepository} from '@/data/database/repository/user.repository';
-import {RoomRepository} from '@/data/database/repository/room.repository';
-import {RedisService} from '@/data/redis/RedisService';
-import {EmailService} from '@/modules/util/email/email.service';
+import {UserRepository} from '@/modules/rest/database/repository/user.repository';
+import {RoomRepository} from '@/modules/rest/database/repository/room.repository';
+import {RedisService} from '@/modules/rest/redis/RedisService';
+import {EmailService} from '@/modules/rest/email/email.service';
import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
-import {HtmlService} from '@/modules/util/html/html.service';
+import {HtmlService} from '@/modules/rest/html/html.service';
import waitForExpect from "wait-for-expect";
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {OAuth2Client} from 'google-auth-library';
-import {HttpService} from '@/modules/util/http/http.service';
+import {HttpService} from '@/modules/rest/http/http.service';
import fetch from 'node-fetch';
import * as googleResponseFixture from '@/fixtures/google.response.fixture.json';
import * as facebookGetTokenResponseFixture from '@/fixtures/facebook.get.token.response.json';
import * as facebookGetUserResponseFixture from '@/fixtures/facebook.get.user.response.json';
-import {ConfigService} from '@/modules/util/config/config.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
import {
config,
IConfig
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
index 0e5102ae7..ee113ac9a 100644
--- a/newback/src/modules/api/auth/auth.module.ts
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -4,16 +4,16 @@ import {
} from '@nestjs/common';
import {AuthController} from '@/modules/api/auth/auth.controller';
import {AuthService} from '@/modules/api/auth/auth.service';
-import {DatabaseModule} from '@/data/database/database.module';
-import {RedisService} from '@/data/redis/RedisService';
-import {EmailModule} from '@/modules/util/email/email.module';
+import {DatabaseModule} from '@/modules/rest/database/database.module';
+import {RedisService} from '@/modules/rest/redis/RedisService';
+import {EmailModule} from '@/modules/rest/email/email.module';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {PasswordService} from '@/modules/api/auth/password.service';
import {OAuth2Client} from 'google-auth-library';
import {config} from 'node-ts-config';
-import {HttpModule} from '@/modules/util/http/http.module';
+import {HttpModule} from '@/modules/rest/http/http.module';
import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
-import {ConfigService} from '@/modules/util/config/config.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
@Module({
imports: [DatabaseModule, EmailModule, HttpModule],
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index 6b7f4fe50..bb7ccad72 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -5,7 +5,7 @@ import {
Logger,
UnauthorizedException
} from '@nestjs/common';
-import {UserRepository} from '@/data/database/repository/user.repository';
+import {UserRepository} from '@/modules/rest/database/repository/user.repository';
import {PasswordService} from '@/modules/api/auth/password.service';
import {
AcceptTokenRequest,
@@ -25,21 +25,21 @@ import {
VerificationType,
VerifyTokenResponse
} from '@/data/types/frontend';
-import {RoomRepository} from '@/data/database/repository/room.repository';
+import {RoomRepository} from '@/modules/rest/database/repository/room.repository';
import {
ALL_ROOM_ID,
MAX_USERNAME_LENGTH
-} from '@/data/utils/consts';
-import {RedisService} from '@/data/redis/RedisService';
-import {EmailService} from '@/modules/util/email/email.service';
+} from '@/utils/consts';
+import {RedisService} from '@/modules/rest/redis/RedisService';
+import {EmailService} from '@/modules/rest/email/email.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {TokenPayload} from 'google-auth-library';
-import {generateUserName} from '@/data/utils/helpers';
+import {generateUserName} from '@/utils/helpers';
import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
import {FacebookGetUserResponse} from '@/data/types/api';
-import {VerificationModel} from '@/data/database/model/verification.model';
+import {VerificationModel} from '@/data/model/verification.model';
@Injectable()
export class AuthService {
diff --git a/newback/src/modules/api/auth/facebook.auth.service.ts b/newback/src/modules/api/auth/facebook.auth.service.ts
index 23da497f3..c47790d32 100644
--- a/newback/src/modules/api/auth/facebook.auth.service.ts
+++ b/newback/src/modules/api/auth/facebook.auth.service.ts
@@ -6,8 +6,8 @@ import {
Logger,
ServiceUnavailableException,
} from '@nestjs/common';
-import {HttpService} from '@/modules/util/http/http.service';
-import {ConfigService} from '@/modules/util/config/config.service';
+import {HttpService} from '@/modules/rest/http/http.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
import {FacebookGetUserResponse} from '@/data/types/api';
@Injectable()
diff --git a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
index ebebb89cf..da1a6d4a2 100644
--- a/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/sign.up.request.validator.ts
@@ -11,7 +11,7 @@ import {
Gender,
SignUpRequest,
} from '@/data/types/frontend';
-import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
+import {MAX_USERNAME_LENGTH} from '@/utils/consts';
export class SignUpRequestValidator implements SignUpRequest {
diff --git a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
index 777323f73..b8ccae791 100644
--- a/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
+++ b/newback/src/modules/api/auth/validators/validate.user.request.validator.ts
@@ -4,7 +4,7 @@ import {
Matches,
} from 'class-validator';
import {ValidateUserRequest} from '@/data/types/frontend';
-import {MAX_USERNAME_LENGTH} from '@/data/utils/consts';
+import {MAX_USERNAME_LENGTH} from '@/utils/consts';
export class ValidateUserRequestValidator implements ValidateUserRequest {
@IsString()
diff --git a/newback/src/modules/app/app.module.ts b/newback/src/modules/app/app.module.ts
index 0840b59e9..3ff0cb811 100644
--- a/newback/src/modules/app/app.module.ts
+++ b/newback/src/modules/app/app.module.ts
@@ -1,14 +1,14 @@
import {Module} from '@nestjs/common';
import {AuthModule} from '@/modules/api/auth/auth.module';
-import {LoggingInterceptor} from '@/modules/util/interceptors/logging.interceptor';
+import {LoggingInterceptor} from '@/modules/app/interceptors/logging.interceptor';
import {
APP_INTERCEPTOR,
RouterModule
} from '@nestjs/core';
-import {LoggerModule} from '@/modules/util/logger/logger.module';
+import {LoggerModule} from '@/modules/rest/logger/logger.module';
import {RedisModule} from '@nestjs-modules/ioredis';
import {config} from 'node-ts-config';
-import {ConfigModule} from '@/modules/util/config/config.module';
+import {ConfigModule} from '@/modules/rest/config/config.module';
@Module({
imports: [AuthModule, LoggerModule, ConfigModule, RedisModule.forRoot({
diff --git a/newback/src/modules/util/guards/captcha.guard.ts b/newback/src/modules/app/guards/captcha.guard.ts
similarity index 90%
rename from newback/src/modules/util/guards/captcha.guard.ts
rename to newback/src/modules/app/guards/captcha.guard.ts
index d49c5e8cb..c123b7dd5 100644
--- a/newback/src/modules/util/guards/captcha.guard.ts
+++ b/newback/src/modules/app/guards/captcha.guard.ts
@@ -12,8 +12,8 @@ import {
Recaptcha
} from 'node-ts-config';
-import {ConfigService} from '@/modules/util/config/config.service';
-import {HttpService} from '@/modules/util/http/http.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
+import {HttpService} from '@/modules/rest/http/http.service';
@Injectable()
export class CaptchaGuard implements CanActivate {
constructor(
diff --git a/newback/src/modules/util/interceptors/logging.interceptor.ts b/newback/src/modules/app/interceptors/logging.interceptor.ts
similarity index 100%
rename from newback/src/modules/util/interceptors/logging.interceptor.ts
rename to newback/src/modules/app/interceptors/logging.interceptor.ts
diff --git a/newback/src/modules/util/config/config.module.ts b/newback/src/modules/rest/config/config.module.ts
similarity index 81%
rename from newback/src/modules/util/config/config.module.ts
rename to newback/src/modules/rest/config/config.module.ts
index 162de8b24..0a3a6e7e3 100644
--- a/newback/src/modules/util/config/config.module.ts
+++ b/newback/src/modules/rest/config/config.module.ts
@@ -2,7 +2,7 @@ import {
Global,
Module
} from '@nestjs/common';
-import {ConfigService} from '@/modules/util/config/config.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
import {config} from 'node-ts-config';
@Global()
diff --git a/newback/src/modules/util/config/config.service.ts b/newback/src/modules/rest/config/config.service.ts
similarity index 100%
rename from newback/src/modules/util/config/config.service.ts
rename to newback/src/modules/rest/config/config.service.ts
diff --git a/newback/src/modules/rest/database/database.module.ts b/newback/src/modules/rest/database/database.module.ts
new file mode 100644
index 000000000..242246c5a
--- /dev/null
+++ b/newback/src/modules/rest/database/database.module.ts
@@ -0,0 +1,64 @@
+import {Module} from '@nestjs/common';
+import {SequelizeModule} from '@nestjs/sequelize';
+
+import {generateOrmConfig} from '@/utils/helpers';
+import {ChannelModel} from '@/data/model/channel.model';
+import {ImageModel} from '@/data/model/image.model';
+import {IpAddressModel} from '@/data/model/ip.address.model';
+import {MessageHistoryModel} from '@/data/model/message.history.model';
+import {MessageModel} from '@/data/model/message.model';
+import {RoomModel} from '@/data/model/room.model';
+import {RoomUsersModel} from '@/data/model/room.users.model';
+import {MessageMentionModel} from '@/data/model/message.mention.model';
+import {SubscriptionMessageModel} from '@/data/model/subscription.message.model';
+import {SubscriptionModel} from '@/data/model/subscription.model';
+import {UploadedFileModel} from '@/data/model/uploaded.file.model';
+import {UserAuthModel} from '@/data/model/user.auth.model';
+import {UserJoinedInfoModel} from '@/data/model/user.joined.info.model';
+import {UserModel} from '@/data/model/user.model';
+import {UserProfileModel} from '@/data/model/user.profile.model';
+import {UserSettingsModel} from '@/data/model/user.settings.model';
+import {VerificationModel} from '@/data/model/verification.model';
+import {Logger} from '@nestjs/common/services/logger.service';
+import {UserRepository} from '@/modules/rest/database/repository/user.repository';
+import {RoomRepository} from '@/modules/rest/database/repository/room.repository';
+
+const repositories = [
+ UserRepository,
+ RoomRepository,
+];
+
+@Module({
+ imports: [
+ SequelizeModule.forRootAsync({
+ inject: [Logger],
+ useFactory: (logger: Logger) => generateOrmConfig((sql) => logger.debug(sql, 'sql')),
+ }),
+ SequelizeModule.forFeature([
+ ChannelModel,
+ ImageModel,
+ IpAddressModel,
+ MessageHistoryModel,
+ MessageMentionModel,
+ MessageModel,
+ RoomModel,
+ RoomUsersModel,
+ SubscriptionMessageModel,
+ SubscriptionModel,
+ UploadedFileModel,
+ UserAuthModel,
+ UserJoinedInfoModel,
+ UserModel,
+ UserProfileModel,
+ UserSettingsModel,
+ VerificationModel,
+ ]),
+ ],
+ providers: [...repositories],
+ exports: [
+ SequelizeModule,
+ ...repositories,
+ ],
+})
+export class DatabaseModule {
+}
diff --git a/newback/src/data/database/repository/room.repository.ts b/newback/src/modules/rest/database/repository/room.repository.ts
similarity index 82%
rename from newback/src/data/database/repository/room.repository.ts
rename to newback/src/modules/rest/database/repository/room.repository.ts
index 633d6f3e6..b715d0818 100644
--- a/newback/src/data/database/repository/room.repository.ts
+++ b/newback/src/modules/rest/database/repository/room.repository.ts
@@ -1,7 +1,7 @@
import {Injectable} from '@nestjs/common';
import {InjectModel} from '@nestjs/sequelize';
-import {RoomModel} from '@/data/database/model/room.model';
-import {RoomUsersModel} from '@/data/database/model/room.users.model';
+import {RoomModel} from '@/data/model/room.model';
+import {RoomUsersModel} from '@/data/model/room.users.model';
import {Transaction} from 'sequelize';
diff --git a/newback/src/data/database/repository/user.repository.ts b/newback/src/modules/rest/database/repository/user.repository.ts
similarity index 92%
rename from newback/src/data/database/repository/user.repository.ts
rename to newback/src/modules/rest/database/repository/user.repository.ts
index fca146f49..c46e55c11 100644
--- a/newback/src/data/database/repository/user.repository.ts
+++ b/newback/src/modules/rest/database/repository/user.repository.ts
@@ -1,14 +1,14 @@
import {Injectable} from '@nestjs/common';
import {InjectModel} from '@nestjs/sequelize';
-import {UserModel} from '@/data/database/model/user.model';
-import {UserAuthModel} from '@/data/database/model/user.auth.model';
+import {UserModel} from '@/data/model/user.model';
+import {UserAuthModel} from '@/data/model/user.auth.model';
import {
Gender,
VerificationType
} from '@/data/types/frontend';
-import {UserProfileModel} from '@/data/database/model/user.profile.model';
-import {UserSettingsModel} from '@/data/database/model/user.settings.model';
-import {VerificationModel} from '@/data/database/model/verification.model';
+import {UserProfileModel} from '@/data/model/user.profile.model';
+import {UserSettingsModel} from '@/data/model/user.settings.model';
+import {VerificationModel} from '@/data/model/verification.model';
import {Transaction} from 'sequelize';
diff --git a/newback/src/modules/util/email/email.module.ts b/newback/src/modules/rest/email/email.module.ts
similarity index 73%
rename from newback/src/modules/util/email/email.module.ts
rename to newback/src/modules/rest/email/email.module.ts
index a9ecbf9f2..f7a7d8d2e 100644
--- a/newback/src/modules/util/email/email.module.ts
+++ b/newback/src/modules/rest/email/email.module.ts
@@ -1,8 +1,8 @@
import {Module} from '@nestjs/common';
import {MailerModule} from '@nestjs-modules/mailer';
import {config} from 'node-ts-config';
-import {EmailService} from '@/modules/util/email/email.service';
-import {HtmlService} from '@/modules/util/html/html.service';
+import {EmailService} from '@/modules/rest/email/email.service';
+import {HtmlService} from '@/modules/rest/html/html.service';
@Module({
diff --git a/newback/src/modules/util/email/email.service.spec.ts b/newback/src/modules/rest/email/email.service.spec.ts
similarity index 89%
rename from newback/src/modules/util/email/email.service.spec.ts
rename to newback/src/modules/rest/email/email.service.spec.ts
index cb46d50d4..4a41df099 100644
--- a/newback/src/modules/util/email/email.service.spec.ts
+++ b/newback/src/modules/rest/email/email.service.spec.ts
@@ -1,12 +1,12 @@
-import {HtmlService} from '@/modules/util/html/html.service';
-import {EmailService} from '@/modules/util/email/email.service';
+import {HtmlService} from '@/modules/rest/html/html.service';
+import {EmailService} from '@/modules/rest/email/email.service';
import {
Test,
TestingModule
} from '@nestjs/testing';
-import {LoggerModule} from '@/modules/util/logger/logger.module';
+import {LoggerModule} from '@/modules/rest/logger/logger.module';
import {MailerService} from '@nestjs-modules/mailer';
-import {ConfigModule} from '@/modules/util/config/config.module';
+import {ConfigModule} from '@/modules/rest/config/config.module';
import {promisify} from 'util';
import {readFile} from 'fs';
import {resolve} from 'path';
diff --git a/newback/src/modules/util/email/email.service.ts b/newback/src/modules/rest/email/email.service.ts
similarity index 94%
rename from newback/src/modules/util/email/email.service.ts
rename to newback/src/modules/rest/email/email.service.ts
index b37515c53..702455f80 100644
--- a/newback/src/modules/util/email/email.service.ts
+++ b/newback/src/modules/rest/email/email.service.ts
@@ -2,9 +2,9 @@ import {
Injectable,
Logger
} from '@nestjs/common';
-import {HtmlService} from '@/modules/util/html/html.service';
+import {HtmlService} from '@/modules/rest/html/html.service';
import {MailerService} from '@nestjs-modules/mailer';
-import {ConfigService} from '@/modules/util/config/config.service';
+import {ConfigService} from '@/modules/rest/config/config.service';
@Injectable()
export class EmailService {
diff --git a/newback/src/modules/util/html/html.service.spec.ts b/newback/src/modules/rest/html/html.service.spec.ts
similarity index 93%
rename from newback/src/modules/util/html/html.service.spec.ts
rename to newback/src/modules/rest/html/html.service.spec.ts
index 7641e3179..92d322ab6 100644
--- a/newback/src/modules/util/html/html.service.spec.ts
+++ b/newback/src/modules/rest/html/html.service.spec.ts
@@ -1,4 +1,4 @@
-import {HtmlService} from '@/modules/util/html/html.service';
+import {HtmlService} from '@/modules/rest/html/html.service';
describe('HtmlService', () => {
diff --git a/newback/src/modules/util/html/html.service.ts b/newback/src/modules/rest/html/html.service.ts
similarity index 100%
rename from newback/src/modules/util/html/html.service.ts
rename to newback/src/modules/rest/html/html.service.ts
diff --git a/newback/src/modules/util/http/http.module.ts b/newback/src/modules/rest/http/http.module.ts
similarity index 82%
rename from newback/src/modules/util/http/http.module.ts
rename to newback/src/modules/rest/http/http.module.ts
index 723b73e0c..60797b738 100644
--- a/newback/src/modules/util/http/http.module.ts
+++ b/newback/src/modules/rest/http/http.module.ts
@@ -3,7 +3,7 @@ import {
Logger,
Module
} from '@nestjs/common';
-import {HttpService} from '@/modules/util/http/http.service';
+import {HttpService} from '@/modules/rest/http/http.service';
import fetch from 'node-fetch';
@Global()
diff --git a/newback/src/modules/util/http/http.service.ts b/newback/src/modules/rest/http/http.service.ts
similarity index 100%
rename from newback/src/modules/util/http/http.service.ts
rename to newback/src/modules/rest/http/http.service.ts
diff --git a/newback/src/modules/util/logger/logger.module.ts b/newback/src/modules/rest/logger/logger.module.ts
similarity index 100%
rename from newback/src/modules/util/logger/logger.module.ts
rename to newback/src/modules/rest/logger/logger.module.ts
diff --git a/newback/src/data/redis/RedisService.ts b/newback/src/modules/rest/redis/RedisService.ts
similarity index 87%
rename from newback/src/data/redis/RedisService.ts
rename to newback/src/modules/rest/redis/RedisService.ts
index f41a3daec..56fa6aa74 100644
--- a/newback/src/data/redis/RedisService.ts
+++ b/newback/src/modules/rest/redis/RedisService.ts
@@ -1,5 +1,5 @@
import {Injectable} from '@nestjs/common';
-import {REDIS_SESSIONS_KEY} from '@/data/utils/consts';
+import {REDIS_SESSIONS_KEY} from '@/utils/consts';
import {
InjectRedis,
Redis
diff --git a/newback/src/data/utils/consts.ts b/newback/src/utils/consts.ts
similarity index 100%
rename from newback/src/data/utils/consts.ts
rename to newback/src/utils/consts.ts
diff --git a/newback/src/data/utils/helpers.spec.ts b/newback/src/utils/helpers.spec.ts
similarity index 89%
rename from newback/src/data/utils/helpers.spec.ts
rename to newback/src/utils/helpers.spec.ts
index ec5289dc0..18df68d2f 100644
--- a/newback/src/data/utils/helpers.spec.ts
+++ b/newback/src/utils/helpers.spec.ts
@@ -1,4 +1,4 @@
-import {generateUserName} from '@/data/utils/helpers';
+import {generateUserName} from '@/utils/helpers';
describe('helper', () => {
diff --git a/newback/src/data/database/ormconfig.ts b/newback/src/utils/helpers.ts
similarity index 67%
rename from newback/src/data/database/ormconfig.ts
rename to newback/src/utils/helpers.ts
index 926977471..bcfdce6fd 100644
--- a/newback/src/data/database/ormconfig.ts
+++ b/newback/src/utils/helpers.ts
@@ -1,8 +1,12 @@
import type {SequelizeModuleOptions} from '@nestjs/sequelize';
-import {config} from 'node-ts-config';
+import {MAX_USERNAME_LENGTH} from '@/utils/consts';
+import {config} from 'node-ts-config';
-export function generateConfig(logging: ((sql: string) => void)): Omit {
+export function generateUserName(email: string) {
+ return email.split('@')[0].replace(/[^0-9a-zA-Z-_]+/g, '-').substring(0, MAX_USERNAME_LENGTH);
+}
+export function generateOrmConfig(logging: ((sql: string) => void)): Omit {
return {
synchronize: config.mysql.synchronize,
logging: config.mysql.logging ? logging : false,
diff --git a/newback/src/migration.runner.ts b/newback/src/utils/migration.runner.ts
similarity index 87%
rename from newback/src/migration.runner.ts
rename to newback/src/utils/migration.runner.ts
index fc706e3d1..1ea2d205d 100644
--- a/newback/src/migration.runner.ts
+++ b/newback/src/utils/migration.runner.ts
@@ -1,11 +1,11 @@
import {createConnection} from 'mysql2';
-import {generateConfig} from '@/data/database/ormconfig';
+import {generateOrmConfig} from '@/utils/helpers';
import {
CommandsRunner,
MysqlDriver
} from 'node-db-migration';
-const {database, host, password, port, username, define} = generateConfig((sql) => console.log(sql))
+const {database, host, password, port, username, define} = generateOrmConfig((sql) => console.log(sql))
const connection = createConnection({
database,
From 43b3b92fbb54885dd537a7dc48ea2fa91d0f6515 Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 16:43:15 +0300
Subject: [PATCH 033/221] Fixed migration sql
---
.../config/migration-template/202204110326-init.sql | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
index 0e2feb71a..f7dc3af51 100644
--- a/newback/config/migration-template/202204110326-init.sql
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -18,7 +18,7 @@ CREATE TABLE `channel`
(
`id` INTEGER auto_increment,
`name` VARCHAR(16) NOT NULL,
- `creator_id` INTEGER,
+ `creator_id` INTEGER NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
`deleted_at` DATETIME,
@@ -91,6 +91,7 @@ CREATE TABLE `ip_address`
(
`id` INTEGER auto_increment,
`ip` VARCHAR(32) NOT NULL UNIQUE,
+ `status` TINYINT(1) NOT NULL DEFAULT true,
`isp` VARCHAR(255),
`country_code` VARCHAR(16),
`country` VARCHAR(64),
@@ -287,3 +288,11 @@ CREATE TABLE `user_settings`
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci;
+
+INSERT INTO user (id, last_time_online, username, sex, thumbnail, created_at, updated_at, deleted_at) VALUES (1, '2022-04-13 13:37:37', '1', 'OTHER', null, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
+INSERT INTO channel (id, name, creator_id, created_at, updated_at, deleted_at) VALUES (1, 'all', 1, '2022-04-13 16:32:11', '2022-04-13 16:32:09', null);
+INSERT INTO room (id, name, is_main_in_channel, p2p, channel_id, creator_id, created_at, updated_at, deleted_at) VALUES (1, null, 1, DEFAULT, 1, 1, '2022-04-13 16:35:16', '2022-04-13 16:35:20', null)
+INSERT INTO user_profile (id, name, city, surname, birthday, contacts, created_at, updated_at, deleted_at) VALUES (1, null, null, null, null, null, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
+INSERT INTO user_auth (id, password, email, facebook_id, google_id, email_verification_id, created_at, updated_at, deleted_at) VALUES (1, '$2b$10$8RTcHp1.oCEYGiPgLbTHH.Fk8MC6YUySzJ8AxGFxnjFqb.zsdlH7m', 'deathangel908@gmail.com', null, null, 1, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
+INSERT INTO user_settings (id, suggestions, show_when_im_typing, embedded_youtube, highlight_code, message_sound, incoming_file_call_sound, online_change_messages, devtools_logs, theme, created_at, updated_at, deleted_at) VALUES (1, 1, 1, 1, 1, 0, 0, 0, 'error', 'COLOR_REG', '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
+INSERT INTO room_user (id, room_id, user_id, volume, notifications, created_at, updated_at, deleted_at) VALUES (1, 1, 1, 2, 0, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
From a2ce340642d48bec6b77b8a62e9415337e1ec5ad Mon Sep 17 00:00:00 2001
From: akoidan
Date: Wed, 13 Apr 2022 17:02:59 +0300
Subject: [PATCH 034/221] Fixed migrati
---
frontend/src/vue/auth/SignUp.vue | 6 +-
newback/config/Config.d.ts | 10 ++-
newback/config/default.json | 3 -
.../migration-template/202204110326-init.sql | 6 +-
newback/src/data/model/channel.model.ts | 2 +-
newback/src/data/model/ip.address.model.ts | 7 ++
newback/src/data/model/room.model.ts | 4 +-
newback/src/data/types/api.ts | 24 +++++++
newback/src/fixtures/ip.134.249.113.11.json | 16 +++++
.../src/modules/api/auth/auth.module.spec.ts | 2 +-
newback/src/modules/api/auth/auth.module.ts | 5 +-
newback/src/modules/api/auth/auth.service.ts | 11 ++-
.../modules/rest/database/database.module.ts | 2 +
.../rest/database/repository/ip.repository.ts | 27 ++++++++
newback/src/modules/rest/http/http.service.ts | 2 +-
.../src/modules/rest/ip/ip.cache.service.ts | 68 +++++++++++++++++++
newback/src/modules/rest/ip/ip.module.ts | 17 +++++
.../modules/rest/ip/ip.service.e2e.spec.ts | 47 +++++++++++++
newback/src/modules/rest/ip/ip.service.ts | 45 ++++++++++++
.../{RedisService.ts => redis.service.ts} | 0
newback/src/utils/helpers.ts | 7 +-
newback/src/utils/migration.runner.ts | 3 +-
22 files changed, 285 insertions(+), 29 deletions(-)
create mode 100644 newback/src/fixtures/ip.134.249.113.11.json
create mode 100644 newback/src/modules/rest/database/repository/ip.repository.ts
create mode 100644 newback/src/modules/rest/ip/ip.cache.service.ts
create mode 100644 newback/src/modules/rest/ip/ip.module.ts
create mode 100644 newback/src/modules/rest/ip/ip.service.e2e.spec.ts
create mode 100644 newback/src/modules/rest/ip/ip.service.ts
rename newback/src/modules/rest/redis/{RedisService.ts => redis.service.ts} (100%)
diff --git a/frontend/src/vue/auth/SignUp.vue b/frontend/src/vue/auth/SignUp.vue
index 09c698d6e..b401384ee 100644
--- a/frontend/src/vue/auth/SignUp.vue
+++ b/frontend/src/vue/auth/SignUp.vue
@@ -330,7 +330,7 @@ export default class SignUp extends Vue {
sexFoc: boolean = true;
- sex: string = Gender.OTHER;
+ sex: Gender = Gender.OTHER;
sexDescription: string = "Need a help?";
@@ -355,8 +355,8 @@ export default class SignUp extends Vue {
const {session} = await this.$api.signUp({
username: this.username,
password: this.password,
- email: this.email,
-
+ email: this.email || undefined, // undefined is not sending via json.stringify
+ sex: this.sex,
});
const message: LoginMessage = {
action: "login",
diff --git a/newback/config/Config.d.ts b/newback/config/Config.d.ts
index 0a75c345e..0b63fae9b 100644
--- a/newback/config/Config.d.ts
+++ b/newback/config/Config.d.ts
@@ -15,13 +15,12 @@ declare module "node-ts-config" {
interface Email {
host: string
port: number
+ secure: boolean
auth: Auth2
- from: string
}
interface Auth2 {
- type: string
user: string
- password: string
+ pass: string
}
interface Recaptcha {
publicKey: string
@@ -38,13 +37,13 @@ declare module "node-ts-config" {
clientId: string
}
interface Mysql {
- synchronize: boolean
- logging: boolean
host: string
port: number
username: string
password: string
database: string
+ synchronize: boolean
+ logging: boolean
}
interface Frontend {
address: string
@@ -68,7 +67,6 @@ declare module "node-ts-config" {
allRoomId: number
showCountryCode: boolean
firebaseUrl: string
- ipApiUrl: string
pingCloseJsDelay: number
pingInterval: number
clientNoServerPingCloseTimeout: number
diff --git a/newback/config/default.json b/newback/config/default.json
index 93a0d6f24..298b5a210 100644
--- a/newback/config/default.json
+++ b/newback/config/default.json
@@ -14,7 +14,6 @@
"allRoomId": 1,
"showCountryCode": false,
"firebaseUrl": "https://fcm.googleapis.com/fcm/send",
- "ipApiUrl": "http://ip-api.com/json/%s",
"pingCloseJsDelay": 10000,
"pingInterval": 300000,
"clientNoServerPingCloseTimeout": 320000
@@ -35,8 +34,6 @@
}
},
"mysql": {
- "synchronize": false,
- "logging": true,
"host": "localhost",
"port": 3306,
"username": "pychat",
diff --git a/newback/config/migration-template/202204110326-init.sql b/newback/config/migration-template/202204110326-init.sql
index f7dc3af51..38666e7b6 100644
--- a/newback/config/migration-template/202204110326-init.sql
+++ b/newback/config/migration-template/202204110326-init.sql
@@ -23,7 +23,7 @@ CREATE TABLE `channel`
`updated_at` DATETIME NOT NULL,
`deleted_at` DATETIME,
PRIMARY KEY (`id`),
- FOREIGN KEY (`creator_id`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
+ FOREIGN KEY (`creator_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci;
@@ -291,8 +291,8 @@ CREATE TABLE `user_settings`
INSERT INTO user (id, last_time_online, username, sex, thumbnail, created_at, updated_at, deleted_at) VALUES (1, '2022-04-13 13:37:37', '1', 'OTHER', null, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
INSERT INTO channel (id, name, creator_id, created_at, updated_at, deleted_at) VALUES (1, 'all', 1, '2022-04-13 16:32:11', '2022-04-13 16:32:09', null);
-INSERT INTO room (id, name, is_main_in_channel, p2p, channel_id, creator_id, created_at, updated_at, deleted_at) VALUES (1, null, 1, DEFAULT, 1, 1, '2022-04-13 16:35:16', '2022-04-13 16:35:20', null)
+INSERT INTO room (id, name, is_main_in_channel, p2p, channel_id, creator_id, created_at, updated_at, deleted_at) VALUES (1, 'all', 1, DEFAULT, 1, 1, '2022-04-13 16:35:16', '2022-04-13 16:35:20', null);
INSERT INTO user_profile (id, name, city, surname, birthday, contacts, created_at, updated_at, deleted_at) VALUES (1, null, null, null, null, null, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
-INSERT INTO user_auth (id, password, email, facebook_id, google_id, email_verification_id, created_at, updated_at, deleted_at) VALUES (1, '$2b$10$8RTcHp1.oCEYGiPgLbTHH.Fk8MC6YUySzJ8AxGFxnjFqb.zsdlH7m', 'deathangel908@gmail.com', null, null, 1, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
+INSERT INTO user_auth (id, password, email, facebook_id, google_id, email_verification_id, created_at, updated_at, deleted_at) VALUES (1, '$2b$10$8RTcHp1.oCEYGiPgLbTHH.Fk8MC6YUySzJ8AxGFxnjFqb.zsdlH7m', 'deathangel908@gmail.com', null, null, null, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
INSERT INTO user_settings (id, suggestions, show_when_im_typing, embedded_youtube, highlight_code, message_sound, incoming_file_call_sound, online_change_messages, devtools_logs, theme, created_at, updated_at, deleted_at) VALUES (1, 1, 1, 1, 1, 0, 0, 0, 'error', 'COLOR_REG', '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
INSERT INTO room_user (id, room_id, user_id, volume, notifications, created_at, updated_at, deleted_at) VALUES (1, 1, 1, 2, 0, '2022-04-13 13:37:37', '2022-04-13 13:37:37', null);
diff --git a/newback/src/data/model/channel.model.ts b/newback/src/data/model/channel.model.ts
index 24a2cf5d8..ab3a380ec 100644
--- a/newback/src/data/model/channel.model.ts
+++ b/newback/src/data/model/channel.model.ts
@@ -28,7 +28,7 @@ export class ChannelModel extends Model {
@ForeignKey(() => UserModel)
@Column({
- allowNull: true, // main room no id
+ allowNull: false,
type: DataType.INTEGER,
})
public creatorId: number;
diff --git a/newback/src/data/model/ip.address.model.ts b/newback/src/data/model/ip.address.model.ts
index 64a2333b8..ebf5b450a 100644
--- a/newback/src/data/model/ip.address.model.ts
+++ b/newback/src/data/model/ip.address.model.ts
@@ -24,6 +24,13 @@ export class IpAddressModel extends Model {
})
public ip: string;
+ @Column({
+ type: DataType.BOOLEAN,
+ defaultValue: true,
+ allowNull: false,
+ })
+ public status: boolean;
+
@Column({
type: DataType.STRING,
allowNull: true,
diff --git a/newback/src/data/model/room.model.ts b/newback/src/data/model/room.model.ts
index c39bf1689..d75a35f93 100644
--- a/newback/src/data/model/room.model.ts
+++ b/newback/src/data/model/room.model.ts
@@ -66,8 +66,8 @@ export class RoomModel extends Model {
allowNull: true,
defaultValue: null,
})
- public creatorId: number;
+ public creatorId: number|null;
@BelongsTo(() => UserModel)
- public creator: UserModel;
+ public creator: UserModel|null;
}
diff --git a/newback/src/data/types/api.ts b/newback/src/data/types/api.ts
index e161dc05e..e2fc2891a 100644
--- a/newback/src/data/types/api.ts
+++ b/newback/src/data/types/api.ts
@@ -3,3 +3,27 @@ export interface FacebookGetUserResponse {
last_name: string;
id: string;
}
+
+export interface IpFailedInfoResponse {
+ message: string;
+ status: 'fail';
+}
+export const IP_FAIL = 'fail';
+
+export interface IpSuccessInfoResponse {
+ status: 'success';
+ country: string;
+ countryCode: string;
+ region: string;
+ regionName: string;
+ city: string;
+ zip: string;
+ lat: number;
+ lon: number;
+ timezone: string;
+ isp: string;
+ org: string;
+ as: string;
+ query: string;
+}
+export type IpInfoResponse = IpFailedInfoResponse | IpSuccessInfoResponse;
diff --git a/newback/src/fixtures/ip.134.249.113.11.json b/newback/src/fixtures/ip.134.249.113.11.json
new file mode 100644
index 000000000..a769f3526
--- /dev/null
+++ b/newback/src/fixtures/ip.134.249.113.11.json
@@ -0,0 +1,16 @@
+{
+ "status": "success",
+ "country": "Ukraine",
+ "countryCode": "UA",
+ "region": "30",
+ "regionName": "Kyiv City",
+ "city": "Kyiv",
+ "zip": "01000",
+ "lat": 50.4501,
+ "lon": 30.5234,
+ "timezone": "Europe/Kiev",
+ "isp": "Kyivstar UA",
+ "org": "Kyivstar LLC",
+ "as": "AS15895 Kyivstar PJSC",
+ "query": "134.249.113.11"
+}
diff --git a/newback/src/modules/api/auth/auth.module.spec.ts b/newback/src/modules/api/auth/auth.module.spec.ts
index 958d59688..de6f1e2c7 100644
--- a/newback/src/modules/api/auth/auth.module.spec.ts
+++ b/newback/src/modules/api/auth/auth.module.spec.ts
@@ -11,7 +11,7 @@ import {LoggerModule} from '@/modules/rest/logger/logger.module';
import {PasswordService} from '@/modules/api/auth/password.service';
import {UserRepository} from '@/modules/rest/database/repository/user.repository';
import {RoomRepository} from '@/modules/rest/database/repository/room.repository';
-import {RedisService} from '@/modules/rest/redis/RedisService';
+import {RedisService} from '@/modules/rest/redis/redis.service';
import {EmailService} from '@/modules/rest/email/email.service';
import {MailerService} from '@nestjs-modules/mailer';
import {Sequelize} from 'sequelize-typescript';
diff --git a/newback/src/modules/api/auth/auth.module.ts b/newback/src/modules/api/auth/auth.module.ts
index ee113ac9a..9527c2563 100644
--- a/newback/src/modules/api/auth/auth.module.ts
+++ b/newback/src/modules/api/auth/auth.module.ts
@@ -5,7 +5,7 @@ import {
import {AuthController} from '@/modules/api/auth/auth.controller';
import {AuthService} from '@/modules/api/auth/auth.service';
import {DatabaseModule} from '@/modules/rest/database/database.module';
-import {RedisService} from '@/modules/rest/redis/RedisService';
+import {RedisService} from '@/modules/rest/redis/redis.service';
import {EmailModule} from '@/modules/rest/email/email.module';
import {GoogleAuthService} from '@/modules/api/auth/google.auth.service';
import {PasswordService} from '@/modules/api/auth/password.service';
@@ -14,9 +14,10 @@ import {config} from 'node-ts-config';
import {HttpModule} from '@/modules/rest/http/http.module';
import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
import {ConfigService} from '@/modules/rest/config/config.service';
+import {IpModule} from '@/modules/rest/ip/ip.module';
@Module({
- imports: [DatabaseModule, EmailModule, HttpModule],
+ imports: [DatabaseModule, EmailModule, HttpModule, IpModule],
controllers: [AuthController],
providers: [
AuthService,
diff --git a/newback/src/modules/api/auth/auth.service.ts b/newback/src/modules/api/auth/auth.service.ts
index bb7ccad72..381410ab9 100644
--- a/newback/src/modules/api/auth/auth.service.ts
+++ b/newback/src/modules/api/auth/auth.service.ts
@@ -30,7 +30,7 @@ import {
ALL_ROOM_ID,
MAX_USERNAME_LENGTH
} from '@/utils/consts';
-import {RedisService} from '@/modules/rest/redis/RedisService';
+import {RedisService} from '@/modules/rest/redis/redis.service';
import {EmailService} from '@/modules/rest/email/email.service';
import {Transaction} from 'sequelize';
import {Sequelize} from 'sequelize-typescript';
@@ -40,6 +40,8 @@ import {generateUserName} from '@/utils/helpers';
import {FacebookAuthService} from '@/modules/api/auth/facebook.auth.service';
import {FacebookGetUserResponse} from '@/data/types/api';
import {VerificationModel} from '@/data/model/verification.model';
+import {IpService} from '@/modules/rest/ip/ip.service';
+import {IpCacheService} from '@/modules/rest/ip/ip.cache.service';
@Injectable()
export class AuthService {
@@ -51,6 +53,7 @@ export class AuthService {
private readonly redisService: RedisService,
private readonly emailService: EmailService,
private readonly googleAuthService: GoogleAuthService,
+ private readonly ipCacheService: IpCacheService,
private readonly facebookService: FacebookAuthService,
private readonly sequelize: Sequelize,
private readonly logger: Logger,
@@ -162,7 +165,8 @@ export class AuthService {
let token = await this.passwordService.generateRandomString(32);
this.logger.log(`Generated token for userId ${userId}: ${token}`)
await this.userRepository.createVerification(email, userId, token, VerificationType.REGISTER, t)
- await this.emailService.sendSignUpEmail(username, userId, email, token, ip, ip)
+ let ipInfo = await this.ipCacheService.getIpString(ip)
+ await this.emailService.sendSignUpEmail(username, userId, email, token, ip, ipInfo)
});
} catch (e) {
this.logger.error(`Can't send email to userid ${userId} ${email} because ${e.message}`, e.stack, 'Mail')
@@ -265,7 +269,8 @@ export class AuthService {
let token: string = await this.passwordService.generateRandomString(32);
this.logger.log(`Generated token='${token}' to restore user email='${email}'`);
await this.userRepository.createVerification(email, userId, token, VerificationType.PASSWORD, t)
- await this.emailService.sendRestorePasswordEmail(username, userId, email, token, ip, ip)
+ let ipInfo = await this.ipCacheService.getIpString(ip);
+ await this.emailService.sendRestorePasswordEmail(username, userId, email, token, ip, ipInfo)
});
}
diff --git a/newback/src/modules/rest/database/database.module.ts b/newback/src/modules/rest/database/database.module.ts
index 242246c5a..ddc220d5e 100644
--- a/newback/src/modules/rest/database/database.module.ts
+++ b/newback/src/modules/rest/database/database.module.ts
@@ -22,10 +22,12 @@ import {VerificationModel} from '@/data/model/verification.model';
import {Logger} from '@nestjs/common/services/logger.service';
import {UserRepository} from '@/modules/rest/database/repository/user.repository';
import {RoomRepository} from '@/modules/rest/database/repository/room.repository';
+import {IpRepository} from '@/modules/rest/database/repository/ip.repository';
const repositories = [
UserRepository,
RoomRepository,
+ IpRepository,
];
@Module({
diff --git a/newback/src/modules/rest/database/repository/ip.repository.ts b/newback/src/modules/rest/database/repository/ip.repository.ts
new file mode 100644
index 000000000..39b210140
--- /dev/null
+++ b/newback/src/modules/rest/database/repository/ip.repository.ts
@@ -0,0 +1,27 @@
+import {Injectable} from '@nestjs/common';
+import {InjectModel} from '@nestjs/sequelize';
+import {RoomModel} from '@/data/model/room.model';
+import {RoomUsersModel} from '@/data/model/room.users.model';
+import {Transaction} from 'sequelize';
+import {IpAddressModel} from '@/data/model/ip.address.model';
+
+
+@Injectable()
+export class IpRepository {
+ public constructor(
+ @InjectModel(IpAddressModel) private readonly ipAddressModel: typeof IpAddressModel,
+ ) {
+ }
+
+ public async saveIP(model: Partial