diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b9106b0c..a8e14998 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,10 +66,14 @@ jobs: timeout_minutes: 15 retry_on: error command: pnpm install --frozen-lockfile + - name: Run DB migration + run: cd packages/api-gateway && pnpm migration:run - name: Run linter run: cd packages/api-gateway && pnpm lint - name: Run test suite run: cd packages/api-gateway && pnpm test:ci + - name: Clean DB + run: cd packages/api-gateway && pnpm typeorm:drop - name: Upload coverage reports to Codecov if: ${{ matrix.node-version == 20 }} uses: codecov/codecov-action@v3 diff --git a/.gitignore b/.gitignore index 9b5cfa88..3c9b6b4c 100644 --- a/.gitignore +++ b/.gitignore @@ -19,15 +19,8 @@ pids *.seed *.pid.lock -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage/ -*.lcov - -# nyc test coverage -.nyc_output +# tap test and coverage +.tap # Compiled Javascript files dist/ @@ -57,5 +50,5 @@ node_modules/ .env* !.env.template -# Turbo -.turbo +# NX +.nx/cache \ No newline at end of file diff --git a/.npmrc b/.npmrc index 39f8a749..7ff69e61 100644 --- a/.npmrc +++ b/.npmrc @@ -1,4 +1,5 @@ engine-strict=true +enable-pre-post-scripts=true package-lock=true auto-install-peers=true strict-peer-dependencies=false diff --git a/nx.json b/nx.json new file mode 100644 index 00000000..34cd4e16 --- /dev/null +++ b/nx.json @@ -0,0 +1,22 @@ +{ + "targetDefaults": { + "format": { + "cache": true + }, + "format:fix": { + "cache": true + }, + "build": { + "cache": true + }, + "lint": { + "cache": true + }, + "lint:fix": { + "cache": true + } + }, + "affected": { + "defaultBase": "main" + } +} diff --git a/package.json b/package.json index 509737bd..0b882d84 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,16 @@ "ci:publish": "pnpm publish -r", "cleanall": "rm -rf pnpm-lock.yaml node_modules */**/node_modules && pnpm workspace -- clean", "clean": "pnpm workspace -- clean", - "format": "turbo --concurrency=1 format", - "format:fix": "turbo --concurrency=1 format:fix", - "lint": "turbo --concurrency=1 lint", - "lint:fix": "turbo --concurrency=1 lint:fix", + "format": "npx nx run-many -t format", + "format:fix": "pnpm clean && npx nx run-many -t format:fix", + "lint": "pnpm clean && npx nx run-many -t lint", + "lint:fix": "pnpm clean && npx nx run-many -t lint:fix", "prepare": "husky install", - "release": "turbo release --concurrency=1", - "test": "pnpm workspace -- test", - "test:dev": "pnpm workspace -- test:dev", + "release": "npx nx run-many -t release", + "test": "npx nx test @bitify/api-gateway", + "test:dev": "npx nx test:dev @bitify/api-gateway", + "test:ci": "npx nx test:ci @bitify/api-gateway", + "test:cov": "npx nx test:cov @bitify/api-gateway", "start": "pnpm workspace -- start", "start:dev": "pnpm workspace -- start:dev", "workspace": "pnpm -r --workspace-concurrency=1" @@ -29,7 +31,7 @@ "@tsconfig/strictest": "^2.0.1", "husky": "^8.0.0", "lint-staged": "^14.0.1", - "turbo": "^1.10.14" + "nx": "17.2.8" }, "keywords": [ "trading", diff --git a/packages/api-gateway/.env.template b/packages/api-gateway/.env.template index bf305bf0..6b4a3f25 100644 --- a/packages/api-gateway/.env.template +++ b/packages/api-gateway/.env.template @@ -17,6 +17,11 @@ POSTGRES_USERNAME="postgres" POSTGRES_PASSWORD="mysecretpassword" POSTGRES_DATABASE="my_database" +# Migration and synchronization cannot be enabled at the same time +POSTGRES_MIGRATIONS_RUN="true" +# Make sure you don't turn on synchronization on production +POSTGRES_SYNCHRONIZE="false" + ### EMAIL EMAIL_TRANSPORT="smtps://username:password@smtp.example.com" EMAIL_FROM="no-reply " diff --git a/packages/api-gateway/.taprc b/packages/api-gateway/.taprc index bf43d663..31f9d167 100644 --- a/packages/api-gateway/.taprc +++ b/packages/api-gateway/.taprc @@ -1,3 +1,3 @@ -timeout: 300 -coverage: false -check-coverage: false \ No newline at end of file +# vim: set filetype=yaml : +allow-incomplete-coverage: true +timeout: 0 diff --git a/packages/api-gateway/database/data-seed.ts b/packages/api-gateway/database/data-seed.ts new file mode 100644 index 00000000..69419676 --- /dev/null +++ b/packages/api-gateway/database/data-seed.ts @@ -0,0 +1,34 @@ +import { DataSource, DataSourceOptions } from 'typeorm'; +import 'dotenv/config'; +import path from 'path'; + +const migrationsRun = process.env['POSTGRES_MIGRATIONS_RUN'] === 'true'; +const synchronize = process.env['POSTGRES_SYNCHRONIZE'] === 'true'; + +if (synchronize) { + console.warn( + "Please make sure you don't turn on synchronization on production. Set 'POSTGRES_SYNCHRONIZE=false' in your .env file to disable synchronization.", + ); +} + +if (migrationsRun && synchronize) + throw new Error( + "Synchronization and migration cannot be enabled at the same time. Set 'POSTGRES_SYNCHRONIZE=false' or 'POSTGRES_MIGRATIONS_RUN=false' in your .env file.", + ); + +const dataSeedOptions: DataSourceOptions = { + type: 'postgres', + host: process.env['POSTGRES_HOST'] ?? '127.0.0.1', + port: parseInt(process.env['POSTGRES_PORT'] ?? '5432', 10), + username: process.env['POSTGRES_USERNAME'] ?? 'postgres', + password: process.env['POSTGRES_PASSWORD'] ?? 'postgres', + database: process.env['POSTGRES_DATABASE'] ?? 'postgres', + migrations: [path.join(__dirname, './seeds/**/*{.ts,.js}')], + migrationsTableName: 'migrations_seed', + migrationsRun, + synchronize, + entities: [path.join(__dirname, './../src/**/*.entity{.ts,.js}')], +}; + +const dataSeed = new DataSource(dataSeedOptions); +export default dataSeed; diff --git a/packages/api-gateway/database/data-source.ts b/packages/api-gateway/database/data-source.ts new file mode 100644 index 00000000..3605c4fa --- /dev/null +++ b/packages/api-gateway/database/data-source.ts @@ -0,0 +1,33 @@ +import { DataSource, DataSourceOptions } from 'typeorm'; +import 'dotenv/config'; +import path from 'path'; + +const migrationsRun = process.env['POSTGRES_MIGRATIONS_RUN'] === 'true'; +const synchronize = process.env['POSTGRES_SYNCHRONIZE'] === 'true'; + +if (synchronize) { + console.warn( + "Please make sure you don't turn on synchronization on production. Set 'POSTGRES_SYNCHRONIZE=false' in your .env file to disable synchronization.", + ); +} + +if (migrationsRun && synchronize) + throw new Error( + "Synchronization and migration cannot be enabled at the same time. Set 'POSTGRES_SYNCHRONIZE=false' or 'POSTGRES_MIGRATIONS_RUN=false' in your .env file.", + ); + +export const dataSourceOptions: DataSourceOptions = { + type: 'postgres', + host: process.env['POSTGRES_HOST'] ?? '127.0.0.1', + port: parseInt(process.env['POSTGRES_PORT'] ?? '5432', 10), + username: process.env['POSTGRES_USERNAME'] ?? 'postgres', + password: process.env['POSTGRES_PASSWORD'] ?? 'postgres', + database: process.env['POSTGRES_DATABASE'] ?? 'postgres', + migrations: [path.join(__dirname, './migrations/**/*{.ts,.js}')], + migrationsRun, + synchronize, + entities: [path.join(__dirname, './../src/**/*.entity{.ts,.js}')], +}; + +const dataSource = new DataSource(dataSourceOptions); +export default dataSource; diff --git a/packages/api-gateway/database/migrations/.gitkeep b/packages/api-gateway/database/migrations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/packages/api-gateway/database/migrations/1697298268394-init.ts b/packages/api-gateway/database/migrations/1697298268394-init.ts new file mode 100644 index 00000000..4576619b --- /dev/null +++ b/packages/api-gateway/database/migrations/1697298268394-init.ts @@ -0,0 +1,199 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class Init1697298268394 implements MigrationInterface { + name = 'Init1697298268394'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "roles" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "name" character varying NOT NULL, CONSTRAINT "PK_c1433d71a4838793a49dcad46ab" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "accounts" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "currencyId" uuid NOT NULL, "balance" numeric(32,16) NOT NULL DEFAULT '0', "locked" numeric(32,16) NOT NULL DEFAULT '0', CONSTRAINT "PK_5a7a02c20412299d198e097a8fe" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_accounts_on_userId" ON "accounts" ("userId") `, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX IF NOT EXISTS "index_accounts_currencyId_and_userId" ON "accounts" ("currencyId", "userId") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "user_roles" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "roleId" uuid NOT NULL, "userId" uuid NOT NULL, CONSTRAINT "PK_8acd5cf26ebd158416f477de799" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "permissions" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "action" character varying NOT NULL, "resourceId" uuid NOT NULL, "condition" json NOT NULL, CONSTRAINT "PK_920331560282b8bd21bb02290df" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "activities" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "userIP" character varying NOT NULL, "userAgent" character varying NOT NULL, "topic" character varying NOT NULL, "action" character varying NOT NULL, "result" character varying NOT NULL, "data" text, CONSTRAINT "PK_7f4004429f731ffb9c88eb486a8" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_activities_on_userId" ON "activities" ("userId") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "session" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "userId" uuid NOT NULL, "expires" TIMESTAMP NOT NULL, CONSTRAINT "PK_f55da76ac1c3ac420f444d2ff11" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "apikeys" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "public" character varying NOT NULL, "secret" character varying NOT NULL, "notes" character varying NOT NULL, "type" character varying NOT NULL, "userIps" text, "spot" character varying, "wallet" character varying, "expiresAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "UQ_6be0b0767685db106c2d414cdbb" UNIQUE ("public"), CONSTRAINT "PK_5a37f8db0aa11ac170c74776c7d" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_apikeys_on_userId" ON "apikeys" ("userId") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "resources" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "name" character varying NOT NULL, CONSTRAINT "PK_632484ab9dff41bba94f9b7c85e" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "role_permissions" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "roleId" uuid NOT NULL, "permissionId" uuid NOT NULL, CONSTRAINT "PK_84059017c90bfcb701b8fa42297" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "profiles" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "firstName" character varying, "lastName" character varying, "dob" character varying, "address" character varying, "postcode" character varying, "city" character varying, "country" character varying, "metadata" jsonb, CONSTRAINT "PK_8e520eb4da7dc01d0e190447c8e" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_profiles_on_userId" ON "profiles" ("userId") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "markets" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "baseUnit" character varying(10) NOT NULL, "quoteUnit" character varying(10) NOT NULL, "amountPrecision" smallint NOT NULL DEFAULT '4', "pricePrecision" smallint NOT NULL DEFAULT '4', "minPrice" numeric(32,16) NOT NULL DEFAULT '0', "maxPrice" numeric(32,16) NOT NULL DEFAULT '0', "minAmount" numeric(32,16) NOT NULL DEFAULT '0', "position" integer NOT NULL DEFAULT '0', "state" smallint NOT NULL DEFAULT '1', CONSTRAINT "PK_dda44129b32f21ae9f1c28dcf99" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_markets_on_baseUnit" ON "markets" ("baseUnit") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_markets_on_quoteUnit" ON "markets" ("quoteUnit") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_markets_on_position" ON "markets" ("position") `, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX IF NOT EXISTS "index_markets_on_baseUnit_and_quoteUnit" ON "markets" ("baseUnit", "quoteUnit") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "deposits" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "currencyId" uuid NOT NULL, "amount" numeric(32,16) NOT NULL, "fee" numeric(32,16) NOT NULL, "address" character varying NOT NULL, "fromAddresses" character varying NOT NULL, "txid" character varying NOT NULL, "txout" integer NOT NULL, "state" integer NOT NULL, "blockNumber" integer NOT NULL, "type" smallint NOT NULL, "tid" character varying NOT NULL, "spread" character varying, "completedAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_f49ba0cd446eaf7abb4953385d9" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_deposits_on_currencyId" ON "deposits" ("currencyId") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_deposits_on_txid" ON "deposits" ("txid") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_deposits_on_type" ON "deposits" ("type") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_deposits_on_state_and_userId_and_currencyId" ON "deposits" ("state", "userId", "currencyId") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_deposits_on_userId_and_txid" ON "deposits" ("userId", "txid") `, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX IF NOT EXISTS "index_deposits_on_currencyId_and_txid_and_txout" ON "deposits" ("currencyId", "txid", "txout") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "blockchains" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "key" character varying NOT NULL, "name" character varying NOT NULL, "client" character varying NOT NULL, "server" character varying NOT NULL, "height" bigint NOT NULL, "explorerAddress" character varying NOT NULL, "explorerTransaction" character varying NOT NULL, "minConfirmation" integer NOT NULL DEFAULT '6', "state" smallint NOT NULL DEFAULT '1', CONSTRAINT "UQ_e2c1a2fd3af5b4dfbebeafc88b2" UNIQUE ("key"), CONSTRAINT "PK_388138041975d49f3d0446cf634" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX IF NOT EXISTS "index_blockchains_on_key" ON "blockchains" ("key") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_blockchains_on_state" ON "blockchains" ("state") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "currencies" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "name" character varying NOT NULL, "blockchainId" uuid NOT NULL, "type" character varying NOT NULL DEFAULT 'coin', "depositFee" numeric(32,16) NOT NULL DEFAULT '0', "minDepositAmount" numeric(32,16) NOT NULL DEFAULT '0', "minCollectionAmount" numeric(32,16) NOT NULL DEFAULT '0', "withdrawFee" numeric(32,16) NOT NULL DEFAULT '0', "minWithdrawAmount" numeric(32,16) NOT NULL DEFAULT '0', "withdrawLimit24h" numeric(32,16) NOT NULL DEFAULT '0', "withdrawLimit72h" numeric(32,16) NOT NULL DEFAULT '0', "position" integer NOT NULL DEFAULT '0', "state" smallint NOT NULL DEFAULT '1', "depositState" smallint NOT NULL DEFAULT '1', "withdrawState" smallint NOT NULL DEFAULT '1', "baseFactor" bigint NOT NULL DEFAULT '1', "precision" smallint NOT NULL DEFAULT '8', "iconUrl" character varying NOT NULL, CONSTRAINT "PK_d528c54860c4182db13548e08c4" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_currencies_on_position" ON "currencies" ("position") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_currencies_on_state" ON "currencies" ("state") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "recovery_tokens" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "userId" uuid NOT NULL, "token" character varying NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_533de0ae206825b9ab04e79874e" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_recovery_tokens_on_userId" ON "recovery_tokens" ("userId") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "users" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "email" character varying NOT NULL, "passwordHash" character varying NOT NULL, "level" integer NOT NULL DEFAULT '0', "state" smallint NOT NULL DEFAULT '0', "referralId" uuid, "otp" boolean NOT NULL DEFAULT false, "otpSecret" character varying, "verifyCode" character varying, "verifyExpire" TIMESTAMP WITH TIME ZONE, CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX IF NOT EXISTS "index_users_on_email" ON "users" ("email") `, + ); + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS "wallets" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "name" character varying NOT NULL, "blockchainId" uuid NOT NULL, "currencyId" uuid NOT NULL, "address" character varying NOT NULL, "maxBalance" numeric(32,16) NOT NULL DEFAULT '0', "state" smallint NOT NULL DEFAULT '1', "type" integer NOT NULL DEFAULT '1', CONSTRAINT "PK_8402e5df5a30a229380e83e4f7e" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_wallets_on_currencyId" ON "wallets" ("currencyId") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_wallets_on_state" ON "wallets" ("state") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_wallets_on_type" ON "wallets" ("type") `, + ); + await queryRunner.query( + `CREATE INDEX IF NOT EXISTS "index_wallets_on_type_and_currencyId_and_state" ON "wallets" ("type", "currencyId", "state") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "public"."index_wallets_on_type_and_currencyId_and_state"`, + ); + await queryRunner.query(`DROP INDEX "public"."index_wallets_on_type"`); + await queryRunner.query(`DROP INDEX "public"."index_wallets_on_state"`); + await queryRunner.query( + `DROP INDEX "public"."index_wallets_on_currencyId"`, + ); + await queryRunner.query(`DROP TABLE "wallets"`); + await queryRunner.query(`DROP INDEX "public"."index_users_on_email"`); + await queryRunner.query(`DROP TABLE "users"`); + await queryRunner.query( + `DROP INDEX "public"."index_recovery_tokens_on_userId"`, + ); + await queryRunner.query(`DROP TABLE "recovery_tokens"`); + await queryRunner.query(`DROP INDEX "public"."index_currencies_on_state"`); + await queryRunner.query( + `DROP INDEX "public"."index_currencies_on_position"`, + ); + await queryRunner.query(`DROP TABLE "currencies"`); + await queryRunner.query(`DROP INDEX "public"."index_blockchains_on_state"`); + await queryRunner.query(`DROP INDEX "public"."index_blockchains_on_key"`); + await queryRunner.query(`DROP TABLE "blockchains"`); + await queryRunner.query( + `DROP INDEX "public"."index_deposits_on_currencyId_and_txid_and_txout"`, + ); + await queryRunner.query( + `DROP INDEX "public"."index_deposits_on_userId_and_txid"`, + ); + await queryRunner.query( + `DROP INDEX "public"."index_deposits_on_state_and_userId_and_currencyId"`, + ); + await queryRunner.query(`DROP INDEX "public"."index_deposits_on_type"`); + await queryRunner.query(`DROP INDEX "public"."index_deposits_on_txid"`); + await queryRunner.query( + `DROP INDEX "public"."index_deposits_on_currencyId"`, + ); + await queryRunner.query(`DROP TABLE "deposits"`); + await queryRunner.query( + `DROP INDEX "public"."index_markets_on_baseUnit_and_quoteUnit"`, + ); + await queryRunner.query(`DROP INDEX "public"."index_markets_on_position"`); + await queryRunner.query(`DROP INDEX "public"."index_markets_on_quoteUnit"`); + await queryRunner.query(`DROP INDEX "public"."index_markets_on_baseUnit"`); + await queryRunner.query(`DROP TABLE "markets"`); + await queryRunner.query(`DROP INDEX "public"."index_profiles_on_userId"`); + await queryRunner.query(`DROP TABLE "profiles"`); + await queryRunner.query(`DROP TABLE "role_permissions"`); + await queryRunner.query(`DROP TABLE "resources"`); + await queryRunner.query(`DROP INDEX "public"."index_apikeys_on_userId"`); + await queryRunner.query(`DROP TABLE "apikeys"`); + await queryRunner.query(`DROP TABLE "session"`); + await queryRunner.query(`DROP INDEX "public"."index_activities_on_userId"`); + await queryRunner.query(`DROP TABLE "activities"`); + await queryRunner.query(`DROP TABLE "permissions"`); + await queryRunner.query(`DROP TABLE "user_roles"`); + await queryRunner.query( + `DROP INDEX "public"."index_accounts_currencyId_and_userId"`, + ); + await queryRunner.query(`DROP INDEX "public"."index_accounts_on_userId"`); + await queryRunner.query(`DROP TABLE "accounts"`); + await queryRunner.query(`DROP TABLE "roles"`); + } +} diff --git a/packages/api-gateway/database/seeds/.gitkeep b/packages/api-gateway/database/seeds/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/packages/api-gateway/database/seeds/1697298348529-seed.ts b/packages/api-gateway/database/seeds/1697298348529-seed.ts new file mode 100644 index 00000000..7d41ea8e --- /dev/null +++ b/packages/api-gateway/database/seeds/1697298348529-seed.ts @@ -0,0 +1,73 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; +// import { Role } from '../../src/acl/roles/role.entity'; +// import { UserRole } from '../../src/app.roles'; +import { User } from '../../src/users/entities/user.entity'; +import { hash } from 'bcrypt'; + +export class Seed1697284198292 implements MigrationInterface { + name = 'Seed1697284198292'; + + public async up(queryRunner: QueryRunner): Promise { + // Create roles + // await queryRunner.manager + // .createQueryBuilder() + // .insert() + // .into(Role) + // .values( + // Object.values(UserRole).map((role) => ({ + // name: role, + // })), + // ) + // .execute(); + + // const roles = await queryRunner.manager.find(Role); + // const rolesMap: Record = {} as Record; + // roles.forEach((role) => { + // rolesMap[role.name as UserRole] = role.id; + // }); + + const superAdmin = { + email: 'superadmin@bitify.com', + level: 1, + state: 1, + passwordHash: await hash('superadmin', 10), + }; + + const member = { + email: 'member@bitify.com', + level: 1, + state: 1, + passwordHash: await hash('member', 10), + }; + + // const createdUser = + await queryRunner.manager + .createQueryBuilder() + .insert() + .into(User) + .values([superAdmin, member]) + .execute(); + + // await queryRunner.manager + // .createQueryBuilder() + // .insert() + // .into(UserRole) + // .values([ + // { + // roleId: rolesMap[UserRole.SUPERADMIN], + // userId: createdUser.identifiers[0]?.['id'], + // }, + // { + // roleId: rolesMap[UserRole.MEMBER], + // userId: createdUser.identifiers[1]?.['id'], + // }, + // ]) + // .execute(); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`TRUNCATE roles RESTART IDENTITY CASCADE;`); + await queryRunner.query(`TRUNCATE user_roles RESTART IDENTITY CASCADE;`); + await queryRunner.query(`TRUNCATE users RESTART IDENTITY CASCADE;`); + } +} diff --git a/packages/api-gateway/package.json b/packages/api-gateway/package.json index 0a93620c..c461c502 100644 --- a/packages/api-gateway/package.json +++ b/packages/api-gateway/package.json @@ -6,24 +6,36 @@ "access": "public" }, "scripts": { - "build": "pnpm clean && nest build", - "clean": "rm -rf coverage dist .nyc_output", + "build": "nest build", + "clean": "rm -rf .tap dist", "format": "prettier --list-different .", "format:fix": "prettier --write .", - "start": "nest start", - "start:dev": "nest start --watch", - "start:dev:db": "bash ./scripts/start-db.sh", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/src/main", "lint": "eslint", "lint:fix": "eslint --fix", + "migration:create": "pnpm build && npx typeorm migration:create", + "migration:generate": "pnpm typeorm migration:generate", + "migration:revert": "pnpm typeorm migration:revert", + "migration:run": "pnpm typeorm migration:run", + "postmigration:create": "prettier --write ./database/migrations", + "postmigration:generate": "prettier --write ./database/migrations", + "postseed:generate": "prettier --write ./database/seeds", "prepublish": "pnpm build", "pretest": "node ./test/before-all-tests.js", "release": "release-it --ci", - "test": "pnpm pretest && tap --ts", - "test:ci": "pnpm pretest && tap --ts --coverage && tap --coverage-report=lcov", - "test:cov": "pnpm pretest && tap --ts --coverage", - "test:dev": "pnpm pretest && tap --ts --watch --coverage" + "seed:generate": "pnpm build && npx typeorm -d ./dist/database/data-seed.js migration:generate", + "seed:run": "pnpm build && npx typeorm -d ./dist/database/data-seed.js migration:run", + "seed:revert": "pnpm build && npx typeorm -d ./dist/database/data-seed.js migration:revert", + "start": "nest start", + "start:dev": "nest start --watch", + "start:dev:db": "bash ./scripts/start-db.sh", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/src/main", + "test": "pnpm pretest && tap", + "test:dev": "pnpm pretest && tap repl w", + "test:ci": "pnpm test:cov", + "test:cov": "pnpm pretest && tap && tap report lcov", + "typeorm": "pnpm build && npx typeorm -d ./dist/database/data-source.js", + "typeorm:drop": "pnpm typeorm schema:drop" }, "author": "Andrea Fassina ", "repository": { @@ -36,6 +48,7 @@ }, "homepage": "https://github.com/fasenderos/bitify#readme", "dependencies": { + "@casl/ability": "^6.5.0", "@fastify/static": "^6.10.2", "@nestjs-modules/mailer": "^1.9.1", "@nestjs/common": "^10.0.0", @@ -85,6 +98,7 @@ "@types/pg": "^8.10.2", "@types/qrcode": "^1.5.1", "@types/sanitize-html": "^2.9.0", + "@types/sinon": "^10.0.19", "@types/tap": "^15.0.8", "@types/timestring": "^6.0.2", "@typescript-eslint/eslint-plugin": "^6.4.1", @@ -94,8 +108,9 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "prettier": "^3.0.2", + "sinon": "^16.1.0", "source-map-support": "^0.5.21", - "tap": "^16.3.7", + "tap": "^18.7.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", diff --git a/packages/api-gateway/src/accounts/entities/account.entity.ts b/packages/api-gateway/src/accounts/entities/account.entity.ts new file mode 100644 index 00000000..b9b0ebbe --- /dev/null +++ b/packages/api-gateway/src/accounts/entities/account.entity.ts @@ -0,0 +1,23 @@ +import { Column, Entity, Index } from 'typeorm'; +import { BaseEntity } from '../../base/base.entity'; +import { Collections } from '../../common/constants'; +const { ACCOUNTS } = Collections; + +@Index(`index_${ACCOUNTS}_currencyId_and_userId`, ['currencyId', 'userId'], { + unique: true, +}) +@Entity({ name: ACCOUNTS }) +export class Account extends BaseEntity { + @Index(`index_${ACCOUNTS}_on_userId`) + @Column({ type: 'uuid' }) + userId!: string; + + @Column({ type: 'uuid' }) + currencyId!: string; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + balance!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + locked!: number; +} diff --git a/packages/api-gateway/src/activities/entities/activity.entity.ts b/packages/api-gateway/src/activities/entities/activity.entity.ts index 55cb01d7..97d64501 100644 --- a/packages/api-gateway/src/activities/entities/activity.entity.ts +++ b/packages/api-gateway/src/activities/entities/activity.entity.ts @@ -24,5 +24,5 @@ export class Activity extends BaseEntity { result!: string; @Column({ type: 'text', nullable: true }) - data?: string | null; + data!: string | null; } diff --git a/packages/api-gateway/src/api-keys/api-keys.controller.ts b/packages/api-gateway/src/api-keys/api-keys.controller.ts index 43f3719f..7b0aaabe 100644 --- a/packages/api-gateway/src/api-keys/api-keys.controller.ts +++ b/packages/api-gateway/src/api-keys/api-keys.controller.ts @@ -11,7 +11,9 @@ const BaseController = ControllerFactory< ApiKey, CreateApiKeyDto, UpdateApiKeyDto ->(CreateApiKeyDto, UpdateApiKeyDto, Collections.APIKEYS); +>(CreateApiKeyDto, UpdateApiKeyDto, Collections.APIKEYS, { + belongsToUser: true, +}); @ApiTags(Collections.APIKEYS) @Controller(Collections.APIKEYS) diff --git a/packages/api-gateway/src/api-keys/entities/api-key.entity.ts b/packages/api-gateway/src/api-keys/entities/api-key.entity.ts index 1d9e70ba..c102ae65 100644 --- a/packages/api-gateway/src/api-keys/entities/api-key.entity.ts +++ b/packages/api-gateway/src/api-keys/entities/api-key.entity.ts @@ -3,14 +3,16 @@ import { BaseEntity } from '../../base/base.entity'; import { Collections } from '../../common/constants'; import { ApiKeyAbility } from '../../app.roles'; +const { APIKEYS } = Collections; + // Currently only HMAC, in the future we may also support RSA export enum ApiKeyType { HMAC = 'HMAC', } -@Entity({ name: Collections.APIKEYS }) -@Index(`index_${Collections.APIKEYS}_on_userId`, ['userId']) +@Entity({ name: APIKEYS }) export class ApiKey extends BaseEntity { + @Index(`index_${APIKEYS}_on_userId`) @Column({ type: 'uuid' }) userId!: string; @@ -23,16 +25,16 @@ export class ApiKey extends BaseEntity { @Column() notes!: string; - @Column({ type: 'enum', enum: ApiKeyType }) + @Column('varchar') type!: ApiKeyType; @Column('simple-array', { nullable: true }) userIps!: string[] | null; - @Column({ type: 'enum', enum: ApiKeyAbility, nullable: true }) + @Column({ type: 'varchar', nullable: true }) spot!: ApiKeyAbility | null; - @Column({ type: 'enum', enum: ApiKeyAbility, nullable: true }) + @Column({ type: 'varchar', nullable: true }) wallet!: ApiKeyAbility | null; @Column({ type: 'timestamptz' }) diff --git a/packages/api-gateway/src/app.controller.ts b/packages/api-gateway/src/app.controller.ts index 97ad3010..9de0345a 100644 --- a/packages/api-gateway/src/app.controller.ts +++ b/packages/api-gateway/src/app.controller.ts @@ -6,7 +6,6 @@ import { Post, UseGuards, } from '@nestjs/common'; -import { EmptyObject } from '../typings/common'; import { HealthCheck, HealthCheckResult, @@ -15,6 +14,7 @@ import { } from '@nestjs/terminus'; import { ApiOkResponse, ApiOperation } from '@nestjs/swagger'; import { ApiKeyGuard } from './auth/guards/api-key.guard'; +import { EmptyObject } from './common/types'; @Controller() export class AppController { diff --git a/packages/api-gateway/src/base/base.controller.ts b/packages/api-gateway/src/base/base.controller.ts index b68a341f..797f8f88 100644 --- a/packages/api-gateway/src/base/base.controller.ts +++ b/packages/api-gateway/src/base/base.controller.ts @@ -14,13 +14,20 @@ import { UsePipes, } from '@nestjs/common'; import { AbstractValidationPipe } from '../common/pipes/abstract-validation.pipe'; -import { IBaseController } from './interfaces/base-controller.interface'; +import { + BaseCrudOptions, + IBaseController, +} from './interfaces/base-controller.interface'; import { IBaseService } from './interfaces/base-service.interface'; -import { BaseEntity } from './base.entity'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import { JwtGuard } from '../auth/guards/jwt.guard'; import { UserRole } from '../app.roles'; -import { DeepPartial, FindManyOptions, FindOptionsWhere } from 'typeorm'; +import { + DeepPartial, + FindManyOptions, + FindOptionsWhere, + ObjectLiteral, +} from 'typeorm'; import { Collections } from '../common/constants'; import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'; import { ApiBearerAuth, ApiResponse } from '@nestjs/swagger'; @@ -34,13 +41,14 @@ import { SanitizeTrimPipe } from '../common/pipes/sanitize-trim.pipe'; * updated and delete an entity protected by the Role Base ACL and the api documentaion. */ export function ControllerFactory< - Entity extends BaseEntity & { userId?: string }, + Entity extends ObjectLiteral & { userId?: string }, CreateDTO extends DeepPartial, UpdateDTO extends QueryDeepPartialEntity, >( createDto: Type, updateDto: Type, resource: Collections, + options?: BaseCrudOptions, ): Type> { const createPipe = new AbstractValidationPipe( { @@ -63,8 +71,11 @@ export function ControllerFactory< { body: updateDto }, ); + const visibility = options?.visibility; + const belongsToUser = options?.belongsToUser; + class BaseController< - Entity extends BaseEntity & { userId?: string }, + Entity extends ObjectLiteral & { userId?: string }, CreateDTO extends DeepPartial, UpdateDTO extends QueryDeepPartialEntity, > implements IBaseController @@ -141,13 +152,15 @@ export function ControllerFactory< @CurrentUser() user: User, ): Promise { // Admin can view any resource - if (user.roles.includes(UserRole.ADMIN)) { + if (user.roles?.includes(UserRole.ADMIN)) { return this.service.findById(id); } + // Member can view owned resource only const entity = await this.service.findOne({ id, - userId: user.id, + ...(belongsToUser ? { userId: user.id } : {}), + ...(visibility ? visibility : {}), } as unknown as FindOptionsWhere); if (!entity) throw new NotFoundException(); @@ -178,12 +191,15 @@ export function ControllerFactory< }) findAll(@CurrentUser() user: User): Promise { // Admin can view any resources - if (user.roles.includes(UserRole.ADMIN)) { + if (user.roles?.includes(UserRole.ADMIN)) { return this.service.find(); } // Member can view owned resources only return this.service.find({ - where: { userId: user.id }, + where: { + ...(belongsToUser ? { userId: user.id } : {}), + ...(visibility ? visibility : {}), + }, } as unknown as FindManyOptions); } diff --git a/packages/api-gateway/src/base/base.service.ts b/packages/api-gateway/src/base/base.service.ts index a141aeb5..7481bede 100644 --- a/packages/api-gateway/src/base/base.service.ts +++ b/packages/api-gateway/src/base/base.service.ts @@ -3,16 +3,17 @@ import { DeleteResult, FindManyOptions, FindOptionsWhere, + ObjectLiteral, Repository, + SelectQueryBuilder, UpdateResult, } from 'typeorm'; import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'; -import { BaseEntity } from './base.entity'; import { IBaseService } from './interfaces/base-service.interface'; import { UnprocessableEntityException } from '@nestjs/common'; export abstract class BaseService< - Entity extends BaseEntity, + Entity extends ObjectLiteral & { userId?: string }, CreateDTO extends DeepPartial, UpdateDTO extends QueryDeepPartialEntity, > implements IBaseService @@ -30,6 +31,14 @@ export abstract class BaseService< return this.repo.create({ ...data, userId: userId }); } + queryBuilder(alias?: string): SelectQueryBuilder { + return this.repo.createQueryBuilder(alias); + } + + sql(query: string, parameters?: any[]) { + return this.repo.manager.query(query, parameters); + } + /** * Saves a given entity in the database. * @param {Entity} data The entity to be created @@ -75,7 +84,10 @@ export abstract class BaseService< * @returns The entity that match the conditions or null. */ findById(id: string, unselected = false): Promise { - return this.findOne({ id } as FindOptionsWhere, unselected); + return this.findOne( + { id } as unknown as FindOptionsWhere, + unselected, + ); } /** diff --git a/packages/api-gateway/src/base/interfaces/base-controller.interface.ts b/packages/api-gateway/src/base/interfaces/base-controller.interface.ts index 7a6aa902..b5ea1aa1 100644 --- a/packages/api-gateway/src/base/interfaces/base-controller.interface.ts +++ b/packages/api-gateway/src/base/interfaces/base-controller.interface.ts @@ -1,10 +1,18 @@ -import { DeepPartial } from 'typeorm'; -import { BaseEntity } from '../base.entity'; +import { DeepPartial, ObjectLiteral } from 'typeorm'; import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'; import { User } from '../../users/entities/user.entity'; +export class BaseCrudOptions { + // filter params to be used in find methods e.g. { state: 'active' } + // if can be retrivied only entities in active state + visibility?: Partial; + + // Entity with `userId` column + belongsToUser?: boolean; +} + export interface IBaseController< - T extends BaseEntity & { userId?: string }, + T extends ObjectLiteral & { userId?: string }, C extends DeepPartial, U extends QueryDeepPartialEntity, > { diff --git a/packages/api-gateway/src/base/interfaces/base-service.interface.ts b/packages/api-gateway/src/base/interfaces/base-service.interface.ts index 05035351..fd70e6db 100644 --- a/packages/api-gateway/src/base/interfaces/base-service.interface.ts +++ b/packages/api-gateway/src/base/interfaces/base-service.interface.ts @@ -3,13 +3,13 @@ import { DeleteResult, FindManyOptions, FindOptionsWhere, + ObjectLiteral, UpdateResult, } from 'typeorm'; -import { BaseEntity } from '../base.entity'; import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'; export interface IBaseService< - T extends BaseEntity & { userId?: string }, + T extends ObjectLiteral & { userId?: string }, C extends DeepPartial, U extends QueryDeepPartialEntity, > { diff --git a/packages/api-gateway/src/blockchains/entities/blockchain.entity.ts b/packages/api-gateway/src/blockchains/entities/blockchain.entity.ts new file mode 100644 index 00000000..4c7f6c7f --- /dev/null +++ b/packages/api-gateway/src/blockchains/entities/blockchain.entity.ts @@ -0,0 +1,38 @@ +import { Column, Entity, Index } from 'typeorm'; +import { Collections, State } from '../../common/constants'; +import { BaseEntity } from '../../base/base.entity'; + +const { BLOCKCHAINS } = Collections; + +@Entity({ name: BLOCKCHAINS }) +export class Blockchain extends BaseEntity { + @Index(`index_${BLOCKCHAINS}_on_key`, { unique: true }) + @Column({ unique: true }) + key!: string; + + @Column() + name!: string; + + @Column() + client!: string; + + @Column() + server!: string; + + @Column('bigint') + height!: number; + + @Column() + explorerAddress!: string; + + @Column() + explorerTransaction!: string; + + @Column({ default: 6 }) + minConfirmation!: number; + + /** active (1), inactive (0) */ + @Index(`index_${BLOCKCHAINS}_on_state`) + @Column({ type: 'smallint', default: State.ACTIVE }) + state!: State; +} diff --git a/packages/api-gateway/src/common/constants.ts b/packages/api-gateway/src/common/constants.ts index 42814879..f99e889f 100644 --- a/packages/api-gateway/src/common/constants.ts +++ b/packages/api-gateway/src/common/constants.ts @@ -1,9 +1,24 @@ export enum Collections { + ACCOUNTS = 'accounts', ACTIVITIES = 'activities', APIKEYS = 'apikeys', - RECOVERY_TOKENS = 'recovery_tokens', + BLOCKCHAINS = 'blockchains', + CURRENCIES = 'currencies', + DEPOSITS = 'deposits', + MARKETS = 'markets', + ORDERS = 'orders', + PERMISSIONS = 'permissions', PROFILES = 'profiles', + RECOVERY_TOKENS = 'recovery_tokens', + RESOURCES = 'resources', + ROLE_PERMISSIONS = 'role_permissions', + ROLES = 'roles', + TRADES = 'trades', + TRADING_FEES = 'trading_fees', + USER_ROLES = 'user_roles', USERS = 'users', + WALLETS = 'wallets', + WITHDRAWS = 'withdraws', } export enum UserState { @@ -11,3 +26,8 @@ export enum UserState { PENDING = 0, BANNED = -1, } + +export enum State { + ACTIVE = 1, + INACTIVE = 0, +} diff --git a/packages/api-gateway/typings/common/index.d.ts b/packages/api-gateway/src/common/interfaces.ts similarity index 93% rename from packages/api-gateway/typings/common/index.d.ts rename to packages/api-gateway/src/common/interfaces.ts index da4de9c3..09eb3544 100644 --- a/packages/api-gateway/typings/common/index.d.ts +++ b/packages/api-gateway/src/common/interfaces.ts @@ -1,5 +1,3 @@ -export type EmptyObject = Record; - export interface AppConfig { app: { name: string; diff --git a/packages/api-gateway/src/common/types.ts b/packages/api-gateway/src/common/types.ts new file mode 100644 index 00000000..7c812aa9 --- /dev/null +++ b/packages/api-gateway/src/common/types.ts @@ -0,0 +1,2 @@ +export type EmptyObject = Record; +export type ObjectLiteral = Record; diff --git a/packages/api-gateway/src/config.ts b/packages/api-gateway/src/config.ts index 4b09ec02..04e5685c 100644 --- a/packages/api-gateway/src/config.ts +++ b/packages/api-gateway/src/config.ts @@ -1,5 +1,5 @@ import { name, version } from '../package.json'; -import { AppConfig } from '../typings/common'; +import { AppConfig } from './common/interfaces'; function ensureValues( key: string, diff --git a/packages/api-gateway/src/currencies/entities/currency.entity.ts b/packages/api-gateway/src/currencies/entities/currency.entity.ts new file mode 100644 index 00000000..44e1a03a --- /dev/null +++ b/packages/api-gateway/src/currencies/entities/currency.entity.ts @@ -0,0 +1,66 @@ +import { Column, Entity, Index } from 'typeorm'; +import { Collections, State } from '../../common/constants'; +import { BaseEntity } from '../../base/base.entity'; + +const { CURRENCIES } = Collections; + +enum CurrencyType { + FIAT = 'fiat', + COIN = 'coin', +} + +@Entity({ name: CURRENCIES }) +export class Currency extends BaseEntity { + @Column() + name!: string; + + @Column('uuid') + blockchainId!: string; + + @Column({ type: 'varchar', default: CurrencyType.COIN }) + type!: CurrencyType; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + depositFee!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + minDepositAmount!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + minCollectionAmount!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + withdrawFee!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + minWithdrawAmount!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + withdrawLimit24h!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + withdrawLimit72h!: number; + + @Index(`index_${CURRENCIES}_on_position`) + @Column({ default: 0 }) + position!: number; + + @Index(`index_${CURRENCIES}_on_state`) + @Column({ type: 'smallint', default: State.ACTIVE }) + state!: State; + + @Column({ type: 'smallint', default: State.ACTIVE }) + depositState!: State; + + @Column({ type: 'smallint', default: State.ACTIVE }) + withdrawState!: State; + + @Column('bigint', { default: 1 }) + baseFactor!: number; + + @Column('smallint', { default: 8 }) + precision!: number; + + @Column() + iconUrl!: string; +} diff --git a/packages/api-gateway/src/database/database.module.ts b/packages/api-gateway/src/database/database.module.ts index 29f19f1e..39de39d5 100644 --- a/packages/api-gateway/src/database/database.module.ts +++ b/packages/api-gateway/src/database/database.module.ts @@ -1,30 +1,8 @@ import { Module } from '@nestjs/common'; -import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AppConfig } from '../../typings/common'; -import path from 'path'; +import { dataSourceOptions } from '../../database/data-source'; @Module({ - imports: [ - TypeOrmModule.forRootAsync({ - imports: [ConfigModule], - useFactory: (configService: ConfigService) => { - const { host, port, username, password, database } = configService.get< - AppConfig['db'] - >('db') as AppConfig['db']; - return { - type: 'postgres', - host, - port, - username, - password, - database, - synchronize: process.env['NODE_ENV'] !== 'production', - entities: [path.join(__dirname, '/../**/*.entity{.ts,.js}')], - }; - }, - inject: [ConfigService], - }), - ], + imports: [TypeOrmModule.forRoot(dataSourceOptions)], }) export class DBModule {} diff --git a/packages/api-gateway/src/deposits/entities/deposit.entity.ts b/packages/api-gateway/src/deposits/entities/deposit.entity.ts new file mode 100644 index 00000000..090fd55c --- /dev/null +++ b/packages/api-gateway/src/deposits/entities/deposit.entity.ts @@ -0,0 +1,71 @@ +import { Column, Entity, Index } from 'typeorm'; +import { Collections } from '../../common/constants'; +import { BaseEntity } from '../../base/base.entity'; + +const { DEPOSITS } = Collections; + +enum DepositType { + CARD = 1, + WIRE = 2, + SWIFT = 3, + SEPA = 4, +} + +@Index( + `index_${DEPOSITS}_on_currencyId_and_txid_and_txout`, + ['currencyId', 'txid', 'txout'], + { unique: true }, +) +@Index(`index_${DEPOSITS}_on_userId_and_txid`, ['userId', 'txid']) +@Index(`index_${DEPOSITS}_on_state_and_userId_and_currencyId`, [ + 'state', + 'userId', + 'currencyId', +]) +@Entity({ name: DEPOSITS }) +export class Deposit extends BaseEntity { + @Column({ type: 'uuid' }) + userId!: string; + + @Index(`index_${DEPOSITS}_on_currencyId`) + @Column({ type: 'uuid' }) + currencyId!: string; + + @Column('decimal', { precision: 32, scale: 16 }) + amount!: number; + + @Column('decimal', { precision: 32, scale: 16 }) + fee!: number; + + @Column() + address!: string; + + @Column() + fromAddresses!: string; + + @Index(`index_${DEPOSITS}_on_txid`) + @Column() + txid!: string; + + @Column() + txout!: number; + + @Column() + state!: number; + + @Column() + blockNumber!: number; + + @Index(`index_${DEPOSITS}_on_type`) + @Column('smallint') + type!: DepositType; + + @Column() + tid!: string; + + @Column('varchar', { nullable: true }) + spread!: string | null; + + @Column({ type: 'timestamptz' }) + completedAt!: Date; +} diff --git a/packages/api-gateway/src/main.ts b/packages/api-gateway/src/main.ts index 5af564de..c7eb8bed 100644 --- a/packages/api-gateway/src/main.ts +++ b/packages/api-gateway/src/main.ts @@ -6,9 +6,9 @@ import { import { AppModule } from './app.module'; import { ConfigService } from '@nestjs/config'; import { Logger } from 'nestjs-pino'; -import { AppConfig } from '../typings/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { ValidationPipe } from '@nestjs/common'; +import { AppConfig } from './common/interfaces'; async function bootstrap(): Promise { const app = await NestFactory.create( diff --git a/packages/api-gateway/src/markets/entities/market.entity.ts b/packages/api-gateway/src/markets/entities/market.entity.ts new file mode 100644 index 00000000..38102b9a --- /dev/null +++ b/packages/api-gateway/src/markets/entities/market.entity.ts @@ -0,0 +1,43 @@ +import { Column, Entity, Index } from 'typeorm'; +import { Collections, State } from '../../common/constants'; +import { BaseEntity } from '../../base/base.entity'; + +const { MARKETS } = Collections; + +@Index( + `index_${MARKETS}_on_baseUnit_and_quoteUnit`, + ['baseUnit', 'quoteUnit'], + { unique: true }, +) +@Entity({ name: MARKETS }) +export class Market extends BaseEntity { + @Index(`index_${MARKETS}_on_baseUnit`) + @Column({ length: 10 }) + baseUnit!: string; + + @Index(`index_${MARKETS}_on_quoteUnit`) + @Column({ length: 10 }) + quoteUnit!: string; + + @Column('smallint', { default: 4 }) + amountPrecision!: number; + + @Column('smallint', { default: 4 }) + pricePrecision!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + minPrice!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + maxPrice!: number; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + minAmount!: number; + + @Index(`index_${MARKETS}_on_position`) + @Column({ default: 0 }) + position!: number; + + @Column({ type: 'smallint', default: State.ACTIVE }) + state!: State; +} diff --git a/packages/api-gateway/src/profiles/entities/profile.entity.ts b/packages/api-gateway/src/profiles/entities/profile.entity.ts index e2ceeb56..51d385be 100644 --- a/packages/api-gateway/src/profiles/entities/profile.entity.ts +++ b/packages/api-gateway/src/profiles/entities/profile.entity.ts @@ -2,9 +2,11 @@ import { Column, Entity, Index } from 'typeorm'; import { BaseEntity } from '../../base/base.entity'; import { Collections } from '../../common/constants'; -@Entity({ name: Collections.PROFILES }) -@Index(`index_${Collections.PROFILES}_on_userId`, ['userId']) +const { PROFILES } = Collections; + +@Entity({ name: PROFILES }) export class Profile extends BaseEntity { + @Index(`index_${PROFILES}_on_userId`) @Column({ type: 'uuid' }) userId!: string; diff --git a/packages/api-gateway/src/recovery-tokens/entities/recovery-token.entity.ts b/packages/api-gateway/src/recovery-tokens/entities/recovery-token.entity.ts index 70709ac9..66a957a8 100644 --- a/packages/api-gateway/src/recovery-tokens/entities/recovery-token.entity.ts +++ b/packages/api-gateway/src/recovery-tokens/entities/recovery-token.entity.ts @@ -2,9 +2,11 @@ import { Column, Entity, Index } from 'typeorm'; import { BaseEntity } from '../../base/base.entity'; import { Collections } from '../../common/constants'; -@Entity({ name: Collections.RECOVERY_TOKENS }) -@Index(`index_${Collections.RECOVERY_TOKENS}_on_userId`, ['userId']) +const { RECOVERY_TOKENS } = Collections; + +@Entity({ name: RECOVERY_TOKENS }) export class RecoveryToken extends BaseEntity { + @Index(`index_${RECOVERY_TOKENS}_on_userId`) @Column({ type: 'uuid' }) userId!: string; diff --git a/packages/api-gateway/src/users/entities/user.entity.ts b/packages/api-gateway/src/users/entities/user.entity.ts index 822bcd14..f0252f7e 100644 --- a/packages/api-gateway/src/users/entities/user.entity.ts +++ b/packages/api-gateway/src/users/entities/user.entity.ts @@ -1,26 +1,19 @@ import { Column, Entity, Index } from 'typeorm'; import { Collections, UserState } from '../../common/constants'; -import { UserRole } from '../../app.roles'; import { BaseEntity } from '../../base/base.entity'; +import { UserRole } from '../../app.roles'; + +const { USERS } = Collections; -@Entity({ name: Collections.USERS }) +@Entity({ name: USERS }) export class User extends BaseEntity { - @Index('index_users_on_email', { unique: true }) + @Index(`index_${USERS}_on_email`, { unique: true }) @Column() email!: string; @Column({ select: false }) passwordHash!: string; - /** - * superadmin = has an access to the whole system without any limits - * admin = has nearly full access except managing permissions - * support - * member - */ - @Column({ default: UserRole.MEMBER }) - roles!: string; - /** * Level 0 is default account level * Level 1 will apply after email verification @@ -31,8 +24,8 @@ export class User extends BaseEntity { level!: number; /** active (1), pending (0), banned (-1) */ - @Column({ default: UserState.PENDING }) - state!: number; + @Column({ type: 'smallint', default: UserState.PENDING }) + state!: UserState; @Column('uuid', { nullable: true }) referralId!: string | null; @@ -48,4 +41,14 @@ export class User extends BaseEntity { @Column('timestamptz', { nullable: true, select: false }) verifyExpire!: Date | null; + + // // This is not a column, it is setted on authenthication + /** + * superadmin = has an access to the whole system without any limits + * admin = has nearly full access except managing permissions + * support + * member + */ + @Column({ default: UserRole.MEMBER }) + roles!: string; } diff --git a/packages/api-gateway/src/wallets/entities/wallet.entity.ts b/packages/api-gateway/src/wallets/entities/wallet.entity.ts new file mode 100644 index 00000000..a17b47b5 --- /dev/null +++ b/packages/api-gateway/src/wallets/entities/wallet.entity.ts @@ -0,0 +1,43 @@ +import { Column, Entity, Index } from 'typeorm'; +import { Collections, State } from '../../common/constants'; +import { BaseEntity } from '../../base/base.entity'; + +const { WALLETS } = Collections; + +enum WalletType { + DEPOSIT = 1, + HOT = 2, + COLD = 3, +} + +@Index(`index_${WALLETS}_on_type_and_currencyId_and_state`, [ + 'type', + 'currencyId', + 'state', +]) +@Entity({ name: WALLETS }) +export class Market extends BaseEntity { + @Column() + name!: string; + + @Column('uuid') + blockchainId!: string; + + @Index(`index_${WALLETS}_on_currencyId`) + @Column('uuid') + currencyId!: string; + + @Column() + address!: string; + + @Column('decimal', { precision: 32, scale: 16, default: 0.0 }) + maxBalance!: number; + + @Index(`index_${WALLETS}_on_state`) + @Column({ type: 'smallint', default: State.ACTIVE }) + state!: State; + + @Index(`index_${WALLETS}_on_type`) + @Column({ default: WalletType.DEPOSIT }) + type!: WalletType; +} diff --git a/packages/api-gateway/test/api-keys/api-keys.e2e.test.ts b/packages/api-gateway/test/api-keys/api-keys.e2e.test.ts index a6eae93b..2fad5741 100644 --- a/packages/api-gateway/test/api-keys/api-keys.e2e.test.ts +++ b/packages/api-gateway/test/api-keys/api-keys.e2e.test.ts @@ -1,5 +1,5 @@ import { test } from 'tap'; -import { buildServer, createUser } from '../helper'; +import { buildServer, createUser, removeUser } from '../helper'; import { HttpStatus } from '@nestjs/common'; import { ApiKey } from '../../src/api-keys/entities/api-key.entity'; import { HttpClient } from '../http-client'; @@ -60,6 +60,8 @@ test('shoul create api key', async ({ equal, teardown }) => { equal(second.notes, mockBody.notes); // When there is no ip, api key expires in 90 days equal(new Date(second.expiresAt).getTime() > Date.now(), true); + + await removeUser(user.id, app); }); test('shoul find owned api keys', async ({ equal, teardown }) => { @@ -152,6 +154,9 @@ test('shoul find owned api keys', async ({ equal, teardown }) => { equal(res.body.length, 1); equal(res.body[0].id, apiKeyUser2.body.id); } + + await removeUser(user1.id, app); + await removeUser(user2.id, app); }); test('shoul update owned api keys', async ({ equal, teardown }) => { @@ -234,6 +239,9 @@ test('shoul update owned api keys', async ({ equal, teardown }) => { ); equal(res.statusCode, HttpStatus.NOT_FOUND); } + + await removeUser(user1.id, app); + await removeUser(user2.id, app); }); test('shoul delete owned api keys', async ({ equal, teardown }) => { @@ -285,4 +293,7 @@ test('shoul delete owned api keys', async ({ equal, teardown }) => { const deleted = await http.get(`/apikeys/${apiKeyUser2.body.id}`, auth2); equal(deleted.statusCode, HttpStatus.NOT_FOUND); } + + await removeUser(user1.id, app); + await removeUser(user2.id, app); }); diff --git a/packages/api-gateway/test/app.e2e.test.ts b/packages/api-gateway/test/app.e2e.test.ts index a2f9e7d2..2fc24508 100644 --- a/packages/api-gateway/test/app.e2e.test.ts +++ b/packages/api-gateway/test/app.e2e.test.ts @@ -1,5 +1,5 @@ import { test } from 'tap'; -import { buildServer, createUser } from './helper'; +import { buildServer, createUser, removeUser } from './helper'; import { HttpClient } from './http-client'; import { HttpStatus } from '@nestjs/common'; import { ApiKeysService } from '../src/api-keys/api-keys.service'; @@ -310,4 +310,6 @@ test('test api-key authentication', async ({ equal, teardown }) => { equal(response.statusCode, HttpStatus.UNPROCESSABLE_ENTITY); equal(response.body.message, 'Your api key is expired'); } + + await removeUser(user.id, app); }); diff --git a/packages/api-gateway/test/auth/auth.e2e.test.ts b/packages/api-gateway/test/auth/auth.e2e.test.ts index 4b2332be..289f0549 100644 --- a/packages/api-gateway/test/auth/auth.e2e.test.ts +++ b/packages/api-gateway/test/auth/auth.e2e.test.ts @@ -16,7 +16,7 @@ import { ConfigService } from '@nestjs/config'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { ResetPasswordTransaction } from '../../src/auth/transactions/reset-password.transaction'; -test('AuthController', async ({ equal, mock, teardown }) => { +test('AuthController', async ({ equal, mockRequire, teardown }) => { const app = await buildServer(); teardown(async () => await app.close()); const http = new HttpClient(app); @@ -144,7 +144,13 @@ test('AuthController', async ({ equal, mock, teardown }) => { equal(disable2FA.statusCode, HttpStatus.OK); // Test Forgot Password - const newPassword = await testForgotPassword(user, app, equal, mock, http); + const newPassword = await testForgotPassword( + user, + app, + equal, + mockRequire, + http, + ); // Test login again with old password const oldPasswordLogin = await http.login(user.email, mockUser.password); @@ -392,6 +398,7 @@ const testLogin = async ( { // Set an invalid user state + // @ts-expect-error state is invalid await userService.updateById(id, { state: 3 }); const login = await http.login(email, password); equal(login.statusCode, HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/packages/api-gateway/test/base/base-service.test.ts b/packages/api-gateway/test/base/base-service.test.ts index 5b7664ea..2abf12c9 100644 --- a/packages/api-gateway/test/base/base-service.test.ts +++ b/packages/api-gateway/test/base/base-service.test.ts @@ -1,5 +1,5 @@ import { test } from 'tap'; -import { buildServer, createUser } from '../helper'; +import { buildServer, createUser, removeUser } from '../helper'; import { UnprocessableEntityException } from '@nestjs/common'; import { RecoveryTokensService } from '../../src/recovery-tokens/recovery-tokens.service'; import { RecoveryToken } from '../../src/recovery-tokens/entities/recovery-token.entity'; @@ -30,6 +30,8 @@ test('base service creatEntity() and save() method', async ({ // test save() method with right param const token = await service.save(tokenEntity); equal(token instanceof RecoveryToken, true); + + await removeUser(user.id, app); }); test('base service find() method', async ({ equal, teardown }) => { @@ -68,6 +70,7 @@ test('base service find() method', async ({ equal, teardown }) => { equal(Array.isArray(res), true); equal(res.length, 1); } + await removeUser(user.id, app); }); test('base service findOne() method', async ({ equal, teardown }) => { @@ -96,6 +99,7 @@ test('base service findOne() method', async ({ equal, teardown }) => { equal(res instanceof RecoveryToken, true); equal(res?.id, token.id); } + await removeUser(user.id, app); }); test('base service findById() method', async ({ equal, teardown }) => { @@ -124,6 +128,7 @@ test('base service findById() method', async ({ equal, teardown }) => { equal(res instanceof RecoveryToken, true); equal(res?.id, token.id); } + await removeUser(user.id, app); }); test('base service update() method', async ({ equal, teardown }) => { @@ -157,6 +162,7 @@ test('base service update() method', async ({ equal, teardown }) => { equal(error instanceof UnprocessableEntityException, true); } } + await removeUser(user.id, app); }); test('base service updateById() method', async ({ equal, teardown }) => { @@ -204,6 +210,7 @@ test('base service updateById() method', async ({ equal, teardown }) => { equal(error instanceof UnprocessableEntityException, true); } } + await removeUser(user.id, app); }); test('base service delete() method', async ({ equal, teardown }) => { @@ -247,6 +254,7 @@ test('base service delete() method', async ({ equal, teardown }) => { equal(response, null); } } + await removeUser(user.id, app); }); test('base service deleteById() method', async ({ equal, teardown }) => { @@ -304,4 +312,5 @@ test('base service deleteById() method', async ({ equal, teardown }) => { equal(response, null); } } + await removeUser(user.id, app); }); diff --git a/packages/api-gateway/test/config.test.ts b/packages/api-gateway/test/config.test.ts index efe1b9fc..38d874e8 100644 --- a/packages/api-gateway/test/config.test.ts +++ b/packages/api-gateway/test/config.test.ts @@ -1,7 +1,9 @@ import Config from '../src/config'; -import { AppConfig } from '../typings/common'; import { name, version } from '../package.json'; import t from 'tap'; +import { AppConfig } from '../src/common/interfaces'; +import dotenv from 'dotenv'; +dotenv.config({ path: __dirname + './../.env.template' }); t.test('test config', ({ same, end, equal }) => { // Without required params should throw err @@ -11,11 +13,6 @@ t.test('test config', ({ same, end, equal }) => { equal(err.message, 'Config missing env.RECAPTCHA_PRIVATE_KEY'); } - // Mock required params - process.env['RECAPTCHA_PRIVATE_KEY'] = 'somevalue'; - process.env['EMAIL_FROM'] = 'somevalue'; - process.env['FRONTEND_BASE_URL'] = 'somevalue'; - const config: AppConfig = Config(); same(config, { app: { name, version }, @@ -25,21 +22,24 @@ t.test('test config', ({ same, end, equal }) => { expRefreshToken: '7d', expVerifyMail: '8m', expResetPassword: '8m', - recaptchaSecret: 'somevalue', - secret2FAToken: 'CHANGE-2FA-TOKEN', - secretAccessToken: 'CHANGE-ACCESS-TOKEN', - secretRefreshToken: 'CHANGE-REFRESH-TOKEN', + recaptchaSecret: '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe', + secret2FAToken: 'change-me-jwt-2fa-secret', + secretAccessToken: 'change-me-jwt-secret', + secretRefreshToken: 'change-me-jwt-refresh-secret', }, db: { host: '127.0.0.1', port: 5432, username: 'postgres', - password: 'postgres', - database: 'postgres', + password: 'mysecretpassword', + database: 'my_database', + }, + email: { + transport: 'smtps://username:password@smtp.example.com', + from: 'no-reply ', }, - email: { transport: undefined, from: 'somevalue' }, - encryption: { secret: 'CHANGE-ENCRYPTION-KEY' }, - frontend: { baseUrl: 'somevalue' }, + encryption: { secret: 'change-me-encryption-secret-32-c' }, + frontend: { baseUrl: 'http://127.0.0.1:3000' }, server: { address: '127.0.0.1', port: 3001 }, }); end(); diff --git a/packages/api-gateway/tsconfig.build.json b/packages/api-gateway/tsconfig.build.json index 344a8417..ce3ac665 100644 --- a/packages/api-gateway/tsconfig.build.json +++ b/packages/api-gateway/tsconfig.build.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "coverage"], + "exclude": ["node_modules", "test", "dist"], "compilerOptions": { "removeComments": true } diff --git a/packages/api-gateway/tsconfig.json b/packages/api-gateway/tsconfig.json index 970f50cf..095c20fd 100644 --- a/packages/api-gateway/tsconfig.json +++ b/packages/api-gateway/tsconfig.json @@ -17,6 +17,5 @@ "noImplicitAny": true, "strictBindCallApply": true, "resolveJsonModule": true - }, - "typeRoots": ["./node_modules/@types", "./typings"] + } } diff --git a/packages/core/.taprc b/packages/core/.taprc new file mode 100644 index 00000000..31f9d167 --- /dev/null +++ b/packages/core/.taprc @@ -0,0 +1,3 @@ +# vim: set filetype=yaml : +allow-incomplete-coverage: true +timeout: 0 diff --git a/packages/core/package.json b/packages/core/package.json index f6bda9b7..309719c5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -4,7 +4,7 @@ "description": "", "scripts": { "build": "pnpm clean && nest build", - "clean": "rm -rf coverage dist .nyc_output", + "clean": "rm -rf .tap dist", "format": "prettier --list-different .", "format:fix": "prettier --write .", "start": "nest start", @@ -13,8 +13,10 @@ "start:prod": "node dist/main", "lint": "eslint", "lint:fix": "eslint --fix", - "test": "tap --ts", - "test:dev": "tap --ts --watch" + "test": "tap", + "test:dev": "tap repl w", + "test:ci": "pnpm test:cov", + "test:cov": "tap && tap report lcov" }, "author": "Andrea Fassina ", "repository": { @@ -46,15 +48,10 @@ "eslint-plugin-prettier": "^5.0.0", "prettier": "^3.0.2", "source-map-support": "^0.5.21", - "tap": "^16.3.7", + "tap": "^18.7.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3" - }, - "tap": { - "coverage": true, - "check-coverage": false, - "coverage-report": "lcov" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7410d8e..548c7ce4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,9 @@ importers: lint-staged: specifier: ^14.0.1 version: 14.0.1 - turbo: - specifier: ^1.10.14 - version: 1.10.14 + nx: + specifier: 17.2.8 + version: 17.2.8 libs/release-it: devDependencies: @@ -38,6 +38,9 @@ importers: packages/api-gateway: dependencies: + '@casl/ability': + specifier: ^6.5.0 + version: 6.5.0 '@fastify/static': specifier: ^6.10.2 version: 6.11.2 @@ -149,7 +152,7 @@ importers: devDependencies: '@bitify/release-it': specifier: '*' - version: 0.0.2 + version: link:../../libs/release-it '@nestjs/cli': specifier: ^10.0.0 version: 10.1.18 @@ -180,6 +183,9 @@ importers: '@types/sanitize-html': specifier: ^2.9.0 version: 2.9.0 + '@types/sinon': + specifier: ^10.0.19 + version: 10.0.19 '@types/tap': specifier: ^15.0.8 version: 15.0.9 @@ -207,12 +213,15 @@ importers: prettier: specifier: ^3.0.2 version: 3.0.3 + sinon: + specifier: ^16.1.0 + version: 16.1.0 source-map-support: specifier: ^0.5.21 version: 0.5.21 tap: - specifier: ^16.3.7 - version: 16.3.8(ts-node@10.9.1)(typescript@5.2.2) + specifier: ^18.7.0 + version: 18.7.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) ts-loader: specifier: ^9.4.3 version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) @@ -281,8 +290,8 @@ importers: specifier: ^0.5.21 version: 0.5.21 tap: - specifier: ^16.3.7 - version: 16.3.8(ts-node@10.9.1)(typescript@5.2.2) + specifier: ^18.7.0 + version: 18.7.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) ts-loader: specifier: ^9.4.3 version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) @@ -303,12 +312,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + /@alcalzone/ansi-tokenize@0.1.3: + resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} + engines: {node: '>=14.13.1'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 dev: true /@angular-devkit/core@16.1.8(chokidar@3.5.3): @@ -394,135 +403,16 @@ packages: '@babel/highlight': 7.22.20 chalk: 2.4.2 - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.22.20: - resolution: {integrity: sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.15 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.20) - '@babel/helpers': 7.22.15 - '@babel/parser': 7.22.16 - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.20 - '@babel/types': 7.22.19 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.15: - resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.20 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.21.11 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.22.19 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - dev: true - - /@babel/helper-module-transforms@7.22.20(@babel/core@7.22.20): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.20 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - dev: true - /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} requiresBuild: true + dev: false /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.22.15: - resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.20 - '@babel/types': 7.22.19 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} @@ -535,8 +425,10 @@ packages: resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} engines: {node: '>=6.0.0'} hasBin: true + requiresBuild: true dependencies: '@babel/types': 7.22.19 + dev: false /@babel/runtime@7.22.15: resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} @@ -545,45 +437,30 @@ packages: regenerator-runtime: 0.14.0 dev: false - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - dev: true - - /@babel/traverse@7.22.20: - resolution: {integrity: sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.22.19: resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} engines: {node: '>=6.9.0'} + requiresBuild: true dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: false + + /@base2/pretty-print-object@1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true - /@bitify/release-it@0.0.2: - resolution: {integrity: sha512-LGLMiRNQGOj4S34gLslj3HSd9fQJfxvMbTqCzIdYHxaws07LYEhsKxtF+pFzSShkY6ZASHQm9ar6v1vFIuwleQ==} + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@casl/ability@6.5.0: + resolution: {integrity: sha512-3guc94ugr5ylZQIpJTLz0CDfwNi0mxKVECj1vJUPAvs+Lwunh/dcuUjwzc4MHM9D8JOYX0XUZMEPedpB3vIbOw==} + dependencies: + '@ucast/mongo2js': 1.3.4 + dev: false + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -742,17 +619,34 @@ packages: strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + /@isaacs/ts-node-temp-fork-for-pr-2009@10.9.5(@types/node@20.6.3)(typescript@5.2.2): + resolution: {integrity: sha512-hEDlwpHhIabtB+Urku8muNMEkGui0LVGlYLS3KoB9QBDf0Pw3r7q0RrfoQmFuk8CvRpGzErO3/vLQd9Ys+/g4g==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=4.2' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@tsconfig/node18': 18.2.2 + '@tsconfig/node20': 20.1.2 + '@types/node': 20.6.3 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 dev: true /@istanbuljs/schema@0.1.3: @@ -760,6 +654,13 @@ packages: engines: {node: '>=8'} dev: true + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@jonkemp/package-utils@1.0.8: resolution: {integrity: sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==} dev: false @@ -1202,6 +1103,104 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@npmcli/agent@2.2.0: + resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.0.1 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + + /@npmcli/git@5.0.4: + resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 7.0.1 + lru-cache: 10.0.1 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.4 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/package-json@5.0.0: + resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/git': 5.0.4 + glob: 10.3.10 + hosted-git-info: 7.0.1 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + proc-log: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/promise-spawn@7.0.1: + resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + which: 4.0.0 + dev: true + + /@npmcli/run-script@7.0.4: + resolution: {integrity: sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.0.0 + '@npmcli/promise-spawn': 7.0.1 + node-gyp: 10.0.1 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@nrwl/tao@17.2.8: + resolution: {integrity: sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==} + hasBin: true + dependencies: + nx: 17.2.8 + tslib: 2.6.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + /@nuxtjs/opencollective@0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -1213,6 +1212,96 @@ packages: transitivePeerDependencies: - encoding + /@nx/nx-darwin-arm64@17.2.8: + resolution: {integrity: sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-darwin-x64@17.2.8: + resolution: {integrity: sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-freebsd-x64@17.2.8: + resolution: {integrity: sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm-gnueabihf@17.2.8: + resolution: {integrity: sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-gnu@17.2.8: + resolution: {integrity: sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-musl@17.2.8: + resolution: {integrity: sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-gnu@17.2.8: + resolution: {integrity: sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-musl@17.2.8: + resolution: {integrity: sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-arm64-msvc@17.2.8: + resolution: {integrity: sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-x64-msvc@17.2.8: + resolution: {integrity: sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@octokit/auth-token@3.0.4: resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} engines: {node: '>= 14'} @@ -1331,108 +1420,538 @@ packages: resolution: {integrity: sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==} dev: false - /@otplib/plugin-crypto@12.0.1: - resolution: {integrity: sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==} + /@otplib/plugin-crypto@12.0.1: + resolution: {integrity: sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==} + dependencies: + '@otplib/core': 12.0.1 + dev: false + + /@otplib/plugin-thirty-two@12.0.1: + resolution: {integrity: sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==} + dependencies: + '@otplib/core': 12.0.1 + thirty-two: 1.0.2 + dev: false + + /@otplib/preset-default@12.0.1: + resolution: {integrity: sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==} + dependencies: + '@otplib/core': 12.0.1 + '@otplib/plugin-crypto': 12.0.1 + '@otplib/plugin-thirty-two': 12.0.1 + dev: false + + /@otplib/preset-v11@12.0.1: + resolution: {integrity: sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==} + dependencies: + '@otplib/core': 12.0.1 + '@otplib/plugin-crypto': 12.0.1 + '@otplib/plugin-thirty-two': 12.0.1 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + /@release-it/conventional-changelog@7.0.2(release-it@16.1.5): + resolution: {integrity: sha512-rsUKWNnU39xivgC2IanjRkEOPsTu2X2jgJGpNHF+mndpOUr1WAROmIaix1o3ne2zseT+GLyZII2NC8FgYaM7xA==} + engines: {node: '>=16'} + peerDependencies: + release-it: ^16.0.0 + dependencies: + concat-stream: 2.0.0 + conventional-changelog: 5.1.0 + conventional-recommended-bump: 8.0.0 + release-it: 16.1.5 + semver: 7.5.4 + + /@selderee/plugin-htmlparser2@0.11.0: + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + dev: false + + /@sigstore/bundle@2.1.1: + resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/core@0.2.0: + resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/sign@2.2.1: + resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@2.3.0: + resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/verify@0.1.0: + resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@sinonjs/samsam@8.0.0: + resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@sqltools/formatter@1.2.5: + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + dev: false + + /@supercharge/request-ip@1.2.0: + resolution: {integrity: sha512-wlt6JW69MHqLY2M6Sm/jVyCojNRKq2CBvwH0Hbx24SFhDQQGkgEjeKxVutDxHSyrWixFaOSLXC27euzxijhyMQ==} + dev: false + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + + /@tapjs/after-each@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-AuXeD8uUYQ/CUdfhx2jvBhJf3M+T/Kroz5T6ItocZ3jf8H/4x2OKMVbb5YcB7J4ANGtmzXp+8SBseoN1av6y0Q==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + function-loop: 4.0.0 + dev: true + + /@tapjs/after@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-r0vMFMfxmO6UR+pB9zGvamaeUI+yhLokYAagsKoM3JdoZgyq0iw1fHn5hPPY8AC1tAzEYG3KtVDpJfpoOr67Iw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + is-actual-promise: 1.0.1 + dev: true + + /@tapjs/asserts@1.1.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MwGs/QklLRAsMnB4fO6QFaZ0myR//E21Rek/gGCpTxz7eUwCh24/y7MlBV0W6zDFdnQ1GFbHc/fIBVtcPAWjyw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/stack': 1.2.7 + is-actual-promise: 1.0.1 + tcompare: 6.4.5(react-dom@18.2.0)(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@tapjs/before-each@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-qxBQaOY+IkThP9iauL1tHCxirG9XuKGJvGHY4IGKuk0RswWkXmawSe5hcJ8m569dRXy9yJHEV7N0QueuyWxpBA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + function-loop: 4.0.0 + dev: true + + /@tapjs/before@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-2rkXrAWlkl0+bZ8wSNfEW/7TANs/Dg5SrY2MmdEb0x7Q/zbMoGjrPVKDRF20Me0p+tJBLWSY+FXQ0OhXK0pUjg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - '@otplib/core': 12.0.1 - dev: false + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + is-actual-promise: 1.0.1 + dev: true - /@otplib/plugin-thirty-two@12.0.1: - resolution: {integrity: sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==} + /@tapjs/config@2.4.15(@tapjs/core@1.5.0)(@tapjs/test@1.4.0): + resolution: {integrity: sha512-uU/gfQJh8aSokEBgwAAHD5ctHYbIiZYFaL6IrROcDp7Wr7/fd/dn9K4efpREwKpqKqOgL3XZPOwx7prKxrLHhA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + '@tapjs/test': 1.4.0 dependencies: - '@otplib/core': 12.0.1 - thirty-two: 1.0.2 - dev: false + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/test': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + chalk: 5.3.0 + jackspeak: 2.3.6 + polite-json: 4.0.1 + tap-yaml: 2.2.1 + walk-up-path: 3.0.1 + dev: true + + /@tapjs/core@1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-g+NNI5TGXVJR5G4AZCU0hWu1pdA2qB2OYrY9Ej3mWeg97mvNZBVgNtvx8Vjdwp9BfgbJfyFK7PvoB4nhKgetSQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + '@tapjs/processinfo': 3.1.6 + '@tapjs/stack': 1.2.7 + '@tapjs/test': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + async-hook-domain: 4.0.1 + diff: 5.1.0 + is-actual-promise: 1.0.1 + minipass: 7.0.3 + signal-exit: 4.1.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5(react-dom@18.2.0)(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + dev: true - /@otplib/preset-default@12.0.1: - resolution: {integrity: sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==} + /@tapjs/error-serdes@1.2.1: + resolution: {integrity: sha512-/7eLEcrGo+Qz3eWrjkhDC+VSEOjabkkzr9eRADeU+OLFeZaik8L/GRk0SGhnp4YsQkv0jcNV00A42bEx2HIZcw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 - dev: false + minipass: 7.0.3 + dev: true - /@otplib/preset-v11@12.0.1: - resolution: {integrity: sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==} + /@tapjs/filter@1.2.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-0yCqaHYLejI/KyxdB5EsrRVu3wxZVl7vPXTwBoyc+ycJWXPapHLhKl67Xk5x3FW/nNelA9TCq/tSHcYlogGN0g==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - '@otplib/core': 12.0.1 - '@otplib/plugin-crypto': 12.0.1 - '@otplib/plugin-thirty-two': 12.0.1 - dev: false + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + dev: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false - optional: true + /@tapjs/fixture@1.2.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-BQIRxydaqjZIG61QhoiQOc9HE3MxSjCn7SUsIfYCzoZoY+3aY6iCdTVg2la86b5ikTbwoWxWWbqICnFWebuHnQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + mkdirp: 3.0.1 + rimraf: 5.0.5 + dev: true - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + /@tapjs/intercept@1.2.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-Trcmp64RKD2/nMz7/+NuwjJHfrn8eFofX3s3g0+QGvnTv+5B5ZQs+zWjS7q2d1Qt8LDV8CfS5w3BhYyONsocSw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.1 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 + '@tapjs/after': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/stack': 1.2.7 dev: true - /@pnpm/config.env-replace@1.1.0: - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} + /@tapjs/mock@1.3.0(@tapjs/core@1.5.0): + resolution: {integrity: sha512-Uzyikl8SS8Mg7OOr2HuyiaVhYvHNRZnw6A1/qTiJnoZ1MHcLFuwFqIX9ZhfXMil5MIYC/ET096VMDm45q9Tdvw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/after': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/stack': 1.2.7 + resolve-import: 1.4.5 + walk-up-path: 3.0.1 + dev: true - /@pnpm/network.ca-file@1.0.2: - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} + /@tapjs/node-serialize@1.3.0(@tapjs/core@1.5.0): + resolution: {integrity: sha512-52oQKQJMMKrI1cNu8kJ5WTv8YFnbhwfwUs3Jh1vXQb4tOhLW8IHWqXBi5AiNL3HlCMMHaKDFQjW6sbbJuMyJPA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - graceful-fs: 4.2.10 + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/error-serdes': 1.2.1 + '@tapjs/stack': 1.2.7 + tap-parser: 15.3.1 + dev: true - /@pnpm/npm-conf@2.2.2: - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} + /@tapjs/processinfo@3.1.6: + resolution: {integrity: sha512-ktDsaf79wJsLaoG1Pp+stHSRf6a1k/JydoRAaYVG5iJnd3DooL6yewZsciUi2yiN/WQc5tAXCIFTXL4uXGB8LA==} + engines: {node: '>=16.17'} dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 + pirates: 4.0.6 + process-on-spawn: 1.0.0 + signal-exit: 4.1.0 + uuid: 8.3.2 + dev: true - /@release-it/conventional-changelog@7.0.2(release-it@16.1.5): - resolution: {integrity: sha512-rsUKWNnU39xivgC2IanjRkEOPsTu2X2jgJGpNHF+mndpOUr1WAROmIaix1o3ne2zseT+GLyZII2NC8FgYaM7xA==} - engines: {node: '>=16'} + /@tapjs/reporter@1.3.16(@tapjs/core@1.5.0)(@tapjs/test@1.4.0)(react-dom@18.2.0): + resolution: {integrity: sha512-YoZpBAFGdZyrhIaRCZDuWSeCc10A3YG/4mIdPsKpSbLXPBZ1hwCV8Y/LPCpH5kunZTXYocvQoRHU+oD4pLXC3g==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} peerDependencies: - release-it: ^16.0.0 + '@tapjs/core': 1.5.0 dependencies: - concat-stream: 2.0.0 - conventional-changelog: 5.1.0 - conventional-recommended-bump: 8.0.0 - release-it: 16.1.5 + '@tapjs/config': 2.4.15(@tapjs/core@1.5.0)(@tapjs/test@1.4.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/stack': 1.2.7 + chalk: 5.3.0 + ink: 4.4.1(react@18.2.0) + minipass: 7.0.3 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.2.0 + string-length: 6.0.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + dev: true + + /@tapjs/run@1.5.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-WrmbHHrhvRvLlTTAGiogF09xiPoorsoG4diAIKifGUyGD/9qRA7pT2mzYIqXvhyxbtuEmaeobHjupSZrak+O4Q==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/after': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/before': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/config': 2.4.15(@tapjs/core@1.5.0)(@tapjs/test@1.4.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/processinfo': 3.1.6 + '@tapjs/reporter': 1.3.16(@tapjs/core@1.5.0)(@tapjs/test@1.4.0)(react-dom@18.2.0) + '@tapjs/spawn': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/stdin': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/test': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + c8: 8.0.1 + chalk: 5.3.0 + chokidar: 3.5.3 + foreground-child: 3.1.1 + glob: 10.3.10 + minipass: 7.0.3 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 17.0.6 + resolve-import: 1.4.5 + rimraf: 5.0.5 semver: 7.5.4 + signal-exit: 4.1.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5(react-dom@18.2.0)(react@18.2.0) + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + dev: true - /@selderee/plugin-htmlparser2@0.11.0: - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + /@tapjs/snapshot@1.2.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fHt4ZgutJ922/YdmXN2d6dkwFTR6KsyD02jcSYBXVDGdFC2YnsjKk/o9s3Yt9tYnYES6Et+6udPlAKcakzR5jQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - dev: false + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + is-actual-promise: 1.0.1 + tcompare: 6.4.5(react-dom@18.2.0)(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true - /@sindresorhus/is@5.6.0: - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + /@tapjs/spawn@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-E5H0NTyTZ0FnkPUd5JU3c2KrnjjMDDAuctRd2b0v/M5LB+uAlwwEEJJ6rh+dBsFK/yatfgPli+nbHZVjUz+Usw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + dev: true - /@sqltools/formatter@1.2.5: - resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} - dev: false + /@tapjs/stack@1.2.7: + resolution: {integrity: sha512-7qUDWDmd+y7ZQ0vTrDTvFlWnJ+ND32NemS5HVuT1ZggHtBwJ62PQHIyCx/B5RopETBb6NvFPfUE21yTiex9Jkw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dev: true - /@supercharge/request-ip@1.2.0: - resolution: {integrity: sha512-wlt6JW69MHqLY2M6Sm/jVyCojNRKq2CBvwH0Hbx24SFhDQQGkgEjeKxVutDxHSyrWixFaOSLXC27euzxijhyMQ==} - dev: false + /@tapjs/stdin@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-UyhK8bRRhQkmBb7N/NFa/11DucHfIzCyyba7uax+dkuXSd6OccTZVxLpRMuaOUV59QCCFAJUJDQnmaWj35fI7Q==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + dev: true - /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + /@tapjs/test@1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-t4U11uAUDUeBQTdlqtiDoiuiG3lKLhHa+PxrdIR3GlG+2wDcpqFR8aFFiuq3XTvks0uoWjKx3WkAMyjNsxmikg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.5(@types/node@20.6.3)(typescript@5.2.2) + '@tapjs/after': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/after-each': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/asserts': 1.1.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/before': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/before-each': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/filter': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/fixture': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/intercept': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/mock': 1.3.0(@tapjs/core@1.5.0) + '@tapjs/node-serialize': 1.3.0(@tapjs/core@1.5.0) + '@tapjs/snapshot': 1.2.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/spawn': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/stdin': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/typescript': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(typescript@5.2.2) + '@tapjs/worker': 1.1.18(@tapjs/core@1.5.0) + glob: 10.3.10 + jackspeak: 2.3.6 + mkdirp: 3.0.1 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + tap-parser: 15.3.1 + tshy: 1.11.0 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + dev: true + + /@tapjs/typescript@1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(typescript@5.2.2): + resolution: {integrity: sha512-3b3pNI20Cf9NRMuT6GE288RESMYMcrwrKuj29Mroiy9MkLEyyPPHqeSRstvakn9/i/nhTlXj2YIftPo80H3OlQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 dependencies: - defer-to-connect: 2.0.1 + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.5(@types/node@20.6.3)(typescript@5.2.2) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@tapjs/worker@1.1.18(@tapjs/core@1.5.0): + resolution: {integrity: sha512-wxl/dXByMWk9FuYiiSzY/U5QU0oe9EWpf7pJ48feWsTTn42wihUHZT25kbleR4V2l68/SlTPlJkEsKnHjU27Pg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.0 + dependencies: + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + dev: true /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} @@ -1458,10 +1977,31 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + /@tsconfig/node18@18.2.2: + resolution: {integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==} + dev: true + + /@tsconfig/node20@20.1.2: + resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==} + dev: true + /@tsconfig/strictest@2.0.2: resolution: {integrity: sha512-jt4jIsWKvUvuY6adJnQJlb/UR7DdjC8CjHI/OaSQruj2yX9/K6+KOvDt/vD6udqos/FUk5Op66CvYT7TBLYO5Q==} dev: true + /@tufjs/canonical-json@2.0.0: + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: true + + /@tufjs/models@2.0.0: + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 + dev: true + /@types/bcrypt@5.0.0: resolution: {integrity: sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==} dependencies: @@ -1529,6 +2069,10 @@ packages: resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} dev: true + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/json-schema@7.0.13: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true @@ -1640,6 +2184,16 @@ packages: '@types/node': 20.6.3 dev: true + /@types/sinon@10.0.19: + resolution: {integrity: sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.3 + dev: true + + /@types/sinonjs__fake-timers@8.1.3: + resolution: {integrity: sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==} + dev: true + /@types/tap@15.0.9: resolution: {integrity: sha512-ewkqbmoYTsKC333VmdpUvxRl8/tDK2RRzR/BBCAuuFPgEvNp1vxqL2Dh812acDpmaBsgWkYORxy8e/RODrzMPw==} dependencies: @@ -1784,6 +2338,30 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ucast/core@1.10.2: + resolution: {integrity: sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==} + dev: false + + /@ucast/js@3.0.3: + resolution: {integrity: sha512-jBBqt57T5WagkAjqfCIIE5UYVdaXYgGkOFYv2+kjq2AVpZ2RIbwCo/TujJpDlwTVluUI+WpnRpoGU2tSGlEvFQ==} + dependencies: + '@ucast/core': 1.10.2 + dev: false + + /@ucast/mongo2js@1.3.4: + resolution: {integrity: sha512-ahazOr1HtelA5AC1KZ9x0UwPMqqimvfmtSm/PRRSeKKeE5G2SCqTgwiNzO7i9jS8zA3dzXpKVPpXMkcYLnyItA==} + dependencies: + '@ucast/core': 1.10.2 + '@ucast/js': 3.0.3 + '@ucast/mongo': 2.4.3 + dev: false + + /@ucast/mongo@2.4.3: + resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} + dependencies: + '@ucast/core': 1.10.2 + dev: false + /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: @@ -1898,6 +2476,25 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -1909,6 +2506,11 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -2051,6 +2653,13 @@ packages: type-fest: 1.4.0 dev: true + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2071,6 +2680,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -2091,19 +2705,13 @@ packages: engines: {node: '>= 6.0.0'} dev: false - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - dependencies: - default-require-extensions: 3.0.1 - dev: true - /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false /archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: false /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} @@ -2180,9 +2788,9 @@ packages: dependencies: tslib: 2.6.2 - /async-hook-domain@2.0.4: - resolution: {integrity: sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==} - engines: {node: '>=10'} + /async-hook-domain@4.0.1: + resolution: {integrity: sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==} + engines: {node: '>=16'} dev: true /async-retry@1.3.3: @@ -2198,13 +2806,17 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: false + /auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -2219,6 +2831,16 @@ packages: - supports-color dev: false + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + /babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -2264,11 +2886,6 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bind-obj-methods@3.0.0: - resolution: {integrity: sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==} - engines: {node: '>=10'} - dev: true - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -2372,23 +2989,66 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} dependencies: run-applescript: 5.0.0 - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /c8@8.0.1: + resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + dev: true + + /cacache@18.0.2: + resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - streamsearch: 1.1.0 - dev: false - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: false + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.3.10 + lru-cache: 10.0.1 + minipass: 7.0.3 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.0 + unique-filename: 3.0.0 + dev: true /cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} @@ -2406,16 +3066,6 @@ packages: normalize-url: 8.0.0 responselike: 3.0.0 - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - dev: true - /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -2436,6 +3086,7 @@ packages: /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + dev: false /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} @@ -2533,7 +3184,6 @@ packages: /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: false /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} @@ -2600,6 +3250,11 @@ packages: yargs: 16.2.0 dev: false + /cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: true + /cli-spinners@2.9.1: resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} @@ -2636,6 +3291,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + dev: false /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -2643,6 +3299,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: false /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -2651,12 +3308,18 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + /code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + convert-to-spaces: 2.0.1 + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2677,6 +3340,7 @@ packages: /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + dev: false /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -2686,7 +3350,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: false /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -2722,10 +3385,6 @@ packages: repeat-string: 1.6.1 dev: true - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: @@ -2902,8 +3561,13 @@ packages: git-semver-tags: 6.0.0 meow: 12.1.1 - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /cookie@0.5.0: @@ -3037,6 +3701,7 @@ packages: /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + dev: false /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -3071,13 +3736,6 @@ packages: execa: 7.2.0 titleize: 3.0.0 - /default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} - dependencies: - strip-bom: 4.0.0 - dev: true - /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -3095,6 +3753,11 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.0 + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -3128,7 +3791,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: false /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -3172,10 +3834,20 @@ packages: wrappy: 1.0.2 dev: false + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + /dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} dev: false @@ -3274,12 +3946,15 @@ packages: /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dev: false /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -3331,6 +4006,14 @@ packages: engines: {node: '>=8.10.0'} dev: false + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -3344,6 +4027,13 @@ packages: tapable: 2.2.1 dev: true + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false @@ -3352,6 +4042,15 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -3437,10 +4136,6 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -3665,8 +4360,9 @@ packages: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true - /events-to-array@1.1.2: - resolution: {integrity: sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==} + /events-to-array@2.0.3: + resolution: {integrity: sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==} + engines: {node: '>=12'} dev: true /events@3.3.0: @@ -3729,6 +4425,10 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: true + /extend-object@1.0.0: resolution: {integrity: sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw==} dev: false @@ -3896,15 +4596,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - /find-my-way@7.6.2: resolution: {integrity: sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==} engines: {node: '>=14'} @@ -3920,6 +4611,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: false /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -3936,10 +4628,6 @@ packages: locate-path: 7.2.0 path-exists: 5.0.0 - /findit@2.0.0: - resolution: {integrity: sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==} - dev: true - /fixpack@4.0.0: resolution: {integrity: sha512-5SM1+H2CcuJ3gGEwTiVo/+nd/hYpNj9Ch3iMDOQ58ndY+VGQ2QdvaUTkd3otjZvYnd/8LF/HkJ5cx7PBq0orCQ==} hasBin: true @@ -3965,10 +4653,25 @@ packages: resolution: {integrity: sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==} dev: false + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -3988,7 +4691,6 @@ packages: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: false /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} @@ -4024,7 +4726,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} @@ -4050,8 +4751,8 @@ packages: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} dev: true - /fs-exists-cached@1.0.0: - resolution: {integrity: sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==} + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true /fs-extra@10.1.0: @@ -4063,6 +4764,15 @@ packages: universalify: 2.0.0 dev: true + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -4076,7 +4786,13 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: false + + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.3 + dev: true /fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} @@ -4103,8 +4819,8 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function-loop@2.0.1: - resolution: {integrity: sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==} + /function-loop@4.0.0: + resolution: {integrity: sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==} dev: true /function.prototype.name@1.1.6: @@ -4134,11 +4850,6 @@ packages: wide-align: 1.1.5 dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -4151,11 +4862,6 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -4262,6 +4968,18 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.3 + path-scurry: 1.10.1 + dev: true + /glob@10.3.3: resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4274,6 +4992,17 @@ packages: path-scurry: 1.10.1 dev: false + /glob@7.1.4: + resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -4311,11 +5040,6 @@ packages: dependencies: ini: 2.0.0 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals@13.22.0: resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} engines: {node: '>=8'} @@ -4459,14 +5183,6 @@ packages: dependencies: function-bind: 1.1.1 - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - dev: true - /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -4638,11 +5354,17 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + /ignore-walk@6.0.4: + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -4667,6 +5389,11 @@ packages: engines: {node: '>=8'} dev: true + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -4683,6 +5410,50 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} + /ink@4.4.1(react@18.2.0): + resolution: {integrity: sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==} + engines: {node: '>=14.16'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + react-devtools-core: ^4.19.1 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + dependencies: + '@alcalzone/ansi-tokenize': 0.1.3 + ansi-escapes: 6.2.0 + auto-bind: 5.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + indent-string: 5.0.0 + is-ci: 3.0.1 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lodash: 4.17.21 + patch-console: 2.0.0 + react: 18.2.0 + react-reconciler: 0.29.0(react@18.2.0) + scheduler: 0.23.0 + signal-exit: 3.0.7 + slice-ansi: 6.0.0 + stack-utils: 2.0.6 + string-width: 5.1.2 + type-fest: 0.12.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + ws: 8.16.0 + yoga-wasm-web: 0.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /inline-css@4.0.2: resolution: {integrity: sha512-o8iZBpVRCs+v8RyEWKxB+4JRi6A4Wop6f3zzqEi0xVx2eIevbgcjXIKYDmQR2ZZ+DD5IVZ6JII0dt2GhJh8etw==} engines: {node: '>=8'} @@ -4783,6 +5554,12 @@ packages: engines: {node: '>= 0.10'} dev: false + /is-actual-promise@1.0.1: + resolution: {integrity: sha512-PlsL4tNv62lx5yN2HSqaRSTgIpUAPW7U6+crVB8HfWm5161rZpeqWbl0ZSqH2MAfRKXWSZVPRNbE/r8qPcb13g==} + dependencies: + tshy: 1.11.0 + dev: true + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -4898,6 +5675,16 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-lower-case@2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + dependencies: + tslib: 2.6.2 + dev: true + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -5004,16 +5791,17 @@ packages: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} + /is-upper-case@2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + dependencies: + tslib: 2.6.2 + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -5026,7 +5814,6 @@ packages: /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -5034,6 +5821,11 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} @@ -5049,37 +5841,6 @@ packages: engines: {node: '>=8'} dev: true - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - dependencies: - append-transform: 2.0.0 - dev: true - - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.20 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.0 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 - dev: true - /istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -5089,17 +5850,6 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-reports@3.1.6: resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} engines: {node: '>=8'} @@ -5121,13 +5871,6 @@ packages: es-get-iterator: 1.1.3 iterate-iterator: 1.0.2 - /jackspeak@1.4.2: - resolution: {integrity: sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==} - engines: {node: '>=8'} - dependencies: - cliui: 7.0.4 - dev: true - /jackspeak@2.3.3: resolution: {integrity: sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==} engines: {node: '>=14'} @@ -5137,6 +5880,15 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: false + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} @@ -5150,6 +5902,21 @@ packages: dev: false optional: true + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -5197,12 +5964,6 @@ packages: dependencies: argparse: 2.0.1 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -5302,6 +6063,10 @@ packages: - encoding dev: false + /just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: @@ -5375,26 +6140,7 @@ packages: /libqp@2.0.1: resolution: {integrity: sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==} - dev: false - - /libtap@1.4.1: - resolution: {integrity: sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw==} - engines: {node: '>=10'} - dependencies: - async-hook-domain: 2.0.4 - bind-obj-methods: 3.0.0 - diff: 4.0.2 - function-loop: 2.0.1 - minipass: 3.3.6 - own-or: 1.0.0 - own-or-env: 1.0.2 - signal-exit: 3.0.7 - stack-utils: 2.0.6 - tap-parser: 11.0.2 - tap-yaml: 1.0.2 - tcompare: 5.0.7 - trivial-deferred: 1.1.2 - dev: true + dev: false /light-my-request@5.10.0: resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==} @@ -5476,6 +6222,7 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: false /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -5496,8 +6243,8 @@ packages: /lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true /lodash.includes@4.3.0: @@ -5561,6 +6308,13 @@ packages: wrap-ansi: 8.1.0 dev: true + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} dev: false @@ -5577,6 +6331,7 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 + dev: false /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -5638,6 +6393,7 @@ packages: engines: {node: '>=8'} dependencies: semver: 6.3.1 + dev: false /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -5649,6 +6405,25 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + /make-fetch-happen@13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/agent': 2.2.0 + cacache: 18.0.2 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.3 + minipass-fetch: 3.0.4 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: true + /mediaquery-text@1.2.0: resolution: {integrity: sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==} dependencies: @@ -5727,6 +6502,12 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -5758,11 +6539,56 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: false /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + minipass: 7.0.3 + dev: true + + /minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.3 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -5777,7 +6603,6 @@ packages: /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - dev: false /minipass@7.0.3: resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} @@ -5789,7 +6614,6 @@ packages: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: false /mjml-accordion@4.14.1: resolution: {integrity: sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==} @@ -6165,6 +6989,12 @@ packages: hasBin: true dev: false + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + /mnemonist@0.39.5: resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} dependencies: @@ -6176,7 +7006,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -6204,6 +7033,11 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -6253,6 +7087,16 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false + /nise@5.1.4: + resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + /no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} dependencies: @@ -6296,11 +7140,27 @@ packages: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + /node-gyp@10.0.1: + resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true dependencies: - process-on-spawn: 1.0.0 + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.3.10 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.0 + nopt: 7.2.0 + proc-log: 3.0.0 + semver: 7.5.4 + tar: 6.2.0 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} dev: true /node-releases@2.0.13: @@ -6333,6 +7193,14 @@ packages: abbrev: 1.1.1 dev: false + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + /normalize-package-data@6.0.0: resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6354,6 +7222,67 @@ packages: resolution: {integrity: sha512-DIuJmrP/Gg1DcXKaApsqcjsJD6jEccqKSfmU3BUx/f1GHsMiTJh70cERwYc64tOmTRTARCeMwkqNNzjh3AHhiw==} dev: false + /npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg@11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.4 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.4 + dev: true + + /npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.4 + dev: true + + /npm-registry-fetch@16.1.0: + resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + make-fetch-happen: 13.0.0 + minipass: 7.0.3 + minipass-fetch: 3.0.4 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.1 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -6388,40 +7317,66 @@ packages: boolbase: 1.0.0 dev: false - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} + /nx@17.2.8: + resolution: {integrity: sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==} hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.6.7 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.9.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 + '@nrwl/tao': 17.2.8 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.6.7 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.2.0 + glob: 7.1.4 + ignore: 5.2.4 + jest-diff: 29.7.0 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 3.0.5 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.1 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 17.2.8 + '@nx/nx-darwin-x64': 17.2.8 + '@nx/nx-freebsd-x64': 17.2.8 + '@nx/nx-linux-arm-gnueabihf': 17.2.8 + '@nx/nx-linux-arm64-gnu': 17.2.8 + '@nx/nx-linux-arm64-musl': 17.2.8 + '@nx/nx-linux-x64-gnu': 17.2.8 + '@nx/nx-linux-x64-musl': 17.2.8 + '@nx/nx-win32-arm64-msvc': 17.2.8 + '@nx/nx-win32-x64-msvc': 17.2.8 transitivePeerDependencies: - - supports-color + - debug dev: true /object-assign@4.1.1: @@ -6482,6 +7437,15 @@ packages: is-wsl: 2.2.0 dev: false + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} @@ -6575,16 +7539,6 @@ packages: '@otplib/preset-v11': 12.0.1 dev: false - /own-or-env@1.0.2: - resolution: {integrity: sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==} - dependencies: - own-or: 1.0.0 - dev: true - - /own-or@1.0.0: - resolution: {integrity: sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==} - dev: true - /p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -6606,6 +7560,7 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: false /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -6624,6 +7579,7 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: false /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -6638,9 +7594,9 @@ packages: dependencies: p-limit: 4.0.0 - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true @@ -6655,6 +7611,7 @@ packages: /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + dev: false /p-wait-for@3.2.0: resolution: {integrity: sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==} @@ -6712,16 +7669,6 @@ packages: ip: 1.1.8 netmask: 2.0.2 - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.11 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - dev: true - /package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -6735,6 +7682,34 @@ packages: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} dev: false + /pacote@17.0.6: + resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 5.0.4 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 7.0.1 + '@npmcli/run-script': 7.0.4 + cacache: 18.0.2 + fs-minipass: 3.0.3 + minipass: 7.0.3 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.1.0 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 7.0.0 + read-package-json-fast: 3.0.2 + sigstore: 2.2.0 + ssri: 10.0.5 + tar: 6.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + /param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} dependencies: @@ -6835,6 +7810,11 @@ packages: utils-merge: 1.0.1 dev: false + /patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6862,6 +7842,7 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + requiresBuild: true /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -6870,6 +7851,12 @@ packages: lru-cache: 10.0.1 minipass: 7.0.3 + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -7045,11 +8032,9 @@ packages: thread-stream: 2.4.0 dev: false - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} dev: true /pluralize@8.0.0: @@ -7062,6 +8047,11 @@ packages: engines: {node: '>=10.13.0'} dev: false + /polite-json@4.0.1: + resolution: {integrity: sha512-8LI5ZeCPBEb4uBbcYKNVwk4jgqNx1yHReWoW4H4uUihWlSqZsUDfSITrRhjliuPgxsNPFhNSudGO2Zu4cbWinQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /postcss@8.4.30: resolution: {integrity: sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==} engines: {node: ^10 || ^12 || >=14} @@ -7142,6 +8132,15 @@ packages: hasBin: true dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.1.0 + dev: true + /preview-email@3.0.19: resolution: {integrity: sha512-DBS3Nir18YtKc8loYCCOGitmiaQ0vTdahPoiXxwNweJDpmVZo+w3tppufOhoK0m8skpRxT56llYLs3VrORnmNQ==} engines: {node: '>=14'} @@ -7159,6 +8158,25 @@ packages: uuid: 9.0.1 dev: false + /prismjs-terminal@1.2.3: + resolution: {integrity: sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + prismjs: 1.29.0 + string-length: 6.0.0 + dev: true + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: true + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /process-on-spawn@1.0.0: resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} engines: {node: '>=8'} @@ -7175,6 +8193,23 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + /promise.allsettled@1.0.6: resolution: {integrity: sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==} engines: {node: '>= 0.4'} @@ -7404,14 +8439,77 @@ packages: unpipe: 1.0.0 dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: true + + /react-element-to-jsx-string@15.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.1.0 + dev: true + + /react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + dev: true + + /react-reconciler@0.29.0(react@18.2.0): + resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: true + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + glob: 10.3.10 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true /read-pkg-up@10.1.0: resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} @@ -7543,13 +8641,6 @@ packages: - encoding - supports-color - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - dependencies: - es6-error: 4.1.1 - dev: true - /remote-content@3.0.1: resolution: {integrity: sha512-zEMsvb4GgxVKBBTHgy2tte67RYBZx2Kyg9mTYpg+JfATHDqYJqhuC3zG1VoiYhDVP5JaB5+mPKcAvdnT0n3jxA==} dependencies: @@ -7575,6 +8666,7 @@ packages: /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -7583,9 +8675,12 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + /resolve-import@1.4.5: + resolution: {integrity: sha512-HXb4YqODuuXT7Icq1Z++0g2JmhgbUHSs3VT2xR83gqvAPUikYT2Xk+562KHQgiaNkbBOlPddYrDLsC44qQggzw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + glob: 10.3.10 + walk-up-path: 3.0.1 dev: true /resolve@1.22.6: @@ -7621,6 +8716,11 @@ packages: engines: {node: '>=4'} dev: false + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -7646,6 +8746,14 @@ packages: glob: 9.3.5 dev: true + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + /run-applescript@3.2.0: resolution: {integrity: sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg==} engines: {node: '>=4'} @@ -7722,6 +8830,12 @@ packages: postcss: 8.4.30 dev: false + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: true + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -7755,6 +8869,15 @@ packages: /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + dev: false + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -7771,6 +8894,7 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false /set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} @@ -7840,7 +8964,31 @@ packages: /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - dev: false + + /sigstore@2.2.0: + resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.1 + '@sigstore/core': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.2.1 + '@sigstore/tuf': 2.3.0 + '@sigstore/verify': 0.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /sinon@16.1.0: + resolution: {integrity: sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ==} + dependencies: + '@sinonjs/commons': 3.0.0 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/samsam': 8.0.0 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -7859,6 +9007,14 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true + /slice-ansi@6.0.0: + resolution: {integrity: sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==} + engines: {node: '>=14.16'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + /slick@1.12.2: resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} dev: false @@ -7922,18 +9078,6 @@ packages: engines: {node: '>= 8'} dev: true - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - dev: true - /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -7965,6 +9109,13 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true + /ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.3 + dev: true + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -7999,6 +9150,13 @@ packages: engines: {node: '>=0.6.19'} dev: true + /string-length@6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + dependencies: + strip-ansi: 7.1.0 + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8071,11 +9229,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -8097,6 +9250,16 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + /strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + /style-data@2.0.1: resolution: {integrity: sha512-frUbteLGDoNEJhbMIWtyNE1VRduZXmZozhct4F+qN++OzIQZNZJ8KToZlDEl3eaedRYlDfKvUoMFMyrZj4x/sg==} dependencies: @@ -8158,6 +9321,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + requiresBuild: true /swagger-ui-dist@5.7.2: resolution: {integrity: sha512-mVZc9QVQ6pTCV5crli3+Ng+DoMPwdtMHK8QLk2oX8Mtamp4D/hV+uYdC3lV0JZrDgpNEcjs0RrWTqMwwosuLPQ==} @@ -8168,6 +9332,17 @@ packages: engines: {node: '>=0.10'} dev: true + /sync-content@1.0.2: + resolution: {integrity: sha512-znd3rYiiSxU3WteWyS9a6FXkTA/Wjk8WQsOyzHbineeL837dLn3DA4MRhsIX3qGcxDMH6+uuFV4axztssk7wEQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + mkdirp: 3.0.1 + path-scurry: 1.10.1 + rimraf: 5.0.5 + dev: true + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} @@ -8176,96 +9351,78 @@ packages: tslib: 2.6.2 dev: true - /tap-mocha-reporter@5.0.3: - resolution: {integrity: sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - color-support: 1.1.3 - debug: 4.3.4 - diff: 4.0.2 - escape-string-regexp: 2.0.0 - glob: 7.2.3 - tap-parser: 11.0.2 - tap-yaml: 1.0.2 - unicode-length: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /tap-parser@11.0.2: - resolution: {integrity: sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==} - engines: {node: '>= 8'} + /tap-parser@15.3.1: + resolution: {integrity: sha512-hwAtXX5TBGt2MJeYvASc7DjP48PUzA7P8RTbLxQcgKCEH7ICD5IsRco7l5YvkzjHlZbUbeI9wzO8B4hw2sKgnQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} hasBin: true dependencies: - events-to-array: 1.1.2 - minipass: 3.3.6 - tap-yaml: 1.0.2 + events-to-array: 2.0.3 + tap-yaml: 2.2.1 dev: true - /tap-yaml@1.0.2: - resolution: {integrity: sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==} + /tap-yaml@2.2.1: + resolution: {integrity: sha512-ovZuUMLAIH59jnFHXKEGJ+WyDYl6Cuduwg9qpvnqkZOUA1nU84q02Sry1HT0KXcdv2uB91bEKKxnIybBgrb6oA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} dependencies: - yaml: 1.10.2 + yaml: 2.3.1 + yaml-types: 0.3.0(yaml@2.3.1) dev: true - /tap@16.3.8(ts-node@10.9.1)(typescript@5.2.2): - resolution: {integrity: sha512-ARpCLtOFST37MholnZm7JMFikGq0x/T9uBdZH83iuddPNgwDTZQiD8+4x7VABUfVWS0ozKUkmHZ5OOzMI3fLPg==} - engines: {node: '>=12'} + /tap@18.7.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-bL/0krlx8k3fY9mjI9CMfVoAGclZegl+vm5pEJpF/USxam5eNhp5wLk5UH0ST3gWEJkW0PDdFHTOStE+mYurrQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} hasBin: true - peerDependencies: - coveralls: ^3.1.1 - flow-remove-types: '>=2.112.0' - ts-node: '>=8.5.2' - typescript: '>=3.7.2' - peerDependenciesMeta: - coveralls: - optional: true - flow-remove-types: - optional: true - ts-node: - optional: true - typescript: - optional: true dependencies: - chokidar: 3.5.3 - findit: 2.0.0 - foreground-child: 2.0.0 - fs-exists-cached: 1.0.0 - glob: 7.2.3 - isexe: 2.0.0 - istanbul-lib-processinfo: 2.0.3 - jackspeak: 1.4.2 - libtap: 1.4.1 - minipass: 3.3.6 - mkdirp: 1.0.4 - nyc: 15.1.0 - opener: 1.5.2 - rimraf: 3.0.2 - signal-exit: 3.0.7 - source-map-support: 0.5.21 - tap-mocha-reporter: 5.0.3 - tap-parser: 11.0.2 - tap-yaml: 1.0.2 - tcompare: 5.0.7 - ts-node: 10.9.1(@types/node@20.6.3)(typescript@5.2.2) - typescript: 5.2.2 - which: 2.0.2 + '@tapjs/after': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/after-each': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/asserts': 1.1.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/before': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/before-each': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/core': 1.5.0(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/filter': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/fixture': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/intercept': 1.2.18(@tapjs/core@1.5.0) + '@tapjs/mock': 1.3.0(@tapjs/core@1.5.0) + '@tapjs/node-serialize': 1.3.0(@tapjs/core@1.5.0) + '@tapjs/run': 1.5.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/snapshot': 1.2.18(@tapjs/core@1.5.0)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/spawn': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/stdin': 1.1.18(@tapjs/core@1.5.0) + '@tapjs/test': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(react-dom@18.2.0)(react@18.2.0) + '@tapjs/typescript': 1.4.0(@tapjs/core@1.5.0)(@types/node@20.6.3)(typescript@5.2.2) + '@tapjs/worker': 1.1.18(@tapjs/core@1.5.0) + resolve-import: 1.4.5 transitivePeerDependencies: - - supports-color - dev: true - bundledDependencies: - - ink - - treport + - '@swc/core' + - '@swc/wasm' + - '@types/node' - '@types/react' - - '@isaacs/import-jsx' + - bluebird + - bufferutil - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + dev: true /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} @@ -8276,13 +9433,16 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: false - /tcompare@5.0.7: - resolution: {integrity: sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==} - engines: {node: '>=10'} + /tcompare@6.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Whuz9xlKKI2XXICKDSDRKjXdBuC6gBNOgmEUtH7UFyQeYzfUMQ19DyjZULarGKDGFhgOg3CJ+IQUEfpkOPg0Uw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} dependencies: - diff: 4.0.2 + diff: 5.1.0 + react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom dev: true /terser-webpack-plugin@5.3.9(webpack@5.88.2): @@ -8384,10 +9544,18 @@ packages: dependencies: os-tmpdir: 1.0.2 + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} requiresBuild: true + dev: false /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -8418,8 +9586,8 @@ packages: hasBin: true dev: true - /trivial-deferred@1.1.2: - resolution: {integrity: sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==} + /trivial-deferred@2.0.0: + resolution: {integrity: sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==} engines: {node: '>= 8'} dev: true @@ -8495,67 +9663,34 @@ packages: strip-bom: 3.0.0 dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /turbo-darwin-64@1.10.14: - resolution: {integrity: sha512-I8RtFk1b9UILAExPdG/XRgGQz95nmXPE7OiGb6ytjtNIR5/UZBS/xVX/7HYpCdmfriKdVwBKhalCoV4oDvAGEg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /turbo-darwin-arm64@1.10.14: - resolution: {integrity: sha512-KAdUWryJi/XX7OD0alOuOa0aJ5TLyd4DNIYkHPHYcM6/d7YAovYvxRNwmx9iv6Vx6IkzTnLeTiUB8zy69QkG9Q==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /turbo-linux-64@1.10.14: - resolution: {integrity: sha512-BOBzoREC2u4Vgpap/WDxM6wETVqVMRcM8OZw4hWzqCj2bqbQ6L0wxs1LCLWVrghQf93JBQtIGAdFFLyCSBXjWQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /turbo-linux-arm64@1.10.14: - resolution: {integrity: sha512-D8T6XxoTdN5D4V5qE2VZG+/lbZX/89BkAEHzXcsSUTRjrwfMepT3d2z8aT6hxv4yu8EDdooZq/2Bn/vjMI32xw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /turbo-windows-64@1.10.14: - resolution: {integrity: sha512-zKNS3c1w4i6432N0cexZ20r/aIhV62g69opUn82FLVs/zk3Ie0GVkSB6h0rqIvMalCp7enIR87LkPSDGz9K4UA==} - cpu: [x64] - os: [win32] - requiresBuild: true + /tshy@1.11.0: + resolution: {integrity: sha512-5T5PVyuYQKTcOKz5a2lpwx4WKi8yEzQGO0Q5l+9clJMYupMaTI7ONEwKggGAZDQQGIgCOyUCfBWnSkG0XdJc+A==} + engines: {node: 16 >=16.17 || 18 >=18.15.0 || >=20.6.1} + hasBin: true + dependencies: + chalk: 5.3.0 + chokidar: 3.5.3 + foreground-child: 3.1.1 + mkdirp: 3.0.1 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + typescript: 5.2.2 + walk-up-path: 3.0.1 dev: true - optional: true - /turbo-windows-arm64@1.10.14: - resolution: {integrity: sha512-rkBwrTPTxNSOUF7of8eVvvM+BkfkhA2OvpHM94if8tVsU+khrjglilp8MTVPHlyS9byfemPAmFN90oRIPB05BA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /turbo@1.10.14: - resolution: {integrity: sha512-hr9wDNYcsee+vLkCDIm8qTtwhJ6+UAMJc3nIY6+PNgUTtXcQgHxCq8BGoL7gbABvNWv76CNbK5qL4Lp9G3ZYRA==} - hasBin: true - optionalDependencies: - turbo-darwin-64: 1.10.14 - turbo-darwin-arm64: 1.10.14 - turbo-linux-64: 1.10.14 - turbo-linux-arm64: 1.10.14 - turbo-windows-64: 1.10.14 - turbo-windows-arm64: 1.10.14 + /tuf-js@2.2.0: + resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/models': 2.0.0 + debug: 4.3.4 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color dev: true /type-check@0.3.2: @@ -8572,6 +9707,16 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -8580,11 +9725,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -8757,10 +9897,18 @@ packages: busboy: 1.6.0 dev: false - /unicode-length@2.1.0: - resolution: {integrity: sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==} + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - punycode: 2.3.0 + unique-slug: 4.0.0 + dev: true + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 dev: true /unique-string@3.0.0: @@ -8859,6 +10007,15 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + /valid-data-url@3.0.1: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} engines: {node: '>=10'} @@ -8870,6 +10027,13 @@ packages: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + /validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} @@ -8890,6 +10054,10 @@ packages: requiresBuild: true dev: false + /walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -8991,6 +10159,7 @@ packages: /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} @@ -9016,6 +10185,14 @@ packages: dependencies: isexe: 2.0.0 + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -9105,6 +10282,19 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -9120,18 +10310,28 @@ packages: /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml-types@0.3.0(yaml@2.3.1): + resolution: {integrity: sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==} + engines: {node: '>= 16', npm: '>= 7'} + peerDependencies: + yaml: ^2.3.0 + dependencies: + yaml: 2.3.1 + dev: true + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -9148,6 +10348,7 @@ packages: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + dev: false /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} @@ -9173,6 +10374,7 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 + dev: false /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -9198,7 +10400,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -9211,3 +10412,7 @@ packages: /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + + /yoga-wasm-web@0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + dev: true diff --git a/turbo.json b/turbo.json deleted file mode 100644 index a011afca..00000000 --- a/turbo.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://turborepo.org/schema.json", - "pipeline": { - "start": { - "cache": false - }, - "release": { - "dependsOn": ["^release"], - "outputMode": "new-only" - }, - "format": {}, - "format:fix": {}, - "lint": {}, - "lint:fix": {} - } -} \ No newline at end of file