diff --git a/.env b/.env index ad7f0924..b2b860d2 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -ENGINE_VERSION=0.1.6-alpha +ENGINE_VERSION=0.1.7-alpha # POSTGRES POSTGRES_USER=docker @@ -14,6 +14,7 @@ SUPERTOKEN_SCHEMA=supertoken # Prisma database connection DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${POSTGRES_DB}?schema=${DB_SCHEMA}&sslmode=prefer +SYNC_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${POSTGRES_DB} # SuperToken database connection SUPERTOKEN_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${POSTGRES_DB}?schema=${SUPERTOKEN_SCHEMA}&sslmode=prefer @@ -31,3 +32,12 @@ BACKEND_HOST=http://localhost:3000 BACKEND_URL=http://server:3000 SUPERTOKEN_CONNECTION_URI=http://supertokens:3567 + + +TEMPORAL_ADDRESS=temporal:7233 +CONFIG_PATH=/app/temp +TEMPORAL_VERSION=1.21.2 +TEMPORAL_UI_VERSION=2.16.1 + +# Generate the token in UI and add it here +TOKEN= \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index f1866929..922aa485 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,12 +21,16 @@ services: container_name: poozle-server depends_on: - db + - temporal + - worker + - supertokens restart: unless-stopped networks: - poozle environment: - ENGINE_VERSION=${ENGINE_VERSION} - DATABASE_URL=${DATABASE_URL} + - SYNC_DATABASE_URL=${SYNC_DATABASE_URL} - FRONTEND_HOST=${FRONTEND_HOST} - PUBLIC_FRONTEND_HOST=${PUBLIC_FRONTEND_HOST} - BACKEND_HOST=${BACKEND_HOST} @@ -34,6 +38,8 @@ services: - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} - PORT=${PORT} - SUPERTOKEN_CONNECTION_URI=${SUPERTOKEN_CONNECTION_URI} + - MASTER_TOKEN=${TOKEN} + - TEMPORAL_ADDRESS=${TEMPORAL_ADDRESS} webapp: image: poozlehq/engine-webapp:${ENGINE_VERSION} @@ -49,6 +55,50 @@ services: ports: - 8000:3000 + worker: + image: poozlehq/engine-worker:${ENGINE_VERSION} + platform: linux/amd64 + container_name: poozle-worker + restart: unless-stopped + networks: + - poozle + environment: + - DATABASE_URL=${SYNC_DATABASE_URL} + - TEMPORAL_ADDRESS=${TEMPORAL_ADDRESS} + - DB_SCHEMA=${DB_SCHEMA} + - CONFIG_PATH=${CONFIG_PATH} + - TOKEN=${TOKEN} + - BACKEND_URL=${BACKEND_URL} + + temporal: + image: temporalio/auto-setup:${TEMPORAL_VERSION} + container_name: temporal + depends_on: + - db + environment: + - DB=postgresql + - DB_PORT=${DB_PORT} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PWD=${POSTGRES_PASSWORD} + - POSTGRES_SEEDS=${DB_HOST} + ports: + - 7233:7233 + networks: + - poozle + + temporal-ui: + container_name: temporal-ui + depends_on: + - temporal + environment: + - TEMPORAL_ADDRESS=${TEMPORAL_ADDRESS} + - TEMPORAL_CORS_ORIGINS=http://localhost:3000 + image: temporalio/ui:${TEMPORAL_UI_VERSION} + networks: + - poozle + ports: + - 8080:8080 + supertokens: image: registry.supertokens.io/supertokens/supertokens-postgresql:5.0 depends_on: diff --git a/engine-idk/package.json b/engine-idk/package.json index ef2a2c09..9713191b 100644 --- a/engine-idk/package.json +++ b/engine-idk/package.json @@ -1,6 +1,6 @@ { "name": "@poozle/engine-idk", - "version": "0.1.28", + "version": "0.1.29", "description": "Used to develop integrations for Poozle", "license": "MIT", "author": "Poozle ", diff --git a/engine-idk/src/bases/base_integration.ts b/engine-idk/src/bases/base_integration.ts index c88a06af..4791d7c0 100644 --- a/engine-idk/src/bases/base_integration.ts +++ b/engine-idk/src/bases/base_integration.ts @@ -55,6 +55,7 @@ export class BaseIntegration implements BaseIntegrationInterface { config, ); headers = { + ...headers, Authorization: `Bearer ${token}`, }; } else { diff --git a/engine-idk/src/bases/base_path.ts b/engine-idk/src/bases/base_path.ts index b5babe23..4ee84f0b 100644 --- a/engine-idk/src/bases/base_path.ts +++ b/engine-idk/src/bases/base_path.ts @@ -30,14 +30,14 @@ export class BasePath { } async baseRun(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const responseFromRun: any = await this.run(method, headers, params, config); + try { + const responseFromRun: any = await this.run(method, headers, params, config); - // if this is a request directly to the integration - if (params.proxy) { - return responseFromRun; - } + // if this is a request directly to the integration + if (params.proxy) { + return responseFromRun; + } - try { const response: any = { data: responseFromRun.data, }; @@ -86,7 +86,7 @@ export class BasePath { const previous = response.meta ? response.meta.previous ?? '' : ''; return { - limit: params.queryParams?.limit ? parseInt(params.queryParams?.limit.toString()) : 10, + limit: params.queryParams?.limit as number, cursors: { previous, current, diff --git a/engine-server/package.json b/engine-server/package.json index f38680f4..4282505f 100644 --- a/engine-server/package.json +++ b/engine-server/package.json @@ -1,6 +1,6 @@ { "name": "engine-server", - "version": "0.1.4-alpha", + "version": "0.1.7-alpha", "description": "Poozle engine", "author": "Poozle", "license": "MIT", @@ -26,7 +26,7 @@ "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", - "start:migrate:prod": "yarn migrate:deploy && yarn seed && node dist/main", + "start:migrate:prod": "yarn migrate:deploy && node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "migrate:dev": "prisma migrate dev --preview-feature", "migrate:dev:create": "prisma migrate dev --create-only --preview-feature", @@ -62,6 +62,7 @@ "@poozle/engine-idk": "^0.1.20", "@prisma/client": "^4.9.0", "@segment/analytics-node": "^1.0.0-beta.24", + "@temporalio/client": "^1.8.1", "@vegardit/prisma-generator-nestjs-dto": "^1.5.1", "axios": "^1.4.0", "bcrypt": "5.1.0", @@ -69,9 +70,11 @@ "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", "date-fns": "^2.30.0", + "knex": "^2.5.1", "nestjs-prisma": "0.20.0", "passport": "0.6.0", "passport-jwt": "4.0.1", + "pg": "^8.11.1", "readline-sync": "^1.4.10", "reflect-metadata": "0.1.13", "rimraf": "4.1.1", diff --git a/engine-server/prisma/dbml/schema.dbml b/engine-server/prisma/dbml/schema.dbml index f6b32c11..ddbdd8b4 100644 --- a/engine-server/prisma/dbml/schema.dbml +++ b/engine-server/prisma/dbml/schema.dbml @@ -81,6 +81,8 @@ Table IntegrationAccount { createdAt DateTime [default: `now()`, not null] updatedAt DateTime [not null] accountIdentifier String + syncEnabled Boolean [not null, default: false] + syncPeriod String fromLinks Link linkId String } @@ -100,6 +102,25 @@ Table Link { IntegrationAccount IntegrationAccount [not null] } +Table Job { + jobId String [pk] + temporalId String [not null] + integrationAccountId String [not null] + status JobStatus [not null] + failedMessage String + recordsSynced Int + logs String + createdAt DateTime [default: `now()`, not null] + updatedAt DateTime [not null] +} + +Enum JobStatus { + PENDING + RUNNING + FAILED + SUCCEEDED +} + Enum ReleaseStage { ALPHA BETA diff --git a/engine-server/prisma/migrations/20230724073043_added_logs_table/migration.sql b/engine-server/prisma/migrations/20230724073043_added_logs_table/migration.sql new file mode 100644 index 00000000..1b97f8da --- /dev/null +++ b/engine-server/prisma/migrations/20230724073043_added_logs_table/migration.sql @@ -0,0 +1,19 @@ +-- CreateEnum +CREATE TYPE "JobStatus" AS ENUM ('PENDING', 'RUNNING', 'FAILED', 'SUCCEEDED'); + +-- CreateTable +CREATE TABLE "Job" ( + "jobId" TEXT NOT NULL, + "temporalId" TEXT NOT NULL, + "integrationAccountId" TEXT NOT NULL, + "status" "JobStatus" NOT NULL, + "recordsSynced" INTEGER NOT NULL, + "logs" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Job_pkey" PRIMARY KEY ("jobId") +); + +-- AddForeignKey +ALTER TABLE "Job" ADD CONSTRAINT "Job_integrationAccountId_fkey" FOREIGN KEY ("integrationAccountId") REFERENCES "IntegrationAccount"("integrationAccountId") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/engine-server/prisma/migrations/20230724073942_make_logs_optional/migration.sql b/engine-server/prisma/migrations/20230724073942_make_logs_optional/migration.sql new file mode 100644 index 00000000..ea817224 --- /dev/null +++ b/engine-server/prisma/migrations/20230724073942_make_logs_optional/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Job" ALTER COLUMN "recordsSynced" DROP NOT NULL, +ALTER COLUMN "logs" DROP NOT NULL; diff --git a/engine-server/prisma/migrations/20230724174858_add_failed_message/migration.sql b/engine-server/prisma/migrations/20230724174858_add_failed_message/migration.sql new file mode 100644 index 00000000..d3761d65 --- /dev/null +++ b/engine-server/prisma/migrations/20230724174858_add_failed_message/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Job" ADD COLUMN "failedMessage" TEXT; diff --git a/engine-server/prisma/migrations/20230725055339_add_sync_params/migration.sql b/engine-server/prisma/migrations/20230725055339_add_sync_params/migration.sql new file mode 100644 index 00000000..b1621a15 --- /dev/null +++ b/engine-server/prisma/migrations/20230725055339_add_sync_params/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "IntegrationAccount" ADD COLUMN "syncEnabled" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "syncPeriod" TEXT; diff --git a/engine-server/prisma/migrations/20230725204826_remove_foriegn_check_in_jobs/migration.sql b/engine-server/prisma/migrations/20230725204826_remove_foriegn_check_in_jobs/migration.sql new file mode 100644 index 00000000..a3a17aaa --- /dev/null +++ b/engine-server/prisma/migrations/20230725204826_remove_foriegn_check_in_jobs/migration.sql @@ -0,0 +1,2 @@ +-- DropForeignKey +ALTER TABLE "Job" DROP CONSTRAINT "Job_integrationAccountId_fkey"; diff --git a/engine-server/prisma/schema.prisma b/engine-server/prisma/schema.prisma index 6b620340..b6a32322 100644 --- a/engine-server/prisma/schema.prisma +++ b/engine-server/prisma/schema.prisma @@ -101,8 +101,13 @@ model IntegrationAccount { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + // to map to the customer organisations accountIdentifier String? + // Sync parameters + syncEnabled Boolean @default(false) + syncPeriod String? + fromLinks Link? @relation(fields: [linkId], references: [linkId]) linkId String? } @@ -128,6 +133,30 @@ model Link { IntegrationAccount IntegrationAccount[] } +model Job { + jobId String @id @default(uuid()) + + // Used to match the id with in temporal + temporalId String + integrationAccountId String + status JobStatus + + failedMessage String? + + recordsSynced Int? + logs String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +enum JobStatus { + PENDING + RUNNING + FAILED + SUCCEEDED +} + enum ReleaseStage { ALPHA BETA diff --git a/engine-server/prisma/seeds/user.ts b/engine-server/prisma/seeds/user.ts index 597e2734..1551e853 100644 --- a/engine-server/prisma/seeds/user.ts +++ b/engine-server/prisma/seeds/user.ts @@ -75,7 +75,6 @@ async function main() { const accessToken = response.headers['st-access-token']; if (!accessToken) { - console.log(response.data); console.log('User not created'); return; } diff --git a/engine-server/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts b/engine-server/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts index cbe2126b..0e5f345f 100644 --- a/engine-server/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts +++ b/engine-server/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts @@ -34,12 +34,32 @@ export class IntegrationAccount { */ workspaceId: string; + /** + * Name used to fetch data from database + */ + workspaceName?: string; + /** * This is used for User experience. You can pass a name * to easily identify the account in UI */ integrationAccountName: string; + /** + * This is used to map organisations/user_id fo the customers + */ + accountIdentifier?: string; + + /** + * Boolean to check if syncing is enabled + */ + syncEnabled: boolean; + + /** + * Internal for sync + */ + syncPeriod?: string; + /** * When this account is deleted. If deleted */ diff --git a/engine-server/src/@@generated/job/entities/index.ts b/engine-server/src/@@generated/job/entities/index.ts new file mode 100644 index 00000000..77c6125c --- /dev/null +++ b/engine-server/src/@@generated/job/entities/index.ts @@ -0,0 +1 @@ +export * from './job'; diff --git a/engine-server/src/@@generated/job/entities/job.ts b/engine-server/src/@@generated/job/entities/job.ts new file mode 100644 index 00000000..c334c172 --- /dev/null +++ b/engine-server/src/@@generated/job/entities/job.ts @@ -0,0 +1,18 @@ +export enum JobStatus { + PENDING = 'PENDING', + RUNNING = 'RUNNING', + FAILED = 'FAILED', + SUCCEEDED = 'SUCCEEDED', +} + +export interface Job { + jobId: string; + temporalId: string; + integrationAccountId: string; + status: JobStatus; + failedMessage: string | null; + recordsSynced: number | null; + logs: string | null; + createdAt: Date; + updatedAt: Date; +} diff --git a/engine-server/src/common/interfaces/pagination.interface.ts b/engine-server/src/common/interfaces/pagination.interface.ts index 266602e4..a1f5f18c 100644 --- a/engine-server/src/common/interfaces/pagination.interface.ts +++ b/engine-server/src/common/interfaces/pagination.interface.ts @@ -1,6 +1,7 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; import { IsNumber, IsOptional, IsString } from 'class-validator'; export class PaginationParams { @@ -15,12 +16,13 @@ export class PaginationParams { cursor?: string; @ApiProperty({ - name: 'cursor', + name: 'limit', type: 'number', description: 'Number of results to return. Minimum 1, Maximum 200, Default 10', }) @IsNumber() @IsOptional() - limit?: number; + @Transform(({ value }) => parseInt(value)) + limit = 10; } diff --git a/engine-server/src/common/interfaces/query.interface.ts b/engine-server/src/common/interfaces/query.interface.ts index a1ea1970..e957b55a 100644 --- a/engine-server/src/common/interfaces/query.interface.ts +++ b/engine-server/src/common/interfaces/query.interface.ts @@ -2,11 +2,39 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { IsBoolean, IsOptional } from 'class-validator'; +import { IsBoolean, IsOptional, IsString } from 'class-validator'; import { PaginationParams } from './pagination.interface'; export class QueryParams extends PaginationParams { + /** + * Get all resources created after + */ + @IsOptional() + @IsString() + created_after?: string; + + /** + * Get all resources created before + */ + @IsOptional() + @IsString() + created_before?: string; + + /** + * Get all resources updated after + */ + @IsOptional() + @IsString() + updated_after?: string; + + /** + * Get all resources updated before + */ + @IsOptional() + @IsString() + updated_before?: string; + @ApiProperty({ name: 'raw', type: 'boolean', @@ -18,7 +46,7 @@ export class QueryParams extends PaginationParams { @Transform(({ value }) => { return value === 'true' || value === 'True' || value === true; }) - raw?: boolean; + raw = false; } export class JustRawParams { @@ -33,7 +61,7 @@ export class JustRawParams { @Transform(({ value }) => { return value === 'true' || value === 'True' || value === true; }) - raw?: boolean; + raw = false; } export enum DIRECTION_ENUM { diff --git a/engine-server/src/common/interfaces/response.interface.ts b/engine-server/src/common/interfaces/response.interface.ts index 7593b6c9..1306d8c2 100644 --- a/engine-server/src/common/interfaces/response.interface.ts +++ b/engine-server/src/common/interfaces/response.interface.ts @@ -5,7 +5,7 @@ import { ApiProperty } from '@nestjs/swagger'; export class Meta { limit: number; cursors: { - before: string; + previous: string; current: string; next: string; }; diff --git a/engine-server/src/common/knex/get.ts b/engine-server/src/common/knex/get.ts new file mode 100644 index 00000000..e4f27720 --- /dev/null +++ b/engine-server/src/common/knex/get.ts @@ -0,0 +1,97 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ +import Knex from 'knex'; + +function getSelectKeys(SELECT_KEYS: string[], raw: boolean) { + if (raw) { + return [...SELECT_KEYS, 'raw']; + } + + return SELECT_KEYS; +} + +export function getBaseQuery( + workspaceName: string, + table: string, + where: Record, + SELECT_KEYS: string[], + raw: boolean, +) { + const knex = Knex({ + client: 'pg', + connection: { + connectionString: process.env.SYNC_DATABASE_URL, + }, + }); + + const query = knex + .withSchema(workspaceName) + .table(table) + .select(getSelectKeys(SELECT_KEYS, raw)) + .where(where); + + return query; +} + +export async function getObjectFromDb( + workspaceName: string, + table: string, + where: Record, + SELECT_KEYS: string[], + raw: boolean, +) { + const knex = Knex({ + client: 'pg', + connection: { + connectionString: process.env.DATABASE_URL, + }, + }); + + const data = await knex + .withSchema(workspaceName) + .table(table) + .select(getSelectKeys(SELECT_KEYS, raw)) + .where(where) + .first(); + + return { + data, + }; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function applyDateFilter(query: any, queryParams: any) { + // Conditionally apply the created_after filter if not null + if (queryParams.created_after) { + query = query.where('created_at', '>=', queryParams.created_after); + } + + // Conditionally apply the created_before filter if not null + if (queryParams.created_before) { + query = query.where('created_at', '<=', queryParams.created_before); + } + + // Conditionally apply the updated_after filter if not null + if (queryParams.updated_after) { + query = query.where('updated_at', '>=', queryParams.updated_after); + } + + // Conditionally apply the updated_before filter if not null + if (queryParams.updated_before) { + query = query.where('updated_at', '<=', queryParams.updated_before); + } + + return query; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function getMetaParams(data: any[], limit: number, page: number) { + return { + limit, + cursors: { + previous: (page > 1 ? page - 1 : '').toString(), + current: page.toString(), + next: data.length === limit ? (page + 1).toString() : '', + }, + }; +} diff --git a/engine-server/src/common/knex/index.ts b/engine-server/src/common/knex/index.ts new file mode 100644 index 00000000..d14d9f8b --- /dev/null +++ b/engine-server/src/common/knex/index.ts @@ -0,0 +1,3 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export * from './get'; diff --git a/engine-server/src/common/utils.ts b/engine-server/src/common/utils.ts index 62a3dcf2..0b864a38 100644 --- a/engine-server/src/common/utils.ts +++ b/engine-server/src/common/utils.ts @@ -9,3 +9,12 @@ export function exclude( } return user; } + +export function pagination(limit: number, cursor: string) { + const page = cursor ? parseInt(cursor) : 1; + const parsedLimit = limit ? limit : 10; + + const offset = (page - 1) * limit; + + return { offset, limit: parsedLimit, page }; +} diff --git a/engine-server/src/main.ts b/engine-server/src/main.ts index 160d33cd..879a1c32 100644 --- a/engine-server/src/main.ts +++ b/engine-server/src/main.ts @@ -5,13 +5,14 @@ import { ValidationPipe, VersioningType } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { HttpAdapterHost, NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import * as cookieParser from 'cookie-parser'; +import cookieParser from 'cookie-parser'; import { PrismaClientExceptionFilter, PrismaService } from 'nestjs-prisma'; import supertokens from 'supertokens-node'; import type { CorsConfig, NestConfig } from 'common/configs/config.interface'; import { SupertokensExceptionFilter } from 'modules/auth/auth.filter'; +import { IntegrationAccountService } from 'modules/integration_account/integration_account.service'; import { AppModule } from './modules/app/app.module'; @@ -42,6 +43,12 @@ async function bootstrap() { const nestConfig = configService.get('nest'); const corsConfig = configService.get('cors'); + // Check for schedules at start of the application if temporal address is present + if (configService.get('TEMPORAL_ADDRESS')) { + const integrationAccountService = app.get(IntegrationAccountService); + integrationAccountService.init(); + } + // Cors if (corsConfig.enabled) { app.enableCors({ diff --git a/engine-server/src/modules/app/app.module.ts b/engine-server/src/modules/app/app.module.ts index 496b2efd..4df8cdab 100644 --- a/engine-server/src/modules/app/app.module.ts +++ b/engine-server/src/modules/app/app.module.ts @@ -17,6 +17,7 @@ import { IntegrationDefinitionModule } from 'modules/integration_definition/inte import { IntegrationOAuthModule } from 'modules/integration_oauth/integration_oauth.module'; import { LinkModule } from 'modules/link/link.module'; import { OAuthCallbackModule } from 'modules/oauth_callback/oauth_callback.module'; +import { SyncModule } from 'modules/sync/sync.module'; import { UserModule } from 'modules/user/user.module'; import { WorkspaceModule } from 'modules/workspace/workspace.module'; @@ -41,6 +42,7 @@ import { AppService } from './app.service'; IntegrationOAuthModule, OAuthCallbackModule, LinkModule, + SyncModule, // Categories and their modules TicketingModule, MailModule, diff --git a/engine-server/src/modules/auth/auth.guard.ts b/engine-server/src/modules/auth/auth.guard.ts index f44319fb..19e2c800 100644 --- a/engine-server/src/modules/auth/auth.guard.ts +++ b/engine-server/src/modules/auth/auth.guard.ts @@ -35,6 +35,16 @@ export class AuthGuard implements CanActivate { let err = undefined; const resp = ctx.getResponse(); const request = ctx.getRequest(); + + // this for users to call from their APIs + let jwt = request.headers['authorization']; + jwt = jwt === undefined ? undefined : jwt.split('Bearer ')[1]; + + // This is to allow API calls from temporal workflows + if (jwt && jwt === process.env.MASTER_TOKEN) { + return true; + } + try { const session = await Session.getSession(request, resp, { sessionRequired: false, diff --git a/engine-server/src/modules/categories/ticketing/models/collection/collection.controller.ts b/engine-server/src/modules/categories/ticketing/models/collection/collection.controller.ts index 97d9db0e..3bbc7faf 100644 --- a/engine-server/src/modules/categories/ticketing/models/collection/collection.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/collection/collection.controller.ts @@ -3,12 +3,10 @@ import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { IntegrationType } from '@prisma/client'; -import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; @@ -19,6 +17,7 @@ import { TicketingCollectionResponse, TicketingCollectionsResponse, } from './collection.interface'; +import { CollectionService } from './collection.service'; @Controller({ version: '1', @@ -26,20 +25,18 @@ import { }) @ApiTags('Ticketing') export class CollectionController { + constructor(private collectionService: CollectionService) {} + @Get() @UseGuards(new AuthGuard()) async getCollections( - @Query() query: CollectionQueryParams = defaultQueryParams, + @Query() query: CollectionQueryParams, @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, ): Promise { - const collectionResponse = await getDataFromAccount( + const collectionResponse = await this.collectionService.getCollections( integrationAccount, - '/collections', - Method.GET, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, - {}, + query, ); return collectionResponse; @@ -53,12 +50,9 @@ export class CollectionController { @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, ): Promise { - const collectionResponse = await getDataFromAccount( + const collectionResponse = await this.collectionService.getCollection( integrationAccount, - `/collections/${params.collection_id}`, - Method.GET, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); diff --git a/engine-server/src/modules/categories/ticketing/models/collection/collection.interface.ts b/engine-server/src/modules/categories/ticketing/models/collection/collection.interface.ts index 02b8ca38..3e7db6ad 100644 --- a/engine-server/src/modules/categories/ticketing/models/collection/collection.interface.ts +++ b/engine-server/src/modules/categories/ticketing/models/collection/collection.interface.ts @@ -1,32 +1,29 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { IsEnum, IsOptional, IsString } from 'class-validator'; +import { Transform } from 'class-transformer'; +import { IsBoolean, IsOptional, IsString } from 'class-validator'; -import { - DIRECTION_ENUM, - JustRawParams, - QueryParams, -} from 'common/interfaces/query.interface'; +import { JustRawParams, QueryParams } from 'common/interfaces/query.interface'; import { Meta } from 'common/interfaces/response.interface'; -enum SORT_ENUM { - 'name' = 'name', - 'created_at' = 'created_at', - 'updated_at' = 'updated_at', -} - export class CollectionQueryParams extends QueryParams { @IsOptional() - @IsEnum(SORT_ENUM) - sort?: string; + @IsBoolean() + @Transform(({ value }) => { + return value === 'true' || value === 'True' || value === true; + }) + realtime?: boolean = false; +} +export class GetCollectionQueryParams extends JustRawParams { @IsOptional() - @IsEnum(DIRECTION_ENUM) - direction?: string; + @IsBoolean() + @Transform(({ value }) => { + return value === 'true' || value === 'True' || value === true; + }) + realtime?: boolean = false; } -export class GetCollectionQueryParams extends JustRawParams {} - export class Collection { id: string; parent_id: string; @@ -35,8 +32,20 @@ export class Collection { description: string; updated_at: string; created_at: string; + + integration_account_id?: string; } +export const COLLECTION_KEYS = [ + 'id', + 'parent_id', + 'type', + 'name', + 'description', + 'updated_at', + 'created_at', +]; + export class TicketingCollectionsResponse { data: Collection[]; meta: Meta; diff --git a/engine-server/src/modules/categories/ticketing/models/collection/collection.service.ts b/engine-server/src/modules/categories/ticketing/models/collection/collection.service.ts new file mode 100644 index 00000000..77633fcf --- /dev/null +++ b/engine-server/src/modules/categories/ticketing/models/collection/collection.service.ts @@ -0,0 +1,153 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Injectable } from '@nestjs/common'; +import { Method, getDataFromAccount } from 'shared/integration_account.utils'; + +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; + +import { + applyDateFilter, + getBaseQuery, + getMetaParams, + getObjectFromDb, +} from 'common/knex'; +import { pagination } from 'common/utils'; + +import { + COLLECTION_KEYS, + CollectionQueryParams, + GetCollectionQueryParams, + PathParamsWithCollectionId, +} from './collection.interface'; + +const DATABASE_NAME = 'ticketing_collection'; + +@Injectable() +export class CollectionService { + async getCollections( + integrationAccount: IntegrationAccount, + query: CollectionQueryParams, + ) { + if (query.realtime) { + return await this.getCollectionsForRealtime(integrationAccount, query); + } + + return await this.getCollectionsFromDb(integrationAccount, query); + } + + async getCollection( + integrationAccount: IntegrationAccount, + query: GetCollectionQueryParams, + params: PathParamsWithCollectionId, + ) { + if (query.realtime) { + return await this.getCollectionForRealtime( + integrationAccount, + query, + params, + ); + } + + return await this.getCollectionFromDb(integrationAccount, query, params); + } + + async getListFromDb( + workspaceName: string, + table: string, + where: Record, + SELECT_KEYS: string[], + queryParams: CollectionQueryParams, + ) { + const { offset, limit, page } = pagination( + queryParams.limit, + queryParams.cursor, + ); + + let query = getBaseQuery( + workspaceName, + table, + where, + SELECT_KEYS, + queryParams.raw, + ); + + query = applyDateFilter(query, queryParams); + + const data = await query.limit(limit).offset(offset); + + return { + data, + meta: getMetaParams(data, limit, page), + }; + } + + async getCollectionsFromDb( + integrationAccount: IntegrationAccount, + query: CollectionQueryParams, + ) { + return await this.getListFromDb( + integrationAccount.workspaceName, + DATABASE_NAME, + { + integration_account_id: integrationAccount.integrationAccountId, + }, + COLLECTION_KEYS, + query, + ); + } + + async getCollectionFromDb( + integrationAccount: IntegrationAccount, + query: GetCollectionQueryParams, + params: PathParamsWithCollectionId, + ) { + return await getObjectFromDb( + integrationAccount.workspaceName, + DATABASE_NAME, + { + integration_account_id: integrationAccount.integrationAccountId, + id: params.collection_id, + }, + COLLECTION_KEYS, + query.raw, + ); + } + + async getCollectionForRealtime( + integrationAccount: IntegrationAccount, + query: GetCollectionQueryParams, + params: PathParamsWithCollectionId, + ) { + const collectionResponse = await getDataFromAccount( + integrationAccount, + `/collections/${params.collection_id}`, + Method.GET, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + { raw: query.raw }, + params, + ); + + return collectionResponse; + } + + async getCollectionsForRealtime( + integrationAccount: IntegrationAccount, + query: CollectionQueryParams, + ) { + const collectionResponse = await getDataFromAccount( + integrationAccount, + '/collections', + Method.GET, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + { + limit: query.limit, + cursor: query.cursor, + raw: query.raw, + }, + {}, + ); + + return collectionResponse; + } +} diff --git a/engine-server/src/modules/categories/ticketing/models/comment/comment.controller.ts b/engine-server/src/modules/categories/ticketing/models/comment/comment.controller.ts index 041ab987..d7fb333e 100644 --- a/engine-server/src/modules/categories/ticketing/models/comment/comment.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/comment/comment.controller.ts @@ -18,7 +18,6 @@ import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; @@ -42,7 +41,7 @@ export class CommentController { @Get(':collection_id/tickets/:ticket_id/comments') @UseGuards(new AuthGuard()) async getComments( - @Query() query: CommentQueryParams = defaultQueryParams, + @Query() query: CommentQueryParams, @Param() params: PathParams, @GetIntegrationAccount(IntegrationType.TICKETING) @@ -53,7 +52,7 @@ export class CommentController { '/comments', Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); @@ -73,7 +72,7 @@ export class CommentController { `/comments/${params.comment_id}`, Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); @@ -94,7 +93,7 @@ export class CommentController { `/comments/${params.comment_id}`, Method.PATCH, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, updateCommentBody, ); @@ -116,7 +115,7 @@ export class CommentController { `/comments`, Method.POST, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, createCommentBody, ); diff --git a/engine-server/src/modules/categories/ticketing/models/tag/tag.controller.ts b/engine-server/src/modules/categories/ticketing/models/tag/tag.controller.ts index d341d729..4a3b4803 100644 --- a/engine-server/src/modules/categories/ticketing/models/tag/tag.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/tag/tag.controller.ts @@ -18,7 +18,6 @@ import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; @@ -42,7 +41,7 @@ export class TagController { @Get(':collection_id/tags') @UseGuards(new AuthGuard()) async getTags( - @Query() query: TagQueryParams = defaultQueryParams, + @Query() query: TagQueryParams, @Param() params: PathParams, @GetIntegrationAccount(IntegrationType.TICKETING) @@ -53,7 +52,7 @@ export class TagController { '/tags', Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); @@ -73,7 +72,7 @@ export class TagController { `/tags/${params.tag_name}`, Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); @@ -94,7 +93,7 @@ export class TagController { `/tags/${params.tag_name}`, Method.PATCH, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, updateTagBody, ); @@ -116,7 +115,7 @@ export class TagController { `/tags`, Method.POST, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, createTagBody, ); diff --git a/engine-server/src/modules/categories/ticketing/models/team/team.controller.ts b/engine-server/src/modules/categories/ticketing/models/team/team.controller.ts index d681a7e6..416a49d1 100644 --- a/engine-server/src/modules/categories/ticketing/models/team/team.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/team/team.controller.ts @@ -18,7 +18,6 @@ import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; @@ -41,7 +40,7 @@ export class TeamController { @Get() @UseGuards(new AuthGuard()) async getTeams( - @Query() query: TeamQueryParams = defaultQueryParams, + @Query() query: TeamQueryParams, @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, @@ -51,7 +50,7 @@ export class TeamController { '/teams', Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, {}, ); @@ -71,7 +70,7 @@ export class TeamController { `/teams/${params.team_name}`, Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, ); @@ -92,7 +91,7 @@ export class TeamController { `/teams/${params.team_name}`, Method.PATCH, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, updateTeamBody, ); @@ -112,7 +111,7 @@ export class TeamController { `/teams`, Method.POST, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, {}, createTeamBody, ); diff --git a/engine-server/src/modules/categories/ticketing/models/ticket/ticket.service.ts b/engine-server/src/modules/categories/ticketing/models/ticket/ticket.service.ts new file mode 100644 index 00000000..738f419f --- /dev/null +++ b/engine-server/src/modules/categories/ticketing/models/ticket/ticket.service.ts @@ -0,0 +1,179 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Injectable } from '@nestjs/common'; +import { Method, getDataFromAccount } from 'shared/integration_account.utils'; + +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; + +import { + applyDateFilter, + getBaseQuery, + getMetaParams, + getObjectFromDb, +} from 'common/knex'; +import { pagination } from 'common/utils'; + +import { + GetTicketsQueryParams, + ListTicketsQueryParams, + PathParamsWithCollectionId, + PathParamsWithTicketId, + TICKET_KEYS, + Ticket, + TicketingTicketsResponse, +} from './tickets.interface'; + +const DATABASE_NAME = 'ticketing_ticket'; + +@Injectable() +export class TicketService { + async getTickets( + integrationAccount: IntegrationAccount, + query: ListTicketsQueryParams, + ) { + return await this.getListFromDb( + integrationAccount.workspaceName, + DATABASE_NAME, + { + integration_account_id: integrationAccount.integrationAccountId, + }, + TICKET_KEYS, + query, + ); + } + + async getCollectionTickets( + integrationAccount: IntegrationAccount, + query: ListTicketsQueryParams, + params: PathParamsWithCollectionId, + ) { + if (query.realtime) { + return await this.getTicketsForRealtime( + integrationAccount, + query, + params, + ); + } + + return await this.getTicketsFromDb(integrationAccount, query, params); + } + + async getTicket( + integrationAccount: IntegrationAccount, + query: GetTicketsQueryParams, + params: PathParamsWithTicketId, + ) { + if (query.realtime) { + return await this.getTicketForRealtime(integrationAccount, query, params); + } + + return await this.getTicketFromDb(integrationAccount, query, params); + } + + async getListFromDb( + workspaceName: string, + table: string, + where: Record, + SELECT_KEYS: string[], + queryParams: ListTicketsQueryParams, + ): Promise { + const { offset, limit, page } = pagination( + queryParams.limit, + queryParams.cursor, + ); + + let query = getBaseQuery( + workspaceName, + table, + where, + SELECT_KEYS, + queryParams.raw, + ); + + query = applyDateFilter(query, queryParams); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const data = (await query.limit(limit).offset(offset)) as any[]; + + return { + data, + meta: getMetaParams(data, limit, page), + }; + } + + async getTicketsFromDb( + integrationAccount: IntegrationAccount, + query: ListTicketsQueryParams, + params: PathParamsWithCollectionId, + ) { + return await this.getListFromDb( + integrationAccount.workspaceName, + DATABASE_NAME, + { + integration_account_id: integrationAccount.integrationAccountId, + collection_id: params.collection_id, + }, + TICKET_KEYS, + query, + ); + } + + async getTicketFromDb( + integrationAccount: IntegrationAccount, + query: GetTicketsQueryParams, + params: PathParamsWithTicketId, + ) { + return await getObjectFromDb( + integrationAccount.workspaceName, + DATABASE_NAME, + { + integration_account_id: integrationAccount.integrationAccountId, + id: params.ticket_id, + collection_id: params.collection_id, + }, + TICKET_KEYS, + query.raw, + ); + } + + async getTicketsForRealtime( + integrationAccount: IntegrationAccount, + query: GetTicketsQueryParams, + params: PathParamsWithCollectionId, + ) { + const ticketsResponse = await getDataFromAccount( + integrationAccount, + '/tickets', + Method.GET, + { + limit: query.limit, + cursor: query.cursor, + raw: query.raw, + }, + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + params as any, + ); + + return ticketsResponse; + } + + async getTicketForRealtime( + integrationAccount: IntegrationAccount, + query: ListTicketsQueryParams, + params: PathParamsWithTicketId, + ) { + const ticketResponse = await getDataFromAccount( + integrationAccount, + `/tickets/${params.ticket_id}`, + Method.GET, + + { raw: query.raw }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + params as any, + ); + + return ticketResponse; + } +} diff --git a/engine-server/src/modules/categories/ticketing/models/ticket/tickets.controller.ts b/engine-server/src/modules/categories/ticketing/models/ticket/tickets.controller.ts index 817d300f..f24b4a85 100644 --- a/engine-server/src/modules/categories/ticketing/models/ticket/tickets.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/ticket/tickets.controller.ts @@ -17,12 +17,11 @@ import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; +import { TicketService } from './ticket.service'; import { - PathParams, PathParamsWithTicketId, ListTicketsQueryParams, TicketingTicketResponse, @@ -30,6 +29,8 @@ import { CommonTicketQueryParams, UpdateTicketBody, CreateTicketBody, + GetTicketsQueryParams, + PathParamsWithCollectionId, } from './tickets.interface'; @Controller({ @@ -39,22 +40,34 @@ import { @ApiTags('Ticketing') @UseGuards(new AuthGuard()) export class TicketsController { - @Get(':collection_id/tickets') + constructor(private ticketService: TicketService) {} + + @Get('tickets') async getTickets( + @Query() query: ListTicketsQueryParams, + @GetIntegrationAccount(IntegrationType.TICKETING) + integrationAccount: IntegrationAccount, + ): Promise { + const ticketsResponse = await this.ticketService.getTickets( + integrationAccount, + query, + ); + + return ticketsResponse; + } + + @Get(':collection_id/tickets') + async getCollectionTickets( @Query() query: ListTicketsQueryParams, @Param() - params: PathParams, + params: PathParamsWithCollectionId, @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, ): Promise { - const ticketsResponse = await getDataFromAccount( + const ticketsResponse = await this.ticketService.getCollectionTickets( integrationAccount, - '/tickets', - Method.GET, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - params as any, + query, + params, ); return ticketsResponse; @@ -62,20 +75,16 @@ export class TicketsController { @Get(':collection_id/tickets/:ticket_id') async getTicketId( - @Query() query: ListTicketsQueryParams, + @Query() query: GetTicketsQueryParams, @Param() params: PathParamsWithTicketId, @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, ): Promise { - const ticketResponse = await getDataFromAccount( + const ticketResponse = await this.ticketService.getTicket( integrationAccount, - `/tickets/${params.ticket_id}`, - Method.GET, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - params as any, + query, + params, ); return ticketResponse; @@ -95,7 +104,7 @@ export class TicketsController { `/tickets/${params.ticket_id}`, Method.PATCH, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, updateTicketBody, ); @@ -107,7 +116,7 @@ export class TicketsController { async createTicket( @Query() query: CommonTicketQueryParams, @Param() - params: PathParams, + params: PathParamsWithCollectionId, @Body() createTicketBody: CreateTicketBody, @GetIntegrationAccount(IntegrationType.TICKETING) integrationAccount: IntegrationAccount, @@ -117,7 +126,7 @@ export class TicketsController { `/tickets`, Method.POST, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, params, createTicketBody, ); diff --git a/engine-server/src/modules/categories/ticketing/models/ticket/tickets.interface.ts b/engine-server/src/modules/categories/ticketing/models/ticket/tickets.interface.ts index d3735085..2b076545 100644 --- a/engine-server/src/modules/categories/ticketing/models/ticket/tickets.interface.ts +++ b/engine-server/src/modules/categories/ticketing/models/ticket/tickets.interface.ts @@ -1,51 +1,32 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { IsArray, IsEnum, IsOptional, IsString } from 'class-validator'; +import { Transform } from 'class-transformer'; +import { IsArray, IsBoolean, IsOptional, IsString } from 'class-validator'; -import { - QueryParams, - JustRawParams, - DIRECTION_ENUM, -} from 'common/interfaces/query.interface'; +import { QueryParams, JustRawParams } from 'common/interfaces/query.interface'; import { Meta } from 'common/interfaces/response.interface'; -enum SORT_ENUM { - 'name' = 'name', - 'created_at' = 'created_at', - 'updated_at' = 'updated_at', -} - -enum STATUS_ENUM { - 'open' = 'open', - 'closed' = 'closed', - 'all' = 'all', -} - export class ListTicketsQueryParams extends QueryParams { @IsOptional() - @IsEnum(SORT_ENUM) - sort?: string; - - @IsOptional() - @IsEnum(DIRECTION_ENUM) - direction?: string; - - @IsOptional() - @IsEnum(STATUS_ENUM) - status?: string; - - @IsOptional() - @IsString() - since?: string; + @IsBoolean() + @Transform(({ value }) => { + return value === 'true' || value === 'True' || value === true; + }) + realtime?: boolean = false; +} +export class GetTicketsQueryParams extends QueryParams { @IsOptional() - @IsString() - assignee_id?: string; + @IsBoolean() + @Transform(({ value }) => { + return value === 'true' || value === 'True' || value === true; + }) + realtime?: boolean = false; } export class CommonTicketQueryParams extends JustRawParams {} -export class PathParams { +export class PathParamsWithCollectionId { @IsString() collection_id: string; } @@ -86,6 +67,24 @@ export class Ticket { completed_at: string; tags: TicketTag[]; } +export const TICKET_KEYS = [ + 'id', + 'parent_id', + 'collection_id', + 'type', + 'name', + 'description', + 'status', + 'priority', + 'ticket_url', + 'assignees', + 'updated_at', + 'created_at', + 'created_by', + 'due_date', + 'completed_at', + 'tags', +]; export class TicketingTicketResponse { data: Ticket; diff --git a/engine-server/src/modules/categories/ticketing/models/users/users.controller.ts b/engine-server/src/modules/categories/ticketing/models/users/users.controller.ts index 57291613..e9be1444 100644 --- a/engine-server/src/modules/categories/ticketing/models/users/users.controller.ts +++ b/engine-server/src/modules/categories/ticketing/models/users/users.controller.ts @@ -8,7 +8,6 @@ import { Method, getDataFromAccount } from 'shared/integration_account.utils'; import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { GetIntegrationAccount } from 'common/decorators/integration_account.decorator'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; import { AuthGuard } from 'modules/auth/auth.guard'; @@ -30,7 +29,7 @@ import { export class UsersController { @Get(':collection_id/users/:user_id') async getUserId( - @Query() query: GetUserParams = defaultQueryParams, + @Query() query: GetUserParams, @Param() params: PathParamsWithUserId, @GetIntegrationAccount(IntegrationType.TICKETING) @@ -41,7 +40,7 @@ export class UsersController { `/users/${params.user_id}`, Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, // eslint-disable-next-line @typescript-eslint/no-explicit-any params as any, ); @@ -51,7 +50,7 @@ export class UsersController { @Get(':collection_id/users') async getUsers( - @Query() query: ListUserParams = defaultQueryParams, + @Query() query: ListUserParams, @Param() params: PathParams, @GetIntegrationAccount(IntegrationType.TICKETING) @@ -62,7 +61,7 @@ export class UsersController { '/users', Method.GET, // eslint-disable-next-line @typescript-eslint/no-explicit-any - { ...defaultQueryParams, ...(query as any) }, + query, // eslint-disable-next-line @typescript-eslint/no-explicit-any params as any, ); diff --git a/engine-server/src/modules/categories/ticketing/ticketing.module.ts b/engine-server/src/modules/categories/ticketing/ticketing.module.ts index 48ce84dd..b302c262 100644 --- a/engine-server/src/modules/categories/ticketing/ticketing.module.ts +++ b/engine-server/src/modules/categories/ticketing/ticketing.module.ts @@ -7,9 +7,11 @@ import { PrismaModule, PrismaService } from 'nestjs-prisma'; import { IntegrationAccountModule } from 'modules/integration_account/integration_account.module'; import { CollectionController } from './models/collection/collection.controller'; +import { CollectionService } from './models/collection/collection.service'; import { CommentController } from './models/comment/comment.controller'; import { TagController } from './models/tag/tag.controller'; import { TeamController } from './models/team/team.controller'; +import { TicketService } from './models/ticket/ticket.service'; import { TicketsController } from './models/ticket/tickets.controller'; import { UsersController } from './models/users/users.controller'; @@ -23,7 +25,7 @@ import { UsersController } from './models/users/users.controller'; CommentController, TagController, ], - providers: [PrismaService], + providers: [PrismaService, CollectionService, TicketService], exports: [], }) export class TicketingModule {} diff --git a/engine-server/src/modules/integration_account/integration_account.controller.ts b/engine-server/src/modules/integration_account/integration_account.controller.ts index 871d3acc..d054aa41 100644 --- a/engine-server/src/modules/integration_account/integration_account.controller.ts +++ b/engine-server/src/modules/integration_account/integration_account.controller.ts @@ -144,12 +144,7 @@ export class IntegrationAccountController { createIntegrationAccountBody: CreateIntegrationAccountBody, ): Promise { return await this.integrationAccountService.createIntegrationAccount( - createIntegrationAccountBody.integrationDefinitionId, - createIntegrationAccountBody.config, - createIntegrationAccountBody.integrationAccountName, - createIntegrationAccountBody.authType, - createIntegrationAccountBody.workspaceId, - createIntegrationAccountBody.accountIdentifier, + createIntegrationAccountBody, ); } diff --git a/engine-server/src/modules/integration_account/integration_account.interface.ts b/engine-server/src/modules/integration_account/integration_account.interface.ts index 535946d6..be3c7c41 100644 --- a/engine-server/src/modules/integration_account/integration_account.interface.ts +++ b/engine-server/src/modules/integration_account/integration_account.interface.ts @@ -2,10 +2,18 @@ import { Config } from '@poozle/engine-idk'; import { IntegrationType } from '@prisma/client'; -import { IsObject, IsOptional, IsString } from 'class-validator'; +import { + IsBoolean, + IsEnum, + IsObject, + IsOptional, + IsString, +} from 'class-validator'; import { WorkspaceIdRequestBody } from 'common/interfaces/workspace.interface'; +import { SyncPeriod } from 'modules/sync/sync.util'; + export class IntegrationAccountRequestIdBody { /** * Unique identifier for Integration Account @@ -93,6 +101,21 @@ export class CreateIntegrationAccountBody extends WorkspaceIdRequestBody { @IsString() @IsOptional() accountIdentifier: string; + + /** + * Enable sync for this account + */ + @IsOptional() + @IsBoolean() + syncEnabled = false; + + /** + * Enable sync for this account + */ + @IsOptional() + @IsString() + @IsEnum(SyncPeriod) + syncPeriod?: SyncPeriod; } export class CreateIntegrationAccountWithLinkBody { @@ -149,4 +172,19 @@ export class UpdateIntegrationAccountBody { */ @IsObject() config: Config; + + /** + * Enable sync for this account + */ + @IsOptional() + @IsBoolean() + syncEnabled = false; + + /** + * Enable sync for this account + */ + @IsOptional() + @IsString() + @IsEnum(SyncPeriod) + syncPeriod?: SyncPeriod; } diff --git a/engine-server/src/modules/integration_account/integration_account.module.ts b/engine-server/src/modules/integration_account/integration_account.module.ts index ee17198d..69add4f6 100644 --- a/engine-server/src/modules/integration_account/integration_account.module.ts +++ b/engine-server/src/modules/integration_account/integration_account.module.ts @@ -6,12 +6,19 @@ import { PrismaModule, PrismaService } from 'nestjs-prisma'; import { IntegrationDefinitionModule } from 'modules/integration_definition/integration_definition.module'; import { LinkModule } from 'modules/link/link.module'; +import { SyncModule } from 'modules/sync/sync.module'; import { IntegrationAccountController } from './integration_account.controller'; import { IntegrationAccountService } from './integration_account.service'; @Module({ - imports: [PrismaModule, HttpModule, IntegrationDefinitionModule, LinkModule], + imports: [ + PrismaModule, + HttpModule, + IntegrationDefinitionModule, + LinkModule, + SyncModule, + ], controllers: [IntegrationAccountController], providers: [PrismaService, IntegrationAccountService], exports: [IntegrationAccountService], diff --git a/engine-server/src/modules/integration_account/integration_account.service.ts b/engine-server/src/modules/integration_account/integration_account.service.ts index 3b6b575e..4c66bb34 100644 --- a/engine-server/src/modules/integration_account/integration_account.service.ts +++ b/engine-server/src/modules/integration_account/integration_account.service.ts @@ -5,6 +5,7 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { CheckResponse, Config } from '@poozle/engine-idk'; import { IntegrationType } from '@prisma/client'; import { PrismaService } from 'nestjs-prisma'; @@ -14,8 +15,10 @@ import { } from 'shared/integration_run_utils'; import { IntegrationDefinitionService } from 'modules/integration_definition/integration_definition.service'; +import { SyncService } from 'modules/sync/sync.service'; import { + CreateIntegrationAccountBody, IntegrationAccountRequestBody, IntegrationAccountRequestBodyWithIntegrationType, IntegrationAccountRequestIdBody, @@ -27,6 +30,8 @@ export class IntegrationAccountService { constructor( private prismaService: PrismaService, private integrationDefinitionService: IntegrationDefinitionService, + private syncService: SyncService, + private configService: ConfigService, ) {} async checkForIntegrationCredentails( @@ -51,14 +56,19 @@ export class IntegrationAccountService { } async createIntegrationAccount( - integrationDefinitionId: string, - config: Config, - integrationAccountName: string, - authType: string, - workspaceId: string, - linkId?: string, - accountIdentifier?: string, + createIntegrationAccountBody: CreateIntegrationAccountBody, ) { + const { + integrationDefinitionId, + config, + integrationAccountName, + authType, + workspaceId, + accountIdentifier, + syncEnabled, + syncPeriod, + } = createIntegrationAccountBody; + const { status } = await this.checkForIntegrationCredentails( integrationDefinitionId, config, @@ -66,18 +76,45 @@ export class IntegrationAccountService { workspaceId, ); - if (status) { - return await this.prismaService.integrationAccount.create({ - data: { - integrationAccountName, - integrationDefinitionId, + if (syncEnabled) { + const integrationDefinition = + await this.integrationDefinitionService.getIntegrationDefinitionWithId( + { + integrationDefinitionId, + }, workspaceId, - integrationConfiguration: config, - authType, - linkId, - accountIdentifier, - }, - }); + ); + + if (integrationDefinition.integrationType !== IntegrationType.TICKETING) { + throw new BadRequestException( + 'Sync currently is only supported to ticketing category', + ); + } + } + + if (status) { + const integrationAccount = + await this.prismaService.integrationAccount.create({ + data: { + integrationAccountName, + integrationDefinitionId, + workspaceId, + integrationConfiguration: config, + authType, + syncEnabled, + syncPeriod, + accountIdentifier, + }, + }); + + if (this.configService.get('TEMPORAL_ADDRESS')) { + if (integrationAccount.syncEnabled) { + await this.syncService.createScheduleIfNotExist(integrationAccount); + await this.syncService.runInitialSync(integrationAccount); + } + } + + return integrationAccount; } throw new BadRequestException('Not a valid credentials'); @@ -133,6 +170,20 @@ export class IntegrationAccountService { async deleteIntegrationAccount( integrationAccountRequestIdBody: IntegrationAccountRequestIdBody, ) { + const integrationAccount = await this.getIntegrationAccountWithId( + integrationAccountRequestIdBody, + ); + + if (this.configService.get('TEMPORAL_ADDRESS')) { + const status = await this.syncService.deleteSyncSchedule( + integrationAccount, + ); + + if (!status) { + throw new BadRequestException('Deleting scheduling failed'); + } + } + return await this.prismaService.integrationAccount.delete({ where: { integrationAccountId: @@ -151,6 +202,11 @@ export class IntegrationAccountService { integrationAccountId: integrationAccountRequestBody.integrationAccountId, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, }, @@ -176,8 +232,14 @@ export class IntegrationAccountService { integrationType: integrationAccountRequestBody.integrationType, }, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, + workspace: true, }, }); @@ -185,7 +247,10 @@ export class IntegrationAccountService { throw new NotFoundException('No integration found'); } - return integrationAccounts[0]; + return { + ...integrationAccounts[0], + workspaceName: integrationAccounts[0].workspace.slug.replace(/-/g, ''), + }; } async getIntegrationAccountsForCategory(category: IntegrationType) { @@ -195,6 +260,11 @@ export class IntegrationAccountService { integrationType: category, }, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, }, @@ -208,6 +278,11 @@ export class IntegrationAccountService { workspaceId, }, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, }, @@ -218,16 +293,43 @@ export class IntegrationAccountService { integrationAccountId: string, updateIntegrationAccountBody: UpdateIntegrationAccountBody, ) { - return await this.prismaService.integrationAccount.update({ - data: { - integrationAccountName: - updateIntegrationAccountBody.integrationAccountName, - integrationConfiguration: updateIntegrationAccountBody.config, - }, - where: { + if (updateIntegrationAccountBody.syncEnabled) { + const integrationAccount = await this.getIntegrationAccountWithId({ integrationAccountId, - }, - }); + }); + + if ( + integrationAccount.integrationDefinition.integrationType !== + IntegrationType.TICKETING + ) { + throw new BadRequestException( + 'Sync currently is only supported to ticketing category', + ); + } + } + const integrationAccount = + await this.prismaService.integrationAccount.update({ + data: { + integrationAccountName: + updateIntegrationAccountBody.integrationAccountName, + integrationConfiguration: updateIntegrationAccountBody.config, + syncEnabled: updateIntegrationAccountBody.syncEnabled, + syncPeriod: updateIntegrationAccountBody.syncPeriod, + }, + where: { + integrationAccountId, + }, + }); + + if (this.configService.get('TEMPORAL_ADDRESS')) { + if (integrationAccount.syncEnabled) { + await this.syncService.updateSchedule(integrationAccount); + } else { + await this.syncService.deleteSyncSchedule(integrationAccount); + } + } + + return integrationAccount; } async checkForIntegrationAccountName( @@ -279,4 +381,15 @@ export class IntegrationAccountService { }, ); } + + async init() { + const integrationAccounts = + await this.prismaService.integrationAccount.findMany({ + where: { + syncEnabled: true, + }, + }); + + await this.syncService.initiate(integrationAccounts); + } } diff --git a/engine-server/src/modules/integration_definition/integration_definition.controller.ts b/engine-server/src/modules/integration_definition/integration_definition.controller.ts index 0dacbd86..4546805e 100644 --- a/engine-server/src/modules/integration_definition/integration_definition.controller.ts +++ b/engine-server/src/modules/integration_definition/integration_definition.controller.ts @@ -18,6 +18,8 @@ import { Specification } from '@poozle/engine-idk'; import { IntegrationDefinition } from '@@generated/integrationDefinition/entities'; +import { WorkspaceIdRequestBody } from 'common/interfaces/workspace.interface'; + import { AuthGuard } from 'modules/auth/auth.guard'; import { @@ -108,6 +110,20 @@ export class IntegrationDefinitionController { ); } + /** + * Check if there are latest integrations + * if there update in the database + */ + @Get('get_latest') + async updateIntegrationDefinitions( + @Query() + workspaceIdRequestBody: WorkspaceIdRequestBody, + ) { + return await this.integrationDefinitionService.updateIntegrationDefinitions( + workspaceIdRequestBody.workspaceId, + ); + } + /** * Get a integration definition in a workspace */ diff --git a/engine-server/src/modules/integration_definition/integration_definition.service.ts b/engine-server/src/modules/integration_definition/integration_definition.service.ts index b082698b..4b386294 100644 --- a/engine-server/src/modules/integration_definition/integration_definition.service.ts +++ b/engine-server/src/modules/integration_definition/integration_definition.service.ts @@ -3,7 +3,7 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { Specification } from '@poozle/engine-idk'; -import { ReleaseStage } from '@prisma/client'; +import { IntegrationType, ReleaseStage } from '@prisma/client'; import axios from 'axios'; import { PrismaService } from 'nestjs-prisma'; import { getIntegrationSpec } from 'shared/integration_run_utils'; @@ -29,9 +29,6 @@ export class IntegrationDefinitionService { { workspaceId: integrationDefinitionRequestWorkspaceIdBody.workspaceId, }, - { - workspaceId: null, - }, ]; if ( @@ -43,10 +40,6 @@ export class IntegrationDefinitionService { workspaceId: integrationDefinitionRequestWorkspaceIdBody.workspaceId, integrationType: cat, })), - ...integrationDefinitionRequestWorkspaceIdBody.category.map((cat) => ({ - workspaceId: null, - integrationType: cat, - })), ]; } @@ -197,4 +190,48 @@ export class IntegrationDefinitionService { ...latestDetails, }; } + + async updateIntegrationDefinitions(workspaceId: string) { + const integrationDefinitions = + await this.prisma.integrationDefinition.findMany({ + where: { + workspaceId, + }, + }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const integrationDefinitionsResponse: any = await axios.get( + 'https://raw.githubusercontent.com/poozlehq/engine/main/integration_definitions.json', + ); + + const totalIntegrationDefinitions = integrationDefinitionsResponse.data; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const integrationDefinitionCreate: any[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + totalIntegrationDefinitions.forEach((integrationDefinition: any) => { + const integrationExists = integrationDefinitions.find( + (id) => id.key === integrationDefinition.key, + ); + + if (!integrationExists) { + integrationDefinitionCreate.push({ + ...integrationDefinition, + workspaceId, + releaseStage: + ReleaseStage[integrationDefinition.releaseStage as ReleaseStage], + integrationType: + IntegrationType[ + integrationDefinition.integrationType as IntegrationType + ], + }); + } + }); + + if (integrationDefinitionCreate.length > 0) { + await this.prisma.integrationDefinition.createMany({ + data: integrationDefinitionCreate, + }); + } + } } diff --git a/engine-server/src/modules/integration_oauth/integration_oauth.service.ts b/engine-server/src/modules/integration_oauth/integration_oauth.service.ts index 468b644a..532fe1bd 100644 --- a/engine-server/src/modules/integration_oauth/integration_oauth.service.ts +++ b/engine-server/src/modules/integration_oauth/integration_oauth.service.ts @@ -23,6 +23,11 @@ export class IntegrationOAuthService { where: { workspaceId: integrationOAuthRequestWorkspaceIdBody.workspaceId, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, }, @@ -40,6 +45,11 @@ export class IntegrationOAuthService { integrationOAuthRequestIdBody.integrationOAuthAppId, workspaceId, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], include: { integrationDefinition: true, }, diff --git a/engine-server/src/modules/link/link.service.ts b/engine-server/src/modules/link/link.service.ts index d4fe98a5..1dbdfce1 100644 --- a/engine-server/src/modules/link/link.service.ts +++ b/engine-server/src/modules/link/link.service.ts @@ -110,6 +110,11 @@ export class LinkService { where: { workspaceId: workspaceIdQueryRequest.workspaceId, }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], }); return links.map((link) => { diff --git a/engine-server/src/modules/oauth_callback/oauth_callback.module.ts b/engine-server/src/modules/oauth_callback/oauth_callback.module.ts index c44ea222..29c53ca1 100644 --- a/engine-server/src/modules/oauth_callback/oauth_callback.module.ts +++ b/engine-server/src/modules/oauth_callback/oauth_callback.module.ts @@ -4,7 +4,7 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { PrismaModule, PrismaService } from 'nestjs-prisma'; -import { IntegrationAccountService } from 'modules/integration_account/integration_account.service'; +import { IntegrationAccountModule } from 'modules/integration_account/integration_account.module'; import { IntegrationDefinitionService } from 'modules/integration_definition/integration_definition.service'; import { IntegrationOAuthService } from 'modules/integration_oauth/integration_oauth.service'; import { LinkModule } from 'modules/link/link.module'; @@ -13,14 +13,13 @@ import { OAuthCallbackController } from './oauth_callback.controller'; import { OAuthCallbackService } from './oauth_callback.service'; @Module({ - imports: [PrismaModule, HttpModule, LinkModule], + imports: [PrismaModule, HttpModule, LinkModule, IntegrationAccountModule], controllers: [OAuthCallbackController], providers: [ OAuthCallbackService, PrismaService, IntegrationOAuthService, IntegrationDefinitionService, - IntegrationAccountService, ], exports: [OAuthCallbackService], }) diff --git a/engine-server/src/modules/oauth_callback/oauth_callback.service.ts b/engine-server/src/modules/oauth_callback/oauth_callback.service.ts index c894d2ad..1b4e965c 100644 --- a/engine-server/src/modules/oauth_callback/oauth_callback.service.ts +++ b/engine-server/src/modules/oauth_callback/oauth_callback.service.ts @@ -269,7 +269,7 @@ export class OAuthCallbackService { }; } - await this.integrationAccountService.createIntegrationAccount( + await this.integrationAccountService.createIntegrationAccountWithLink( integrationOAuth.integrationDefinitionId, // eslint-disable-next-line @typescript-eslint/no-explicit-any integrationConfiguration as any, diff --git a/engine-server/src/modules/sync/sync.controller.ts b/engine-server/src/modules/sync/sync.controller.ts new file mode 100644 index 00000000..75987489 --- /dev/null +++ b/engine-server/src/modules/sync/sync.controller.ts @@ -0,0 +1,37 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Controller, Get, Param } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; + +import { IntegrationAccountRequestIdBody } from 'modules/integration_account/integration_account.interface'; + +import { SyncService } from './sync.service'; + +@Controller({ + version: '1', + path: 'sync', +}) +@ApiTags('Sync') +export class SyncController { + constructor(private syncService: SyncService) {} + + @Get(':integrationAccountId') + async getSyncSchedule( + @Param() + integrationAccountIdRequestIdBody: IntegrationAccountRequestIdBody, + ) { + return await this.syncService.getSyncSchedule( + integrationAccountIdRequestIdBody.integrationAccountId, + ); + } + + @Get(':integrationAccountId/jobs') + async getJobs( + @Param() + integrationAccountIdRequestIdBody: IntegrationAccountRequestIdBody, + ) { + return await this.syncService.getJobs( + integrationAccountIdRequestIdBody.integrationAccountId, + ); + } +} diff --git a/engine-server/src/modules/sync/sync.module.ts b/engine-server/src/modules/sync/sync.module.ts new file mode 100644 index 00000000..a3b76ce0 --- /dev/null +++ b/engine-server/src/modules/sync/sync.module.ts @@ -0,0 +1,16 @@ +/** Copyright (c) 2022, Poozle, all rights reserved. **/ + +import { HttpModule } from '@nestjs/axios'; +import { Module } from '@nestjs/common'; +import { PrismaModule, PrismaService } from 'nestjs-prisma'; + +import { SyncController } from './sync.controller'; +import { SyncService } from './sync.service'; + +@Module({ + imports: [PrismaModule, HttpModule], + controllers: [SyncController], + providers: [PrismaService, SyncService], + exports: [SyncService], +}) +export class SyncModule {} diff --git a/engine-server/src/modules/sync/sync.service.ts b/engine-server/src/modules/sync/sync.service.ts new file mode 100644 index 00000000..73a0c8ba --- /dev/null +++ b/engine-server/src/modules/sync/sync.service.ts @@ -0,0 +1,206 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Injectable } from '@nestjs/common'; +import { + Client, + Connection, + ScheduleDescription, + ScheduleOverlapPolicy, +} from '@temporalio/client'; +import ms from 'ms'; +import { PrismaService } from 'nestjs-prisma'; + +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; + +import { getInterval } from './sync.util'; + +export const DEFAULT_QUEUE = 'SYNC_QUEUE'; +const OVERLAP_POLICY: ScheduleOverlapPolicy = ScheduleOverlapPolicy.ALLOW_ALL; + +@Injectable() +export class SyncService { + client: Client | null = null; + + constructor(private prismaService: PrismaService) { + this.init(); + } + + async init() { + const connection = await Connection.connect({ + address: process.env['TEMPORAL_ADDRESS'] || 'localhost:7233', + }); + const client = new Client({ + connection, + }); + + this.client = client; + } + + async initiate(integrationAccounts: IntegrationAccount[]) { + integrationAccounts.forEach(async (integrationAccount) => { + await this.createScheduleIfNotExist(integrationAccount); + }); + } + + async runInitialSync(integrationAccount: IntegrationAccount) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + + const scheduleHandle = this.client?.schedule.getHandle(scheduleId); + await scheduleHandle?.trigger(OVERLAP_POLICY); + } + + async runInitialSyncWithId(integrationAccountId: string) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccountId}`; + + const scheduleHandle = this.client?.schedule.getHandle(scheduleId); + await scheduleHandle?.trigger(ScheduleOverlapPolicy.BUFFER_ALL); + } + + async createScheduleIfNotExist(integrationAccount: IntegrationAccount) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + + try { + await this.client?.schedule.getHandle(scheduleId).describe(); + } catch (e) { + // If we are hear that means schedule is not there + await this.createSchedule(integrationAccount); + } + } + + async scheduleExists(integrationAccount: IntegrationAccount) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + + try { + await this.client?.schedule.getHandle(scheduleId).describe(); + return true; + } catch (e) { + // If we are hear that means schedule is not there + return false; + } + } + + async createSchedule(integrationAccount: IntegrationAccount) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + const { interval, offset } = getInterval( + integrationAccount.syncPeriod, + new Date(), + ); + + await this.client?.schedule.create({ + scheduleId, + spec: { + intervals: [ + { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + every: interval as any, + offset, + }, + ], + }, + action: { + type: 'startWorkflow', + workflowType: 'runSync', + taskQueue: DEFAULT_QUEUE, + args: [ + { + integrationAccountId: integrationAccount.integrationAccountId, + }, + ], + }, + }); + } + + async updateSchedule(integrationAccount: IntegrationAccount) { + function updateFunction(scheduleDescription: ScheduleDescription) { + const { interval, offset } = getInterval( + integrationAccount.syncPeriod, + new Date(), + ); + + scheduleDescription.spec = { + intervals: [ + { + every: ms(interval), + offset, + }, + ], + }; + return scheduleDescription; + } + + try { + /** + * Create the schedule if it doesn't exist + */ + const exists = await this.scheduleExists(integrationAccount); + + if (exists) { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + + const scheduleHandle = this.client?.schedule.getHandle(scheduleId); + + await scheduleHandle?.update(updateFunction); + } else { + await this.createSchedule(integrationAccount); + await this.runInitialSync(integrationAccount); + } + } catch (e) { + console.log(e); + } + } + + async deleteSyncSchedule( + integrationAccount: IntegrationAccount, + ): Promise { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccount.integrationAccountId}`; + + if (!this.client) { + return false; + } + + const workflowService = this.client?.workflowService; + try { + await workflowService?.deleteSchedule({ + scheduleId, + namespace: 'default', + }); + return true; + } catch (e) { + console.log(e); + return false; + } + } + + async getSyncSchedule(integrationAccountId: string) { + try { + const scheduleId = `${DEFAULT_QUEUE}.${integrationAccountId}`; + + const scheduleHandle = this.client?.schedule.getHandle(scheduleId); + + return await scheduleHandle.describe(); + } catch (e) { + return undefined; + } + } + + async getJobs(integrationAccountId: string) { + const jobs = await this.prismaService.job.findMany({ + where: { + integrationAccountId, + }, + orderBy: [ + { + updatedAt: 'asc', + }, + ], + }); + + const schedule = await this.getSyncSchedule(integrationAccountId); + + return { + jobs, + schedule, + }; + } +} diff --git a/engine-server/src/modules/sync/sync.util.ts b/engine-server/src/modules/sync/sync.util.ts new file mode 100644 index 00000000..0eb7a141 --- /dev/null +++ b/engine-server/src/modules/sync/sync.util.ts @@ -0,0 +1,66 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ +import ms from 'ms'; + +export function getOffset(interval: string, date: Date): number { + const intervalMilliseconds = ms(interval); + + const nowMilliseconds = + date.getMinutes() * 60 * 1000 + + date.getSeconds() * 1000 + + date.getMilliseconds(); + + const offset = nowMilliseconds % intervalMilliseconds; + + return offset; +} + +export enum SyncPeriod { + EVERY_HALF_DAY = 'EVERY_HALF_DAY', + EVERY_HALF_HOUR = 'EVERY_HALF_HOUR', + EVERY_QUARTER_HOUR = 'EVERY_QUARTER_HOUR', + EVERY_HOUR = 'EVERY_HOUR', + EVERY_DAY = 'EVERY_DAY', +} + +/** + * Get Interval + * @desc get the interval based on the runs property in the yaml. The offset + * should be the amount of time that the interval should be offset by. + * If the time is 1536 and the interval is 30m then the next time the sync should run is 1606 + * and then 1636 etc. The offset should be based on the interval and should never be + * greater than the interval + */ +export function getInterval( + runs: string, + date: Date, +): { interval: string; offset: number } { + if (runs === SyncPeriod.EVERY_HALF_DAY) { + return { interval: '12h', offset: getOffset('12h', date) }; + } + + if (runs === SyncPeriod.EVERY_HALF_HOUR) { + return { interval: '30m', offset: getOffset('30m', date) }; + } + + if (runs === SyncPeriod.EVERY_QUARTER_HOUR) { + return { interval: '15m', offset: getOffset('15m', date) }; + } + + if (runs === SyncPeriod.EVERY_HOUR) { + return { interval: '1h', offset: getOffset('1h', date) }; + } + + if (runs === SyncPeriod.EVERY_DAY) { + return { interval: '1d', offset: getOffset('1d', date) }; + } + + const interval = runs.replace('every ', ''); + + if (ms(interval) < ms('5m')) { + throw new Error('interval must be greater than 5 minutes'); + } + + const offset = getOffset(interval, date); + + return { interval, offset }; +} diff --git a/engine-server/src/modules/user/user.module.ts b/engine-server/src/modules/user/user.module.ts index 32069342..fc7bc88f 100644 --- a/engine-server/src/modules/user/user.module.ts +++ b/engine-server/src/modules/user/user.module.ts @@ -2,11 +2,13 @@ import { Module } from '@nestjs/common'; +import { IntegrationDefinitionModule } from 'modules/integration_definition/integration_definition.module'; + import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ - imports: [], + imports: [IntegrationDefinitionModule], controllers: [UserController], providers: [UserService], }) diff --git a/engine-server/src/modules/user/user.service.ts b/engine-server/src/modules/user/user.service.ts index a5291f1a..e6ddc89f 100644 --- a/engine-server/src/modules/user/user.service.ts +++ b/engine-server/src/modules/user/user.service.ts @@ -9,11 +9,16 @@ import { colors, } from 'unique-names-generator'; +import { IntegrationDefinitionService } from 'modules/integration_definition/integration_definition.service'; + import { CreateUserInput, UpdateUserInput } from './user.interface'; @Injectable() export class UserService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private integrationDefinitionService: IntegrationDefinitionService, + ) {} async updateUser( userId: string, @@ -44,7 +49,7 @@ export class UserService { separator: '-', }); // big_red - return this.prisma.user.create({ + const user = await this.prisma.user.create({ data: { ...userData, userId, @@ -58,5 +63,12 @@ export class UserService { Workspace: true, }, }); + + const workspace = user.Workspace[0]; + await this.integrationDefinitionService.updateIntegrationDefinitions( + workspace.workspaceId, + ); + + return user; } } diff --git a/engine-server/src/shared/integration_account.utils.ts b/engine-server/src/shared/integration_account.utils.ts index 2a877a8f..52e38505 100644 --- a/engine-server/src/shared/integration_account.utils.ts +++ b/engine-server/src/shared/integration_account.utils.ts @@ -2,9 +2,6 @@ import { IntegrationAccount } from '@@generated/integrationAccount/entities'; -import { defaultQueryParams } from 'common/interfaces/defaults.constants'; -import { QueryParams } from 'common/interfaces/query.interface'; - import { runIntegrationCommand } from './integration_run_utils'; export const enum Method { @@ -18,7 +15,8 @@ export async function getDataFromAccount( integrationAccount: IntegrationAccount, path: string, method: Method, - queryParams: QueryParams = defaultQueryParams, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + queryParams: any, // eslint-disable-next-line @typescript-eslint/no-explicit-any pathParams: any, // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/engine-server/tsconfig.json b/engine-server/tsconfig.json index 17e31e7f..aaa9f4d6 100644 --- a/engine-server/tsconfig.json +++ b/engine-server/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "esModuleInterop": true, "module": "commonjs", "declaration": false, "removeComments": true, diff --git a/engine-server/yarn.lock b/engine-server/yarn.lock index c77c647a..eea03928 100644 --- a/engine-server/yarn.lock +++ b/engine-server/yarn.lock @@ -412,6 +412,25 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@grpc/grpc-js@~1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" + integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.0": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.8.tgz#c050bbeae5f000a1919507f195a1b094e218036e" + integrity sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.2.4" + yargs "^17.7.2" + "@hapi/boom@^10.0.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-10.0.1.tgz#ebb14688275ae150aa6af788dbe482e6a6062685" @@ -931,6 +950,11 @@ consola "^2.15.0" node-fetch "^2.6.1" +"@opentelemetry/api@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" + integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + "@paciolan/remote-module-loader@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@paciolan/remote-module-loader/-/remote-module-loader-3.0.2.tgz#e07a24d5c8e80b6e02f978f9dc3290d5382aa559" @@ -1230,6 +1254,59 @@ tmp "0.2.1" ts-pattern "^4.0.1" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@schematics/angular@~13.3.0": version "13.3.11" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-13.3.11.tgz#7e3264c0da1ab16967eed85ef79c5445735c6160" @@ -1295,6 +1372,38 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@temporalio/client@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@temporalio/client/-/client-1.8.1.tgz#e531f913907223ffd3adcc46a796d445235bb558" + integrity sha512-TwAOsE6qcc3By+R+vZDULkzzWDbYf8zBie61zu2nAGfspD3pbMCG2sTFXsNs6y6avF2sofu3d559YrQClGW++Q== + dependencies: + "@grpc/grpc-js" "~1.7.3" + "@temporalio/common" "1.8.1" + "@temporalio/proto" "1.8.1" + abort-controller "^3.0.0" + long "^5.2.0" + uuid "^8.3.2" + +"@temporalio/common@1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@temporalio/common/-/common-1.8.1.tgz#6dcce257699313b5f66324452b6936ef1167060a" + integrity sha512-U1aAjC/vAZC88WrAuhE4JcUHS58v813HsBhYRQOTqsY4avDW59wa2tU1FSd8jz6Q/MgC0jRzP4ADOCyvpRIE+Q== + dependencies: + "@opentelemetry/api" "^1.4.1" + "@temporalio/proto" "1.8.1" + long "^5.2.0" + ms "^3.0.0-canary.1" + proto3-json-serializer "^1.0.3" + protobufjs "^7.0.0" + +"@temporalio/proto@1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@temporalio/proto/-/proto-1.8.1.tgz#2c2eb7d9616363ce3526aa727cecede2b68fb601" + integrity sha512-upXcA8hiDsDFjfNeYY6CQg/xEG3dtqYCrHPpTnF7K/Qyv/HRuoJUu3smFRKyeekAUE2KFuwOmAmXq5sV/HqUVw== + dependencies: + long "^5.2.0" + protobufjs "^7.0.0" + "@timsuchanek/copy@1.4.5": version "1.4.5" resolved "https://registry.yarnpkg.com/@timsuchanek/copy/-/copy-1.4.5.tgz#8e9658c056e24e1928a88bed45f9eac6a72b7c40" @@ -1545,6 +1654,11 @@ dependencies: "@types/node" "*" +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -1565,6 +1679,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "20.4.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.4.tgz#c79c7cc22c9d0e97a7944954c9e663bcbd92b0cb" + integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew== + "@types/node@^18.11.18": version "18.16.16" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.16.tgz#3b64862856c7874ccf7439e6bab872d245c86d8e" @@ -1923,6 +2042,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" @@ -2404,6 +2530,11 @@ buffer-from@^1.0.0: 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" @@ -2679,6 +2810,11 @@ color-support@^1.1.2: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colorette@2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2691,6 +2827,11 @@ commander@4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3310,6 +3451,11 @@ eslint@8.32.0: strip-json-comments "^3.1.0" text-table "^0.2.0" +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^9.4.0: version "9.5.2" resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" @@ -3358,6 +3504,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +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" @@ -3784,6 +3935,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== + 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" @@ -4112,6 +4268,11 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -4891,6 +5052,26 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +knex@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.1.tgz#a6c6b449866cf4229f070c17411f23871ba52ef9" + integrity sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA== + dependencies: + colorette "2.0.19" + commander "^10.0.0" + debug "4.3.4" + escalade "^3.1.1" + esm "^3.2.25" + get-package-type "^0.1.0" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.6.1" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -4950,6 +5131,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -5003,6 +5189,16 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +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== + +long@^5.0.0, long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5221,6 +5417,11 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@^3.0.0-canary.1: + version "3.0.0-canary.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" + integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== + multer@1.4.4-lts.1: version "1.4.4-lts.1" resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4-lts.1.tgz#24100f701a4611211cfae94ae16ea39bb314e04d" @@ -5526,6 +5727,11 @@ 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== +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== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5615,6 +5821,64 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@2.6.1, pg-connection-string@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + +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.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + +pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +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.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.1.tgz#297e0eb240306b1e9e4f55af8a3bae76ae4810b1" + integrity sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.1" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +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" @@ -5642,6 +5906,28 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +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 sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +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" @@ -5707,6 +5993,31 @@ prompts@2.4.2, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +proto3-json-serializer@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz#1b5703152b6ce811c5cdcc6468032caf53521331" + integrity sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw== + dependencies: + protobufjs "^7.0.0" + +protobufjs@^7.0.0, protobufjs@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5871,6 +6182,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + reflect-metadata@0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -6266,6 +6584,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -6513,6 +6836,11 @@ tar@^6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" +tarn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" + integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== + temp-dir@2.0.0, temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -6593,6 +6921,11 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + tmp@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -6916,7 +7249,7 @@ utils-merge@1.0.1, utils-merge@^1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2: +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== @@ -7157,7 +7490,7 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== diff --git a/engine-webapp/.env.prod b/engine-webapp/.env.prod index 24cedf21..ca49b0d4 100644 --- a/engine-webapp/.env.prod +++ b/engine-webapp/.env.prod @@ -1,3 +1,3 @@ -NEXT_PUBLIC_VERSION=0.1.6-alpha +NEXT_PUBLIC_VERSION=0.1.7-alpha NEXT_PUBLIC_BASE_HOST=PROD_NEXT_PUBLIC_BASE_HOST diff --git a/engine-webapp/package.json b/engine-webapp/package.json index da10a314..6206be8c 100644 --- a/engine-webapp/package.json +++ b/engine-webapp/package.json @@ -1,6 +1,6 @@ { "name": "engine-webapp", - "version": "0.1.4-alpha", + "version": "0.1.7-alpha", "description": "Poozle engine webapp", "author": "Poozle", "license": "MIT", diff --git a/engine-webapp/src/@@generated/integrationAccount/dto/connect-integrationAccount.dto.ts b/engine-webapp/src/@@generated/integrationAccount/dto/connect-integrationAccount.dto.ts deleted file mode 100644 index f0c03a76..00000000 --- a/engine-webapp/src/@@generated/integrationAccount/dto/connect-integrationAccount.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ - - export class ConnectIntegrationAccountDto { - integrationAccountId: string; - } - \ No newline at end of file diff --git a/engine-webapp/src/@@generated/integrationAccount/dto/create-integrationAccount.dto.ts b/engine-webapp/src/@@generated/integrationAccount/dto/create-integrationAccount.dto.ts deleted file mode 100644 index abde38d4..00000000 --- a/engine-webapp/src/@@generated/integrationAccount/dto/create-integrationAccount.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class CreateIntegrationAccountDto { - integrationConfiguration?: any; - authType: string; - integrationAccountName: string; - deleted?: Date; -} diff --git a/engine-webapp/src/@@generated/integrationAccount/dto/index.ts b/engine-webapp/src/@@generated/integrationAccount/dto/index.ts deleted file mode 100644 index d5f27edf..00000000 --- a/engine-webapp/src/@@generated/integrationAccount/dto/index.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export * from './connect-integrationAccount.dto'; -export * from './create-integrationAccount.dto'; -export * from './update-integrationAccount.dto'; \ No newline at end of file diff --git a/engine-webapp/src/@@generated/integrationAccount/dto/update-integrationAccount.dto.ts b/engine-webapp/src/@@generated/integrationAccount/dto/update-integrationAccount.dto.ts deleted file mode 100644 index 626bfc8e..00000000 --- a/engine-webapp/src/@@generated/integrationAccount/dto/update-integrationAccount.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class UpdateIntegrationAccountDto { - integrationConfiguration?: any; - authType?: string; - integrationAccountName?: string; - deleted?: Date; -} diff --git a/engine-webapp/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts b/engine-webapp/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts index b13cb612..393b3710 100644 --- a/engine-webapp/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts +++ b/engine-webapp/src/@@generated/integrationAccount/entities/integrationAccount.entity.ts @@ -11,6 +11,20 @@ export class IntegrationAccount { workspace?: Workspace; workspaceId: string; integrationAccountName: string; + /** + * This is used to map organisations/user_id fo the customers + */ + accountIdentifier?: string; + + /** + * Boolean to check if syncing is enabled + */ + syncEnabled: boolean; + + /** + * Internal for sync + */ + syncPeriod?: string; deleted: Date | null; createdAt: Date; updatedAt: Date; diff --git a/engine-webapp/src/@@generated/job/entities/index.ts b/engine-webapp/src/@@generated/job/entities/index.ts new file mode 100644 index 00000000..77c6125c --- /dev/null +++ b/engine-webapp/src/@@generated/job/entities/index.ts @@ -0,0 +1 @@ +export * from './job'; diff --git a/engine-webapp/src/@@generated/job/entities/job.ts b/engine-webapp/src/@@generated/job/entities/job.ts new file mode 100644 index 00000000..c334c172 --- /dev/null +++ b/engine-webapp/src/@@generated/job/entities/job.ts @@ -0,0 +1,18 @@ +export enum JobStatus { + PENDING = 'PENDING', + RUNNING = 'RUNNING', + FAILED = 'FAILED', + SUCCEEDED = 'SUCCEEDED', +} + +export interface Job { + jobId: string; + temporalId: string; + integrationAccountId: string; + status: JobStatus; + failedMessage: string | null; + recordsSynced: number | null; + logs: string | null; + createdAt: Date; + updatedAt: Date; +} diff --git a/engine-webapp/src/components/table/table.tsx b/engine-webapp/src/components/table/table.tsx index f9b3d868..500671bf 100644 --- a/engine-webapp/src/components/table/table.tsx +++ b/engine-webapp/src/components/table/table.tsx @@ -1,5 +1,5 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { Table as MTable, TableProps, Text } from '@mantine/core'; +import { Group, Table as MTable, TableProps, Text } from '@mantine/core'; import styles from './table.module.scss'; @@ -51,7 +51,13 @@ export function Table({ - {rows} + {rows.length > 0 && {rows}} + + {rows.length === 0 && ( + + No data found + + )} ); } diff --git a/engine-webapp/src/modules/home/first_integration/first_integration.tsx b/engine-webapp/src/modules/home/first_integration/first_integration.tsx index 37918797..2f6bfeea 100644 --- a/engine-webapp/src/modules/home/first_integration/first_integration.tsx +++ b/engine-webapp/src/modules/home/first_integration/first_integration.tsx @@ -62,7 +62,10 @@ export function FirstIntegration() { {selectedIntegrationDefinition && ( + id.integrationDefinitionId === selectedIntegrationDefinition, + )} workspaceId={workspaceId as string} onComplete={() => { // TODO (harshith): Change the status in workspace diff --git a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account.tsx b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account.tsx index e56e5de9..ddefb6b2 100644 --- a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account.tsx +++ b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account.tsx @@ -66,7 +66,10 @@ export function NewIntegration() { {selectedIntegrationDefinition && ( + id.integrationDefinitionId === selectedIntegrationDefinition, + )} workspaceId={workspaceId as string} /> )} diff --git a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form.tsx b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form.tsx index c755abd6..92757987 100644 --- a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form.tsx +++ b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form.tsx @@ -2,6 +2,7 @@ /* eslint-disable prettier/prettier */ /** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { IntegrationDefinition } from '@@generated/integrationDefinition/entities'; import { Alert, Button, Group, Select, TextInput } from '@mantine/core'; import { useForm } from '@mantine/form'; import { notifications } from '@mantine/notifications'; @@ -25,7 +26,7 @@ import { } from './new_integration_account_form_utils'; interface NewIntegrationFormProps { - integrationDefinitionId: string; + integrationDefinition: IntegrationDefinition; workspaceId: string; integrationAccountNameDefault?: string; onComplete?: () => void; @@ -36,14 +37,14 @@ interface FormProps { workspaceId: string; onComplete?: () => void; integrationAccountNameDefault?: string; - integrationDefinitionId: string; + integrationDefinition: IntegrationDefinition; } export function Form({ spec, workspaceId, integrationAccountNameDefault, - integrationDefinitionId, + integrationDefinition, onComplete, }: FormProps) { const form = useForm({ @@ -82,11 +83,13 @@ export function Form({ // eslint-disable-next-line @typescript-eslint/no-explicit-any const onSubmit = (values: any) => { createIntegrationAccount({ - integrationDefinitionId, + integrationDefinitionId: integrationDefinition.integrationDefinitionId, workspaceId, config: values[getPropertyName(values.authType)], authType: values.authType, integrationAccountName: values.integrationAccountName, + syncEnabled: values.syncEnabled === 'Yes' ? true : false, + syncPeriod: values.syncPeriod, }); }; @@ -103,7 +106,8 @@ export function Form({ checkCredentials({ workspaceId: workspaceId as string, - integrationDefinitionId, + integrationDefinitionId: + integrationDefinition.integrationDefinitionId, // eslint-disable-next-line @typescript-eslint/no-explicit-any config: values[getPropertyName(authType)], authType, @@ -161,7 +165,7 @@ export function Form({ } export function NewIntegrationForm({ - integrationDefinitionId, + integrationDefinition, workspaceId, integrationAccountNameDefault, onComplete, @@ -171,7 +175,7 @@ export function NewIntegrationForm({ isLoading, error, } = useGetIntegrationDefinitionSpecQuery({ - integrationDefinitionId, + integrationDefinitionId: integrationDefinition.integrationDefinitionId, workspaceId: workspaceId as string, }); @@ -200,7 +204,7 @@ export function NewIntegrationForm({ spec={integrationDefinitionSpec as any} workspaceId={workspaceId as string} onComplete={onComplete} - integrationDefinitionId={integrationDefinitionId} + integrationDefinition={integrationDefinition} integrationAccountNameDefault={integrationAccountNameDefault} /> ); diff --git a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form_utils.ts b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form_utils.ts index f2174ec2..74799dba 100644 --- a/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form_utils.ts +++ b/engine-webapp/src/modules/integration_account/new_integration_account/new_integration_account_form_utils.ts @@ -61,5 +61,8 @@ export function getInitialValues( // eslint-disable-next-line prefer-destructuring initialValues['authType'] = Object.keys(spec.auth_specification)[0]; + initialValues['syncEnabled'] = false; + initialValues['syncPeriod'] = undefined; + return initialValues; } diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/data/data.module.scss b/engine-webapp/src/modules/integration_account/update_integration_account/data/data.module.scss new file mode 100644 index 00000000..7749fc14 --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/data/data.module.scss @@ -0,0 +1,19 @@ +.form { + width: 100%; +} + +.formContainer { + width: 100%; +} + +.tableDataContainer { + padding: var(--mantine-spacing-md) 0; +} + +.tablePaper { + border: 1px solid var(--mantine-color-gray-2); +} + +.container { + border: 1px solid var(--mantine-color-gray-2); +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/data/data.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/data/data.tsx new file mode 100644 index 00000000..2fff863f --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/data/data.tsx @@ -0,0 +1,111 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; +import { Job } from '@@generated/job/entities'; +import { Text, Tooltip, ActionIcon, Paper, Alert, Group } from '@mantine/core'; +import { IconDownload } from '@tabler/icons-react'; +import * as React from 'react'; + +import { useGetSyncScheduleQuery } from 'services/sync/get_schedule'; + +import { Loader, Table } from 'components'; + +import styles from './data.module.scss'; +import { SyncStatus } from './sync_status'; +import { showDateInUI } from '../../../../utils/common'; + +interface DataProps { + integrationAccount: IntegrationAccount; +} + +export function Data({ integrationAccount }: DataProps) { + const { data: syncSchedule, isLoading } = useGetSyncScheduleQuery({ + integrationAccountId: integrationAccount.integrationAccountId, + }); + + const download = (content: string) => { + // This creates the file. + // In my case, I have an array, and each item in + // the array should be on a new line, which is why + // I use .join('\n') here. + const data = new Blob([content], { type: 'text/plain' }); + + // update the download link state + window.open(window.URL.createObjectURL(data), '_blank'); + }; + + if (isLoading) { + return ; + } + + const columns = [ + { + name: 'Status', + key: 'status', + render: (data: Job) => { + return ( +
+ +
+ ); + }, + }, + { + name: 'Sync start time', + key: 'last_sync', + render: (data: Job) => { + return ( +
+ + {showDateInUI(data.createdAt)} + +
+ ); + }, + }, + + { + name: 'Actions', + key: 'action', + render: (data: Job) => { + return ( +
+ + download(data.logs)}> + + + +
+ ); + }, + }, + ]; + + return ( +
+ {syncSchedule.schedule?.info?.nextActionTimes && ( + + + Next sync will start at + + {showDateInUI( + new Date(syncSchedule.schedule?.info?.nextActionTimes[0]), + )} + + + + )} + + + + + ); +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/data/index.ts b/engine-webapp/src/modules/integration_account/update_integration_account/data/index.ts new file mode 100644 index 00000000..80e97ef1 --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/data/index.ts @@ -0,0 +1,3 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export * from './data'; diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.module.scss b/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.module.scss new file mode 100644 index 00000000..f1c37f77 --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.module.scss @@ -0,0 +1,3 @@ +.failedMessage { + max-width: 200px; +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.tsx new file mode 100644 index 00000000..8e6bf5be --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/data/sync_status.tsx @@ -0,0 +1,62 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { JobStatus } from '@@generated/job/entities'; +import { Group, Stack, Text, ThemeIcon } from '@mantine/core'; +import { IconCheck, IconLoader, IconX } from '@tabler/icons-react'; + +import styles from './sync_status.module.scss'; + +interface SyncStatusProps { + status: JobStatus; + failedMessage?: string; +} + +export function SyncStatus({ status, failedMessage }: SyncStatusProps) { + if (status === JobStatus.FAILED) { + return ( + + + + + + Failed + + + {failedMessage && ( + + {failedMessage} + + )} + + ); + } + + if (status === JobStatus.RUNNING) { + return ( + + + + + + Running + + + ); + } + + return ( + <> + + + + + Done + + + ); +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/delete_integration_account/delete_integration_account.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/delete_integration_account/delete_integration_account.tsx index c8fda624..b0fed028 100644 --- a/engine-webapp/src/modules/integration_account/update_integration_account/delete_integration_account/delete_integration_account.tsx +++ b/engine-webapp/src/modules/integration_account/update_integration_account/delete_integration_account/delete_integration_account.tsx @@ -1,5 +1,6 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { Paper, Stack, @@ -16,11 +17,11 @@ import { useDeleteIntegrationAccount } from 'services/integration_account'; import styles from './delete_integration_account.module.scss'; interface DeleteIntegrationAccountProps { - integrationAccountId: string; + integrationAccount: IntegrationAccount; } export function DeleteIntegrationAccount({ - integrationAccountId, + integrationAccount, }: DeleteIntegrationAccountProps) { const router = useRouter(); @@ -61,7 +62,8 @@ export function DeleteIntegrationAccount({ size="xs" onClick={() => deleteIntegrationAccount({ - integrationAccountId, + integrationAccountId: + integrationAccount.integrationAccountId, }) } > diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/settings/settings.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/settings/settings.tsx index df0a1c89..2c058c36 100644 --- a/engine-webapp/src/modules/integration_account/update_integration_account/settings/settings.tsx +++ b/engine-webapp/src/modules/integration_account/update_integration_account/settings/settings.tsx @@ -1,13 +1,29 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; +import { Stack } from '@mantine/core'; +import { isSyncEnabled } from 'utils/sync'; + import { DeleteIntegrationAccount } from '../delete_integration_account'; +import { SyncSettings } from '../sync_settings'; interface SettingsProps { - integrationAccountId: string; + integrationAccount: IntegrationAccount; + refetch: () => void; } -export function Settings({ integrationAccountId }: SettingsProps) { +export function Settings({ integrationAccount, refetch }: SettingsProps) { return ( - + + {isSyncEnabled( + integrationAccount.integrationDefinition.integrationType, + ) && ( + + )} + + ); } diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/index.ts b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/index.ts new file mode 100644 index 00000000..f534a96b --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/index.ts @@ -0,0 +1,3 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export * from './sync_settings'; diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.module.scss b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.module.scss new file mode 100644 index 00000000..11f66700 --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.module.scss @@ -0,0 +1,15 @@ +.container { + border: 1px solid var(--mantine-color-gray-2); +} + +.title { + border-bottom: 1px solid var(--mantine-color-gray-2); +} + +.formContainer { + width: 100%; +} + +.form { + width: 100%; +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.tsx new file mode 100644 index 00000000..e68e9c33 --- /dev/null +++ b/engine-webapp/src/modules/integration_account/update_integration_account/sync_settings/sync_settings.tsx @@ -0,0 +1,103 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { IntegrationAccount } from '@@generated/integrationAccount/entities'; +import { Button, Group, Paper, Select, Stack, Title } from '@mantine/core'; +import { useForm } from '@mantine/form'; +import { notifications } from '@mantine/notifications'; +import { IconCheck } from '@tabler/icons-react'; +import { SYNC_OPTIONS, SYNC_OPTION_ENUM } from 'utils/sync'; + +import { useUpdateIntegrationAccountMutation } from 'services/integration_account'; + +import styles from './sync_settings.module.scss'; + +interface SyncSettingstProps { + integrationAccount: IntegrationAccount; + refetch: () => void; +} + +export function SyncSettings({ + integrationAccount, + refetch, +}: SyncSettingstProps) { + const { mutate: updateIntegrationAccount, isLoading: updateIsLoading } = + useUpdateIntegrationAccountMutation({ + onSuccess: (data) => { + refetch(); + notifications.show({ + icon: , + title: 'Status', + color: 'green', + message: `Integration account ${data.integrationAccountName} is updated`, + }); + }, + onError: (err) => { + console.log(err); + }, + }); + + const form = useForm({ + initialValues: { + syncEnabled: integrationAccount.syncEnabled ? 'Yes' : 'No', + syncPeriod: integrationAccount.syncPeriod + ? integrationAccount.syncPeriod + : undefined, + }, + }); + + return ( + + + + Sync Settings + + + + +
{ + updateIntegrationAccount({ + config: integrationAccount.integrationConfiguration, + authType: integrationAccount.authType, + integrationAccountName: integrationAccount.integrationAccountName, + integrationAccountId: integrationAccount.integrationAccountId, + syncEnabled: values.syncEnabled === 'Yes' ? true : false, + syncPeriod: values.syncPeriod as SYNC_OPTION_ENUM, + }); + })} + > + ({ + label: SYNC_OPTIONS[option], + value: option, + }), + )} + placeholder="Choose sync period" + {...form.getInputProps('syncPeriod')} + /> + )} + + + + + +
+
+ ); +} diff --git a/engine-webapp/src/modules/integration_account/update_integration_account/update_integration_account.tsx b/engine-webapp/src/modules/integration_account/update_integration_account/update_integration_account.tsx index 74666389..414a7435 100644 --- a/engine-webapp/src/modules/integration_account/update_integration_account/update_integration_account.tsx +++ b/engine-webapp/src/modules/integration_account/update_integration_account/update_integration_account.tsx @@ -1,10 +1,11 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ import { Group, Paper, Stack, Tabs, Text } from '@mantine/core'; -import { IconLine, IconSettings } from '@tabler/icons-react'; +import { IconBox, IconLine, IconSettings } from '@tabler/icons-react'; import { useRouter } from 'next/router'; import { SessionAuth } from 'supertokens-auth-react/recipe/session'; import { showDateInUI } from 'utils'; +import { isSyncEnabled } from 'utils/sync'; import { SideBarLayout } from 'layouts/sidebar_layout'; import { GetUserData } from 'wrappers/get_user_data'; @@ -13,6 +14,7 @@ import { useGetIntegrationAccountQuery } from 'services/integration_account'; import { Header, IntegrationIcon, IntegrationType, Loader } from 'components'; +import { Data } from './data'; import { Settings } from './settings'; import styles from './update_integration_account.module.scss'; import { UpdateIntegrationForm } from './update_integration_account_form'; @@ -68,6 +70,18 @@ export function UpdateIntegration() { Overview + {isSyncEnabled( + integrationAccount.integrationDefinition.integrationType, + ) && ( + } + value="data" + > + Data + + )} + } @@ -89,9 +103,18 @@ export function UpdateIntegration() { + {isSyncEnabled( + integrationAccount.integrationDefinition.integrationType, + ) && ( + + + + )} + diff --git a/engine-webapp/src/modules/settings/integrations/integrations.tsx b/engine-webapp/src/modules/settings/integrations/integrations.tsx index a7f90ed1..d1f33424 100644 --- a/engine-webapp/src/modules/settings/integrations/integrations.tsx +++ b/engine-webapp/src/modules/settings/integrations/integrations.tsx @@ -7,94 +7,22 @@ import { Group, Loader, Paper, - Popover, Stack, Text, UnstyledButton, } from '@mantine/core'; -import { notifications } from '@mantine/notifications'; -import { IconAlertSmall, IconCheck } from '@tabler/icons-react'; +import axios from 'axios'; import { useRouter } from 'next/router'; import * as React from 'react'; -import { - useGetIntegrationDefinitionsQuery, - useUpdateIntegrationDefinitionMutation, -} from 'services/integration_definition'; +import { useGetIntegrationDefinitionsQuery } from 'services/integration_definition'; import { IntegrationIcon, IntegrationType, Table } from 'components'; import { ReleaseStage } from 'components/release_stage'; import { AddNewIntegrationModal } from './add_new_integration_modal'; import styles from './integrations.module.scss'; - -interface UpdateComponentInterface { - id: IntegrationDefinition; - refetch: () => void; -} - -function UpdateComponent({ id, refetch }: UpdateComponentInterface) { - const { - mutate: updateIntegrationDefinitionServer, - isLoading: loadingUpdateIntegration, - } = useUpdateIntegrationDefinitionMutation({ - onSuccess: () => { - notifications.show({ - icon: , - title: 'Status', - color: 'green', - message: `Integration is updated successfully`, - }); - refetch(); - }, - onError: (err) => { - notifications.show({ - icon: , - title: 'Status', - color: 'red', - message: err, - }); - }, - }); - - const updateIntegrationDefinition = (id: IntegrationDefinition) => { - updateIntegrationDefinitionServer({ - integrationDefinitionId: id.integrationDefinitionId, - sourceUrl: id.latestVersionSource, - version: id.latestVersion, - }); - }; - - return ( -
- - - - - - - Do this only when you are really sure -
- - - -
-
-
-
-
- ); -} +import { UpdateComponent } from './update_integration'; export function Integrations() { const router = useRouter(); @@ -112,6 +40,14 @@ export function Integrations() { workspaceId: workspaceId as string, }); + const updateintegrationDefinitions = async () => { + await axios.get( + `/api/v1/integration_definition/get_latest?workspaceId=${workspaceId}`, + ); + + refetch(); + }; + const columns = [ { name: 'Name', @@ -202,12 +138,18 @@ export function Integrations() { return (
- + + - +
void; +} + +export function UpdateComponent({ id, refetch }: UpdateComponentInterface) { + const { + mutate: updateIntegrationDefinitionServer, + isLoading: loadingUpdateIntegration, + } = useUpdateIntegrationDefinitionMutation({ + onSuccess: () => { + notifications.show({ + icon: , + title: 'Status', + color: 'green', + message: `Integration is updated successfully`, + }); + refetch(); + }, + onError: (err) => { + notifications.show({ + icon: , + title: 'Status', + color: 'red', + message: err, + }); + }, + }); + + const updateIntegrationDefinition = (id: IntegrationDefinition) => { + updateIntegrationDefinitionServer({ + integrationDefinitionId: id.integrationDefinitionId, + sourceUrl: id.latestVersionSource, + version: id.latestVersion, + }); + }; + + return ( +
+ + + + + + + Do this only when you are really sure +
+ + + +
+
+
+
+
+ ); +} diff --git a/engine-webapp/src/services/integration_account/create_integration_account.ts b/engine-webapp/src/services/integration_account/create_integration_account.ts index 111eb98b..2a5741d7 100644 --- a/engine-webapp/src/services/integration_account/create_integration_account.ts +++ b/engine-webapp/src/services/integration_account/create_integration_account.ts @@ -3,6 +3,7 @@ import { IntegrationAccount } from '@@generated/integrationAccount/entities/integrationAccount.entity'; import { useMutation } from 'react-query'; import { ajaxPost } from 'utils'; +import { SYNC_OPTION_ENUM } from 'utils/sync'; export interface CreateIntegrationAccountParams { integrationDefinitionId: string; @@ -11,6 +12,9 @@ export interface CreateIntegrationAccountParams { authType: string; workspaceId: string; integrationAccountName: string; + + syncEnabled?: boolean; + syncPeriod?: SYNC_OPTION_ENUM; } export interface CreateIntegrationAccountWithoutWorkspaceParams { diff --git a/engine-webapp/src/services/integration_account/update_integration_account.ts b/engine-webapp/src/services/integration_account/update_integration_account.ts index 75bc3d74..a2fa6176 100644 --- a/engine-webapp/src/services/integration_account/update_integration_account.ts +++ b/engine-webapp/src/services/integration_account/update_integration_account.ts @@ -3,6 +3,7 @@ import { IntegrationAccount } from '@@generated/integrationAccount/entities'; import { useMutation } from 'react-query'; import { ajaxPost } from 'utils'; +import { SYNC_OPTION_ENUM } from 'utils/sync'; export interface UpdateIntegrationAccountParams { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -10,6 +11,9 @@ export interface UpdateIntegrationAccountParams { integrationAccountName: string; authType: string; integrationAccountId: string; + + syncEnabled?: boolean; + syncPeriod?: SYNC_OPTION_ENUM; } export function updateIntegrationAccount({ diff --git a/engine-webapp/src/services/sync/get_schedule.ts b/engine-webapp/src/services/sync/get_schedule.ts new file mode 100644 index 00000000..cc6e6734 --- /dev/null +++ b/engine-webapp/src/services/sync/get_schedule.ts @@ -0,0 +1,40 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Job } from '@@generated/job/entities'; +import { UseQueryResult, useQuery } from 'react-query'; +import { XHRErrorResponse, ajaxGet } from 'utils'; + +/** + * Query Key for Get user. + */ +export const GetSyncSchedule = 'getSyncSchedule'; + +interface SyncSchedule { + jobs: Job; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + schedule: any; +} + +interface SyncSchedulesParams { + integrationAccountId: string; +} + +export function getSyncSchedule(params: SyncSchedulesParams) { + return ajaxGet({ + url: `/api/v1/sync/${params.integrationAccountId}/jobs`, + }); +} + +export function useGetSyncScheduleQuery( + queryParams: SyncSchedulesParams, +): UseQueryResult { + return useQuery( + [GetSyncSchedule, queryParams], + () => getSyncSchedule(queryParams), + { + notifyOnChangeProps: 'tracked', + retry: 1, + refetchOnWindowFocus: false, // Frequency of Change would be Low + }, + ); +} diff --git a/engine-webapp/src/utils/sync.ts b/engine-webapp/src/utils/sync.ts new file mode 100644 index 00000000..ec13f61e --- /dev/null +++ b/engine-webapp/src/utils/sync.ts @@ -0,0 +1,23 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { IntegrationType } from 'lib/integration_type'; + +export enum SYNC_OPTION_ENUM { + EVERY_HALF_DAY = 'EVERY_HALF_DAY', + EVERY_HALF_HOUR = 'EVERY_HALF_HOUR', + EVERY_QUARTER_HOUR = 'EVERY_QUARTER_HOUR', + EVERY_HOUR = 'EVERY_HOUR', + EVERY_DAY = 'EVERY_DAY', +} + +export const SYNC_OPTIONS = { + EVERY_HALF_DAY: 'every half day', + EVERY_HALF_HOUR: 'every half hour', + EVERY_QUARTER_HOUR: 'every quarter hour', + EVERY_HOUR: 'every hour', + EVERY_DAY: 'every day', +}; + +export function isSyncEnabled(integrationType: IntegrationType): boolean { + return integrationType === IntegrationType.TICKETING; +} diff --git a/engine-worker/.dockerignore b/engine-worker/.dockerignore new file mode 100644 index 00000000..fe374792 --- /dev/null +++ b/engine-worker/.dockerignore @@ -0,0 +1,5 @@ +.cq/ + +node_modules/ + +temp/ \ No newline at end of file diff --git a/engine-worker/.eslintignore b/engine-worker/.eslintignore new file mode 100644 index 00000000..d51db97d --- /dev/null +++ b/engine-worker/.eslintignore @@ -0,0 +1,3 @@ +/**/*.js + +engine-worker/ diff --git a/engine-worker/.eslintrc b/engine-worker/.eslintrc new file mode 100644 index 00000000..ca3b702f --- /dev/null +++ b/engine-worker/.eslintrc @@ -0,0 +1,83 @@ +{ + "extends": ["plugin:@typescript-eslint/recommended", "prettier", "plugin:prettier/recommended"], + "plugins": ["@typescript-eslint", "prettier", "unused-imports", "notice", "import"], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "rules": { + "curly": "warn", + "dot-location": "warn", + "eqeqeq": "error", + "prettier/prettier": "warn", + "unused-imports/no-unused-imports": "warn", + "no-else-return": "warn", + "no-lonely-if": "warn", + "no-inner-declarations": "off", + "no-unused-vars": "off", + "no-useless-computed-key": "warn", + "no-useless-return": "warn", + "no-var": "warn", + "object-shorthand": ["warn", "always"], + "prefer-arrow-callback": "warn", + "prefer-const": "warn", + "prefer-destructuring": ["warn", { "AssignmentExpression": { "array": true } }], + "prefer-object-spread": "warn", + "prefer-template": "warn", + "spaced-comment": ["warn", "always", { "markers": ["/"] }], + "yoda": "warn", + "import/order": [ + "warn", + { + "newlines-between": "always", + "groups": ["type", "builtin", "external", "internal", ["parent", "sibling"], "index"], + "pathGroupsExcludedImportTypes": ["builtin"], + "pathGroups": [ + { + "pattern": "models{/**,}", + "group": "internal" + }, + { + "pattern": "+(types){/**,}", + "group": "internal", + "position": "after" + } + ], + "alphabetize": { + "order": "asc" /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */, + "caseInsensitive": true /* ignore case. Options: [true, false] */ + } + } + ], + "@typescript-eslint/array-type": ["warn", { "default": "array-simple" }], + "@typescript-eslint/ban-ts-comment": [ + "warn", + { + "ts-expect-error": "allow-with-description" + } + ], + "@typescript-eslint/ban-types": "warn", + "@typescript-eslint/consistent-indexed-object-style": ["warn", "record"], + "@typescript-eslint/consistent-type-definitions": ["warn", "interface"], + "@typescript-eslint/no-unused-vars": "warn", + "notice/notice": [ + "error", + { + "mustMatch": "Copyright \\(c\\) [0-9]{0,4}, Poozle, all rights reserved.", + "template": "/** Copyright (c) <%= YEAR %>, Poozle, all rights reserved. **/\n\n" + } + ] + }, + "parser": "@typescript-eslint/parser", + "overrides": [ + { + "files": ["scripts/**/*"], + "rules": { + "@typescript-eslint/no-var-requires": "off" + } + } + ] +} diff --git a/engine-worker/.gitignore b/engine-worker/.gitignore new file mode 100644 index 00000000..105b1a00 --- /dev/null +++ b/engine-worker/.gitignore @@ -0,0 +1,38 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.pnp.* + +lib/ + +node_modules/ + +.cq/ + +logs/ + +temp/ \ No newline at end of file diff --git a/engine-worker/.prettierrc b/engine-worker/.prettierrc new file mode 100644 index 00000000..b61e355b --- /dev/null +++ b/engine-worker/.prettierrc @@ -0,0 +1,22 @@ +{ + "arrowParens": "always", + "tabWidth": 2, + "useTabs": false, + "semi": true, + "bracketSpacing": true, + "jsxBracketSameLine": false, + "requirePragma": false, + "proseWrap": "preserve", + "singleQuote": true, + "formatOnSave": true, + "trailingComma": "all", + "printWidth": 100, + "overrides": [ + { + "files": ".prettierrc", + "options": { + "parser": "json" + } + } + ] +} diff --git a/engine-worker/Dockerfile b/engine-worker/Dockerfile new file mode 100644 index 00000000..3a5d4779 --- /dev/null +++ b/engine-worker/Dockerfile @@ -0,0 +1,19 @@ +FROM node:18-slim + +RUN apt-get update \ + && apt-get install -y ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +RUN apt-get update && apt-get install curl -y +RUN curl -L https://github.com/cloudquery/cloudquery/releases/download/cli-v3.11.0/cloudquery_linux_amd64 -o cloudquery +RUN chmod a+x cloudquery + +COPY . . + +RUN yarn + +RUN yarn build + +CMD [ "node", "./lib/worker.js" ] diff --git a/engine-worker/README.md b/engine-worker/README.md new file mode 100644 index 00000000..a07f64e2 --- /dev/null +++ b/engine-worker/README.md @@ -0,0 +1,44 @@ +# Github Readme + +This is the repository for the Github integration, written in Typescript. + +### Prerequisites + +**To iterate on this connector, make sure to complete this prerequisites section.** + +#### Install dependencies + +From this integration directory, run the following command: + +```js +yarn; +``` + +This will install all the necessary dependencies for the integration. + +### Locally running the connector + +As we are still making the integration creation process better this is still a series of steps to test things out. We want to create a test suite to test certain key flows automatically. + +1. Run `yarn build` command to build the integration which will create a file `github/index.js` which is the compiled + version of the complete integration + +2. We already have a test file `public/test.js` where you can write multiple testcases to test the functionality of the integration. + +Examples: + +``` +main('SPEC', {}) + +main('CHECK', { + config: { + // Pass credentials according to configuration + } +}) +``` + +In case you need help reach us out in Slack. + +### Publishing a new version integration + +You can create a PR in our repo and we will take care of the rest. diff --git a/engine-worker/package.json b/engine-worker/package.json new file mode 100644 index 00000000..2e734090 --- /dev/null +++ b/engine-worker/package.json @@ -0,0 +1,66 @@ +{ + "name": "@poozle/engine-worker", + "version": "0.1.6-alpha", + "description": "worker for Poozle", + "scripts": { + "build": "tsc --build", + "build.watch": "tsc --build --watch", + "lint": "eslint .", + "start": "ts-node src/worker.ts", + "start.watch": "nodemon src/worker.ts", + "schedule.start": "ts-node temp/start.ts" + }, + "nodemonConfig": { + "execMap": { + "ts": "ts-node" + }, + "ext": "ts", + "watch": [ + "src" + ] + }, + "dependencies": { + "@temporalio/activity": "1.7.0", + "@temporalio/client": "1.7.0", + "@temporalio/worker": "1.7.0", + "@temporalio/workflow": "1.7.0", + "js-yaml": "^4.1.0", + "knex": "^2.5.1", + "pg": "^8.11.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@babel/core": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@babel/preset-typescript": "^7.17.12", + "@types/js-yaml": "^4.0.5", + "@types/knex": "^0.16.1", + "@types/node": "^20.4.4", + "@types/uuid": "^9.0.2", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", + "eslint": "^8.24.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-notice": "^0.9.10", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-unused-imports": "^2.0.0", + "nodemon": "^2.0.12", + "prettier": "^2.6.2", + "rimraf": "^3.0.2", + "ts-node": "^10.8.1", + "typescript": "^4.7.2" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/engine-worker/src/activities.ts b/engine-worker/src/activities.ts new file mode 100644 index 00000000..d637fef1 --- /dev/null +++ b/engine-worker/src/activities.ts @@ -0,0 +1,105 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { ExecSyncOptionsWithStringEncoding, execSync } from 'child_process'; +import { readFileSync } from 'fs'; + +import Knex from 'knex'; + +import { saveConfig } from './utils/config'; +import { extractInfoFromLog } from './utils/extract'; +import { + JobStatus, + createJob, + updateJobFailed, + updateJobLogs, + updateJobSuccess, +} from './utils/job'; + +const knex = Knex({ + client: 'pg', + connection: { + connectionString: process.env.DATABASE_URL, + }, +}); + +/** + * + * Create a job + * Also generate the config and save to a yaml + */ +export async function preSync(integrationAccountId: string): Promise { + const job = await createJob(knex, integrationAccountId); + + await saveConfig(knex, integrationAccountId); + + return job.jobId; +} + +/** + * Run the cloudquery job + */ +export async function runCloudQuerySync( + jobId: string, + integrationAccountId: string, +): Promise { + try { + const options: ExecSyncOptionsWithStringEncoding = { + encoding: 'utf-8', + stdio: 'pipe', + cwd: '/app', + }; + + const result = execSync( + `./cloudquery sync ${process.env.CONFIG_PATH}/${integrationAccountId}/config.yaml --log-level error --log-file-name ${process.env.CONFIG_PATH}/${integrationAccountId}/cloudquery.log`, + options, + ); + + const logs = result.trim(); + + /** + * Extract Response of cloudquery + */ + const response = extractInfoFromLog(logs); + + if (response) { + const { resources, errors } = response; + + if (errors !== '0') { + // There are errors in the sync + await updateJobFailed( + knex, + jobId, + JobStatus.FAILED, + `There are ${errors} errors in the sync`, + ); + } else { + // Sync succeded + await updateJobSuccess(knex, jobId, JobStatus.SUCCEEDED, parseInt(resources)); + } + } else { + // Parsing failed + await updateJobFailed(knex, jobId, JobStatus.FAILED, 'Parsing log message failed'); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + await updateJobFailed(knex, jobId, JobStatus.FAILED, error.stderr.toString()); + console.error('stderr:', error.stderr.toString()); + + console.error('Error code:', error.status); + throw error; + } +} + +/** + * + * Take logs and save them to job logs + */ +export async function postSync(jobId: string, integrationAccountId: string) { + const logContent = readFileSync( + `${process.env.CONFIG_PATH}/${integrationAccountId}/cloudquery.log`, + 'utf8', + ); + + await updateJobLogs(knex, jobId, logContent); +} diff --git a/engine-worker/src/constants.ts b/engine-worker/src/constants.ts new file mode 100644 index 00000000..035391be --- /dev/null +++ b/engine-worker/src/constants.ts @@ -0,0 +1,3 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export const DEFAULT_QUEUE = 'SYNC_QUEUE'; diff --git a/engine-worker/src/utils/config.ts b/engine-worker/src/utils/config.ts new file mode 100644 index 00000000..3f4966e1 --- /dev/null +++ b/engine-worker/src/utils/config.ts @@ -0,0 +1,124 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { existsSync, mkdirSync, rmdirSync, writeFileSync } from 'fs'; + +import yaml from 'js-yaml'; +import { Knex } from 'knex'; + +import { IntegrationAccount, getIntegrationAccount } from './integrationAccount'; +import { getWorkspace } from './workspace'; + +interface IntegrationDefinition { + integrationDefinitionId: string; + key: string; + name: string; + integrationType: string; +} + +function getTables(integrationDefinitionType: string) { + switch (integrationDefinitionType) { + case 'ticketing': + return [ + 'ticketing_collection', + 'ticketing_ticket', + 'ticketing_user', + 'ticketing_team', + 'ticketing_tag', + ]; + + default: + return ['ticketing_collection', 'ticketing_ticket']; + } +} + +function generateSource( + integrationAccount: IntegrationAccount, + integrationDefinition: IntegrationDefinition, +): string { + const integrationDefinitionType = integrationDefinition.integrationType.toLowerCase(); + + return yaml.dump({ + kind: 'source', + spec: { + name: `${integrationDefinitionType}-${integrationAccount.integrationAccountName}`, + registry: 'github', + path: `poozlehq/${integrationDefinitionType}`, + version: 'v0.1.2', + concurrency: 10000, + tables: getTables(integrationDefinitionType), + destinations: ['postgresql'], + backend_options: { + table_name: 'state_table', + connection: '@@plugins.postgresql.connection', + }, + spec: { + api_key: process.env.TOKEN, + workspace_id: integrationAccount.workspaceId, + integration_account_id: integrationAccount.integrationAccountId, + uid: 'github', + start_date: '2023-01-01T00:00:00Z', + url: `${process.env.BACKEND_URL}/v1/${integrationDefinitionType}`, + }, + }, + }); +} + +function generateDestination(schemaName: string): string { + return yaml.dump({ + kind: 'destination', + spec: { + name: 'postgresql', + path: 'cloudquery/postgresql', + version: 'v5.0.1', + write_mode: 'overwrite', + spec: { + connection_string: `${process.env.DATABASE_URL}?search_path=${schemaName}`, + pgx_log_level: 'debug', + }, + }, + }); +} + +export async function createSchemaIfNotExists(knex: Knex, schemaName: string) { + await knex.raw(`CREATE SCHEMA IF NOT EXISTS ${schemaName}`); +} + +export async function generateConfig(knex: Knex, integrationAccountId: string) { + const integrationAccount = await getIntegrationAccount(knex, integrationAccountId); + + const integrationDefinition = await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('IntegrationDefinition') + .select('*') + .where({ integrationDefinitionId: integrationAccount.integrationDefinitionId }) + .first(); + + const workspace = await getWorkspace(knex, integrationAccount.workspaceId); + + /** + * Create schema with workspaceId if not present + * This is used by cloudquery while sync + */ + await createSchemaIfNotExists(knex, workspace.slug.replace(/-/g, '')); + + const sourceContent = generateSource( + integrationAccount, + integrationDefinition as IntegrationDefinition, + ); + + const destinationContent = generateDestination(workspace.slug.replace(/-/g, '')); + + return `${sourceContent} \n---\n${destinationContent}`; +} + +export async function saveConfig(knex: Knex, integrationAccountId: string) { + const config = await generateConfig(knex, integrationAccountId); + const folder = `${process.env.CONFIG_PATH}/${integrationAccountId}`; + + if (existsSync(folder)) { + rmdirSync(folder, { recursive: true }); + } + + mkdirSync(folder, { recursive: true }); + writeFileSync(`${folder}/config.yaml`, config); +} diff --git a/engine-worker/src/utils/extract.ts b/engine-worker/src/utils/extract.ts new file mode 100644 index 00000000..45d73cab --- /dev/null +++ b/engine-worker/src/utils/extract.ts @@ -0,0 +1,15 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export function extractInfoFromLog( + log: string, +): { resources: string; errors: string; warnings: string; time: string } | null { + const regex = /Resources: (.*?), Errors: (.*?), Warnings: (.*?), Time: (.*?)$/; + const match = log.match(regex); + + if (match) { + const [, resources, errors, warnings, time] = match; + return { resources, errors, warnings, time }; + } + + return null; +} diff --git a/engine-worker/src/utils/integrationAccount.ts b/engine-worker/src/utils/integrationAccount.ts new file mode 100644 index 00000000..b622810f --- /dev/null +++ b/engine-worker/src/utils/integrationAccount.ts @@ -0,0 +1,24 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Knex } from 'knex'; + +export interface IntegrationAccount { + integrationAccountId: string; + integrationDefinitionId: string; + integrationConfiguration: Record; + authType: string; + integrationAccountName: string; + workspaceId: string; +} + +export async function getIntegrationAccount(knex: Knex, integrationAccountId: string) { + const integrationAccount = await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('IntegrationAccount') + .select('*') + .where({ integrationAccountId }) + .first(); + + return integrationAccount as IntegrationAccount; +} diff --git a/engine-worker/src/utils/job.ts b/engine-worker/src/utils/job.ts new file mode 100644 index 00000000..5bdf25d1 --- /dev/null +++ b/engine-worker/src/utils/job.ts @@ -0,0 +1,87 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Knex } from 'knex'; +import { v4 as uuidv4 } from 'uuid'; + +import { DEFAULT_QUEUE } from '../constants'; + +export enum JobStatus { + PENDING = 'PENDING', + RUNNING = 'RUNNING', + FAILED = 'FAILED', + SUCCEEDED = 'SUCCEEDED', +} + +interface Job { + jobId: string; + temporalId: string; + + integrationAccountId: string; + + status: JobStatus; + + failedMessage?: string; + recordsSynced?: number; + logs: string; + + updatedAt: string; +} + +export async function createJob(knex: Knex, integrationAccountId: string) { + const records = await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('Job') + .insert({ + jobId: uuidv4(), + status: JobStatus.RUNNING, + integrationAccountId, + temporalId: `${DEFAULT_QUEUE}.${integrationAccountId}`, + updatedAt: new Date().toLocaleDateString(), + }) + .returning(['jobId', 'temporalId', 'status']); + + return records[0]; +} + +export async function updateJobSuccess( + knex: Knex, + jobId: string, + status: JobStatus, + recordsSynced?: number, +) { + return await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('Job') + .where({ jobId }) + .update({ + status, + recordsSynced, + }); +} + +export async function updateJobFailed( + knex: Knex, + jobId: string, + status: JobStatus, + failedMessage?: string, +) { + return await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('Job') + .where({ jobId }) + .update({ + status, + failedMessage, + }); +} + +export async function updateJobLogs(knex: Knex, jobId: string, logs: string) { + return await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('Job') + .where({ jobId }) + .update({ + logs, + }); +} diff --git a/engine-worker/src/utils/workspace.ts b/engine-worker/src/utils/workspace.ts new file mode 100644 index 00000000..3cf09b11 --- /dev/null +++ b/engine-worker/src/utils/workspace.ts @@ -0,0 +1,20 @@ +/* eslint-disable dot-location */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Knex } from 'knex'; + +interface Workspace { + slug: string; + workspaceId: string; +} + +export async function getWorkspace(knex: Knex, workspaceId: string) { + const workspace = await knex + .withSchema(process.env.DB_SCHEMA as string) + .table('Workspace') + .select('*') + .where({ workspaceId }) + .first(); + + return workspace as Workspace; +} diff --git a/engine-worker/src/worker.ts b/engine-worker/src/worker.ts new file mode 100644 index 00000000..69fcd749 --- /dev/null +++ b/engine-worker/src/worker.ts @@ -0,0 +1,26 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { NativeConnection, Worker } from '@temporalio/worker'; + +import * as activities from './activities'; +import { DEFAULT_QUEUE } from './constants'; + +async function run() { + const connection = await NativeConnection.connect({ + address: process.env.TEMPORAL_ADDRESS || 'localhost:7233', + }); + + const worker = await Worker.create({ + connection, + workflowsPath: require.resolve('./workflows'), + activities, + taskQueue: DEFAULT_QUEUE, + }); + + await worker.run(); +} + +run().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/engine-worker/src/workflows.ts b/engine-worker/src/workflows.ts new file mode 100644 index 00000000..4d0127ed --- /dev/null +++ b/engine-worker/src/workflows.ts @@ -0,0 +1,23 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import type * as activities from './activities'; + +import { proxyActivities } from '@temporalio/workflow'; + +const { runCloudQuerySync, preSync, postSync } = proxyActivities({ + startToCloseTimeout: '90 minute', + retry: { + maximumAttempts: 3, + }, +}); +interface Params { + integrationAccountId: string; +} + +export async function runSync({ integrationAccountId }: Params): Promise { + const jobId = await preSync(integrationAccountId); + + await runCloudQuerySync(jobId, integrationAccountId); + + await postSync(jobId, integrationAccountId); +} diff --git a/engine-worker/tsconfig.json b/engine-worker/tsconfig.json new file mode 100644 index 00000000..6ff187f6 --- /dev/null +++ b/engine-worker/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node16/tsconfig.json", + "version": "4.4.2", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["src/**/*.ts"] +} diff --git a/engine-worker/yarn.lock b/engine-worker/yarn.lock new file mode 100644 index 00000000..7acb4124 --- /dev/null +++ b/engine-worker/yarn.lock @@ -0,0 +1,4348 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== + +"@babel/core@^7.18.2": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== + dependencies: + "@babel/types" "^7.22.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" + integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== + dependencies: + "@babel/types" "^7.22.3" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== + dependencies: + "@babel/compat-data" "^7.22.0" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.22.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + semver "^6.3.0" + +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== + dependencies: + "@babel/types" "^7.22.3" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@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.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== + dependencies: + "@babel/types" "^7.21.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== + dependencies: + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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-class-properties@^7.12.13": + 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-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-attributes@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" + integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + 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-jsx@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + 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.10.4": + 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-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + 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.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" + integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-class-properties@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" + integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-class-static-block@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" + integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-dynamic-import@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" + integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-export-namespace-from@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" + integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-json-strings@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" + integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" + integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== + dependencies: + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-new-target@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" + integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" + integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" + integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.3" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-optional-catch-binding@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" + integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-methods@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" + integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" + integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.21.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" + integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-typescript" "^7.21.4" + +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" + integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" + integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/preset-env@^7.18.2": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" + integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.3" + "@babel/plugin-transform-async-to-generator" "^7.20.7" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-class-properties" "^7.22.3" + "@babel/plugin-transform-class-static-block" "^7.22.3" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-dynamic-import" "^7.22.1" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-export-namespace-from" "^7.22.3" + "@babel/plugin-transform-for-of" "^7.21.5" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-json-strings" "^7.22.3" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.3" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" + "@babel/plugin-transform-new-target" "^7.22.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" + "@babel/plugin-transform-numeric-separator" "^7.22.3" + "@babel/plugin-transform-object-rest-spread" "^7.22.3" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-optional-catch-binding" "^7.22.3" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-private-methods" "^7.22.3" + "@babel/plugin-transform-private-property-in-object" "^7.22.3" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.20.7" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.3" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.4" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.17.12": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-typescript" "^7.21.3" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.8.4": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.42.0": + version "8.42.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" + integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== + +"@grpc/grpc-js@~1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" + integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.0": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.8.tgz#c050bbeae5f000a1919507f195a1b094e218036e" + integrity sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.2.4" + yargs "^17.7.2" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@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== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@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", "@nodelib/fs.walk@^1.2.8": + 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" + +"@opentelemetry/api@^1.3.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" + integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@rollup/plugin-babel@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.2.tgz#92ad7a00cc0e4a6b59e1498cda9f907a9c0d2db3" + integrity sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@rollup/pluginutils" "^5.0.1" + +"@rollup/plugin-commonjs@^23.0.2": + version "23.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.7.tgz#7d26d879caa54283086de1974b66f512ef60abdc" + integrity sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/plugin-json@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-5.0.2.tgz#d7dbbac62ff74064876b3e5d0d863cb3ad1e7cdb" + integrity sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + +"@rollup/plugin-node-resolve@^15.0.1": + version "15.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz#9ffcd8e8c457080dba89bb9fcb583a6778dc757e" + integrity sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-replace@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz#45f53501b16311feded2485e98419acb8448c61d" + integrity sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + magic-string "^0.27.0" + +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@swc/core-darwin-arm64@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.70.tgz#056ac6899e22cb7f7be21388d4d938ca5123a72b" + integrity sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ== + +"@swc/core-darwin-x64@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.70.tgz#3945814de6fadbee5b46cb2a3422353acb420c5c" + integrity sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ== + +"@swc/core-linux-arm-gnueabihf@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.70.tgz#7960e54ede1af75a7ef99ee53febf37fea6269a8" + integrity sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg== + +"@swc/core-linux-arm64-gnu@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.70.tgz#df9654e5040bbeb1619739756a7f50100e38ace8" + integrity sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A== + +"@swc/core-linux-arm64-musl@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.70.tgz#2c2aab5a136c7eb409ddc9cdc4f947a68fd74493" + integrity sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ== + +"@swc/core-linux-x64-gnu@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.70.tgz#774351532b154ed36a5c6d14b647e7a8ab510028" + integrity sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q== + +"@swc/core-linux-x64-musl@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.70.tgz#c0b1b4ad5f4ef187eaa093589a4933ecb6836546" + integrity sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA== + +"@swc/core-win32-arm64-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.70.tgz#8640267ce3959db0e7e682103677a5e0500b5ea7" + integrity sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ== + +"@swc/core-win32-ia32-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.70.tgz#f95d5656622f5a963bc0125da9fda84cf40faa8d" + integrity sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ== + +"@swc/core-win32-x64-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.70.tgz#5b3acddb96fdf60df089b837061915cb4be94eaa" + integrity sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g== + +"@swc/core@^1.2.204": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.70.tgz#f5ddc6fe6add7a99f5b94d2214ad0d8527d11479" + integrity sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.70" + "@swc/core-darwin-x64" "1.3.70" + "@swc/core-linux-arm-gnueabihf" "1.3.70" + "@swc/core-linux-arm64-gnu" "1.3.70" + "@swc/core-linux-arm64-musl" "1.3.70" + "@swc/core-linux-x64-gnu" "1.3.70" + "@swc/core-linux-x64-musl" "1.3.70" + "@swc/core-win32-arm64-msvc" "1.3.70" + "@swc/core-win32-ia32-msvc" "1.3.70" + "@swc/core-win32-x64-msvc" "1.3.70" + +"@temporalio/activity@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/activity/-/activity-1.7.0.tgz#8bbafb62284333aa9eafe891808077be3c39df1e" + integrity sha512-gfZjC7TIkpqWMr3gtTDvP+L8Fh8mj+5wcSRVGvAEj2v+6KujC22iffX414wDY6yoFnSD92rlhDLLMOOXt3j7qQ== + dependencies: + "@temporalio/common" "1.7.0" + abort-controller "^3.0.0" + +"@temporalio/client@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/client/-/client-1.7.0.tgz#b7f4298a12a002b53a84b62f2abba5b13bf18c0f" + integrity sha512-ZKJOFOopG7rKiv+Y7lH+xCOk/lVrKIKu/a1OLqbhKPyhIU0Ew0PVG1skHhd1uCz3kSjlYCrIhrzprgT1/BkZEw== + dependencies: + "@grpc/grpc-js" "~1.7.3" + "@temporalio/common" "1.7.0" + "@temporalio/proto" "1.7.0" + abort-controller "^3.0.0" + long "^5.2.0" + uuid "^8.3.2" + +"@temporalio/common@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/common/-/common-1.7.0.tgz#ed1495604ae81d26d8b0e1eca84ca6979830e848" + integrity sha512-QbkrVqVNC5txTyvCfypgwy+9YLpdEZfMp1CMGGmwQ1hToHAx4oEPsFEFJ85p0KUVZjiLXW+8EOJlpBjRGqNXjQ== + dependencies: + "@opentelemetry/api" "^1.3.0" + "@temporalio/proto" "1.7.0" + long "^5.2.0" + ms "^2.1.3" + proto3-json-serializer "^1.0.3" + protobufjs "^7.0.0" + +"@temporalio/core-bridge@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/core-bridge/-/core-bridge-1.7.0.tgz#4298ec96281b9ab355c5bf252d6ccab041aa4201" + integrity sha512-i5rszcchQZ2inqlfkB5IS4wJZtOSez5WxF/Un34zfvUZNVq8GeD+qTJqvRqqXMCjAi9Zyunk2MyzYIwqm1lzJA== + dependencies: + "@opentelemetry/api" "^1.3.0" + "@temporalio/common" "1.7.0" + arg "^5.0.2" + cargo-cp-artifact "^0.1.6" + which "^2.0.2" + +"@temporalio/proto@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/proto/-/proto-1.7.0.tgz#793ffe2cedd94bdb8c30b72f009c3c95f21a1da4" + integrity sha512-ndoJdaUoTSc8rkMU61u+VJreYZUDsg8yuOVMEpf6qdI0DavuvpJNX+tEjs5ARKfKUK8fhjQFbj2f27VWNGFgzw== + dependencies: + long "^5.2.0" + protobufjs "^7.0.0" + +"@temporalio/worker@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/worker/-/worker-1.7.0.tgz#f9be2ff2d91e88c2a9c4aa289e61c9f91b628b43" + integrity sha512-4iSH3nNe+ICnhrioIch2tOV7qUes6jP2+ce8DQ2Ya1JFy600buKg/YI+Ppu+YlPQZRIT3iBY8csugkbyXtcsQQ== + dependencies: + "@opentelemetry/api" "^1.3.0" + "@swc/core" "^1.2.204" + "@temporalio/activity" "1.7.0" + "@temporalio/client" "1.7.0" + "@temporalio/common" "1.7.0" + "@temporalio/core-bridge" "1.7.0" + "@temporalio/proto" "1.7.0" + "@temporalio/workflow" "1.7.0" + abort-controller "^3.0.0" + cargo-cp-artifact "^0.1.6" + heap-js "^2.2.0" + memfs "^3.4.6" + ms "^2.1.3" + rxjs "^7.5.5" + source-map "^0.7.4" + source-map-loader "^4.0.0" + swc-loader "^0.2.3" + unionfs "^4.4.0" + webpack "^5.75.0" + +"@temporalio/workflow@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@temporalio/workflow/-/workflow-1.7.0.tgz#e7d1d656ad65e1f5f6ab48535d92f7c7f683dbb6" + integrity sha512-XyFaShbasMlRVY5Q38NW+tK/xhwAkjwFdDq9Bti0jy7TqhSwrosj5v5X2Tag4tZcBMfQIAP2l5H3Sg/UCwVpXg== + dependencies: + "@temporalio/common" "1.7.0" + "@temporalio/proto" "1.7.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/js-yaml@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/knex@^0.16.1": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@types/knex/-/knex-0.16.1.tgz#619678407265c675463c563ed38323461a49515d" + integrity sha512-54gWD1HWwdVx5iLHaJ1qxH3I6KyBsj5fFqzRpXFn7REWiEB2jwspeVCombNsocSrqPd7IRPqKrsIME7/cD+TFQ== + dependencies: + knex "*" + +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/node@*": + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + +"@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^20.4.4": + version "20.4.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.4.tgz#c79c7cc22c9d0e97a7944954c9e663bcbd92b0cb" + integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew== + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/uuid@^9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" + integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== + +"@typescript-eslint/eslint-plugin@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.2.tgz#112e6ae1e23a1dc8333ce82bb9c65c2608b4d8a3" + integrity sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg== + dependencies: + "@typescript-eslint/scope-manager" "5.48.2" + "@typescript-eslint/type-utils" "5.48.2" + "@typescript-eslint/utils" "5.48.2" + debug "^4.3.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.2.tgz#c9edef2a0922d26a37dba03be20c5fff378313b3" + integrity sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw== + dependencies: + "@typescript-eslint/scope-manager" "5.48.2" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/typescript-estree" "5.48.2" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz#bb7676cb78f1e94921eaab637a4b5d596f838abc" + integrity sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== + dependencies: + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" + +"@typescript-eslint/type-utils@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz#7d3aeca9fa37a7ab7e3d9056a99b42f342c48ad7" + integrity sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew== + dependencies: + "@typescript-eslint/typescript-estree" "5.48.2" + "@typescript-eslint/utils" "5.48.2" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.2.tgz#635706abb1ec164137f92148f06f794438c97b8e" + integrity sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== + +"@typescript-eslint/typescript-estree@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz#6e206b462942b32383582a6c9251c05021cc21b0" + integrity sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== + dependencies: + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.2.tgz#3777a91dcb22b8499a25519e06eef2e9569295a3" + integrity sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.48.2" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/typescript-estree" "5.48.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz#c247582a0bcce467461d7b696513bf9455000060" + integrity sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== + dependencies: + "@typescript-eslint/types" "5.48.2" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@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== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +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== + +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" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + 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.7.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +acorn@^8.8.0, acorn@^8.8.2: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +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@^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" + +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: + 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" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +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-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + 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== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.4.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" + +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + +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== + +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== + +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.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== + dependencies: + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +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== + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +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.30001489: + version "1.0.30001492" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" + integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== + +caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== + +cargo-cp-artifact@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz#353814f49f6aa76601a4bcb3ea5f3071180b90de" + integrity sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA== + +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: + 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" + +chokidar@^3.5.2: + 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" + +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== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.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 sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +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== + +colorette@2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +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== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== + dependencies: + browserslist "^4.21.5" + +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.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" + +debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, 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" + +debug@^3.2.7: + 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" + +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.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +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== + +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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +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" + +electron-to-chromium@^1.4.411: + version "1.4.419" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz#6fbea1f3abb65bf46e8ad874b5c1f0816ce2f8ce" + integrity sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw== + +electron-to-chromium@^1.4.431: + version "1.4.468" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz#3cbf64ad67d9f12bfe69fefe5eb1935ec4f6ab7a" + integrity sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag== + +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== + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +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" + +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-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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +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-config-prettier@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-notice@^0.9.10: + version "0.9.10" + resolved "https://registry.yarnpkg.com/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz#89cf6377bf1c004a219c4e541321ea9125b408c8" + integrity sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ== + dependencies: + find-root "^1.1.0" + lodash "^4.17.15" + metric-lcs "^0.1.2" + +eslint-plugin-prettier@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-unused-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" + integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +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.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + 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.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.24.0: + version "8.42.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291" + integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.42.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + 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.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + 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== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +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== + +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" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +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-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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.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 sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +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" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^4.0.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" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.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" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.0, fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +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== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +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.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +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-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" + +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== + +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.2: + 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.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.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.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +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.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +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-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +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@^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" + +heap-js@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.3.0.tgz#8eed2cede31ec312aa696eef1d4df0565841f183" + integrity sha512-E5303mzwQ+4j/n2J0rDvEPBN7GKjhis10oHiYOgjxsmxYgqG++hz9NyLLOXttzH8as/DyiBHYpUrJTZWYaMo8Q== + +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== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +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 sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +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-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + 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 sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +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-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +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-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +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.2: + 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-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-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +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" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +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-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" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +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-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 sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +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" + +knex@*, knex@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.1.tgz#a6c6b449866cf4229f070c17411f23871ba52ef9" + integrity sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA== + dependencies: + colorette "2.0.19" + commander "^10.0.0" + debug "4.3.4" + escalade "^3.1.1" + esm "^3.2.25" + get-package-type "^0.1.0" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.6.1" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + +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" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +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" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +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.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +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== + +long@^5.0.0, long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +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" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +make-dir@^3.0.2: + 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.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +memfs@^3.4.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +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== + +metric-lcs@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/metric-lcs/-/metric-lcs-0.1.2.tgz#87913f149410e39c7c5a19037512814eaf155e11" + integrity sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA== + +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: + 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" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + 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.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +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.1, 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== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +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== + +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + +nodemon@^2.0.12: + version "2.0.22" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" + integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^5.7.1" + simple-update-notifier "^1.0.7" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +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== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +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.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +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" + +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: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +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-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +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== + +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== + +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" + +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" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +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-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-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@2.6.1, pg-connection-string@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + +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.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + +pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +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.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.1.tgz#297e0eb240306b1e9e4f55af8a3bae76ae4810b1" + integrity sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.1" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +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.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.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" + +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 sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +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-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.6.2: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +proto3-json-serializer@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz#1b5703152b6ce811c5cdcc6468032caf53521331" + integrity sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw== + dependencies: + protobufjs "^7.0.0" + +protobufjs@^7.0.0, protobufjs@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +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== + +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" + +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.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +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== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +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-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@^1.14.2, resolve@^1.20.0, resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +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: + 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" + +rollup-plugin-terser@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup-plugin-typescript2@^0.34.0: + version "0.34.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.34.1.tgz#c457f155a71d133c142689213fce78694e30d0be" + integrity sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw== + dependencies: + "@rollup/pluginutils" "^4.1.2" + find-cache-dir "^3.3.2" + fs-extra "^10.0.0" + semver "^7.3.7" + tslib "^2.4.0" + +rollup@^3.2.3: + version "3.23.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.23.0.tgz#b8d6146dac4bf058ee817f92820988e9b358b564" + integrity sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ== + optionalDependencies: + fsevents "~2.3.2" + +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@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.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-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"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.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, 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== + +semver@^7.3.7: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +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== + +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" + +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" + integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +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.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +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.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +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 sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +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, supports-color@^5.5.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.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== + +swc-loader@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d" + integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tarn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" + integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== + +terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.0.0: + version "5.17.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.7.tgz#2a8b134826fe179b711969fd9d9a0c2479b2a8c3" + integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.16.8: + version "5.19.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" + integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + +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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +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" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +ts-node@^10.8.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.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.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +tslib@^2.4.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + +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== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^4.7.2: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unionfs@^4.4.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/unionfs/-/unionfs-4.5.1.tgz#d2b812aa83840d8dc1f8c74100e318b4bb0071d4" + integrity sha512-hn8pzkh0/80mpsIT/YBJKa4+BF/9pNh0IgysBi0CjL95Uok8Hus69TNfgeJckoUNwfTpBq26+F7edO1oBINaIw== + dependencies: + fs-monkey "^1.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +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" + +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== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +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.75.0: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +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-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +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" + +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 sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +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@^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" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/integration_definitions.json b/integration_definitions.json index fc6a0bac..18b681ed 100644 --- a/integration_definitions.json +++ b/integration_definitions.json @@ -12,9 +12,9 @@ "name": "Jira", "key": "jira", "icon": "jira.svg", - "version": "0.1.7", + "version": "0.1.8", "releaseStage": "ALPHA", - "sourceUrl": "https://raw.githubusercontent.com/poozlehq/build-artifacts/main/ticketing/jira/0.1.7/index.js", + "sourceUrl": "https://raw.githubusercontent.com/poozlehq/build-artifacts/main/ticketing/jira/0.1.8/index.js", "integrationType": "TICKETING" }, { diff --git a/integrations/documentation/notion/package.json b/integrations/documentation/notion/package.json index 5df6de03..29a89630 100644 --- a/integrations/documentation/notion/package.json +++ b/integrations/documentation/notion/package.json @@ -1,6 +1,6 @@ { "name": "@poozle/notion", - "version": "0.1.8", + "version": "0.1.9", "description": "notion extension for Poozle", "exports": { ".": { @@ -47,7 +47,7 @@ "access": "public" }, "dependencies": { - "@poozle/engine-idk": "^0.1.24", + "@poozle/engine-idk": "^0.1.29", "axios": "^1.4.0" }, "browserslist": { diff --git a/integrations/documentation/notion/public/test.js b/integrations/documentation/notion/public/test.js new file mode 100644 index 00000000..2d8a06f1 --- /dev/null +++ b/integrations/documentation/notion/public/test.js @@ -0,0 +1,23 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +const { main } = require('../notion/index'); + +async function run() { + const response = await main('CHECK', { + config: { + authType: 'Api Key', + api_key: '', + }, + + path: '/pages', + method: 'GET', + + params: { + queryParams: {}, + }, + }); + + console.log(response); +} + +run(); diff --git a/integrations/documentation/notion/src/common.ts b/integrations/documentation/notion/src/common.ts new file mode 100644 index 00000000..b9e571eb --- /dev/null +++ b/integrations/documentation/notion/src/common.ts @@ -0,0 +1,9 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +export const BASE_URL = 'https://api.github.com'; + +export interface Meta { + previous: string; + next: string; + current: string; +} diff --git a/integrations/documentation/notion/src/models/block/block.interface.ts b/integrations/documentation/notion/src/models/block/block.interface.ts new file mode 100644 index 00000000..f8321f2e --- /dev/null +++ b/integrations/documentation/notion/src/models/block/block.interface.ts @@ -0,0 +1,64 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Block, BlockType } from '@poozle/engine-idk'; +import { Meta } from 'common'; + +export interface BlockWithRaw extends Block { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + raw: any; +} + +export interface BlocksResponse { + data: BlockWithRaw[]; + meta: Meta; +} + +export interface BlockResponse { + data: BlockWithRaw; +} + +export interface BlocksParams { + queryParams: { + cursor?: string; + }; + + pathParams: { + parent_id: string; + }; +} + +export interface CreateBlockParams { + pathParams: { + parent_id: string; + }; + + requestBody: { + data: Block[]; + }; +} + +export interface UpdateBlockParams { + pathParams: { + block_id: string; + }; + + requestBody: Block; +} + +export interface SingleBlockResponse { + object: string; + id: string; + parent: Record; + created_time: string; + last_edited_time: string; + created_by: Record; + last_edited_by: Record; + has_children: boolean; + archived: boolean; + type: BlockType; + + // TODO (harshith): fix the types + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [key: string]: any; + children?: SingleBlockResponse[]; +} diff --git a/integrations/documentation/notion/src/models/block/block.utils.ts b/integrations/documentation/notion/src/models/block/block.utils.ts index 9d05dfb6..03ce2b21 100644 --- a/integrations/documentation/notion/src/models/block/block.utils.ts +++ b/integrations/documentation/notion/src/models/block/block.utils.ts @@ -3,33 +3,9 @@ import { Block, BlockType, Content, Params } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; -export const BASE_URL = 'https://api.notion.com/v1'; - -export interface SingleBlockResponse { - object: string; - id: string; - parent: Record; - created_time: string; - last_edited_time: string; - created_by: Record; - last_edited_by: Record; - has_children: boolean; - archived: boolean; - type: BlockType; - - // TODO (harshith): fix the types - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - children?: SingleBlockResponse[]; -} +import { BlockWithRaw, SingleBlockResponse } from './block.interface'; -export interface BlockResponse { - blocks: SingleBlockResponse[]; - meta: { - has_more: boolean; - next_cursor: string; - }; -} +export const BASE_URL = 'https://api.notion.com/v1'; export function convertUpdateBody(data: Block) { return { @@ -72,6 +48,7 @@ export function convertAppendBody(data: Block[]) { export async function fetchBlockChildren( block: SingleBlockResponse, headers: AxiosHeaders, + // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { const childUrl = `${BASE_URL}/blocks/${block.id.replace(/-/g, '')}/children`; @@ -115,11 +92,7 @@ export async function fetchBlockChildren( }; } -export async function fetchPageBlocks( - url: string, - headers: AxiosHeaders, - params: Params, -): Promise { +export async function fetchPageBlocks(url: string, headers: AxiosHeaders, params: Params) { const limit = params.queryParams?.limit ? parseInt(params.queryParams?.limit.toString()) : 10; const final_params = { @@ -257,7 +230,7 @@ export function extractChildrenData(data: SingleBlockResponse): Block[] { })); } -export function extractBlockData(data: SingleBlockResponse): Block { +export function extractBlockData(data: SingleBlockResponse): BlockWithRaw { const content = extractContent(data); let children: Block[] = []; @@ -266,7 +239,12 @@ export function extractBlockData(data: SingleBlockResponse): Block { children = extractChildrenData(data); } else { children = data.children - ? data.children?.map((data: SingleBlockResponse) => extractBlockData(data)) + ? data.children?.map((data: SingleBlockResponse) => { + const childrenData = extractBlockData(data); + delete childrenData['raw']; + + return childrenData; + }) : []; } @@ -276,6 +254,9 @@ export function extractBlockData(data: SingleBlockResponse): Block { block_type: data.type, content, children, + + // Raw + raw: data, }; return block_data; diff --git a/integrations/documentation/notion/src/models/block/blocks.path.ts b/integrations/documentation/notion/src/models/block/blocks.path.ts index 42bb1d8b..faf35391 100644 --- a/integrations/documentation/notion/src/models/block/blocks.path.ts +++ b/integrations/documentation/notion/src/models/block/blocks.path.ts @@ -1,39 +1,50 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Block, Config, Params } from '@poozle/engine-idk'; +import { BasePath, Block, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { + BlocksParams, + BlocksResponse, + CreateBlockParams, + SingleBlockResponse, + UpdateBlockParams, +} from './block.interface'; import { BASE_URL, - BlockResponse, convertAppendBody, convertUpdateBody, extractBlockData, fetchPageBlocks, - SingleBlockResponse, } from './block.utils'; export class BlocksPath extends BasePath { - async getBlocks(url: string, headers: AxiosHeaders, params: Params) { + async getBlocks( + url: string, + headers: AxiosHeaders, + params: BlocksParams, + ): Promise { const block_id = params.pathParams?.parent_id as string; url += `/${block_id}/children`; - const { blocks, meta } = (await fetchPageBlocks(url, headers, params)) as BlockResponse; + const { blocks, meta } = await fetchPageBlocks(url, headers, params); return { data: blocks.map((blockData: SingleBlockResponse) => ({ ...extractBlockData(blockData), })), - raw: blocks, meta: { - next_cursor: meta.next_cursor, + previous: '', + current: params.queryParams?.cursor ? params.queryParams?.cursor : '', + next: meta.has_more ? meta.next_cursor : '', }, }; } - async createBlock(url: string, headers: AxiosHeaders, params: Params) { + async createBlocks(url: string, headers: AxiosHeaders, params: CreateBlockParams) { url += `/${params.pathParams?.parent_id}/children`; - const body = convertAppendBody(params.requestBody?.data as Block[]); + + const body = convertAppendBody(params.requestBody.data); const block_response = await axios.patch(url, body, { headers }); @@ -41,11 +52,10 @@ export class BlocksPath extends BasePath { data: block_response.data.results.map((blockData: SingleBlockResponse) => { return extractBlockData(blockData); }), - raw: block_response.data.results, }; } - async updateBlock(url: string, headers: AxiosHeaders, params: Params) { + async updateBlock(url: string, headers: AxiosHeaders, params: UpdateBlockParams) { try { url += `/${params.pathParams?.block_id}`; const body = convertUpdateBody(params.requestBody as Block); @@ -53,28 +63,32 @@ export class BlocksPath extends BasePath { return { data: extractBlockData(response.data), - raw: response, }; } catch (e) { throw new Error(e); } } - async run(method: string, headers: AxiosHeaders, params: Params, _config: Config) { + async run( + method: string, + headers: AxiosHeaders, + params: BlocksParams | CreateBlockParams | UpdateBlockParams, + _config: Config, + ) { const url = `${BASE_URL}/blocks`; switch (method) { case 'GET': - return this.getBlocks(url, headers, params); + return this.getBlocks(url, headers, params as BlocksParams); case 'POST': - return this.createBlock(url, headers, params); + return this.createBlocks(url, headers, params as CreateBlockParams); case 'PATCH': - return this.updateBlock(url, headers, params); + return this.updateBlock(url, headers, params as UpdateBlockParams); default: - return {}; + throw new Error(`Unknown method ${method}`); } } } diff --git a/integrations/documentation/notion/src/models/page/page.path.ts b/integrations/documentation/notion/src/models/page/page.path.ts index 0b54ad85..baa3858e 100644 --- a/integrations/documentation/notion/src/models/page/page.path.ts +++ b/integrations/documentation/notion/src/models/page/page.path.ts @@ -13,10 +13,8 @@ export class PagePath extends BasePath { headers, }); - return { data: convertBlockPage(response.data), - raw: response.data, }; } @@ -28,7 +26,7 @@ export class PagePath extends BasePath { return this.fetchSinglePage(url, headers, params); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/documentation/notion/src/models/page/pages.path.ts b/integrations/documentation/notion/src/models/page/pages.path.ts index 951109a9..4eb4e2ce 100644 --- a/integrations/documentation/notion/src/models/page/pages.path.ts +++ b/integrations/documentation/notion/src/models/page/pages.path.ts @@ -13,28 +13,12 @@ export class PagesPath extends BasePath { const pagesResponse = await axios.post( url, { - query: params.queryParams?.title ?? '', filter: { value: 'page', property: 'object', }, page_size: limit, ...(params.queryParams?.cursor ? { start_cursor: params.queryParams?.cursor } : {}), - ...(params.queryParams?.direction === 'asc' - ? { - sort: { - direction: 'ascending', - timestamp: - params.queryParams?.sort === 'created_at' ? 'created_time' : 'last_edited_time', - }, - } - : { - sort: { - direction: 'descending', - timestamp: - params.queryParams?.sort === 'created_at' ? 'created_time' : 'last_edited_time', - }, - }), }, { headers }, ); @@ -44,9 +28,10 @@ export class PagesPath extends BasePath { data: pagesResponse.data.results?.map((data: any) => { return convertPages(data); }), - raw: pagesResponse.data.results, meta: { - next_cursor: pagesResponse.data.has_more ? pagesResponse.data.next_cursor : '', + previous: '', + current: params.queryParams?.cursor ? params.queryParams?.cursor : '', + next: pagesResponse.data.has_more ? pagesResponse.data.next_cursor : '', }, }; } diff --git a/integrations/documentation/notion/src/models/page/pages.utils.ts b/integrations/documentation/notion/src/models/page/pages.utils.ts index b1343b99..528f6d96 100644 --- a/integrations/documentation/notion/src/models/page/pages.utils.ts +++ b/integrations/documentation/notion/src/models/page/pages.utils.ts @@ -10,12 +10,16 @@ export function convertPages(pageData: any) { return { id: pageData.id, - parent_id: pageData.parent?.type === "workspace" ? '' : (pageData.parent[pageData.parent?.type] ?? ''), + parent_id: + pageData.parent?.type === 'workspace' ? '' : pageData.parent[pageData.parent?.type] ?? '', title: titleKey ? pageData.properties[titleKey].title[0]?.plain_text : '', created_by: pageData.created_by.id, created_at: pageData.created_time, updated_at: pageData.last_edited_time, updated_by: pageData.last_edited_by.id, + + // Raw + raw: pageData, }; } @@ -28,6 +32,9 @@ export function convertBlockPage(pageData: any) { created_at: pageData.created_time, updated_at: pageData.last_edited_time, updated_by: pageData.last_edited_by.id, + + // Raw + raw: pageData, }; } diff --git a/integrations/documentation/notion/yarn.lock b/integrations/documentation/notion/yarn.lock index edd7d0cb..5b61ac6c 100644 --- a/integrations/documentation/notion/yarn.lock +++ b/integrations/documentation/notion/yarn.lock @@ -1109,10 +1109,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@poozle/engine-idk@^0.1.24": - version "0.1.24" - resolved "https://registry.yarnpkg.com/@poozle/engine-idk/-/engine-idk-0.1.24.tgz#9dce7e45d16cbbf8bf8e2b42225872c0aa59d13d" - integrity sha512-yO4JS+zcQj/v9nvF3FriZGTdeQytcqAQQXF/Qd+dx9QtCah2SoBD93zy2pYtpoXPCZuw1z2WPQWcxhsyom5BDA== +"@poozle/engine-idk@^0.1.29": + version "0.1.29" + resolved "https://registry.yarnpkg.com/@poozle/engine-idk/-/engine-idk-0.1.29.tgz#5350f2e7cf7728b79f36ab5e2341ff6cd15d40bc" + integrity sha512-uWomNAtaHDo53xPPAFheNKiyYXHL9djkDQnPKtF4VMT68AiMr1SOSN2RPpuOXsDQCCBRA1kKa4tCtHoI3NXxLA== dependencies: axios "^1.3.2" qs "^6.11.2" diff --git a/integrations/ticketing/github/src/models/ticket/ticket.interface.ts b/integrations/ticketing/github/src/models/ticket/ticket.interface.ts index c17b0533..919e082c 100644 --- a/integrations/ticketing/github/src/models/ticket/ticket.interface.ts +++ b/integrations/ticketing/github/src/models/ticket/ticket.interface.ts @@ -21,12 +21,7 @@ export interface GetTicketsParams { queryParams: { limit: number; cursor: string; - - sort?: string; - direction?: string; since?: string; - state?: string; - assignee_id?: string; }; pathParams: { diff --git a/integrations/ticketing/github/src/models/ticket/tickets.path.ts b/integrations/ticketing/github/src/models/ticket/tickets.path.ts index b56883d6..a84d4866 100644 --- a/integrations/ticketing/github/src/models/ticket/tickets.path.ts +++ b/integrations/ticketing/github/src/models/ticket/tickets.path.ts @@ -24,17 +24,8 @@ export class TicketsPath extends BasePath { const final_params = { per_page: limit, - sort: - params.queryParams?.sort === 'created_at' - ? 'created' - : params.queryParams?.sort === 'updated_at' - ? 'updated' - : '', - direction: params.queryParams?.direction, since: params.queryParams?.since, page, - ...(params.queryParams?.state && { state: params.queryParams.state }), - ...(params.queryParams?.assignee_id && { assignee: params.queryParams.assignee_id }), }; const response = await axios({ diff --git a/integrations/ticketing/jira/package.json b/integrations/ticketing/jira/package.json index df67ced5..080d8347 100644 --- a/integrations/ticketing/jira/package.json +++ b/integrations/ticketing/jira/package.json @@ -1,6 +1,6 @@ { "name": "@poozle/jira", - "version": "0.1.4", + "version": "0.1.8", "description": "jira extension for Poozle", "exports": { ".": { @@ -48,8 +48,9 @@ }, "dependencies": { "@poozle/engine-edk": "^0.2.13", - "@poozle/engine-idk": "^0.1.8", - "axios": "^1.4.0" + "@poozle/engine-idk": "^0.1.29", + "axios": "^1.4.0", + "dayjs": "^1.11.9" }, "browserslist": { "production": [ diff --git a/integrations/ticketing/jira/public/test.js b/integrations/ticketing/jira/public/test.js new file mode 100644 index 00000000..623124ce --- /dev/null +++ b/integrations/ticketing/jira/public/test.js @@ -0,0 +1,29 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +const { main } = require('../jira/index'); + +async function run() { + const response = await main('RUN', { + path: '/tickets', + method: 'GET', + config: { + authType: 'Api Key', + email_id: '', + jira_domain: '', + api_key: '', + }, + params: { + queryParams: { + limit: 5, + raw: true, + }, + pathParams: { + ticket_id: '', + }, + }, + }); + + console.log(response); +} + +run(); diff --git a/integrations/ticketing/jira/src/common.ts b/integrations/ticketing/jira/src/common.ts new file mode 100644 index 00000000..894b0215 --- /dev/null +++ b/integrations/ticketing/jira/src/common.ts @@ -0,0 +1,31 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Config } from '@poozle/engine-idk'; +import dayjs from 'dayjs'; + +export interface Meta { + previous: string; + next: string; + current: string; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function getMetaParams(data: any[], limit: number, page: number) { + return { + previous: (page > 1 ? page - 1 : '').toString(), + current: page.toString(), + next: data.length === limit ? (page + 1).toString() : '', + }; +} + +export function convertTimestampToTZFormat(date: string) { + return new Date(date).toISOString(); +} + +export function formatDateForSince(date: string) { + return dayjs(new Date(date)).format('YYYY-MM-DD'); +} + +export function getBaseUrl(config: Config){ + return `https://${config.jira_domain}/rest/api/2`; +} \ No newline at end of file diff --git a/integrations/ticketing/jira/src/index.ts b/integrations/ticketing/jira/src/index.ts index f041a1e5..72b401fc 100644 --- a/integrations/ticketing/jira/src/index.ts +++ b/integrations/ticketing/jira/src/index.ts @@ -4,20 +4,24 @@ import { BaseIntegration, CheckResponse, Config, - GenericProxyModel, SpecificationResponse, getAccessToken, interpolateString, } from '@poozle/engine-idk'; import axios from 'axios'; +import { ProxyPath } from 'proxy'; -import { JiraAttachmentModel } from 'models/attachment/attachment.model'; -import { JiraCollectionModel } from 'models/collection/collection.model'; -import { JiraCommentModel } from 'models/comment/comments.model'; -import { JiraTicketModel } from 'models/ticket/ticket.model'; -import { JiraUserModel } from 'models/user/user.model'; +import { CollectionPath } from 'models/collection/collection.path'; +import { CollectionsPath } from 'models/collection/collections.path'; +import { CommentPath } from 'models/comment/comment.path'; +import { CommentsPath } from 'models/comment/comments.path'; +import { TicketPath } from 'models/ticket/ticket.path'; +import { TicketsPath } from 'models/ticket/tickets.path'; +import { UserPath } from 'models/user/user.path'; +import { UsersPath } from 'models/user/users.path'; import spec from './spec'; +import { getBaseUrl } from 'common'; class JiraIntegration extends BaseIntegration { async spec(): SpecificationResponse { @@ -54,7 +58,7 @@ class JiraIntegration extends BaseIntegration { try { const response = await axios({ - url: `https://${config.jira_domain}.atlassian.net/rest/api/2/project`, + url: `https://${getBaseUrl(config)}/project`, headers, }); @@ -77,14 +81,30 @@ class JiraIntegration extends BaseIntegration { } } - models() { + paths() { return [ - new GenericProxyModel(), - new JiraTicketModel(), - new JiraCollectionModel(), - new JiraCommentModel(), - new JiraUserModel(), - new JiraAttachmentModel(), + /** + * PROXY API calls to the third party directly + */ + new ProxyPath(/^\/?proxy$/g, ['GET', 'POST', 'PATCH', 'DELETE']), + + /** + * This paths get the projects from github + */ + new CollectionsPath(/^\/?collections$/g, 'GET'), + new CollectionPath(/^\/?collections+/g, 'GET'), + + /** + * These map to tickets + */ + new TicketsPath(/^\/?tickets$/g, ['GET', 'POST']), + new TicketPath(/^\/?tickets+/g, ['GET', 'PATCH']), + + new CommentsPath(/^\/?comments$/g, ['GET', 'POST']), + new CommentPath(/^\/?comments+/g, ['GET', 'PATCH']), + + new UsersPath(/^\/?users$/g, 'GET'), + new UserPath(/^\/?users+/g, 'GET'), ]; } } diff --git a/integrations/ticketing/jira/src/models/attachment/attachment.model.ts b/integrations/ticketing/jira/src/models/attachment/attachment.model.ts deleted file mode 100644 index 11c69ae1..00000000 --- a/integrations/ticketing/jira/src/models/attachment/attachment.model.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BaseModel, UserSchema } from '@poozle/engine-idk'; - -import { AttachmentPath } from './attachment.path'; -import { AttachmentsPath } from './attachments.path'; - -export class JiraAttachmentModel extends BaseModel { - constructor() { - super('JiraAttachmentModel', UserSchema); - } - - paths() { - return [ - new AttachmentsPath(/^\/?attachments$/g, 'GET', this.schema), - new AttachmentPath(/^\/?attachments+/g, 'GET', this.schema), - ]; - } -} diff --git a/integrations/ticketing/jira/src/models/attachment/attachment.path.ts b/integrations/ticketing/jira/src/models/attachment/attachment.path.ts deleted file mode 100644 index 725ddb16..00000000 --- a/integrations/ticketing/jira/src/models/attachment/attachment.path.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BasePath, Config, Params } from '@poozle/engine-idk'; -import axios, { AxiosHeaders } from 'axios'; - -import { convertAttachment } from './attachment.utils'; - -export class AttachmentPath extends BasePath { - async fetchSingleUser(url: string, headers: AxiosHeaders, _params: Params) { - try { - const response = await axios({ - url, - headers, - }); - - return convertAttachment(response.data); - } catch (e) { - throw new Error(e); - } - } - - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - let url = ''; - - switch (method) { - case 'GET': - url = `${BASE_URL}/rest/api/2/attachment/${params.pathParams?.attachment_id}`; - return this.fetchSingleUser(url, headers, params); - - default: - return {}; - } - } -} diff --git a/integrations/ticketing/jira/src/models/attachment/attachment.utils.ts b/integrations/ticketing/jira/src/models/attachment/attachment.utils.ts deleted file mode 100644 index 936222c9..00000000 --- a/integrations/ticketing/jira/src/models/attachment/attachment.utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -export function convertAttachment(data: any) { - return { - id: data.attachmentId, - file_name: data.filename, - content_type: data.mimeType, - uploaded_by: { id: data.author.key, username: data.author.displayName }, - created_at: data.created, - raw_data: data, - }; -} diff --git a/integrations/ticketing/jira/src/models/attachment/attachments.path.ts b/integrations/ticketing/jira/src/models/attachment/attachments.path.ts deleted file mode 100644 index fdd030b6..00000000 --- a/integrations/ticketing/jira/src/models/attachment/attachments.path.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BasePath, Config, Params } from '@poozle/engine-idk'; -import axios, { AxiosHeaders } from 'axios'; - -import { convertAttachment } from './attachment.utils'; - -export class AttachmentsPath extends BasePath { - async fetchAttachments(url: string, headers: AxiosHeaders, _params: Params) { - try { - const response = await axios({ - url, - headers, - }); - - const issues = response.data.issues; - const attachments = issues.flatMap((issue: any) => issue.fields.attachment); - - const attachmentContents = attachments.map(async (attachment: any) => { - const attachmentResponse = await axios.get(attachment.content, { - headers, - responseType: 'arraybuffer', - }); - - return { - attachmentId: attachment.id, - filename: attachment.filename, - content: attachmentResponse.data, - }; - }); - - return attachmentContents.map((data: any) => convertAttachment(data)); - } catch (e) { - throw new Error(e); - } - } - - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - let url = ''; - - switch (method) { - case 'GET': - url = `${BASE_URL}/rest/api/2/search?jql=project=${params.pathParams?.collection_id} AND attachments is not empty&fields=attachments`; - return this.fetchAttachments(url, headers, params); - - default: - return {}; - } - } -} diff --git a/integrations/ticketing/jira/src/models/collection/collection.interface.ts b/integrations/ticketing/jira/src/models/collection/collection.interface.ts new file mode 100644 index 00000000..c2f5cd21 --- /dev/null +++ b/integrations/ticketing/jira/src/models/collection/collection.interface.ts @@ -0,0 +1,15 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Collection } from '@poozle/engine-idk'; + +export interface FetchCollectionsParams { + queryParams: { + limit: number; + cursor?: string; + }; +} + +export interface CollectionWithRaw extends Collection { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + raw: any; +} diff --git a/integrations/ticketing/jira/src/models/collection/collection.model.ts b/integrations/ticketing/jira/src/models/collection/collection.model.ts deleted file mode 100644 index 6c349791..00000000 --- a/integrations/ticketing/jira/src/models/collection/collection.model.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BaseModel, CollectionSchema } from '@poozle/engine-idk'; - -import { GetCollectionPath } from './collection.path'; -import { GetCollectionsPath } from './collections.path'; - -export class JiraCollectionModel extends BaseModel { - constructor() { - super('JiraCollectionModel', CollectionSchema); - } - - paths() { - return [ - new GetCollectionsPath(/^\/?collections$/g, 'GET', this.schema), - new GetCollectionPath(/^\/?collections+/g, 'GET', this.schema), - ]; - } -} diff --git a/integrations/ticketing/jira/src/models/collection/collection.path.ts b/integrations/ticketing/jira/src/models/collection/collection.path.ts index c7e45105..9e9180b8 100644 --- a/integrations/ticketing/jira/src/models/collection/collection.path.ts +++ b/integrations/ticketing/jira/src/models/collection/collection.path.ts @@ -2,22 +2,22 @@ import { BasePath, Config, Params } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl } from 'common'; import { convertCollection } from './collection.utils'; -export class GetCollectionPath extends BasePath { +export class CollectionPath extends BasePath { async fetchSingleCollection(url: string, headers: AxiosHeaders) { const response = await axios({ url, headers, }); - return convertCollection(response.data); + return { data: convertCollection(response.data) }; } async run(_method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - const url = `${BASE_URL}/rest/api/2/project/${params.pathParams?.collection_id}`; + const url = `${getBaseUrl(config)}/project/${params.pathParams?.collection_id}`; return this.fetchSingleCollection(url, headers); } diff --git a/integrations/ticketing/jira/src/models/collection/collection.utils.ts b/integrations/ticketing/jira/src/models/collection/collection.utils.ts index 3fdeeee9..e7b09c75 100644 --- a/integrations/ticketing/jira/src/models/collection/collection.utils.ts +++ b/integrations/ticketing/jira/src/models/collection/collection.utils.ts @@ -1,11 +1,21 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { CollectionWithRaw } from './collection.interface'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any -export function convertCollection(data: any) { +export function convertCollection(data: any): CollectionWithRaw { return { - id: data.id, + id: data.key, name: data.name, type: data.projectTypeKey, - raw_data: data, + + // extract + parent_id: '', + created_at: '', + updated_at: '', + description: '', + + // Raw + raw: data, }; } diff --git a/integrations/ticketing/jira/src/models/collection/collections.path.ts b/integrations/ticketing/jira/src/models/collection/collections.path.ts index beb8b77b..3f85add5 100644 --- a/integrations/ticketing/jira/src/models/collection/collections.path.ts +++ b/integrations/ticketing/jira/src/models/collection/collections.path.ts @@ -1,55 +1,49 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Collection, Config, Meta, Params } from '@poozle/engine-idk'; +import { BasePath, Collection, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl, getMetaParams } from 'common'; +import { FetchCollectionsParams } from './collection.interface'; import { convertCollection } from './collection.utils'; function paginate(array: Collection[], page_size: number, page_number: number) { // human-readable page numbers usually start with 1, so we reduce 1 in the first argument - return array.slice((page_number - 1) * page_size, page_number * page_size); + array.slice((page_number - 1) * page_size, page_number * page_size); + + return array; } -export class GetCollectionsPath extends BasePath { - async fetchCollections(url: string, headers: AxiosHeaders, params: Params) { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; +export class CollectionsPath extends BasePath { + async fetchCollections(url: string, headers: AxiosHeaders, params: FetchCollectionsParams) { + const page = params.queryParams.cursor ? parseInt(params.queryParams.cursor) : 1; const response = await axios({ url, headers, }); - return paginate( + const data = paginate( + // eslint-disable-next-line @typescript-eslint/no-explicit-any response.data.map((data: any) => convertCollection(data)), - params.queryParams?.limit as number, + params.queryParams.limit as number, page, ); - } - - async getMetaParams(_data: Collection[], params: Params): Promise { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; return { - limit: params.queryParams?.limit as number, - cursors: { - before: (page > 1 ? page - 1 : 1).toString(), - current: page.toString(), - next: (page + 1).toString(), - }, + data, + meta: getMetaParams(data, params.queryParams.limit as number, page), }; } - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - const url = `${BASE_URL}/rest/api/2/project`; + async run(method: string, headers: AxiosHeaders, params: FetchCollectionsParams, config: Config) { + const url = `${getBaseUrl(config)}/project`; switch (method) { case 'GET': return this.fetchCollections(url, headers, params); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/comment/comment.interface.ts b/integrations/ticketing/jira/src/models/comment/comment.interface.ts new file mode 100644 index 00000000..957cfbeb --- /dev/null +++ b/integrations/ticketing/jira/src/models/comment/comment.interface.ts @@ -0,0 +1,47 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { Comment, CreateCommentBody, UpdateCommentBody } from '@poozle/engine-idk'; +import { Meta } from 'common'; + +export interface CommentWithRaw extends Comment { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + raw: any; +} + +export interface CommentsResponse { + data: CommentWithRaw[]; + meta: Meta; +} + +export interface CommentResponse { + data: CommentWithRaw; +} + +export interface GetCommentParams { + pathParams: { + ticket_id: string; + comment_id: string; + }; +} + +export interface UpdateCommentParams extends GetCommentParams { + requestBody: UpdateCommentBody; +} + +export interface GetCommentsParams { + queryParams: { + limit: number; + cursor?: string; + }; + + pathParams: { + ticket_id: string; + }; +} +export interface CreateCommentParams { + requestBody: CreateCommentBody; + + pathParams: { + ticket_id: string; + }; +} diff --git a/integrations/ticketing/jira/src/models/comment/comment.path.ts b/integrations/ticketing/jira/src/models/comment/comment.path.ts index 54fa4812..8429eaf9 100644 --- a/integrations/ticketing/jira/src/models/comment/comment.path.ts +++ b/integrations/ticketing/jira/src/models/comment/comment.path.ts @@ -1,39 +1,53 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Params, UpdateCommentBody } from '@poozle/engine-idk'; +import { BasePath, Config, UpdateCommentBody } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl } from 'common'; +import { CommentResponse, GetCommentParams, UpdateCommentParams } from './comment.interface'; import { convertComments } from './comments.utils'; -export class GetCommentPath extends BasePath { - async fetchSingleComment(url: string, headers: AxiosHeaders, params: Params) { +export class CommentPath extends BasePath { + async fetchSingleComment( + url: string, + headers: AxiosHeaders, + params: GetCommentParams, + ): Promise { const response = await axios({ url, headers, }); - return convertComments(response.data, params.pathParams?.ticket_id as string | null); + return { data: convertComments(response.data, params.pathParams.ticket_id) }; } - async updateComment(url: string, headers: AxiosHeaders, params: Params) { + async updateComment( + url: string, + headers: AxiosHeaders, + params: UpdateCommentParams, + ): Promise { const updateBody: UpdateCommentBody = params.requestBody as UpdateCommentBody; const response = await axios.put(url, updateBody, { headers }); - return convertComments(response.data, params.pathParams?.ticket_id as string | null); + return { data: convertComments(response.data, params.pathParams?.ticket_id) }; } - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - const url = `${BASE_URL}/rest/api/2/issue/${params.pathParams?.ticket_id}/comment/${params.pathParams?.comment_id}`; + async run( + method: string, + headers: AxiosHeaders, + params: GetCommentParams | UpdateCommentParams, + config: Config, + ) { + const url = `${getBaseUrl(config)}/issue/${params.pathParams.ticket_id}/comment/${params.pathParams.comment_id}`; switch (method) { case 'GET': return this.fetchSingleComment(url, headers, params); case 'PATCH': - return this.updateComment(url, headers, params); + return this.updateComment(url, headers, params as UpdateCommentParams); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/comment/comments.model.ts b/integrations/ticketing/jira/src/models/comment/comments.model.ts deleted file mode 100644 index 95796506..00000000 --- a/integrations/ticketing/jira/src/models/comment/comments.model.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BaseModel, CommentSchema } from '@poozle/engine-idk'; - -import { GetCommentPath } from './comment.path'; -import { GetCommentsPath } from './comments.path'; - -export class JiraCommentModel extends BaseModel { - constructor() { - super('JiraCommentModel', CommentSchema); - } - - paths() { - return [ - new GetCommentsPath(/^\/?comments$/g, ['GET', 'POST'], this.schema), - new GetCommentPath(/^\/?comments+/g, ['GET', 'PATCH'], this.schema), - ]; - } -} diff --git a/integrations/ticketing/jira/src/models/comment/comments.path.ts b/integrations/ticketing/jira/src/models/comment/comments.path.ts index 7ae846c9..b17525dd 100644 --- a/integrations/ticketing/jira/src/models/comment/comments.path.ts +++ b/integrations/ticketing/jira/src/models/comment/comments.path.ts @@ -1,63 +1,72 @@ +/* eslint-disable import/order */ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Params, CreateCommentBody, Meta, Comment } from '@poozle/engine-idk'; +import { BasePath, Config, CreateCommentBody } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; import { convertComments } from './comments.utils'; +import { getBaseUrl, getMetaParams } from 'common'; +import { + CommentResponse, + CommentsResponse, + CreateCommentParams, + GetCommentsParams, +} from './comment.interface'; -export class GetCommentsPath extends BasePath { - async fetchComments(url: string, headers: AxiosHeaders, params: Params) { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; +export class CommentsPath extends BasePath { + async fetchComments( + url: string, + headers: AxiosHeaders, + { queryParams, pathParams }: GetCommentsParams, + ): Promise { + const page = typeof queryParams?.cursor === 'string' ? parseInt(queryParams?.cursor) : 1; const response = await axios({ url, headers, params: { - maxResults: params.queryParams?.limit, + maxResults: queryParams.limit, startAt: page, }, }); - return response.data.comments.map((data: any) => - convertComments(data, params.pathParams?.ticket_id as string | null), - ); + return { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: response.data.comments.map((data: any) => + convertComments(data, pathParams.ticket_id as string | null), + ), + meta: getMetaParams(response.data, queryParams.limit, page), + }; } - async createComment(url: string, headers: AxiosHeaders, params: Params) { + async createComment( + url: string, + headers: AxiosHeaders, + params: CreateCommentParams, + ): Promise { const createBody: CreateCommentBody = params.requestBody as CreateCommentBody; const response = await axios.post(url, createBody, { headers }); - return convertComments(response.data, params.pathParams?.ticket_id as string | null); - } - - async getMetaParams(_data: Comment[], params: Params): Promise { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; - - return { - limit: params.queryParams?.limit as number, - cursors: { - before: (page > 1 ? page - 1 : 1).toString(), - current: page.toString(), - next: (page + 1).toString(), - }, - }; + return { data: convertComments(response.data, params.pathParams?.ticket_id) }; } - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - const url = `${BASE_URL}/rest/api/2/issue/${params.pathParams?.ticket_id}/comment`; + async run( + method: string, + headers: AxiosHeaders, + params: GetCommentsParams | CreateCommentParams, + config: Config, + ) { + const url = `${getBaseUrl(config)}/issue/${params.pathParams?.ticket_id}/comment`; switch (method) { case 'GET': - return this.fetchComments(url, headers, params); + return this.fetchComments(url, headers, params as GetCommentsParams); case 'POST': - return this.createComment(url, headers, params); + return this.createComment(url, headers, params as CreateCommentParams); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/comment/comments.utils.ts b/integrations/ticketing/jira/src/models/comment/comments.utils.ts index b68a1405..7260239b 100644 --- a/integrations/ticketing/jira/src/models/comment/comments.utils.ts +++ b/integrations/ticketing/jira/src/models/comment/comments.utils.ts @@ -1,15 +1,25 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -export function convertComments(data: any, collection_id: string | null) { +import { convertTimestampToTZFormat } from 'common'; + +import { CommentWithRaw } from './comment.interface'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function convertComments(data: any, collection_id: string | null): CommentWithRaw { return { id: data.id, - ticket_id: collection_id ? collection_id : undefined, + ticket_id: collection_id ? collection_id : '', body: data.body, created_by_id: data.author.accountId, created_by: { id: data.author.accountId, username: data.author.displayName }, is_private: data.jsdPublic, - created_at: data.created, - updated_at: data.updated, - raw_data: data, + created_at: convertTimestampToTZFormat(data.created), + updated_at: convertTimestampToTZFormat(data.updated), + + // extra + html_body: '', + + // Raw + raw: data, }; } diff --git a/integrations/ticketing/jira/src/models/ticket/ticket.interface.ts b/integrations/ticketing/jira/src/models/ticket/ticket.interface.ts new file mode 100644 index 00000000..9daab4eb --- /dev/null +++ b/integrations/ticketing/jira/src/models/ticket/ticket.interface.ts @@ -0,0 +1,44 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { CreateTicketBody, Ticket, UpdateTicketBody } from '@poozle/engine-idk'; + +export interface TicketWithRaw extends Ticket { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + raw: any; +} + +/* eslint-disable notice/notice */ +export interface FetchTicketParams { + pathParams: { + collection_id: string; + ticket_id: string; + }; +} + +export interface UpdateTicketParams extends FetchTicketParams { + requestBody: UpdateTicketBody; +} + +export interface FetchTicketsParams { + queryParams: { + limit: number; + cursor?: string; + since?: string; + }; + + pathParams: { + collection_id: string; + }; +} + +export interface CreateTicketParams { + queryParams: { + limit: number; + cursor?: string; + }; + + requestBody: CreateTicketBody; + pathParams: { + collection_id: string; + }; +} diff --git a/integrations/ticketing/jira/src/models/ticket/ticket.model.ts b/integrations/ticketing/jira/src/models/ticket/ticket.model.ts deleted file mode 100644 index 2cba1da4..00000000 --- a/integrations/ticketing/jira/src/models/ticket/ticket.model.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BaseModel, TicketSchema } from '@poozle/engine-idk'; - -import { TicketPath } from './ticket.path'; -import { TicketsPath } from './tickets.path'; - -export class JiraTicketModel extends BaseModel { - constructor() { - super('JiraTicketModel', TicketSchema); - } - - paths() { - return [ - new TicketsPath(/^\/?tickets$/g, ['GET', 'POST'], this.schema), - new TicketPath(/^\/?tickets+/g, ['GET', 'PATCH'], this.schema), - ]; - } -} diff --git a/integrations/ticketing/jira/src/models/ticket/ticket.path.ts b/integrations/ticketing/jira/src/models/ticket/ticket.path.ts index f7f28e37..47625afa 100644 --- a/integrations/ticketing/jira/src/models/ticket/ticket.path.ts +++ b/integrations/ticketing/jira/src/models/ticket/ticket.path.ts @@ -1,26 +1,30 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Params, UpdateTicketBody } from '@poozle/engine-idk'; +import { BasePath, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl } from 'common'; +import { FetchTicketParams, UpdateTicketParams } from './ticket.interface'; import { convertTicket, JIRATicketBody } from './ticket.utils'; export class TicketPath extends BasePath { - async fetchSingleTicket(url: string, headers: AxiosHeaders, params: Params) { + async fetchSingleTicket(url: string, headers: AxiosHeaders, params: FetchTicketParams) { try { const response = await axios({ url, headers, }); - return convertTicket(response.data, params.pathParams?.collection_id as string | null); + return { + data: convertTicket(response.data, params.pathParams.collection_id), + }; } catch (e) { throw new Error(e); } } - async patchTicket(url: string, headers: AxiosHeaders, params: Params) { - const body: UpdateTicketBody = params.requestBody as UpdateTicketBody; + async patchTicket(url: string, headers: AxiosHeaders, params: UpdateTicketParams) { + const body = params.requestBody; const createBody: JIRATicketBody = { fields: { @@ -41,6 +45,7 @@ export class TicketPath extends BasePath { const cleanedCreateBody = { fields: Object.fromEntries( Object.entries(createBody.fields).filter( + // eslint-disable-next-line @typescript-eslint/no-unused-vars ([_, value]) => value !== undefined && value !== null, ), ), @@ -48,22 +53,29 @@ export class TicketPath extends BasePath { const response = await axios.put(url, cleanedCreateBody, { headers }); - return response.data; + return { + data: convertTicket(response.data, params.pathParams.collection_id), + }; } - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; - const url = `${BASE_URL}/rest/api/2/issue/${params.pathParams?.ticket_id}`; + + async run( + method: string, + headers: AxiosHeaders, + params: FetchTicketParams | UpdateTicketParams, + config: Config, + ) { + const url = `${getBaseUrl(config)}/issue/${params.pathParams?.ticket_id}`; switch (method) { case 'GET': return this.fetchSingleTicket(url, headers, params); case 'PATCH': - await this.patchTicket(url, headers, params); + await this.patchTicket(url, headers, params as UpdateTicketParams); return this.fetchSingleTicket(url, headers, params); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/ticket/ticket.utils.ts b/integrations/ticketing/jira/src/models/ticket/ticket.utils.ts index 4d7bdf74..3181a073 100644 --- a/integrations/ticketing/jira/src/models/ticket/ticket.utils.ts +++ b/integrations/ticketing/jira/src/models/ticket/ticket.utils.ts @@ -1,5 +1,9 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ +import { convertTimestampToTZFormat } from 'common'; + +import { TicketWithRaw } from './ticket.interface'; + export const ticketMappings = { name: 'summary', description: 'description', @@ -10,15 +14,15 @@ export const ticketMappings = { }; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export function convertTicket(data: any, collection_id: string | null) { +export function convertTicket(data: any, collection_id: string | null): TicketWithRaw { return { - id: data.id, + id: data.key, name: data.fields.summary, - collection_id: collection_id ? collection_id : data.fields.project.id, + collection_id: collection_id ? collection_id : data.fields.project.key, description: data.fields.description, status: data.fields.status.name, - created_at: data.fields.created, - updated_at: data.fields.updated, + created_at: convertTimestampToTZFormat(data.fields.created), + updated_at: convertTimestampToTZFormat(data.fields.updated), created_by: data.fields.creator.displayName, type: data.fields.issuetype.name, assignees: [ @@ -27,13 +31,18 @@ export function convertTicket(data: any, collection_id: string | null) { ticket_url: data.self, parent_id: data.fields.parent?.id, priority: data.fields.priority.name, - due_date: data.fields.duedate, + due_date: data.fields.duedate ? convertTimestampToTZFormat(data.fields.duedate) : '', // eslint-disable-next-line @typescript-eslint/no-explicit-any tags: data.labels?.map((lab: any) => ({ id: lab.id, name: lab.displayName, })), - raw_data: data, + + // extra + completed_at: '', + + // Raw + raw: data, }; } diff --git a/integrations/ticketing/jira/src/models/ticket/tickets.path.ts b/integrations/ticketing/jira/src/models/ticket/tickets.path.ts index a6e5da95..6c3a5413 100644 --- a/integrations/ticketing/jira/src/models/ticket/tickets.path.ts +++ b/integrations/ticketing/jira/src/models/ticket/tickets.path.ts @@ -1,62 +1,75 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Params, CreateTicketBody, Ticket, Meta } from '@poozle/engine-idk'; +import { BasePath, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { formatDateForSince, getBaseUrl, getMetaParams } from 'common'; +import { CreateTicketParams, FetchTicketsParams } from './ticket.interface'; import { convertTicket, JIRATicketBody } from './ticket.utils'; export class TicketsPath extends BasePath { - async fetchTickets(url: string, headers: AxiosHeaders, params: Params) { - const page = params.queryParams?.cursor ? parseInt(params.queryParams?.cursor.toString()) : 1; - const startAt = - page * (params.queryParams?.limit ? parseInt(params.queryParams?.limit.toString()) : 10); + async fetchTickets( + url: string, + headers: AxiosHeaders, + { queryParams, pathParams }: FetchTicketsParams, + ) { + const page = queryParams.cursor ? parseInt(queryParams.cursor) : 0; + const startAt = page * queryParams.limit; + const since = queryParams.since + ? `AND updatedDate > '${formatDateForSince(queryParams.since)}'` + : ''; const final_params = { - maxResults: params.queryParams?.limit, + maxResults: queryParams.limit, startAt, }; try { const response = await axios({ - url, + url: `${url}${since}`, headers, params: final_params, }); - return response.data.issues.map((data: any) => - convertTicket(data, params.pathParams?.collection_id as string | null), - ); + return { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: response.data.issues.map((data: any) => + convertTicket(data, pathParams?.collection_id as string | null), + ), + meta: getMetaParams(response.data.issues, queryParams.limit as number, page), + }; } catch (e) { throw new Error(e); } } - async createTickets(url: string, headers: AxiosHeaders, params: Params) { + async createTickets(url: string, headers: AxiosHeaders, params: CreateTicketParams) { try { - const body: CreateTicketBody = params.requestBody as CreateTicketBody; + const body = params.requestBody; const createBody: JIRATicketBody = { fields: { project: { - id: params.pathParams?.collection_id as string, + id: params.pathParams.collection_id as string, }, - summary: body?.name, + summary: body.name, issuetype: { - name: body?.type, + name: body.type, }, assignee: { - accountId: body?.assignees[0].id, + accountId: body.assignees[0].id, }, reporter: { - name: body?.created_by, + name: body.created_by, }, - labels: body?.tags.map((tag) => tag.name), + labels: body.tags.map((tag) => tag.name), }, }; const cleanedCreateBody = { fields: Object.fromEntries( Object.entries(createBody.fields).filter( + // eslint-disable-next-line @typescript-eslint/no-unused-vars ([_, value]) => value !== undefined && value !== null, ), ), @@ -65,50 +78,34 @@ export class TicketsPath extends BasePath { const createResponse = await axios.post(url, cleanedCreateBody, { headers }); const response = await axios.get(createResponse.data.self, { headers }); - return convertTicket(response.data, params.pathParams?.collection_id as string | null); + + return { + data: convertTicket(response.data, params.pathParams.collection_id), + }; } catch (e) { throw new Error(e); } } - async getMetaParams(_data: Ticket[], params: Params): Promise { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; - - return { - limit: params.queryParams?.limit as number, - cursors: { - before: (page > 1 ? page - 1 : 1).toString(), - current: page.toString(), - next: (page + 1).toString(), - }, - }; - } - - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; + async run( + method: string, + headers: AxiosHeaders, + params: FetchTicketsParams | CreateTicketParams, + config: Config, + ) { let url = ''; switch (method) { case 'GET': - url = `${BASE_URL}/rest/api/2/search?jql=project=${params.pathParams?.collection_id}`; - if (params.queryParams?.sort && params.queryParams?.direction) { - const sort = - params.queryParams?.sort === 'created_at' - ? 'created' - : params.queryParams?.sort === 'updated_at' - ? 'updated' - : 'created'; - url += ` ORDER BY ${sort} ${params.queryParams?.direction}`; - } + url = `${getBaseUrl(config)}/search?jql=project=${params.pathParams.collection_id}`; return this.fetchTickets(url, headers, params); case 'POST': - url = `${BASE_URL}/rest/api/2/issue`; - return this.createTickets(url, headers, params); + url = `${getBaseUrl(config)}/rest/api/2/issue`; + return this.createTickets(url, headers, params as CreateTicketParams); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/user/user.interface.ts b/integrations/ticketing/jira/src/models/user/user.interface.ts new file mode 100644 index 00000000..54f6affb --- /dev/null +++ b/integrations/ticketing/jira/src/models/user/user.interface.ts @@ -0,0 +1,36 @@ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { User } from '@poozle/engine-idk'; +import { Meta } from 'common'; + +export interface UserWithRaw extends User { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + raw: any; +} + +export interface UsersResponse { + data: UserWithRaw[]; + meta: Meta; +} + +export interface UserResponse { + data: UserWithRaw; +} + +export interface GetUsersParams { + queryParams: { + limit: number; + cursor: string; + }; + + pathParams: { + collection_id: string; + }; +} + +export interface GetUserParams { + pathParams: { + collection_id: string; + user_id: string; + }; +} diff --git a/integrations/ticketing/jira/src/models/user/user.model.ts b/integrations/ticketing/jira/src/models/user/user.model.ts deleted file mode 100644 index 9e04869f..00000000 --- a/integrations/ticketing/jira/src/models/user/user.model.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright (c) 2023, Poozle, all rights reserved. **/ - -import { BaseModel, UserSchema } from '@poozle/engine-idk'; - -import { UserPath } from './user.path'; -import { UsersPath } from './users.path'; - -export class JiraUserModel extends BaseModel { - constructor() { - super('JiraUserModel', UserSchema); - } - - paths() { - return [ - new UsersPath(/^\/?users$/g, 'GET', this.schema), - new UserPath(/^\/?users+/g, 'GET', this.schema), - ]; - } -} diff --git a/integrations/ticketing/jira/src/models/user/user.path.ts b/integrations/ticketing/jira/src/models/user/user.path.ts index fe4028ea..241d939c 100644 --- a/integrations/ticketing/jira/src/models/user/user.path.ts +++ b/integrations/ticketing/jira/src/models/user/user.path.ts @@ -1,35 +1,36 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Params } from '@poozle/engine-idk'; +import { BasePath, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl } from 'common'; +import { GetUserParams, UserResponse } from './user.interface'; import { convertUser } from './user.utils'; export class UserPath extends BasePath { - async fetchSingleUser(url: string, headers: AxiosHeaders, _params: Params) { + async fetchSingleUser(url: string, headers: AxiosHeaders): Promise { try { const response = await axios({ url, headers, }); - return convertUser(response.data); + return { data: convertUser(response.data) }; } catch (e) { throw new Error(e); } } - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; + async run(method: string, headers: AxiosHeaders, params: GetUserParams, config: Config) { let url = ''; switch (method) { case 'GET': - url = `${BASE_URL}/rest/api/2/user?accountId=${params.pathParams?.user_id}`; - return this.fetchSingleUser(url, headers, params); + url = `${getBaseUrl(config)}/user?accountId=${params.pathParams?.user_id}`; + return this.fetchSingleUser(url, headers); default: - return {}; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/models/user/user.utils.ts b/integrations/ticketing/jira/src/models/user/user.utils.ts index 5f45d688..09f99945 100644 --- a/integrations/ticketing/jira/src/models/user/user.utils.ts +++ b/integrations/ticketing/jira/src/models/user/user.utils.ts @@ -1,10 +1,18 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -export function convertUser(data: any) { +import { UserWithRaw } from './user.interface'; + +export function convertUser(data: any): UserWithRaw { return { id: data.accountId, name: data.displayName, avatar: data.avatarUrls['48x48'], - raw_data: data, + + // Extra field + email_address: '', + + // Raw + raw: data, }; } diff --git a/integrations/ticketing/jira/src/models/user/users.path.ts b/integrations/ticketing/jira/src/models/user/users.path.ts index edc815d2..b56bde73 100644 --- a/integrations/ticketing/jira/src/models/user/users.path.ts +++ b/integrations/ticketing/jira/src/models/user/users.path.ts @@ -1,56 +1,46 @@ /** Copyright (c) 2023, Poozle, all rights reserved. **/ -import { BasePath, Config, Meta, Params, User } from '@poozle/engine-idk'; +import { BasePath, Config } from '@poozle/engine-idk'; import axios, { AxiosHeaders } from 'axios'; +import { getBaseUrl, getMetaParams } from 'common'; +import { GetUsersParams } from './user.interface'; import { convertUser } from './user.utils'; export class UsersPath extends BasePath { - async fetchUsers(url: string, headers: AxiosHeaders, params: Params) { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; + async fetchUsers(url: string, headers: AxiosHeaders, params: GetUsersParams) { + const page = params.queryParams.cursor ? parseInt(params.queryParams.cursor) : 1; try { const response = await axios({ url, headers, params: { - maxResult: params.queryParams?.limit, + maxResult: params.queryParams.limit, startAt: page, }, }); - return response.data.map((data: any) => convertUser(data)); + return { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: response.data.map((data: any) => convertUser(data)), + meta: getMetaParams(response.data, params.queryParams.limit, page), + }; } catch (e) { throw new Error(e); } } - async getMetaParams(_data: User[], params: Params): Promise { - const page = - typeof params.queryParams?.cursor === 'string' ? parseInt(params.queryParams?.cursor) : 1; - - return { - limit: params.queryParams?.limit as number, - cursors: { - before: (page > 1 ? page - 1 : 1).toString(), - current: page.toString(), - next: (page + 1).toString(), - }, - }; - } - - async run(method: string, headers: AxiosHeaders, params: Params, config: Config) { - const BASE_URL = `https://${config.jira_domain}.atlassian.net`; + async run(method: string, headers: AxiosHeaders, params: GetUsersParams, config: Config) { let url = ''; switch (method) { case 'GET': - url = `${BASE_URL}/rest/api/2/users/search`; + url = `${getBaseUrl(config)}/users/search`; return this.fetchUsers(url, headers, params); default: - return []; + throw new Error('Method not found'); } } } diff --git a/integrations/ticketing/jira/src/proxy.ts b/integrations/ticketing/jira/src/proxy.ts new file mode 100644 index 00000000..3d72d985 --- /dev/null +++ b/integrations/ticketing/jira/src/proxy.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** Copyright (c) 2023, Poozle, all rights reserved. **/ + +import { BasePath, Params } from '@poozle/engine-idk'; +import axios, { AxiosHeaders } from 'axios'; + +export class ProxyPath extends BasePath { + async run(method: string, headers: AxiosHeaders, params: Params): Promise { + const axiosObject: any = { + url: params.url, + method, + headers: headers as any, + }; + + if (params.requestBody) { + axiosObject['data'] = params.requestBody; + } + + if (params.queryParams) { + axiosObject['params'] = params.queryParams; + } + + const response = await axios(axiosObject); + + return response.data; + } +} diff --git a/integrations/ticketing/jira/src/spec.ts b/integrations/ticketing/jira/src/spec.ts index 7e62e027..0100a697 100644 --- a/integrations/ticketing/jira/src/spec.ts +++ b/integrations/ticketing/jira/src/spec.ts @@ -15,12 +15,7 @@ export default { type: 'string', title: 'Api Key', description: 'Enter the API Key', - }, - jira_domain: { - type: 'string', - title: 'Jira Domain', - description: 'Enter the subdomain for Jira', - }, + } }, }, }, @@ -58,4 +53,16 @@ export default { }, }, }, + other_inputs: { + input_specification: { + type: 'object', + properties: { + jira_domain: { + type: 'string', + title: 'Jira Domain', + description: 'Enter the subdomain for Jira. example: abc.atlassian.net', + }, + }, + }, + }, }; diff --git a/integrations/ticketing/jira/yarn.lock b/integrations/ticketing/jira/yarn.lock index f76aa9ac..5c6df972 100644 --- a/integrations/ticketing/jira/yarn.lock +++ b/integrations/ticketing/jira/yarn.lock @@ -1116,12 +1116,13 @@ dependencies: axios "^1.3.2" -"@poozle/engine-idk@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@poozle/engine-idk/-/engine-idk-0.1.8.tgz#606e6566fcf1f68ed3b0513909d041048c12cbd2" - integrity sha512-2wliwg8JygzSkw34wrFymo97Wt1JNo67n4qvJsbNL21QF/r8wmA0Xj1ahHNfLAu/Exw7CgvwjLyFvOQgVLb7Qg== +"@poozle/engine-idk@^0.1.29": + version "0.1.29" + resolved "https://registry.yarnpkg.com/@poozle/engine-idk/-/engine-idk-0.1.29.tgz#5350f2e7cf7728b79f36ab5e2341ff6cd15d40bc" + integrity sha512-uWomNAtaHDo53xPPAFheNKiyYXHL9djkDQnPKtF4VMT68AiMr1SOSN2RPpuOXsDQCCBRA1kKa4tCtHoI3NXxLA== dependencies: axios "^1.3.2" + qs "^6.11.2" "@rollup/plugin-babel@6.0.2": version "6.0.2" @@ -1580,6 +1581,11 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +dayjs@^1.11.9: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2774,6 +2780,13 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qs@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"