From 4cf499a85d2fb49e08b7b5a33c04e6d219104fe1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Mar 2024 18:35:18 +0200 Subject: [PATCH 01/45] chore: update .gitignore --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 30faeee..f581e17 100644 --- a/.gitignore +++ b/.gitignore @@ -34,5 +34,10 @@ lerna-debug.log* !.vscode/launch.json !.vscode/extensions.json -# .env +# compiled app +dist + .env + +dev.db +dev.db-journal From f6fee490465216e21f64693ff68058e1909118dc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Mar 2024 18:46:07 +0200 Subject: [PATCH 02/45] chore: add prisma package --- package-lock.json | 119 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 4 +- 2 files changed, 114 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index f373f00..3f6fc5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,15 +10,16 @@ "license": "UNLICENSED", "dependencies": { "@nestjs/common": "^10.3.3", + "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", "@nestjs/jwt": "^10.2.0", "@nestjs/mapped-types": "^2.0.5", "@nestjs/platform-express": "^10.3.3", "@nestjs/swagger": "^7.3.0", + "@prisma/client": "^5.10.2", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "dotenv": "^16.4.5", "http-status-codes": "^2.3.0", "reflect-metadata": "^0.2.1", "rimraf": "^5.0.5", @@ -53,6 +54,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.7.0", "prettier": "^3.2.5", + "prisma": "^5.10.2", "source-map-support": "^0.5.21", "supertest": "^6.2.4", "ts-jest": "^29.1.2", @@ -1997,6 +1999,32 @@ } } }, + "node_modules/@nestjs/config": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.2.0.tgz", + "integrity": "sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==", + "dependencies": { + "dotenv": "16.4.1", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21", + "uuid": "9.0.1" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/@nestjs/core": { "version": "10.3.3", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.3.tgz", @@ -2247,6 +2275,68 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@prisma/client": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.10.2.tgz", + "integrity": "sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.10.2.tgz", + "integrity": "sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.10.2.tgz", + "integrity": "sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.10.2", + "@prisma/engines-version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", + "@prisma/fetch-engine": "5.10.2", + "@prisma/get-platform": "5.10.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9.tgz", + "integrity": "sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.10.2.tgz", + "integrity": "sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.10.2", + "@prisma/engines-version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", + "@prisma/get-platform": "5.10.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.10.2.tgz", + "integrity": "sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.10.2" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4521,15 +4611,12 @@ "node": ">=6.0.0" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "engines": { "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" } }, "node_modules/eastasianwidth": { @@ -9067,6 +9154,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prisma": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.10.2.tgz", + "integrity": "sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.10.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", diff --git a/package.json b/package.json index c8039a0..865625f 100644 --- a/package.json +++ b/package.json @@ -28,15 +28,16 @@ }, "dependencies": { "@nestjs/common": "^10.3.3", + "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", "@nestjs/jwt": "^10.2.0", "@nestjs/mapped-types": "^2.0.5", "@nestjs/platform-express": "^10.3.3", "@nestjs/swagger": "^7.3.0", + "@prisma/client": "^5.10.2", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "dotenv": "^16.4.5", "http-status-codes": "^2.3.0", "reflect-metadata": "^0.2.1", "rimraf": "^5.0.5", @@ -71,6 +72,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.7.0", "prettier": "^3.2.5", + "prisma": "^5.10.2", "source-map-support": "^0.5.21", "supertest": "^6.2.4", "ts-jest": "^29.1.2", From f0d3b2cfda6a3a2443a10289a9ca5afc8828063b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Mar 2024 18:48:01 +0200 Subject: [PATCH 03/45] chore: add docker compose with postgresSQL --- docker-compose.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..97e2c34 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' +services: + + postgres: + image: postgres:16.2 + restart: always + environment: + - POSTGRES_USER=myuser + - POSTGRES_PASSWORD=mypassword + volumes: + - postgres:/var/lib/postgresql/data + ports: + - '5432:5432' + +volumes: + postgres: From 060113756fcf9878b2431a1e073aaa0ecdd11652 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 11 Mar 2024 18:50:36 +0200 Subject: [PATCH 04/45] feat: add prisma --- .../20240311122329_init/migration.sql | 25 +++++++++++++++++++ .../20240311132135_init/migration.sql | 18 +++++++++++++ prisma/migrations/migration_lock.toml | 3 +++ prisma/schema.prisma | 19 ++++++++++++++ src/app.module.ts | 4 +++ src/main.ts | 2 -- src/prisma/prisma.module.ts | 9 +++++++ src/prisma/prisma.service.ts | 25 +++++++++++++++++++ 8 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20240311122329_init/migration.sql create mode 100644 prisma/migrations/20240311132135_init/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 src/prisma/prisma.module.ts create mode 100644 src/prisma/prisma.service.ts diff --git a/prisma/migrations/20240311122329_init/migration.sql b/prisma/migrations/20240311122329_init/migration.sql new file mode 100644 index 0000000..72c87ae --- /dev/null +++ b/prisma/migrations/20240311122329_init/migration.sql @@ -0,0 +1,25 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "name" TEXT, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Post" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT, + "published" BOOLEAN DEFAULT false, + "authorId" INTEGER, + + CONSTRAINT "Post_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- AddForeignKey +ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20240311132135_init/migration.sql b/prisma/migrations/20240311132135_init/migration.sql new file mode 100644 index 0000000..e5836a9 --- /dev/null +++ b/prisma/migrations/20240311132135_init/migration.sql @@ -0,0 +1,18 @@ +/* + Warnings: + + - You are about to drop the column `email` on the `User` table. All the data in the column will be lost. + - You are about to drop the `Post` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Post" DROP CONSTRAINT "Post_authorId_fkey"; + +-- DropIndex +DROP INDEX "User_email_key"; + +-- AlterTable +ALTER TABLE "User" DROP COLUMN "email"; + +-- DropTable +DROP TABLE "Post"; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..46317ca --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,19 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + name String? +} diff --git a/src/app.module.ts b/src/app.module.ts index 4d4fce5..a4c553a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; import { AlbumModule } from './album/album.module'; import { AppController } from './app.controller'; @@ -6,6 +7,7 @@ import { AppService } from './app.service'; import { ArtistModule } from './artist/artist.module'; import { DatabaseModule } from './database/database.module'; import { FavoriteModule } from './favorite/favorite.module'; +import { PrismaModule } from './prisma/prisma.module'; import { TrackModule } from './track/track.module'; import { UserModule } from './user/user.module'; @@ -17,6 +19,8 @@ import { UserModule } from './user/user.module'; ArtistModule, AlbumModule, FavoriteModule, + ConfigModule.forRoot(), + PrismaModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/main.ts b/src/main.ts index e4158e3..183ee74 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,3 @@ -import 'dotenv/config'; - import { NestFactory } from '@nestjs/core'; import { SwaggerModule } from '@nestjs/swagger'; diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts new file mode 100644 index 0000000..54327ba --- /dev/null +++ b/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; + +import { PrismaService } from './prisma.service'; + +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts new file mode 100644 index 0000000..617ccb0 --- /dev/null +++ b/src/prisma/prisma.service.ts @@ -0,0 +1,25 @@ +import { + INestApplication, + Injectable, + OnModuleDestroy, + OnModuleInit, +} from '@nestjs/common'; +import { Prisma, PrismaClient } from '@prisma/client'; + +@Injectable() +export class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + async onModuleInit() { + await this.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } + + async enableShutdownHooks(app: INestApplication) { + this.$on('beforeExit', async () => app.close()); + } +} From a6ba7b695954b8c211f2f39e46b4a328c60c808d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Mar 2024 18:01:19 +0200 Subject: [PATCH 05/45] chore: add necessary packages --- package-lock.json | 310 ++++++++-------------------------------------- package.json | 3 +- 2 files changed, 54 insertions(+), 259 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f6fc5c..a3c0c3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { + "@nestjs/cli": "^10.3.2", "@nestjs/common": "^10.3.3", "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", @@ -20,6 +21,7 @@ "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", + "dotenv": "^16.4.5", "http-status-codes": "^2.3.0", "reflect-metadata": "^0.2.1", "rimraf": "^5.0.5", @@ -27,7 +29,6 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@nestjs/cli": "^10.3.2", "@nestjs/schematics": "^10.1.1", "@nestjs/testing": "^10.3.3", "@types/bcrypt": "^5.0.2", @@ -93,7 +94,6 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.2.tgz", "integrity": "sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==", - "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -120,7 +120,6 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.2.tgz", "integrity": "sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==", - "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "jsonc-parser": "3.2.0", @@ -138,7 +137,6 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.1.2.tgz", "integrity": "sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==", - "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -160,7 +158,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -172,7 +169,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "engines": { "node": ">= 12" } @@ -181,7 +177,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, "engines": { "node": ">=12" }, @@ -193,7 +188,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -209,7 +203,6 @@ "version": "9.2.12", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", - "dev": true, "dependencies": { "@ljharb/through": "^2.3.11", "ansi-escapes": "^4.3.2", @@ -235,7 +228,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -247,7 +239,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -256,7 +247,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -265,7 +255,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" @@ -278,7 +267,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -290,7 +278,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -304,7 +291,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -312,14 +298,12 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -328,7 +312,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -337,7 +320,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -544,7 +526,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -576,7 +557,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -590,7 +570,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -602,7 +581,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -616,7 +594,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -624,14 +601,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -640,7 +615,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -649,7 +623,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -926,7 +899,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, "optional": true, "engines": { "node": ">=0.1.90" @@ -1630,7 +1602,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1644,7 +1615,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1653,7 +1623,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1662,7 +1631,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -1671,14 +1639,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1688,7 +1654,6 @@ "version": "2.3.12", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", - "dev": true, "dependencies": { "call-bind": "^1.0.5" }, @@ -1785,7 +1750,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.2.tgz", "integrity": "sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==", - "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -1833,7 +1797,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1846,7 +1809,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -1855,7 +1817,6 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1870,7 +1831,6 @@ "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1879,7 +1839,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, "dependencies": { "glob": "^9.2.0" }, @@ -1897,7 +1856,6 @@ "version": "9.3.5", "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", @@ -1915,7 +1873,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1928,7 +1885,6 @@ "version": "5.90.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", - "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -2125,7 +2081,6 @@ "version": "10.1.1", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.1.tgz", "integrity": "sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==", - "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -2140,8 +2095,7 @@ "node_modules/@nestjs/schematics/node_modules/jsonc-parser": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" }, "node_modules/@nestjs/swagger": { "version": "7.3.0", @@ -2464,7 +2418,6 @@ "version": "8.56.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", - "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2474,7 +2427,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -2483,8 +2435,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", @@ -2562,8 +2513,7 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2892,7 +2842,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -2901,26 +2850,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -2930,14 +2875,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -2949,7 +2892,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -2958,7 +2900,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -2966,14 +2907,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -2989,7 +2928,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -3002,7 +2940,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -3014,7 +2951,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -3028,7 +2964,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -3037,14 +2972,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abbrev": { "version": "1.1.1", @@ -3067,7 +3000,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3079,7 +3011,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, "peerDependencies": { "acorn": "^8" } @@ -3117,7 +3048,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3133,7 +3063,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -3150,7 +3079,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } @@ -3159,7 +3087,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3174,7 +3101,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -3208,7 +3134,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3221,7 +3146,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -3327,8 +3251,7 @@ "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" }, "node_modules/array-union": { "version": "2.1.0", @@ -3664,7 +3587,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -3697,7 +3619,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -3706,7 +3627,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3717,7 +3637,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3775,7 +3694,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3787,7 +3705,6 @@ "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3840,7 +3757,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -3911,7 +3827,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -3929,7 +3844,6 @@ "version": "1.0.30001594", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3972,14 +3886,12 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4011,7 +3923,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -4056,7 +3967,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -4068,7 +3978,6 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, "engines": { "node": ">=6" }, @@ -4080,7 +3989,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, "dependencies": { "string-width": "^4.2.0" }, @@ -4095,7 +4003,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, "engines": { "node": ">= 10" } @@ -4135,7 +4042,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, "engines": { "node": ">=0.8" } @@ -4196,7 +4102,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -4205,7 +4110,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", - "dev": true, "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -4326,7 +4230,6 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -4452,7 +4355,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4461,7 +4363,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, "dependencies": { "clone": "^1.0.2" }, @@ -4611,6 +4512,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dotenv-expand": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", @@ -4640,8 +4552,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.693", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", - "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", - "dev": true + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==" }, "node_modules/emittery": { "version": "0.13.1", @@ -4672,7 +4583,6 @@ "version": "5.15.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -4685,7 +4595,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -4799,8 +4708,7 @@ "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { "version": "2.0.3", @@ -4846,7 +4754,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, "engines": { "node": ">=6" } @@ -5551,7 +5458,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5576,7 +5482,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5588,7 +5493,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -5614,7 +5518,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -5773,7 +5676,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -5786,8 +5688,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", @@ -5814,8 +5715,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5850,7 +5750,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -5865,7 +5764,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -5886,7 +5784,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6045,7 +5942,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -6073,7 +5969,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6083,7 +5978,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6140,7 +6034,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6180,8 +6073,7 @@ "node_modules/fs-monkey": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -6192,7 +6084,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6360,7 +6251,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6371,8 +6261,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { "version": "13.24.0", @@ -6438,8 +6327,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -6468,7 +6356,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6608,7 +6495,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -6637,7 +6523,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6695,7 +6580,6 @@ "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -6735,7 +6619,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, "engines": { "node": ">= 0.10" } @@ -6767,8 +6650,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { "version": "2.0.0", @@ -6801,7 +6683,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6841,7 +6722,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -6868,7 +6748,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6921,7 +6800,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6933,7 +6811,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, "engines": { "node": ">=8" } @@ -6963,7 +6840,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7093,7 +6969,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -7946,8 +7821,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7981,14 +7855,12 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8000,7 +7872,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -8011,14 +7882,12 @@ "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8147,14 +8016,12 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, "engines": { "node": ">=6.11.5" } @@ -8230,7 +8097,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -8267,7 +8133,6 @@ "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -8324,7 +8189,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, "dependencies": { "fs-monkey": "^1.0.4" }, @@ -8340,8 +8204,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -8419,7 +8282,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -8518,8 +8380,7 @@ "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -8538,14 +8399,12 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-addon-api": { "version": "5.1.0", @@ -8556,7 +8415,6 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, "dependencies": { "lodash": "^4.17.21" } @@ -8589,8 +8447,7 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nopt": { "version": "5.0.0", @@ -8610,7 +8467,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8778,7 +8634,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -8810,7 +8665,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -8833,7 +8687,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8881,7 +8734,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -8893,7 +8745,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -8943,8 +8794,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -8978,7 +8828,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -8986,14 +8835,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, "engines": { "node": ">=10" }, @@ -9078,7 +8925,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, "engines": { "node": ">=4" } @@ -9221,7 +9067,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -9280,7 +9125,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -9336,7 +9180,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9348,7 +9191,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -9360,7 +9202,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, "dependencies": { "resolve": "^1.1.6" }, @@ -9434,7 +9275,6 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, "engines": { "node": ">=0.10" } @@ -9452,7 +9292,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9461,7 +9300,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -9499,7 +9337,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -9517,7 +9354,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9529,8 +9365,7 @@ "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/reusify": { "version": "1.0.4", @@ -9563,7 +9398,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -9668,7 +9502,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9686,7 +9519,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -9702,7 +9534,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -9710,8 +9541,7 @@ "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/semver": { "version": "7.6.0", @@ -9788,7 +9618,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -9871,7 +9700,6 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -9888,7 +9716,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9898,7 +9725,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9918,7 +9744,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9973,7 +9798,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, "engines": { "node": ">= 8" } @@ -9982,7 +9806,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9992,7 +9815,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10272,7 +10094,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -10289,7 +10110,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, "engines": { "node": ">=0.10" } @@ -10314,7 +10134,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -10363,7 +10182,6 @@ "version": "5.29.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", - "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10381,7 +10199,6 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10415,7 +10232,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10429,7 +10245,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10443,8 +10258,7 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/test-exclude": { "version": "6.0.0", @@ -10511,14 +10325,12 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -10545,7 +10357,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -10570,7 +10381,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, "bin": { "tree-kill": "cli.js" } @@ -10697,7 +10507,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -10711,7 +10520,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -10725,7 +10533,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "engines": { "node": ">=4" } @@ -10862,7 +10669,6 @@ "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10906,7 +10712,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -10923,7 +10728,6 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -10953,7 +10757,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -11032,7 +10835,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11045,7 +10847,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, "dependencies": { "defaults": "^1.0.3" } @@ -11059,7 +10860,6 @@ "version": "5.90.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "dev": true, "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -11107,7 +10907,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true, "engines": { "node": ">=6" } @@ -11116,7 +10915,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -11125,7 +10923,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -11139,7 +10936,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "peer": true, "engines": { "node": ">=4.0" @@ -11262,7 +11058,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11358,7 +11153,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } diff --git a/package.json b/package.json index 865625f..4c8721f 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "node": "20.0.0" }, "dependencies": { + "@nestjs/cli": "^10.3.2", "@nestjs/common": "^10.3.3", "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", @@ -38,6 +39,7 @@ "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", + "dotenv": "^16.4.5", "http-status-codes": "^2.3.0", "reflect-metadata": "^0.2.1", "rimraf": "^5.0.5", @@ -45,7 +47,6 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@nestjs/cli": "^10.3.2", "@nestjs/schematics": "^10.1.1", "@nestjs/testing": "^10.3.3", "@types/bcrypt": "^5.0.2", From 5dac47692c012db269698d662112a60017a9b076 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Mar 2024 18:01:45 +0200 Subject: [PATCH 06/45] chore: add postgresSQL environment variables --- .env.example | 6 ++++++ environment.d.ts | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/.env.example b/.env.example index 8d594af..fe80dbc 100644 --- a/.env.example +++ b/.env.example @@ -5,3 +5,9 @@ JWT_SECRET_KEY=secret123123 JWT_SECRET_REFRESH_KEY=secret123123 TOKEN_EXPIRE_TIME=1h TOKEN_REFRESH_EXPIRE_TIME=24h + +POSTGRES_USER=myuser +POSTGRES_PASSWORD=mypassword +POSTGRES_DB=home-library +POSTGRES_PORT=5432 +DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public" diff --git a/environment.d.ts b/environment.d.ts index 34af0e9..c802d9b 100644 --- a/environment.d.ts +++ b/environment.d.ts @@ -6,5 +6,10 @@ namespace NodeJS { JWT_SECRET_REFRESH_KEY: string; TOKEN_EXPIRE_TIME: string; TOKEN_REFRESH_EXPIRE_TIME: string; + POSTGRES_USER:string; + POSTGRES_PASSWORD:string; + POSTGRES_DB:string; + POSTGRES_PORT:string; + DATABASE_URL:string; } } From 2cd0d45ecf3ab6b2cdc4a5c18f8d19c192dbdf78 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Mar 2024 18:02:23 +0200 Subject: [PATCH 07/45] chore: configure docker --- .dockerignore | 28 ++++++++++++++++++++++++++++ Dockerfile | 40 ++++++++++++++++++++++++++++++++++++++++ docker-compose.yaml | 39 +++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 16 ---------------- 4 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yaml delete mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..abcd83d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +**/.classpath +**/.dockerignore +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/.next +**/.cache +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +**/build +**/dist +LICENSE +README.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..905697a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +ARG NODE_VERSION=20.0.0 + +FROM node:${NODE_VERSION}-alpine + +# add user to group +RUN addgroup app && adduser -S -G app app + +# set the user to run the app +USER app + +# set the working directory to /app +WORKDIR /app + +# copy package.json and package-lock.json to the working directory +# This is done before copying the rest of the files to take advantage of Dockerโ€™s cache +# If the package.json and package-lock.json files havenโ€™t changed, Docker will use the cached dependencies +COPY package*.json ./ + +# Run the application as a root user. +USER root + +# change the ownership of the /app directory to the app user +# chown -R : +# chown command changes the user and/or group ownership of for given file. +RUN chown -R app:app . + +# Run the application as a non-root user. +USER app + +# install dependencies +RUN npm ci + +# Copy the rest of the source files into the image. +COPY . . + +# Expose the port that the application listens on. +EXPOSE ${PORT} + +# Run the application. +CMD npx prisma generate && npm run start:dev diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..6fc3f94 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,39 @@ +version: '3.8' + +services: + server: + build: + context: . + ports: + - ${PORT}:${PORT} + depends_on: + db: + condition: service_healthy + networks: + - app-network + db: + image: postgres:16.2-alpine + restart: always + user: postgres + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} + volumes: + - db-data:/var/lib/postgresql/data + ports: + - ${POSTGRES_PORT}:${POSTGRES_PORT} + healthcheck: + test: [ "CMD", "pg_isready", "-U", "${POSTGRES_USER}", "-d", "${POSTGRES_DB}" ] + interval: 10s + timeout: 5s + retries: 5 + networks: + - app-network + +volumes: + db-data: + +networks: + app-network: + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 97e2c34..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: '3.8' -services: - - postgres: - image: postgres:16.2 - restart: always - environment: - - POSTGRES_USER=myuser - - POSTGRES_PASSWORD=mypassword - volumes: - - postgres:/var/lib/postgresql/data - ports: - - '5432:5432' - -volumes: - postgres: From 5aacb89f4c0aed8a473f7ec609a46de16bc7d4d0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Mar 2024 18:40:06 +0200 Subject: [PATCH 08/45] chore: configure docker to run in watch mode --- docker-compose.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 6fc3f94..5328ea4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -11,6 +11,15 @@ services: condition: service_healthy networks: - app-network + develop: + watch: + - path: ./package.json + action: rebuild + - path: ./package-lock.json + action: rebuild + - path: . + target: /app + action: sync db: image: postgres:16.2-alpine restart: always From 967bfb7d2f10c45e05ed921b541e3553c26e07cd Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 13 Mar 2024 23:22:29 +0200 Subject: [PATCH 09/45] chore: reduce docker server's image size --- .dockerignore | 3 +++ Dockerfile | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index abcd83d..0731f3a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ **/.classpath **/.dockerignore **/.git +**/.env.example **/.gitignore **/.project **/.settings @@ -24,5 +25,7 @@ **/values.dev.yaml **/build **/dist +**/doc +**/public LICENSE README.md diff --git a/Dockerfile b/Dockerfile index 905697a..7e2c33e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,8 +27,12 @@ RUN chown -R app:app . # Run the application as a non-root user. USER app -# install dependencies -RUN npm ci +# install dependencies and remove unnecessary files +RUN npm ci && npm cache clean --force && rm -rf \ + ./node_modules/.cache \ + ./node_modules/.npm \ + ./node_modules/.yarn \ + ./node_modules/.pnpm # Copy the rest of the source files into the image. COPY . . From eeae76aa3953bad7b2c4aec294689fc873f4e263 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 13:17:09 +0200 Subject: [PATCH 10/45] chore: add npm script to run docker vulnerabilities scan --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c8721f..50e2ffc 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "test:refresh": "cross-env TEST_MODE=auth jest --testPathPattern refresh.e2e.spec.ts --noStackTrace --runInBand", "test:watch": "jest --watch", "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand" + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine" }, "engines": { "node": "20.0.0" From 690c45c6f81006e85716e1a2300bbc69a5449fc1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 16:34:33 +0200 Subject: [PATCH 11/45] chore: add editorconfig --- .editorconfig | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ab561f3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true From b21e91b4c9de5e2997be1e4ff59f60af7098bdde Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 16:34:55 +0200 Subject: [PATCH 12/45] chore: reduce docker image size --- .dockerignore | 1 + Dockerfile | 48 ++++++++++++++++++++---------------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/.dockerignore b/.dockerignore index 0731f3a..56c001a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -27,5 +27,6 @@ **/dist **/doc **/public +**/test LICENSE README.md diff --git a/Dockerfile b/Dockerfile index 7e2c33e..95068c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,44 +1,36 @@ -ARG NODE_VERSION=20.0.0 +ARG NODE_VERSION=20 -FROM node:${NODE_VERSION}-alpine +FROM node:${NODE_VERSION}-alpine as build-stage -# add user to group -RUN addgroup app && adduser -S -G app app +WORKDIR /app -# set the user to run the app -USER app +COPY package.json ./ -# set the working directory to /app -WORKDIR /app +RUN npm i --only=prod && npm i @nestjs/cli -# copy package.json and package-lock.json to the working directory -# This is done before copying the rest of the files to take advantage of Dockerโ€™s cache -# If the package.json and package-lock.json files havenโ€™t changed, Docker will use the cached dependencies -COPY package*.json ./ +COPY . . -# Run the application as a root user. -USER root +RUN npx prisma generate && npm run build -# change the ownership of the /app directory to the app user -# chown -R : -# chown command changes the user and/or group ownership of for given file. -RUN chown -R app:app . +FROM node:${NODE_VERSION}-alpine as runtime-stage -# Run the application as a non-root user. -USER app +WORKDIR /app -# install dependencies and remove unnecessary files -RUN npm ci && npm cache clean --force && rm -rf \ +COPY --from=build-stage /app/dist ./dist +COPY --from=build-stage /app/.env ./ +COPY --from=build-stage /app/node_modules/@prisma ./node_modules/@prisma +COPY --from=build-stage /app/node_modules/.prisma ./node_modules/.prisma +COPY package.json ./ + +RUN npm i --only=prod \ + && npm cache clean --force \ + && rm package.json \ + && rm -rf \ ./node_modules/.cache \ ./node_modules/.npm \ ./node_modules/.yarn \ ./node_modules/.pnpm -# Copy the rest of the source files into the image. -COPY . . - -# Expose the port that the application listens on. EXPOSE ${PORT} -# Run the application. -CMD npx prisma generate && npm run start:dev +CMD node dist/src/main.js From 000bd1033399447edf9f920cee784cda8dd1c118 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 16:35:17 +0200 Subject: [PATCH 13/45] chore: change nest clie to be dev dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 50e2ffc..466e791 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "node": "20.0.0" }, "dependencies": { - "@nestjs/cli": "^10.3.2", "@nestjs/common": "^10.3.3", "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", @@ -48,6 +47,7 @@ "uuid": "^9.0.1" }, "devDependencies": { + "@nestjs/cli": "^10.3.2", "@nestjs/schematics": "^10.1.1", "@nestjs/testing": "^10.3.3", "@types/bcrypt": "^5.0.2", From 0f6f3c2f0dc0edb46d882c89afa92e5c5b7cfc73 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:24:56 +0200 Subject: [PATCH 14/45] chore: add prisma schema --- prisma/schema.prisma | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 46317ca..c3a3912 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,9 +1,3 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init - generator client { provider = "prisma-client-js" } @@ -14,6 +8,38 @@ datasource db { } model User { - id Int @id @default(autoincrement()) - name String? + id String @id @default(uuid()) + login String + password String + version Int @default(1) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Artist { + id String @id @default(uuid()) + name String + grammy Boolean +} + +model Track { + id String @id @default(uuid()) + name String + artistId String? + albumId String? + duration Int +} + +model Album { + id String @id @default(uuid()) + name String + year Int + artistId String? +} + +model Favorites { + id String @id @default(uuid()) + artists String[] + albums String[] + tracks String[] } From dfb00f451aee1151169183d02810e5443e4cd4d2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:25:16 +0200 Subject: [PATCH 15/45] chore: add docker start script --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 466e791..7d013e5 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", + "start:prod": "node dist/src/main.js", "lint": "eslint \"{src,apps,libs,test,types,db}/**/*.ts\" --fix", "type-check": "tsc --noEmit", "test": "jest --testPathIgnorePatterns refresh.e2e.spec.ts --noStackTrace --runInBand", @@ -22,7 +22,8 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine" + "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine", + "start:migrate:prod": "prisma migrate dev --name init && npm run start:prod" }, "engines": { "node": "20.0.0" From 59336b82d82da50d449fc8462028869a7c4f8659 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:25:36 +0200 Subject: [PATCH 16/45] chore: remove old migrations --- .../20240311122329_init/migration.sql | 25 ------------------- .../20240311132135_init/migration.sql | 18 ------------- prisma/migrations/migration_lock.toml | 3 --- 3 files changed, 46 deletions(-) delete mode 100644 prisma/migrations/20240311122329_init/migration.sql delete mode 100644 prisma/migrations/20240311132135_init/migration.sql delete mode 100644 prisma/migrations/migration_lock.toml diff --git a/prisma/migrations/20240311122329_init/migration.sql b/prisma/migrations/20240311122329_init/migration.sql deleted file mode 100644 index 72c87ae..0000000 --- a/prisma/migrations/20240311122329_init/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "email" TEXT NOT NULL, - "name" TEXT, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Post" ( - "id" SERIAL NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT, - "published" BOOLEAN DEFAULT false, - "authorId" INTEGER, - - CONSTRAINT "Post_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- AddForeignKey -ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20240311132135_init/migration.sql b/prisma/migrations/20240311132135_init/migration.sql deleted file mode 100644 index e5836a9..0000000 --- a/prisma/migrations/20240311132135_init/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `email` on the `User` table. All the data in the column will be lost. - - You are about to drop the `Post` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "Post" DROP CONSTRAINT "Post_authorId_fkey"; - --- DropIndex -DROP INDEX "User_email_key"; - --- AlterTable -ALTER TABLE "User" DROP COLUMN "email"; - --- DropTable -DROP TABLE "Post"; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index fbffa92..0000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file From 3974b7e3c06c969c392b4c1a197739812c541c62 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:26:04 +0200 Subject: [PATCH 17/45] chore: update docker to perform prisma migrations --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 95068c4..f84f1e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,11 +20,11 @@ COPY --from=build-stage /app/dist ./dist COPY --from=build-stage /app/.env ./ COPY --from=build-stage /app/node_modules/@prisma ./node_modules/@prisma COPY --from=build-stage /app/node_modules/.prisma ./node_modules/.prisma +COPY --from=build-stage /app/prisma ./prisma COPY package.json ./ RUN npm i --only=prod \ && npm cache clean --force \ - && rm package.json \ && rm -rf \ ./node_modules/.cache \ ./node_modules/.npm \ @@ -33,4 +33,4 @@ RUN npm i --only=prod \ EXPOSE ${PORT} -CMD node dist/src/main.js +CMD [ "npm", "run", "start:migrate:prod" ] From 1939bb67cf66ba4db889f16d3aaf85e5f3d17f97 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:26:25 +0200 Subject: [PATCH 18/45] chore: update migrations --- .../20240315135526_init/migration.sql | 51 +++++++++++++++++++ prisma/migrations/migration_lock.toml | 3 ++ 2 files changed, 54 insertions(+) create mode 100644 prisma/migrations/20240315135526_init/migration.sql create mode 100644 prisma/migrations/migration_lock.toml diff --git a/prisma/migrations/20240315135526_init/migration.sql b/prisma/migrations/20240315135526_init/migration.sql new file mode 100644 index 0000000..1cbc79a --- /dev/null +++ b/prisma/migrations/20240315135526_init/migration.sql @@ -0,0 +1,51 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "login" TEXT NOT NULL, + "password" TEXT NOT NULL, + "version" INTEGER NOT NULL DEFAULT 1, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Artist" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "grammy" BOOLEAN NOT NULL, + + CONSTRAINT "Artist_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Track" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "artistId" TEXT, + "albumId" TEXT, + "duration" INTEGER NOT NULL, + + CONSTRAINT "Track_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Album" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "year" INTEGER NOT NULL, + "artistId" TEXT, + + CONSTRAINT "Album_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Favorites" ( + "id" TEXT NOT NULL, + "artists" TEXT[], + "albums" TEXT[], + "tracks" TEXT[], + + CONSTRAINT "Favorites_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file From a1afd9abf9d8be0e1ed032435a6cbaf792992339 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:28:15 +0200 Subject: [PATCH 19/45] feat: change user entity to work with prisma --- src/user/user.controller.ts | 4 ++-- src/user/user.module.ts | 4 ++-- src/user/user.service.ts | 27 +++++++++++++++------------ 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 7fbf0cb..b2ce378 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -51,12 +51,12 @@ export class UserController { @UseInterceptors(ClassSerializerInterceptor) @UsePipes(new ValidationPipe()) @Put(':id') - update( + async update( @Param('id', ParseUUIDPipe) id: string, @Body() updateUserDto: UpdateUserDto, ) { const { oldPassword } = updateUserDto; - const user = this.userService.findOne(id); + const user = await this.userService.findOne(id); const isSamePassword = oldPassword === user?.password; if (!user) throw new NotFoundException(errorMessage.USER_NOT_FOUND); diff --git a/src/user/user.module.ts b/src/user/user.module.ts index ba1ec7e..139fcab 100644 --- a/src/user/user.module.ts +++ b/src/user/user.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; -import { DatabaseModule } from '../database/database.module'; +import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule], + imports: [PrismaModule], controllers: [UserController], providers: [UserService], }) diff --git a/src/user/user.service.ts b/src/user/user.service.ts index f90090e..0cafb82 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -2,29 +2,32 @@ import { Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { DatabaseService } from '../database/database.service'; +import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class UserService { - constructor(private readonly databaseService: DatabaseService) {} + constructor(private readonly prismaService: PrismaService) {} - create(createUserDto: CreateUserDto) { - return this.databaseService.user.create(createUserDto); + async create(createUserDto: CreateUserDto) { + return this.prismaService.user.create({ data: createUserDto }); } - findAll() { - return this.databaseService.user.findMany(); + async findAll() { + return this.prismaService.user.findMany(); } - findOne(id: string) { - return this.databaseService.user.findById(id); + async findOne(id: string) { + return this.prismaService.user.findUnique({ where: { id } }); } - update(id: string, updateUserDto: UpdateUserDto) { - return this.databaseService.user.update(id, updateUserDto); + async update(id: string, updateUserDto: UpdateUserDto) { + return this.prismaService.user.update({ + where: { id }, + data: updateUserDto, + }); } - remove(id: string) { - return this.databaseService.user.delete(id); + async remove(id: string) { + return this.prismaService.user.delete({ where: { id } }); } } From dc807027d33fcbd47831e831b2afbbcb5e943ad3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:28:41 +0200 Subject: [PATCH 20/45] feat: change track entity to work with prisma --- src/track/track.module.ts | 4 ++-- src/track/track.service.ts | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/track/track.module.ts b/src/track/track.module.ts index 60347df..21be25c 100644 --- a/src/track/track.module.ts +++ b/src/track/track.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common'; import { TrackController } from './track.controller'; import { TrackService } from './track.service'; -import { DatabaseModule } from '../database/database.module'; +import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule], + imports: [PrismaModule], controllers: [TrackController], providers: [TrackService], }) diff --git a/src/track/track.service.ts b/src/track/track.service.ts index e7e3cd3..e48b007 100644 --- a/src/track/track.service.ts +++ b/src/track/track.service.ts @@ -2,30 +2,34 @@ import { Injectable } from '@nestjs/common'; import { CreateTrackDto } from './dto/create-track.dto'; import { UpdateTrackDto } from './dto/update-track.dto'; -import { DatabaseService } from '../database/database.service'; +import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class TrackService { - constructor(private readonly databaseService: DatabaseService) {} + constructor(private readonly prismaService: PrismaService) {} create(createTrackDto: CreateTrackDto) { - return this.databaseService.track.create(createTrackDto); + return this.prismaService.track.create({ data: createTrackDto }); } findAll() { - return this.databaseService.track.findMany(); + return this.prismaService.track.findMany(); } findOne(id: string) { - return this.databaseService.track.findById(id); + return this.prismaService.track.findUnique({ where: { id } }); } update(id: string, updateTrackDto: UpdateTrackDto) { - return this.databaseService.track.update(id, updateTrackDto); + return this.prismaService.track.update({ + where: { id }, + data: updateTrackDto, + }); } remove(id: string) { - this.databaseService.favorite.track.delete(id); - return this.databaseService.track.delete(id); + // TODO: delete from favorite + // this.prismaService.favorite.track.delete(id); + return this.prismaService.track.delete({ where: { id } }); } } From bb7b5d20f564b71059147a95f29294024fb84425 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:28:48 +0200 Subject: [PATCH 21/45] feat: change artist entity to work with prisma --- src/artist/artist.module.ts | 4 +-- src/artist/artist.service.ts | 50 ++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/artist/artist.module.ts b/src/artist/artist.module.ts index 5b521b0..de47f48 100644 --- a/src/artist/artist.module.ts +++ b/src/artist/artist.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common'; import { ArtistController } from './artist.controller'; import { ArtistService } from './artist.service'; -import { DatabaseModule } from '../database/database.module'; +import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule], + imports: [PrismaModule], controllers: [ArtistController], providers: [ArtistService], }) diff --git a/src/artist/artist.service.ts b/src/artist/artist.service.ts index b4c4cac..a5fae74 100644 --- a/src/artist/artist.service.ts +++ b/src/artist/artist.service.ts @@ -2,32 +2,60 @@ import { Injectable } from '@nestjs/common'; import { CreateArtistDto } from './dto/create-artist.dto'; import { UpdateArtistDto } from './dto/update-artist.dto'; -import { DatabaseService } from '../database/database.service'; +import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class ArtistService { - constructor(private readonly databaseService: DatabaseService) {} + constructor(private readonly prismaService: PrismaService) {} create(createArtistDto: CreateArtistDto) { - return this.databaseService.artist.create(createArtistDto); + return this.prismaService.artist.create({ data: createArtistDto }); } findAll() { - return this.databaseService.artist.findMany(); + return this.prismaService.artist.findMany(); } findOne(id: string) { - return this.databaseService.artist.findById(id); + return this.prismaService.artist.findUnique({ where: { id } }); } update(id: string, updateArtistDto: UpdateArtistDto) { - return this.databaseService.artist.update(id, updateArtistDto); + return this.prismaService.artist.update({ + where: { id }, + data: updateArtistDto, + }); } - remove(id: string) { - this.databaseService.track.deleteArtist(id); - this.databaseService.album.deleteArtist(id); - this.databaseService.favorite.artist.delete(id); - return this.databaseService.artist.delete(id); + async remove(id: string) { + // this.prismaService.favorite.artist.delete(id); + const artistTracks = await this.prismaService.track.findMany({ + where: { artistId: id }, + }); + + const artistAlbums = await this.prismaService.album.findMany({ + where: { artistId: id }, + }); + + // TODO: remove artist from favorites + // this.prismaService.favorites.delete({where:{artists:{has:{}}}}); + + // Delete artist id for all artist's albums + artistAlbums.forEach((album) => + this.prismaService.track.update({ + where: { id: album.id }, + data: { artistId: null }, + }), + ); + + // Delete artist id for all artist's tracks + artistTracks.forEach((track) => + this.prismaService.track.update({ + where: { id: track.id }, + data: { artistId: null }, + }), + ); + + return this.prismaService.artist.delete({ where: { id } }); } } From 0603a81ab0aeb862e24d551be2d4902320159d03 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Mar 2024 19:28:53 +0200 Subject: [PATCH 22/45] feat: change album entity to work with prisma --- src/album/album.module.ts | 4 ++-- src/album/album.service.ts | 34 ++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/album/album.module.ts b/src/album/album.module.ts index dce2e18..a90b997 100644 --- a/src/album/album.module.ts +++ b/src/album/album.module.ts @@ -2,10 +2,10 @@ import { Module } from '@nestjs/common'; import { AlbumController } from './album.controller'; import { AlbumService } from './album.service'; -import { DatabaseModule } from '../database/database.module'; +import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule], + imports: [PrismaModule], controllers: [AlbumController], providers: [AlbumService], }) diff --git a/src/album/album.service.ts b/src/album/album.service.ts index c1a963b..ddc6e29 100644 --- a/src/album/album.service.ts +++ b/src/album/album.service.ts @@ -2,31 +2,45 @@ import { Injectable } from '@nestjs/common'; import { CreateAlbumDto } from './dto/create-album.dto'; import { UpdateAlbumDto } from './dto/update-album.dto'; -import { DatabaseService } from '../database/database.service'; +import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class AlbumService { - constructor(private readonly databaseService: DatabaseService) {} + constructor(private readonly prismaService: PrismaService) {} create(createAlbumDto: CreateAlbumDto) { - return this.databaseService.album.create(createAlbumDto); + return this.prismaService.album.create({ data: createAlbumDto }); } findAll() { - return this.databaseService.album.findMany(); + return this.prismaService.album.findMany(); } findOne(id: string) { - return this.databaseService.album.findById(id); + return this.prismaService.album.findUnique({ where: { id } }); } update(id: string, updateAlbumDto: UpdateAlbumDto) { - return this.databaseService.album.update(id, updateAlbumDto); + return this.prismaService.album.update({ + where: { id }, + data: updateAlbumDto, + }); } - remove(id: string) { - this.databaseService.track.deleteAlbum(id); - this.databaseService.favorite.album.delete(id); - return this.databaseService.album.delete(id); + async remove(id: string) { + const albumTracks = await this.prismaService.track.findMany({ + where: { albumId: id }, + }); + + albumTracks.forEach((track) => + this.prismaService.track.update({ + where: { id: track.id }, + data: { albumId: null }, + }), + ); + + // TODO: delete from favorites + // this.prismaService.favorite.album.delete(id); + return this.prismaService.album.delete({ where: { id } }); } } From a129823229f2c815a9bc52f7a87fbfd56115f940 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:36:19 +0200 Subject: [PATCH 23/45] chore: update Dockerfile --- .dockerignore | 7 +++++++ Dockerfile | 12 ++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.dockerignore b/.dockerignore index 56c001a..f51cd5d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,6 +4,13 @@ **/.env.example **/.gitignore **/.project +**/.editorconfig +**/.eslintrc.js +**/.prettierrc +**/jest.config.json +**/nest-cli.json +**/tsconfig.build.json +**/environment.d.ts **/.settings **/.toolstarget **/.vs diff --git a/Dockerfile b/Dockerfile index f84f1e4..aee2188 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,20 +10,24 @@ RUN npm i --only=prod && npm i @nestjs/cli COPY . . -RUN npx prisma generate && npm run build +RUN npx prisma generate FROM node:${NODE_VERSION}-alpine as runtime-stage WORKDIR /app -COPY --from=build-stage /app/dist ./dist +COPY --from=build-stage /app/src ./src +COPY --from=build-stage /app/db ./db +COPY --from=build-stage /app/types ./types COPY --from=build-stage /app/.env ./ +COPY --from=build-stage /app/tsconfig.json ./ COPY --from=build-stage /app/node_modules/@prisma ./node_modules/@prisma COPY --from=build-stage /app/node_modules/.prisma ./node_modules/.prisma COPY --from=build-stage /app/prisma ./prisma + COPY package.json ./ -RUN npm i --only=prod \ +RUN npm i && npm i @nestjs/cli \ && npm cache clean --force \ && rm -rf \ ./node_modules/.cache \ @@ -33,4 +37,4 @@ RUN npm i --only=prod \ EXPOSE ${PORT} -CMD [ "npm", "run", "start:migrate:prod" ] +CMD [ "npm", "run", "start:migrate:dev" ] From 70c1e596d384191ff4681d47afda9c7e81d51428 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:36:37 +0200 Subject: [PATCH 24/45] fix: album service prisma queries --- src/album/album.controller.ts | 18 +++++++--------- src/album/album.service.ts | 39 +++++++++++++++-------------------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/album/album.controller.ts b/src/album/album.controller.ts index 2855c27..b5dd0fd 100644 --- a/src/album/album.controller.ts +++ b/src/album/album.controller.ts @@ -25,40 +25,38 @@ export class AlbumController { @UsePipes(new ValidationPipe()) @Post() - create(@Body() createAlbumDto: CreateAlbumDto) { + async create(@Body() createAlbumDto: CreateAlbumDto) { return this.albumService.create(createAlbumDto); } @Get() - findAll() { + async findAll() { return this.albumService.findAll(); } @Get(':id') - findOne(@Param('id', ParseUUIDPipe) id: string) { - const album = this.albumService.findOne(id); + async findOne(@Param('id', ParseUUIDPipe) id: string) { + const album = await this.albumService.findOne(id); if (!album) throw new NotFoundException(errorMessage.ALBUM_NOT_FOUND); return album; } @UsePipes(new ValidationPipe()) @Put(':id') - update( + async update( @Param('id', ParseUUIDPipe) id: string, @Body() updateAlbumDto: UpdateAlbumDto, ) { - const updatedAlbum = this.albumService.update(id, updateAlbumDto); - + const updatedAlbum = await this.albumService.update(id, updateAlbumDto); if (!updatedAlbum) throw new NotFoundException(errorMessage.ALBUM_NOT_FOUND); - return updatedAlbum; } @Delete(':id') @HttpCode(HttpStatus.NO_CONTENT) - remove(@Param('id', ParseUUIDPipe) id: string) { - const album = this.albumService.remove(id); + async remove(@Param('id', ParseUUIDPipe) id: string) { + const album = await this.albumService.remove(id); if (!album) throw new NotFoundException(errorMessage.ARTIST_NOT_FOUND); return album; } diff --git a/src/album/album.service.ts b/src/album/album.service.ts index ddc6e29..ceaa711 100644 --- a/src/album/album.service.ts +++ b/src/album/album.service.ts @@ -8,39 +8,34 @@ import { PrismaService } from '../prisma/prisma.service'; export class AlbumService { constructor(private readonly prismaService: PrismaService) {} - create(createAlbumDto: CreateAlbumDto) { + async create(createAlbumDto: CreateAlbumDto) { return this.prismaService.album.create({ data: createAlbumDto }); } - findAll() { + async findAll() { return this.prismaService.album.findMany(); } - findOne(id: string) { + async findOne(id: string) { return this.prismaService.album.findUnique({ where: { id } }); } - update(id: string, updateAlbumDto: UpdateAlbumDto) { - return this.prismaService.album.update({ - where: { id }, - data: updateAlbumDto, - }); + async update(id: string, updateAlbumDto: UpdateAlbumDto) { + try { + return await this.prismaService.album.update({ + where: { id }, + data: updateAlbumDto, + }); + } catch (e) { + return null; + } } async remove(id: string) { - const albumTracks = await this.prismaService.track.findMany({ - where: { albumId: id }, - }); - - albumTracks.forEach((track) => - this.prismaService.track.update({ - where: { id: track.id }, - data: { albumId: null }, - }), - ); - - // TODO: delete from favorites - // this.prismaService.favorite.album.delete(id); - return this.prismaService.album.delete({ where: { id } }); + try { + return await this.prismaService.album.delete({ where: { id } }); + } catch (e) { + return null; + } } } From 775d396c0c44a4fdfa0eaa85802673141e143e6e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:36:44 +0200 Subject: [PATCH 25/45] fix: artist service prisma queries --- src/artist/artist.controller.ts | 18 +++++------ src/artist/artist.service.ts | 54 +++++++++++---------------------- 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/src/artist/artist.controller.ts b/src/artist/artist.controller.ts index 2c9b905..8b67c35 100644 --- a/src/artist/artist.controller.ts +++ b/src/artist/artist.controller.ts @@ -25,40 +25,38 @@ export class ArtistController { @UsePipes(new ValidationPipe()) @Post() - create(@Body() createArtistDto: CreateArtistDto) { + async create(@Body() createArtistDto: CreateArtistDto) { return this.artistService.create(createArtistDto); } @Get() - findAll() { + async findAll() { return this.artistService.findAll(); } @Get(':id') - findOne(@Param('id', ParseUUIDPipe) id: string) { - const artist = this.artistService.findOne(id); + async findOne(@Param('id', ParseUUIDPipe) id: string) { + const artist = await this.artistService.findOne(id); if (!artist) throw new NotFoundException(errorMessage.ARTIST_NOT_FOUND); return artist; } @UsePipes(new ValidationPipe()) @Put(':id') - update( + async update( @Param('id', ParseUUIDPipe) id: string, @Body() updateArtistDto: UpdateArtistDto, ) { - const updatedArtist = this.artistService.update(id, updateArtistDto); - + const updatedArtist = await this.artistService.update(id, updateArtistDto); if (!updatedArtist) throw new NotFoundException(errorMessage.ARTIST_NOT_FOUND); - return updatedArtist; } @Delete(':id') @HttpCode(HttpStatus.NO_CONTENT) - remove(@Param('id', ParseUUIDPipe) id: string) { - const artist = this.artistService.remove(id); + async remove(@Param('id', ParseUUIDPipe) id: string) { + const artist = await this.artistService.remove(id); if (!artist) throw new NotFoundException(errorMessage.ARTIST_NOT_FOUND); return artist; } diff --git a/src/artist/artist.service.ts b/src/artist/artist.service.ts index a5fae74..642b626 100644 --- a/src/artist/artist.service.ts +++ b/src/artist/artist.service.ts @@ -8,54 +8,34 @@ import { PrismaService } from '../prisma/prisma.service'; export class ArtistService { constructor(private readonly prismaService: PrismaService) {} - create(createArtistDto: CreateArtistDto) { + async create(createArtistDto: CreateArtistDto) { return this.prismaService.artist.create({ data: createArtistDto }); } - findAll() { + async findAll() { return this.prismaService.artist.findMany(); } - findOne(id: string) { + async findOne(id: string) { return this.prismaService.artist.findUnique({ where: { id } }); } - update(id: string, updateArtistDto: UpdateArtistDto) { - return this.prismaService.artist.update({ - where: { id }, - data: updateArtistDto, - }); + async update(id: string, updateArtistDto: UpdateArtistDto) { + try { + return await this.prismaService.artist.update({ + where: { id }, + data: updateArtistDto, + }); + } catch (e) { + return null; + } } async remove(id: string) { - // this.prismaService.favorite.artist.delete(id); - const artistTracks = await this.prismaService.track.findMany({ - where: { artistId: id }, - }); - - const artistAlbums = await this.prismaService.album.findMany({ - where: { artistId: id }, - }); - - // TODO: remove artist from favorites - // this.prismaService.favorites.delete({where:{artists:{has:{}}}}); - - // Delete artist id for all artist's albums - artistAlbums.forEach((album) => - this.prismaService.track.update({ - where: { id: album.id }, - data: { artistId: null }, - }), - ); - - // Delete artist id for all artist's tracks - artistTracks.forEach((track) => - this.prismaService.track.update({ - where: { id: track.id }, - data: { artistId: null }, - }), - ); - - return this.prismaService.artist.delete({ where: { id } }); + try { + return await this.prismaService.artist.delete({ where: { id } }); + } catch (e) { + return null; + } } } From 0940d9bf607ca617d7644a0bd05b5e7ca1fd591c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:36:54 +0200 Subject: [PATCH 26/45] fix: favorite service prisma queries --- src/favorite/favorite.controller.ts | 5 +---- src/favorite/favorite.module.ts | 3 ++- src/favorite/favorite.service.ts | 26 ++++++++++++++++---------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/favorite/favorite.controller.ts b/src/favorite/favorite.controller.ts index 46cc52c..11d92e3 100644 --- a/src/favorite/favorite.controller.ts +++ b/src/favorite/favorite.controller.ts @@ -48,10 +48,7 @@ export class FavoriteController { @Get() findAll() { - const tracks = this.favoriteService.findAllTracks(); - const albums = this.favoriteService.findAllAlbums(); - const artists = this.favoriteService.findAllArtists(); - return { tracks, albums, artists }; + return this.favoriteService.findAll(); } @Delete('track/:id') diff --git a/src/favorite/favorite.module.ts b/src/favorite/favorite.module.ts index 37f29bb..30aed88 100644 --- a/src/favorite/favorite.module.ts +++ b/src/favorite/favorite.module.ts @@ -3,9 +3,10 @@ import { Module } from '@nestjs/common'; import { FavoriteController } from './favorite.controller'; import { FavoriteService } from './favorite.service'; import { DatabaseModule } from '../database/database.module'; +import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule], + imports: [DatabaseModule, PrismaModule], controllers: [FavoriteController], providers: [FavoriteService], }) diff --git a/src/favorite/favorite.service.ts b/src/favorite/favorite.service.ts index b43760e..c5c82d0 100644 --- a/src/favorite/favorite.service.ts +++ b/src/favorite/favorite.service.ts @@ -1,13 +1,20 @@ import { Injectable } from '@nestjs/common'; import { DatabaseService } from '../database/database.service'; +import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class FavoriteService { - constructor(private readonly databaseService: DatabaseService) {} + constructor( + private readonly databaseService: DatabaseService, + private readonly prismaService: PrismaService, + ) {} createTrack(id: string) { - return this.databaseService.favorite.track.create(id); + return this.prismaService.track.update({ + where: { id }, + data: { favoritesId: 'favs' }, + }); } createAlbum(id: string) { @@ -18,16 +25,15 @@ export class FavoriteService { return this.databaseService.favorite.artist.create(id); } - findAllTracks() { - return this.databaseService.favorite.track.findMany(); - } + async findAll() { + const data = await this.prismaService.favorites.findUnique({ + where: { id: 'favs' }, + select: { artists: true, albums: true, tracks: true }, + }); - findAllAlbums() { - return this.databaseService.favorite.album.findMany(); - } + console.log(data); - findAllArtists() { - return this.databaseService.favorite.artist.findMany(); + return data; } removeTrack(id: string) { From 157b56edf7afab24c3b29571ecc9b47068ada6e4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:37:17 +0200 Subject: [PATCH 27/45] feat: add exclude user fields util --- src/lib/shared/exclude.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/lib/shared/exclude.ts diff --git a/src/lib/shared/exclude.ts b/src/lib/shared/exclude.ts new file mode 100644 index 0000000..b0310e6 --- /dev/null +++ b/src/lib/shared/exclude.ts @@ -0,0 +1,11 @@ +function exclude( + user: User, + keys: Key[], +): Omit { + return Object.fromEntries( + Object.entries(user as { [k: string]: unknown }).filter( + ([key]) => !keys.includes(key as Key), + ), + ) as Omit; +} +export default exclude; From 3e215ab74a645f13220fca459cd8a1cef51589cf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:37:31 +0200 Subject: [PATCH 28/45] feat: add format user date util --- src/lib/shared/formatUserDate.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/lib/shared/formatUserDate.ts diff --git a/src/lib/shared/formatUserDate.ts b/src/lib/shared/formatUserDate.ts new file mode 100644 index 0000000..98be080 --- /dev/null +++ b/src/lib/shared/formatUserDate.ts @@ -0,0 +1,9 @@ +import { User } from '@prisma/client'; + +const formatUserDate = (user: User) => ({ + ...user, + createdAt: new Date(user.createdAt).getTime(), + updatedAt: new Date(user.updatedAt).getTime(), +}); + +export default formatUserDate; From 672dfa8336b01579b7947b1af7011d74e6940895 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:37:50 +0200 Subject: [PATCH 29/45] chore: change npm script --- package-lock.json | 298 +++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 259 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3c0c3e..46681d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { - "@nestjs/cli": "^10.3.2", "@nestjs/common": "^10.3.3", "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", @@ -29,6 +28,7 @@ "uuid": "^9.0.1" }, "devDependencies": { + "@nestjs/cli": "^10.3.2", "@nestjs/schematics": "^10.1.1", "@nestjs/testing": "^10.3.3", "@types/bcrypt": "^5.0.2", @@ -94,6 +94,7 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.2.tgz", "integrity": "sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==", + "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -120,6 +121,7 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.2.tgz", "integrity": "sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==", + "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "jsonc-parser": "3.2.0", @@ -137,6 +139,7 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.1.2.tgz", "integrity": "sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==", + "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -158,6 +161,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -169,6 +173,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "engines": { "node": ">= 12" } @@ -177,6 +182,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, "engines": { "node": ">=12" }, @@ -188,6 +194,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -203,6 +210,7 @@ "version": "9.2.12", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "dev": true, "dependencies": { "@ljharb/through": "^2.3.11", "ansi-escapes": "^4.3.2", @@ -228,6 +236,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -239,6 +248,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -247,6 +257,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -255,6 +266,7 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" @@ -267,6 +279,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -278,6 +291,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -291,6 +305,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -298,12 +313,14 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -312,6 +329,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -320,6 +338,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -526,6 +545,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -557,6 +577,7 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -570,6 +591,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -581,6 +603,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -594,6 +617,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -601,12 +625,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -615,6 +641,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -623,6 +650,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -899,6 +927,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, "optional": true, "engines": { "node": ">=0.1.90" @@ -1602,6 +1631,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1615,6 +1645,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -1623,6 +1654,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -1631,6 +1663,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -1639,12 +1672,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1654,6 +1689,7 @@ "version": "2.3.12", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", + "dev": true, "dependencies": { "call-bind": "^1.0.5" }, @@ -1750,6 +1786,7 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.3.2.tgz", "integrity": "sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==", + "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -1797,6 +1834,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1809,6 +1847,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -1817,6 +1856,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1831,6 +1871,7 @@ "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1839,6 +1880,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, "dependencies": { "glob": "^9.2.0" }, @@ -1856,6 +1898,7 @@ "version": "9.3.5", "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", @@ -1873,6 +1916,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1885,6 +1929,7 @@ "version": "5.90.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", + "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -2081,6 +2126,7 @@ "version": "10.1.1", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.1.tgz", "integrity": "sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==", + "dev": true, "dependencies": { "@angular-devkit/core": "17.1.2", "@angular-devkit/schematics": "17.1.2", @@ -2095,7 +2141,8 @@ "node_modules/@nestjs/schematics/node_modules/jsonc-parser": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true }, "node_modules/@nestjs/swagger": { "version": "7.3.0", @@ -2418,6 +2465,7 @@ "version": "8.56.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2427,6 +2475,7 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -2435,7 +2484,8 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.21", @@ -2513,7 +2563,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2842,6 +2893,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -2850,22 +2902,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -2875,12 +2931,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -2892,6 +2950,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -2900,6 +2959,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -2907,12 +2967,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -2928,6 +2990,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -2940,6 +3003,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -2951,6 +3015,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -2964,6 +3029,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -2972,12 +3038,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/abbrev": { "version": "1.1.1", @@ -3000,6 +3068,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3011,6 +3080,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, "peerDependencies": { "acorn": "^8" } @@ -3048,6 +3118,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3063,6 +3134,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -3079,6 +3151,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, "engines": { "node": ">=6" } @@ -3087,6 +3160,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3101,6 +3175,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -3134,6 +3209,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3146,6 +3222,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -3251,7 +3328,8 @@ "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true }, "node_modules/array-union": { "version": "2.1.0", @@ -3587,6 +3665,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -3619,6 +3698,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { "node": ">=8" } @@ -3627,6 +3707,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3637,6 +3718,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3694,6 +3776,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3705,6 +3788,7 @@ "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3757,6 +3841,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -3827,6 +3912,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -3844,6 +3930,7 @@ "version": "1.0.30001594", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3886,12 +3973,14 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3923,6 +4012,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -3967,6 +4057,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -3978,6 +4069,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "engines": { "node": ">=6" }, @@ -3989,6 +4081,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, "dependencies": { "string-width": "^4.2.0" }, @@ -4003,6 +4096,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, "engines": { "node": ">= 10" } @@ -4042,6 +4136,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "engines": { "node": ">=0.8" } @@ -4102,6 +4197,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "engines": { "node": ">= 6" } @@ -4110,6 +4206,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -4230,6 +4327,7 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -4355,6 +4453,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4363,6 +4462,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, "dependencies": { "clone": "^1.0.2" }, @@ -4552,7 +4652,8 @@ "node_modules/electron-to-chromium": { "version": "1.4.693", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", - "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==" + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", + "dev": true }, "node_modules/emittery": { "version": "0.13.1", @@ -4583,6 +4684,7 @@ "version": "5.15.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -4595,6 +4697,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -4708,7 +4811,8 @@ "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true }, "node_modules/es-set-tostringtag": { "version": "2.0.3", @@ -4754,6 +4858,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, "engines": { "node": ">=6" } @@ -5458,6 +5563,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5482,6 +5588,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5493,6 +5600,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -5518,6 +5626,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } @@ -5676,6 +5785,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -5688,7 +5798,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", @@ -5715,7 +5826,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5750,6 +5862,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -5764,6 +5877,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -5784,6 +5898,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5942,6 +6057,7 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -5969,6 +6085,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5978,6 +6095,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6034,6 +6152,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6073,7 +6192,8 @@ "node_modules/fs-monkey": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -6084,6 +6204,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6251,6 +6372,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6261,7 +6383,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/globals": { "version": "13.24.0", @@ -6327,7 +6450,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -6356,6 +6480,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6495,6 +6620,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -6523,6 +6649,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6580,6 +6707,7 @@ "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -6619,6 +6747,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -6650,7 +6779,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-async-function": { "version": "2.0.0", @@ -6683,6 +6813,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6722,6 +6853,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -6748,6 +6880,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6800,6 +6933,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6811,6 +6945,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, "engines": { "node": ">=8" } @@ -6840,6 +6975,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -6969,6 +7105,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { "node": ">=10" }, @@ -7821,7 +7958,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7855,12 +7993,14 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7872,6 +8012,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -7882,12 +8023,14 @@ "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8016,12 +8159,14 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, "engines": { "node": ">=6.11.5" } @@ -8097,6 +8242,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -8133,6 +8279,7 @@ "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -8189,6 +8336,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, "dependencies": { "fs-monkey": "^1.0.4" }, @@ -8204,7 +8352,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -8282,6 +8431,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -8380,7 +8530,8 @@ "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -8399,12 +8550,14 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true }, "node_modules/node-addon-api": { "version": "5.1.0", @@ -8415,6 +8568,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, "dependencies": { "lodash": "^4.17.21" } @@ -8447,7 +8601,8 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true }, "node_modules/nopt": { "version": "5.0.0", @@ -8467,6 +8622,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8634,6 +8790,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -8665,6 +8822,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -8687,6 +8845,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8734,6 +8893,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -8745,6 +8905,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -8794,7 +8955,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.10.1", @@ -8828,6 +8990,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -8835,12 +8998,14 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, "engines": { "node": ">=10" }, @@ -8925,6 +9090,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, "engines": { "node": ">=4" } @@ -9067,6 +9233,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -9125,6 +9292,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -9180,6 +9348,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9191,6 +9360,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -9202,6 +9372,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, "dependencies": { "resolve": "^1.1.6" }, @@ -9275,6 +9446,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, "engines": { "node": ">=0.10" } @@ -9292,6 +9464,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9300,6 +9473,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -9337,6 +9511,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -9354,6 +9529,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9365,7 +9541,8 @@ "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/reusify": { "version": "1.0.4", @@ -9398,6 +9575,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -9502,6 +9680,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9519,6 +9698,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -9534,6 +9714,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -9541,7 +9722,8 @@ "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/semver": { "version": "7.6.0", @@ -9618,6 +9800,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -9700,6 +9883,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -9716,6 +9900,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9725,6 +9910,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9744,6 +9930,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9798,6 +9985,7 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, "engines": { "node": ">= 8" } @@ -9806,6 +9994,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9815,6 +10004,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10094,6 +10284,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10110,6 +10301,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, "engines": { "node": ">=0.10" } @@ -10134,6 +10326,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -10182,6 +10375,7 @@ "version": "5.29.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10199,6 +10393,7 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10232,6 +10427,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10245,6 +10441,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10258,7 +10455,8 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", @@ -10325,12 +10523,14 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -10357,6 +10557,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -10381,6 +10582,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, "bin": { "tree-kill": "cli.js" } @@ -10507,6 +10709,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -10520,6 +10723,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -10533,6 +10737,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { "node": ">=4" } @@ -10669,6 +10874,7 @@ "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10712,6 +10918,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -10728,6 +10935,7 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10757,6 +10965,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -10835,6 +11044,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -10847,6 +11057,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "dependencies": { "defaults": "^1.0.3" } @@ -10860,6 +11071,7 @@ "version": "5.90.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -10907,6 +11119,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, "engines": { "node": ">=6" } @@ -10915,6 +11128,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, "engines": { "node": ">=10.13.0" } @@ -10923,6 +11137,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -10936,6 +11151,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "peer": true, "engines": { "node": ">=4.0" @@ -11058,6 +11274,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11153,6 +11370,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "engines": { "node": ">=12" } diff --git a/package.json b/package.json index 7d013e5..628181c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine", - "start:migrate:prod": "prisma migrate dev --name init && npm run start:prod" + "start:migrate:dev": "prisma migrate dev --name init && npm run start:dev" }, "engines": { "node": "20.0.0" From 8a0b136ece7eb542a8951092dd1232540d6ffa52 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:38:06 +0200 Subject: [PATCH 30/45] refactor: update prisma schema --- prisma/schema.prisma | 46 ++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c3a3912..c1b7e43 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -8,7 +8,7 @@ datasource db { } model User { - id String @id @default(uuid()) + id String @id @default(uuid()) login String password String version Int @default(1) @@ -17,29 +17,41 @@ model User { } model Artist { - id String @id @default(uuid()) - name String - grammy Boolean + id String @id @default(uuid()) + name String + grammy Boolean + tracks Track[] + album Album[] + favorites Favorites? @relation(fields: [favoritesId], references: [id]) + favoritesId String? } model Track { - id String @id @default(uuid()) - name String - artistId String? - albumId String? - duration Int + id String @id @default(uuid()) + name String + artist Artist? @relation(fields: [artistId], references: [id], onDelete: SetNull) + artistId String? + album Album? @relation(fields: [albumId], references: [id], onDelete: SetNull) + albumId String? + duration Int + favorites Favorites? @relation(fields: [favoritesId], references: [id]) + favoritesId String? } model Album { - id String @id @default(uuid()) - name String - year Int - artistId String? + id String @id @default(uuid()) + name String + year Int + artist Artist? @relation(fields: [artistId], references: [id], onDelete: SetNull) + artistId String? + track Track[] + favorites Favorites? @relation(fields: [favoritesId], references: [id]) + favoritesId String? } model Favorites { - id String @id @default(uuid()) - artists String[] - albums String[] - tracks String[] + id String @id @default("favs") + artists Artist[] + albums Album[] + tracks Track[] } From 84efdc99f28fe01de40411c45d9f82784297112d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:38:19 +0200 Subject: [PATCH 31/45] fix: track service prisma queries --- src/track/track.controller.ts | 21 +++++++++------------ src/track/track.service.ts | 30 ++++++++++++++++++------------ 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/track/track.controller.ts b/src/track/track.controller.ts index 19644d9..b62d37a 100644 --- a/src/track/track.controller.ts +++ b/src/track/track.controller.ts @@ -25,41 +25,38 @@ export class TrackController { @UsePipes(new ValidationPipe()) @Post() - create(@Body() createTrackDto: CreateTrackDto) { - const track = this.trackService.create(createTrackDto); - return track; + async create(@Body() createTrackDto: CreateTrackDto) { + return this.trackService.create(createTrackDto); } @Get() - findAll() { + async findAll() { return this.trackService.findAll(); } @Get(':id') - findOne(@Param('id', ParseUUIDPipe) id: string) { - const track = this.trackService.findOne(id); + async findOne(@Param('id', ParseUUIDPipe) id: string) { + const track = await this.trackService.findOne(id); if (!track) throw new NotFoundException(errorMessage.TRACK_NOT_FOUND); return track; } @UsePipes(new ValidationPipe()) @Put(':id') - update( + async update( @Param('id', ParseUUIDPipe) id: string, @Body() updateTrackDto: UpdateTrackDto, ) { - const updatedTrack = this.trackService.update(id, updateTrackDto); - + const updatedTrack = await this.trackService.update(id, updateTrackDto); if (!updatedTrack) throw new NotFoundException(errorMessage.TRACK_NOT_FOUND); - return updatedTrack; } @Delete(':id') @HttpCode(HttpStatus.NO_CONTENT) - remove(@Param('id', ParseUUIDPipe) id: string) { - const track = this.trackService.remove(id); + async remove(@Param('id', ParseUUIDPipe) id: string) { + const track = await this.trackService.remove(id); if (!track) throw new NotFoundException(errorMessage.TRACK_NOT_FOUND); return track; } diff --git a/src/track/track.service.ts b/src/track/track.service.ts index e48b007..66b0c40 100644 --- a/src/track/track.service.ts +++ b/src/track/track.service.ts @@ -8,28 +8,34 @@ import { PrismaService } from '../prisma/prisma.service'; export class TrackService { constructor(private readonly prismaService: PrismaService) {} - create(createTrackDto: CreateTrackDto) { + async create(createTrackDto: CreateTrackDto) { return this.prismaService.track.create({ data: createTrackDto }); } - findAll() { + async findAll() { return this.prismaService.track.findMany(); } - findOne(id: string) { + async findOne(id: string) { return this.prismaService.track.findUnique({ where: { id } }); } - update(id: string, updateTrackDto: UpdateTrackDto) { - return this.prismaService.track.update({ - where: { id }, - data: updateTrackDto, - }); + async update(id: string, updateTrackDto: UpdateTrackDto) { + try { + return await this.prismaService.track.update({ + where: { id }, + data: updateTrackDto, + }); + } catch (e) { + return null; + } } - remove(id: string) { - // TODO: delete from favorite - // this.prismaService.favorite.track.delete(id); - return this.prismaService.track.delete({ where: { id } }); + async remove(id: string) { + try { + return await this.prismaService.track.delete({ where: { id } }); + } catch (e) { + return null; + } } } From 372f32377118af4d48c010bac72ea4607c126255 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:38:27 +0200 Subject: [PATCH 32/45] fix: user service prisma queries --- src/user/entities/user.entity.ts | 10 +------ src/user/user.controller.ts | 45 +++++++++++++++++--------------- src/user/user.service.ts | 27 ++++++++++++++----- 3 files changed, 45 insertions(+), 37 deletions(-) diff --git a/src/user/entities/user.entity.ts b/src/user/entities/user.entity.ts index 9e8b739..e830e15 100644 --- a/src/user/entities/user.entity.ts +++ b/src/user/entities/user.entity.ts @@ -1,8 +1,6 @@ import { Exclude } from 'class-transformer'; import * as uuid from 'uuid'; -import { UpdateUserDto } from '../dto/update-user.dto'; - export class User { public id: string; @@ -22,13 +20,7 @@ export class User { this.login = login; this.password = password; this.version = 1; - this.createdAt = Date.now(); + this.createdAt = 123; this.updatedAt = this.createdAt; } - - update({ newPassword }: UpdateUserDto) { - this.password = newPassword; - this.version += 1; - this.updatedAt = Date.now(); - } } diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index b2ce378..34f9c39 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -1,6 +1,5 @@ import { Body, - ClassSerializerInterceptor, Controller, Delete, ForbiddenException, @@ -12,43 +11,47 @@ import { ParseUUIDPipe, Post, Put, - UseInterceptors, UsePipes, ValidationPipe, } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; +import { User } from './entities/user.entity'; import { UserService } from './user.service'; import { errorMessage } from '../lib/const/const'; +import exclude from '../lib/shared/exclude'; +import formatUserDate from '../lib/shared/formatUserDate'; @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} - @UseInterceptors(ClassSerializerInterceptor) @UsePipes(new ValidationPipe()) @Post() - create(@Body() createUserDto: CreateUserDto) { - return this.userService.create(createUserDto); + async create(@Body() createUserDto: CreateUserDto) { + const user = await this.userService.create(createUserDto); + const updUser = formatUserDate(user); + return exclude(updUser!, ['password']); } - @UseInterceptors(ClassSerializerInterceptor) @Get() - findAll() { - return this.userService.findAll(); + async findAll() { + const users = await this.userService.findAll(); + const updUsers = users.map(formatUserDate); + return updUsers.map((user) => + exclude(user!, ['password']), + ); } - @UseInterceptors(ClassSerializerInterceptor) @Get(':id') - findOne(@Param('id', ParseUUIDPipe) id: string) { - const user = this.userService.findOne(id); - + async findOne(@Param('id', ParseUUIDPipe) id: string) { + const user = await this.userService.findOne(id); if (!user) throw new NotFoundException(errorMessage.USER_NOT_FOUND); - return user; + const updUser = formatUserDate(user); + return exclude(updUser!, ['password']); } - @UseInterceptors(ClassSerializerInterceptor) @UsePipes(new ValidationPipe()) @Put(':id') async update( @@ -64,17 +67,17 @@ export class UserController { if (!isSamePassword) throw new ForbiddenException(errorMessage.INVALID_PASSWORD); - const updatedUser = this.userService.update(id, updateUserDto); - return updatedUser; + const updatedUser = await this.userService.update(id, updateUserDto); + const updUser = formatUserDate(updatedUser!); + return exclude(updUser!, ['password']); } - @UseInterceptors(ClassSerializerInterceptor) @Delete(':id') @HttpCode(HttpStatus.NO_CONTENT) - remove(@Param('id', ParseUUIDPipe) id: string) { - const user = this.userService.remove(id); - + async remove(@Param('id', ParseUUIDPipe) id: string) { + const user = await this.userService.remove(id); if (!user) throw new NotFoundException(errorMessage.USER_NOT_FOUND); - return user; + const updUser = formatUserDate(user); + return exclude(updUser!, ['password']); } } diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 0cafb82..3316540 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -9,7 +9,9 @@ export class UserService { constructor(private readonly prismaService: PrismaService) {} async create(createUserDto: CreateUserDto) { - return this.prismaService.user.create({ data: createUserDto }); + return this.prismaService.user.create({ + data: createUserDto, + }); } async findAll() { @@ -20,14 +22,25 @@ export class UserService { return this.prismaService.user.findUnique({ where: { id } }); } - async update(id: string, updateUserDto: UpdateUserDto) { - return this.prismaService.user.update({ - where: { id }, - data: updateUserDto, - }); + async update(id: string, { newPassword }: UpdateUserDto) { + try { + return await this.prismaService.user.update({ + where: { id }, + data: { + password: newPassword, + version: { increment: 1 }, + }, + }); + } catch (e) { + return null; + } } async remove(id: string) { - return this.prismaService.user.delete({ where: { id } }); + try { + return await this.prismaService.user.delete({ where: { id } }); + } catch (e) { + return null; + } } } From 4bf6b31a45fb5080df17ef0616275c81a7861cc4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:38:44 +0200 Subject: [PATCH 33/45] chore: delete sql migrations --- .../20240315135526_init/migration.sql | 51 ------------------- prisma/migrations/migration_lock.toml | 3 -- 2 files changed, 54 deletions(-) delete mode 100644 prisma/migrations/20240315135526_init/migration.sql delete mode 100644 prisma/migrations/migration_lock.toml diff --git a/prisma/migrations/20240315135526_init/migration.sql b/prisma/migrations/20240315135526_init/migration.sql deleted file mode 100644 index 1cbc79a..0000000 --- a/prisma/migrations/20240315135526_init/migration.sql +++ /dev/null @@ -1,51 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "login" TEXT NOT NULL, - "password" TEXT NOT NULL, - "version" INTEGER NOT NULL DEFAULT 1, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Artist" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "grammy" BOOLEAN NOT NULL, - - CONSTRAINT "Artist_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Track" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "artistId" TEXT, - "albumId" TEXT, - "duration" INTEGER NOT NULL, - - CONSTRAINT "Track_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Album" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "year" INTEGER NOT NULL, - "artistId" TEXT, - - CONSTRAINT "Album_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Favorites" ( - "id" TEXT NOT NULL, - "artists" TEXT[], - "albums" TEXT[], - "tracks" TEXT[], - - CONSTRAINT "Favorites_pkey" PRIMARY KEY ("id") -); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index fbffa92..0000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file From 00c7f8aa73bdff82078ffd70518bc2b09e0806ae Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 19:39:43 +0200 Subject: [PATCH 34/45] refactor: remove user update method --- db/userDB.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/db/userDB.ts b/db/userDB.ts index 873bda7..985a4ad 100644 --- a/db/userDB.ts +++ b/db/userDB.ts @@ -1,6 +1,5 @@ import { DB } from './types/interfaces'; import { CreateUserDto } from '../src/user/dto/create-user.dto'; -import { UpdateUserDto } from '../src/user/dto/update-user.dto'; import { User } from '../src/user/entities/user.entity'; import { DBTable } from '../types/types'; @@ -33,10 +32,8 @@ class UserDB implements DB { return toDeleteUser; } - update(id: string, dto: UpdateUserDto): User | undefined { - const user = this.#table[id]; - user?.update(dto); - return user; + update(): User | undefined { + return null as unknown as User; } } From 883d478c2f14baf4d52885d512ba88c82424bb5b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 18 Mar 2024 19:02:45 +0200 Subject: [PATCH 35/45] refactor: remove in-memory db --- Dockerfile | 1 - db/albumDB.ts | 58 --------------------------- db/artistDB.ts | 49 ----------------------- db/db.ts | 17 -------- db/favorite/favoriteAlbumDB.ts | 37 ------------------ db/favorite/favoriteArtistDB.ts | 37 ------------------ db/favorite/favoriteDB.ts | 13 ------- db/favorite/favoriteTrackDB.ts | 37 ------------------ db/trackDB.ts | 67 -------------------------------- db/types/interfaces.ts | 10 ----- db/userDB.ts | 40 ------------------- src/app.module.ts | 2 - src/database/database.module.ts | 9 ----- src/database/database.service.ts | 7 ---- 14 files changed, 384 deletions(-) delete mode 100644 db/albumDB.ts delete mode 100644 db/artistDB.ts delete mode 100644 db/db.ts delete mode 100644 db/favorite/favoriteAlbumDB.ts delete mode 100644 db/favorite/favoriteArtistDB.ts delete mode 100644 db/favorite/favoriteDB.ts delete mode 100644 db/favorite/favoriteTrackDB.ts delete mode 100644 db/trackDB.ts delete mode 100644 db/types/interfaces.ts delete mode 100644 db/userDB.ts delete mode 100644 src/database/database.module.ts delete mode 100644 src/database/database.service.ts diff --git a/Dockerfile b/Dockerfile index aee2188..70d8705 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,6 @@ FROM node:${NODE_VERSION}-alpine as runtime-stage WORKDIR /app COPY --from=build-stage /app/src ./src -COPY --from=build-stage /app/db ./db COPY --from=build-stage /app/types ./types COPY --from=build-stage /app/.env ./ COPY --from=build-stage /app/tsconfig.json ./ diff --git a/db/albumDB.ts b/db/albumDB.ts deleted file mode 100644 index 6a6948e..0000000 --- a/db/albumDB.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { DB } from './types/interfaces'; -import { CreateAlbumDto } from '../src/album/dto/create-album.dto'; -import { UpdateAlbumDto } from '../src/album/dto/update-album.dto'; -import { Album } from '../src/album/entities/album.entity'; -import { DBTable } from '../types/types'; - -class AlbumDB implements DB { - #table: DBTable = {}; - - findById(id: string): Album | undefined { - return this.#table[id]; - } - - findByArtistId(id: string): Album | undefined { - return Object.values(this.#table).find((album) => album?.artistId === id); - } - - deleteArtist(id: string) { - const album = this.findByArtistId(id); - if (album) album.artistId = null; - } - - findMany(): Album[] { - return Object.values(this.#table); - } - - create({ name, artistId, year }: CreateAlbumDto): Album | undefined { - const artist = new Album(name, year, artistId); - this.#table[artist.id] = artist; - return artist; - } - - delete(id: string): Album | undefined { - const toDeleteAlbum = this.#table[id]; - - if (!toDeleteAlbum) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, artist]) => artist !== toDeleteAlbum, - ), - ); - - return toDeleteAlbum; - } - - update(id: string, dto: UpdateAlbumDto): Album | undefined { - const artist = this.#table[id]; - - if (!artist) return undefined; - - const newArtist = { ...artist, ...dto }; - this.#table[id] = newArtist; - return newArtist; - } -} - -export default new AlbumDB(); diff --git a/db/artistDB.ts b/db/artistDB.ts deleted file mode 100644 index 52c8f4e..0000000 --- a/db/artistDB.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DB } from './types/interfaces'; -import { CreateArtistDto } from '../src/artist/dto/create-artist.dto'; -import { UpdateArtistDto } from '../src/artist/dto/update-artist.dto'; -import { Artist } from '../src/artist/entities/artist.entity'; -import { DBTable } from '../types/types'; - -class ArtistDB implements DB { - #table: DBTable = {}; - - findById(id: string): Artist | undefined { - return this.#table[id]; - } - - findMany(): Artist[] { - return Object.values(this.#table); - } - - create({ name, grammy }: CreateArtistDto): Artist | undefined { - const artist = new Artist(name, grammy); - this.#table[artist.id] = artist; - return artist; - } - - delete(id: string): Artist | undefined { - const toDeleteArtist = this.#table[id]; - - if (!toDeleteArtist) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, artist]) => artist !== toDeleteArtist, - ), - ); - - return toDeleteArtist; - } - - update(id: string, dto: UpdateArtistDto): Artist | undefined { - const artist = this.#table[id]; - - if (!artist) return undefined; - - const newArtist = { ...artist, ...dto }; - this.#table[id] = newArtist; - return newArtist; - } -} - -export default new ArtistDB(); diff --git a/db/db.ts b/db/db.ts deleted file mode 100644 index b41ce7d..0000000 --- a/db/db.ts +++ /dev/null @@ -1,17 +0,0 @@ -import AlbumDB from './albumDB'; -import ArtistDB from './artistDB'; -import FavoriteDB from './favorite/favoriteDB'; -import TrackDB from './trackDB'; -import UserDB from './userDB'; - -export class DB { - public user = UserDB; - - public track = TrackDB; - - public artist = ArtistDB; - - public album = AlbumDB; - - public favorite = FavoriteDB; -} diff --git a/db/favorite/favoriteAlbumDB.ts b/db/favorite/favoriteAlbumDB.ts deleted file mode 100644 index 1bb7a8a..0000000 --- a/db/favorite/favoriteAlbumDB.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Album } from '../../src/album/entities/album.entity'; -import { DBTable } from '../../types/types'; -import AlbumDB from '../albumDB'; -import { FavoriteDB } from '../types/interfaces'; - -class FavoriteAlbumDB implements FavoriteDB { - #table: DBTable = {}; - - findMany(): Album[] { - return Object.values(this.#table); - } - - create(id: string): Album | undefined { - const album = AlbumDB.findById(id); - - if (!album) return undefined; - - this.#table[id] = album; - return album; - } - - delete(id: string): Album | undefined { - const toDeleteAlbum = this.#table[id]; - - if (!toDeleteAlbum) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, album]) => album !== toDeleteAlbum, - ), - ); - - return toDeleteAlbum; - } -} - -export default new FavoriteAlbumDB(); diff --git a/db/favorite/favoriteArtistDB.ts b/db/favorite/favoriteArtistDB.ts deleted file mode 100644 index bb167e8..0000000 --- a/db/favorite/favoriteArtistDB.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Artist } from '../../src/artist/entities/artist.entity'; -import { DBTable } from '../../types/types'; -import ArtistDB from '../artistDB'; -import { FavoriteDB } from '../types/interfaces'; - -class FavoriteArtistDB implements FavoriteDB { - #table: DBTable = {}; - - findMany(): Artist[] { - return Object.values(this.#table); - } - - create(id: string): Artist | undefined { - const artist = ArtistDB.findById(id); - - if (!artist) return undefined; - - this.#table[id] = artist; - return artist; - } - - delete(id: string): Artist | undefined { - const toDeleteArtist = this.#table[id]; - - if (!toDeleteArtist) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, artist]) => artist !== toDeleteArtist, - ), - ); - - return toDeleteArtist; - } -} - -export default new FavoriteArtistDB(); diff --git a/db/favorite/favoriteDB.ts b/db/favorite/favoriteDB.ts deleted file mode 100644 index b0edb2c..0000000 --- a/db/favorite/favoriteDB.ts +++ /dev/null @@ -1,13 +0,0 @@ -import FavoriteAlbumDB from './favoriteAlbumDB'; -import FavoriteArtistDB from './favoriteArtistDB'; -import FavoriteTrackDB from './favoriteTrackDB'; - -class FavoriteDB { - public track = FavoriteTrackDB; - - public album = FavoriteAlbumDB; - - public artist = FavoriteArtistDB; -} - -export default new FavoriteDB(); diff --git a/db/favorite/favoriteTrackDB.ts b/db/favorite/favoriteTrackDB.ts deleted file mode 100644 index 3278a2c..0000000 --- a/db/favorite/favoriteTrackDB.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Track } from '../../src/track/entities/track.entity'; -import { DBTable } from '../../types/types'; -import TrackDB from '../trackDB'; -import { FavoriteDB } from '../types/interfaces'; - -class FavoriteTrackDB implements FavoriteDB { - #table: DBTable = {}; - - findMany(): Track[] { - return Object.values(this.#table); - } - - create(id: string): Track | undefined { - const track = TrackDB.findById(id); - - if (!track) return undefined; - - this.#table[id] = track; - return track; - } - - delete(id: string): Track | undefined { - const toDeleteTrack = this.#table[id]; - - if (!toDeleteTrack) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, track]) => track !== toDeleteTrack, - ), - ); - - return toDeleteTrack; - } -} - -export default new FavoriteTrackDB(); diff --git a/db/trackDB.ts b/db/trackDB.ts deleted file mode 100644 index 13896d6..0000000 --- a/db/trackDB.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { DB } from './types/interfaces'; -import { CreateTrackDto } from '../src/track/dto/create-track.dto'; -import { UpdateTrackDto } from '../src/track/dto/update-track.dto'; -import { Track } from '../src/track/entities/track.entity'; -import { DBTable } from '../types/types'; - -class TrackDB implements DB { - #table: DBTable = {}; - - findByArtistId(id: string): Track | undefined { - return Object.values(this.#table).find((track) => track?.artistId === id); - } - - findByAlbumById(id: string): Track | undefined { - return Object.values(this.#table).find((track) => track?.albumId === id); - } - - deleteArtist(id: string) { - const track = this.findByArtistId(id); - if (track) track.artistId = null; - } - - deleteAlbum(id: string) { - const track = this.findByAlbumById(id); - if (track) track.albumId = null; - } - - findById(id: string): Track | undefined { - return this.#table[id]; - } - - findMany(): Track[] { - return Object.values(this.#table); - } - - create({ name, duration, artistId, albumId }: CreateTrackDto): Track { - const track = new Track(name, duration, artistId, albumId); - this.#table[track.id] = track; - return track; - } - - delete(id: string): Track | undefined { - const toDeleteTrack = this.#table[id]; - - if (!toDeleteTrack) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter( - ([, track]) => track !== toDeleteTrack, - ), - ); - - return toDeleteTrack; - } - - update(id: string, dto: UpdateTrackDto): Track | undefined { - const track = this.#table[id]; - - if (!track) return undefined; - - const newTrack = { ...track, ...dto }; - this.#table[id] = newTrack; - return newTrack; - } -} - -export default new TrackDB(); diff --git a/db/types/interfaces.ts b/db/types/interfaces.ts deleted file mode 100644 index 46e35c9..0000000 --- a/db/types/interfaces.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface DB { - findById(id: string): TEntity | undefined; - findMany(): TEntity[]; - create(dto: unknown): TEntity | undefined; - delete(id: string): TEntity | undefined; - update(id: string, dto: unknown): TEntity | undefined; -} - -export interface FavoriteDB - extends Pick, 'findMany' | 'create' | 'delete'> {} diff --git a/db/userDB.ts b/db/userDB.ts deleted file mode 100644 index 985a4ad..0000000 --- a/db/userDB.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { DB } from './types/interfaces'; -import { CreateUserDto } from '../src/user/dto/create-user.dto'; -import { User } from '../src/user/entities/user.entity'; -import { DBTable } from '../types/types'; - -class UserDB implements DB { - #table: DBTable = {}; - - findById(id: string): User | undefined { - return this.#table[id]; - } - - findMany(): User[] { - return Object.values(this.#table); - } - - create({ login, password }: CreateUserDto): User { - const user = new User(login, password); - this.#table[user.id] = user; - return user; - } - - delete(id: string): User | undefined { - const toDeleteUser = this.#table[id]; - - if (!toDeleteUser) return undefined; - - this.#table = Object.fromEntries( - Object.entries(this.#table).filter(([, user]) => user !== toDeleteUser), - ); - - return toDeleteUser; - } - - update(): User | undefined { - return null as unknown as User; - } -} - -export default new UserDB(); diff --git a/src/app.module.ts b/src/app.module.ts index a4c553a..1a80393 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,7 +5,6 @@ import { AlbumModule } from './album/album.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ArtistModule } from './artist/artist.module'; -import { DatabaseModule } from './database/database.module'; import { FavoriteModule } from './favorite/favorite.module'; import { PrismaModule } from './prisma/prisma.module'; import { TrackModule } from './track/track.module'; @@ -14,7 +13,6 @@ import { UserModule } from './user/user.module'; @Module({ imports: [ UserModule, - DatabaseModule, TrackModule, ArtistModule, AlbumModule, diff --git a/src/database/database.module.ts b/src/database/database.module.ts deleted file mode 100644 index 53280ec..0000000 --- a/src/database/database.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { DatabaseService } from './database.service'; - -@Module({ - providers: [DatabaseService], - exports: [DatabaseService], -}) -export class DatabaseModule {} diff --git a/src/database/database.service.ts b/src/database/database.service.ts deleted file mode 100644 index 373bd47..0000000 --- a/src/database/database.service.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { DB } from '../../db/db'; - -// TODO: change to use Prisma client -@Injectable() -export class DatabaseService extends DB {} From b4ce9003e1a5124ef15f34359b63a3b269ddca4a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 18 Mar 2024 19:03:04 +0200 Subject: [PATCH 36/45] refactor: change favorites to use prisma --- src/favorite/favorite.controller.ts | 26 +++++----- src/favorite/favorite.module.ts | 3 +- src/favorite/favorite.service.ts | 73 ++++++++++++++++++++++------- 3 files changed, 69 insertions(+), 33 deletions(-) diff --git a/src/favorite/favorite.controller.ts b/src/favorite/favorite.controller.ts index 11d92e3..651171c 100644 --- a/src/favorite/favorite.controller.ts +++ b/src/favorite/favorite.controller.ts @@ -21,8 +21,8 @@ export class FavoriteController { @UsePipes(new ValidationPipe()) @Post('track/:id') - createTrack(@Param('id', ParseUUIDPipe) id: string) { - const track = this.favoriteService.createTrack(id); + async createTrack(@Param('id', ParseUUIDPipe) id: string) { + const track = await this.favoriteService.createTrack(id); if (!track) throw new UnprocessableEntityException(errorMessage.TRACK_NOT_FOUND); return track; @@ -30,8 +30,8 @@ export class FavoriteController { @UsePipes(new ValidationPipe()) @Post('album/:id') - createAlbum(@Param('id', ParseUUIDPipe) id: string) { - const album = this.favoriteService.createAlbum(id); + async createAlbum(@Param('id', ParseUUIDPipe) id: string) { + const album = await this.favoriteService.createAlbum(id); if (!album) throw new UnprocessableEntityException(errorMessage.ALBUM_NOT_FOUND); return album; @@ -39,22 +39,22 @@ export class FavoriteController { @UsePipes(new ValidationPipe()) @Post('artist/:id') - createArtist(@Param('id', ParseUUIDPipe) id: string) { - const artist = this.favoriteService.createArtist(id); + async createArtist(@Param('id', ParseUUIDPipe) id: string) { + const artist = await this.favoriteService.createArtist(id); if (!artist) throw new UnprocessableEntityException(errorMessage.ARTIST_NOT_FOUND); return artist; } @Get() - findAll() { + async findAll() { return this.favoriteService.findAll(); } @Delete('track/:id') @HttpCode(HttpStatus.NO_CONTENT) - removeTrack(@Param('id', ParseUUIDPipe) id: string) { - const track = this.favoriteService.removeTrack(id); + async removeTrack(@Param('id', ParseUUIDPipe) id: string) { + const track = await this.favoriteService.removeTrack(id); if (!track) throw new UnprocessableEntityException(errorMessage.TRACK_NOT_FOUND); return track; @@ -62,8 +62,8 @@ export class FavoriteController { @Delete('album/:id') @HttpCode(HttpStatus.NO_CONTENT) - removeAlbum(@Param('id', ParseUUIDPipe) id: string) { - const album = this.favoriteService.removeAlbum(id); + async removeAlbum(@Param('id', ParseUUIDPipe) id: string) { + const album = await this.favoriteService.removeAlbum(id); if (!album) throw new UnprocessableEntityException(errorMessage.ALBUM_NOT_FOUND); return album; @@ -71,8 +71,8 @@ export class FavoriteController { @Delete('artist/:id') @HttpCode(HttpStatus.NO_CONTENT) - removeArtist(@Param('id', ParseUUIDPipe) id: string) { - const artist = this.favoriteService.removeArtist(id); + async removeArtist(@Param('id', ParseUUIDPipe) id: string) { + const artist = await this.favoriteService.removeArtist(id); if (!artist) throw new UnprocessableEntityException(errorMessage.ARTIST_NOT_FOUND); return artist; diff --git a/src/favorite/favorite.module.ts b/src/favorite/favorite.module.ts index 30aed88..b7ac9f6 100644 --- a/src/favorite/favorite.module.ts +++ b/src/favorite/favorite.module.ts @@ -2,11 +2,10 @@ import { Module } from '@nestjs/common'; import { FavoriteController } from './favorite.controller'; import { FavoriteService } from './favorite.service'; -import { DatabaseModule } from '../database/database.module'; import { PrismaModule } from '../prisma/prisma.module'; @Module({ - imports: [DatabaseModule, PrismaModule], + imports: [PrismaModule], controllers: [FavoriteController], providers: [FavoriteService], }) diff --git a/src/favorite/favorite.service.ts b/src/favorite/favorite.service.ts index c5c82d0..23ac9d8 100644 --- a/src/favorite/favorite.service.ts +++ b/src/favorite/favorite.service.ts @@ -1,50 +1,87 @@ import { Injectable } from '@nestjs/common'; -import { DatabaseService } from '../database/database.service'; import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class FavoriteService { - constructor( - private readonly databaseService: DatabaseService, - private readonly prismaService: PrismaService, - ) {} + constructor(private readonly prismaService: PrismaService) {} + + async createTrack(id: string) { + const favorites = await this.prismaService.favorites.findUnique({ + where: { id: 'favs' }, + }); + + if (!favorites) { + await this.prismaService.favorites.create({ + data: { id: 'favs' }, + }); + } - createTrack(id: string) { return this.prismaService.track.update({ where: { id }, data: { favoritesId: 'favs' }, }); } - createAlbum(id: string) { - return this.databaseService.favorite.album.create(id); + async createAlbum(id: string) { + const favorites = await this.prismaService.favorites.findUnique({ + where: { id: 'favs' }, + }); + + if (!favorites) { + await this.prismaService.favorites.create({ + data: { id: 'favs' }, + }); + } + + return this.prismaService.album.update({ + where: { id }, + data: { favoritesId: 'favs' }, + }); } - createArtist(id: string) { - return this.databaseService.favorite.artist.create(id); + async createArtist(id: string) { + const favorites = await this.prismaService.favorites.findUnique({ + where: { id: 'favs' }, + }); + + if (!favorites) { + await this.prismaService.favorites.create({ + data: { id: 'favs' }, + }); + } + + return this.prismaService.artist.update({ + where: { id }, + data: { favoritesId: 'favs' }, + }); } async findAll() { - const data = await this.prismaService.favorites.findUnique({ + return this.prismaService.favorites.findMany({ where: { id: 'favs' }, select: { artists: true, albums: true, tracks: true }, }); - - console.log(data); - - return data; } removeTrack(id: string) { - return this.databaseService.favorite.track.delete(id); + return this.prismaService.track.update({ + where: { id }, + data: { favoritesId: null }, + }); } removeAlbum(id: string) { - return this.databaseService.favorite.album.delete(id); + return this.prismaService.album.update({ + where: { id }, + data: { favoritesId: null }, + }); } removeArtist(id: string) { - return this.databaseService.favorite.artist.delete(id); + return this.prismaService.artist.update({ + where: { id }, + data: { favoritesId: null }, + }); } } From 4ce149d14bac05df5488bf1a699ae17ab2d220b5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Mar 2024 18:51:57 +0200 Subject: [PATCH 37/45] refactor: make exclude util more generic --- src/lib/shared/exclude.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/shared/exclude.ts b/src/lib/shared/exclude.ts index b0310e6..5497f33 100644 --- a/src/lib/shared/exclude.ts +++ b/src/lib/shared/exclude.ts @@ -1,11 +1,11 @@ -function exclude( - user: User, +function exclude( + entity: TEntity, keys: Key[], -): Omit { +): Omit { return Object.fromEntries( - Object.entries(user as { [k: string]: unknown }).filter( + Object.entries(entity as { [k: string]: unknown }).filter( ([key]) => !keys.includes(key as Key), ), - ) as Omit; + ) as Omit; } export default exclude; From 4f48e836148c488c36954ea0b755f2d49606d111 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Mar 2024 18:52:25 +0200 Subject: [PATCH 38/45] refactor: save favs table if in constant --- src/lib/const/const.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/const/const.ts b/src/lib/const/const.ts index 3359cbf..3e0719b 100644 --- a/src/lib/const/const.ts +++ b/src/lib/const/const.ts @@ -14,3 +14,5 @@ export const SWAGGER_CONFIG = new DocumentBuilder() .setVersion('1.0') .addTag('Home Library') .build(); + +export const FAVS_TABLE_ID = 'favs'; From ad58f18870cfc836705915a60187f924d0a5bd0e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Mar 2024 18:52:52 +0200 Subject: [PATCH 39/45] fix: favorite entity prisma queries --- src/favorite/favorite.service.ts | 109 ++++++++++++++++--------------- src/prisma/prisma.service.ts | 12 ++++ 2 files changed, 69 insertions(+), 52 deletions(-) diff --git a/src/favorite/favorite.service.ts b/src/favorite/favorite.service.ts index 23ac9d8..c259948 100644 --- a/src/favorite/favorite.service.ts +++ b/src/favorite/favorite.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; +import exclude from '../lib/shared/exclude'; import { PrismaService } from '../prisma/prisma.service'; @Injectable() @@ -7,81 +8,85 @@ export class FavoriteService { constructor(private readonly prismaService: PrismaService) {} async createTrack(id: string) { - const favorites = await this.prismaService.favorites.findUnique({ - where: { id: 'favs' }, - }); - - if (!favorites) { - await this.prismaService.favorites.create({ - data: { id: 'favs' }, + try { + return await this.prismaService.track.update({ + where: { id }, + data: { favoritesId: 'favs' }, }); + } catch (e) { + return null; } - - return this.prismaService.track.update({ - where: { id }, - data: { favoritesId: 'favs' }, - }); } async createAlbum(id: string) { - const favorites = await this.prismaService.favorites.findUnique({ - where: { id: 'favs' }, - }); - - if (!favorites) { - await this.prismaService.favorites.create({ - data: { id: 'favs' }, + try { + return await this.prismaService.album.update({ + where: { id }, + data: { favoritesId: 'favs' }, }); + } catch (e) { + return null; } - - return this.prismaService.album.update({ - where: { id }, - data: { favoritesId: 'favs' }, - }); } async createArtist(id: string) { - const favorites = await this.prismaService.favorites.findUnique({ - where: { id: 'favs' }, - }); - - if (!favorites) { - await this.prismaService.favorites.create({ - data: { id: 'favs' }, + try { + return await this.prismaService.artist.update({ + where: { id }, + data: { favoritesId: 'favs' }, }); + } catch (e) { + return null; } - - return this.prismaService.artist.update({ - where: { id }, - data: { favoritesId: 'favs' }, - }); } async findAll() { - return this.prismaService.favorites.findMany({ + const data = await this.prismaService.favorites.findMany({ where: { id: 'favs' }, select: { artists: true, albums: true, tracks: true }, }); + + const clearData = { + albums: data['0']?.albums.map((el) => exclude(el, ['favoritesId'])), + artists: data['0']?.artists.map((el) => exclude(el, ['favoritesId'])), + tracks: data['0']?.tracks.map((el) => exclude(el, ['favoritesId'])), + }; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return { artists: [], albums: [], tracks: [], ...clearData }; } - removeTrack(id: string) { - return this.prismaService.track.update({ - where: { id }, - data: { favoritesId: null }, - }); + async removeTrack(id: string) { + try { + return await this.prismaService.track.update({ + where: { id }, + data: { favoritesId: null }, + }); + } catch (e) { + return null; + } } - removeAlbum(id: string) { - return this.prismaService.album.update({ - where: { id }, - data: { favoritesId: null }, - }); + async removeAlbum(id: string) { + try { + return await this.prismaService.album.update({ + where: { id }, + data: { favoritesId: null }, + }); + } catch (e) { + return null; + } } - removeArtist(id: string) { - return this.prismaService.artist.update({ - where: { id }, - data: { favoritesId: null }, - }); + async removeArtist(id: string) { + try { + return await this.prismaService.artist.update({ + where: { id }, + data: { favoritesId: null }, + }); + } catch (e) { + return null; + } } } diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index 617ccb0..6b6f8c6 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -6,6 +6,8 @@ import { } from '@nestjs/common'; import { Prisma, PrismaClient } from '@prisma/client'; +import { FAVS_TABLE_ID } from '../lib/const/const'; + @Injectable() export class PrismaService extends PrismaClient @@ -13,6 +15,16 @@ export class PrismaService { async onModuleInit() { await this.$connect(); + + const favorites = await this.favorites.findUnique({ + where: { id: FAVS_TABLE_ID }, + }); + + if (!favorites) { + await this.favorites.create({ + data: { id: FAVS_TABLE_ID }, + }); + } } async onModuleDestroy() { From a66431aed6fa284005d9476ac1258b7a6601a472 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 20 Mar 2024 18:53:10 +0200 Subject: [PATCH 40/45] chore: update prisma dependencies --- package-lock.json | 64 +++++++++++++++++++++++------------------------ package.json | 4 +-- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46681d7..68ea5dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@nestjs/mapped-types": "^2.0.5", "@nestjs/platform-express": "^10.3.3", "@nestjs/swagger": "^7.3.0", - "@prisma/client": "^5.10.2", + "@prisma/client": "^5.11.0", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", @@ -55,7 +55,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.7.0", "prettier": "^3.2.5", - "prisma": "^5.10.2", + "prisma": "^5.11.0", "source-map-support": "^0.5.21", "supertest": "^6.2.4", "ts-jest": "^29.1.2", @@ -2277,9 +2277,9 @@ } }, "node_modules/@prisma/client": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.10.2.tgz", - "integrity": "sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.11.0.tgz", + "integrity": "sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==", "hasInstallScript": true, "engines": { "node": ">=16.13" @@ -2294,48 +2294,48 @@ } }, "node_modules/@prisma/debug": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.10.2.tgz", - "integrity": "sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.11.0.tgz", + "integrity": "sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==", "devOptional": true }, "node_modules/@prisma/engines": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.10.2.tgz", - "integrity": "sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.11.0.tgz", + "integrity": "sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/debug": "5.10.2", - "@prisma/engines-version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", - "@prisma/fetch-engine": "5.10.2", - "@prisma/get-platform": "5.10.2" + "@prisma/debug": "5.11.0", + "@prisma/engines-version": "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102", + "@prisma/fetch-engine": "5.11.0", + "@prisma/get-platform": "5.11.0" } }, "node_modules/@prisma/engines-version": { - "version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9.tgz", - "integrity": "sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==", + "version": "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102.tgz", + "integrity": "sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==", "devOptional": true }, "node_modules/@prisma/fetch-engine": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.10.2.tgz", - "integrity": "sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.11.0.tgz", + "integrity": "sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==", "devOptional": true, "dependencies": { - "@prisma/debug": "5.10.2", - "@prisma/engines-version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", - "@prisma/get-platform": "5.10.2" + "@prisma/debug": "5.11.0", + "@prisma/engines-version": "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102", + "@prisma/get-platform": "5.11.0" } }, "node_modules/@prisma/get-platform": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.10.2.tgz", - "integrity": "sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.11.0.tgz", + "integrity": "sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==", "devOptional": true, "dependencies": { - "@prisma/debug": "5.10.2" + "@prisma/debug": "5.11.0" } }, "node_modules/@sinclair/typebox": { @@ -9167,13 +9167,13 @@ } }, "node_modules/prisma": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.10.2.tgz", - "integrity": "sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.11.0.tgz", + "integrity": "sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.10.2" + "@prisma/engines": "5.11.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index 628181c..943107a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@nestjs/mapped-types": "^2.0.5", "@nestjs/platform-express": "^10.3.3", "@nestjs/swagger": "^7.3.0", - "@prisma/client": "^5.10.2", + "@prisma/client": "^5.11.0", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", @@ -75,7 +75,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.7.0", "prettier": "^3.2.5", - "prisma": "^5.10.2", + "prisma": "^5.11.0", "source-map-support": "^0.5.21", "supertest": "^6.2.4", "ts-jest": "^29.1.2", From f3a3a5468e7eacbd445307e2420dca62250c9691 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Mar 2024 23:01:55 +0200 Subject: [PATCH 41/45] chore: change prisma to "push" instead of "migrate" --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 943107a..10e8a2e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine", - "start:migrate:dev": "prisma migrate dev --name init && npm run start:dev" + "start:migrate:dev": "npx prisma db push && npm run start:dev" }, "engines": { "node": "20.0.0" From 25215def04205fda18f16c8b7c150483cbafd4b2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 21 Mar 2024 23:14:55 +0200 Subject: [PATCH 42/45] chore: add logs volumes --- docker-compose.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 5328ea4..b9dd067 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -30,6 +30,7 @@ services: - POSTGRES_DB=${POSTGRES_DB} volumes: - db-data:/var/lib/postgresql/data + - logs:/home/logs ports: - ${POSTGRES_PORT}:${POSTGRES_PORT} healthcheck: @@ -42,6 +43,7 @@ services: volumes: db-data: + logs: networks: app-network: From 8faf16d999386b0d0d9b7bdcc579082e7e68c934 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 23 Mar 2024 19:35:12 +0200 Subject: [PATCH 43/45] chore: change docker to use prisma migrate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10e8a2e..5f2f353 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine", - "start:migrate:dev": "npx prisma db push && npm run start:dev" + "start:migrate:dev": "npx prisma migrate dev --name init && npm run start:dev" }, "engines": { "node": "20.0.0" From 8385d93d339650b144ba269791289e27005c29b5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 23 Mar 2024 19:41:25 +0200 Subject: [PATCH 44/45] docs: update readme --- README.md | 58 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 50324c6..6139417 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,11 @@ To run the project locally, you would have to download zip file with the reposit ๐Ÿค” What things do you need to do in order to run our project locally? * โšก Use node 20 LTS -* โœŒ๏ธ Installed [.git](https://git-scm.com/) on your computer. +* โœŒ๏ธ Installed [.git](https://git-scm.com/) on your computer. * ๐Ÿ“ Code Editor of your choice. +* ๐Ÿณ Docker. -## ๐Ÿ”ฎ Installation And Preparation +## ๐Ÿ”ฎ Installation And Preparation First make sure you have all the things listed in the previous section. Then clone our repository to your computer: ๐Ÿ‘Œ @@ -41,11 +42,17 @@ JWT_SECRET_KEY=secret123123 JWT_SECRET_REFRESH_KEY=secret123123 TOKEN_EXPIRE_TIME=1h TOKEN_REFRESH_EXPIRE_TIME=24h + +POSTGRES_USER=myuser +POSTGRES_PASSWORD=mypassword +POSTGRES_DB=home-library +POSTGRES_PORT=5432 +DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public" ``` ๐Ÿคฉ Finally run a development server: ``` -npm run start:dev +docker compose up ``` Aaaaand you're done! ๐ŸŽ‰๐Ÿฅณ @@ -100,7 +107,7 @@ Type check the App with `TypeScript`: npm run type-check ``` -## ๐Ÿงช Testing +## ๐Ÿงช Testing After application running open new terminal and enter: @@ -128,32 +135,47 @@ To run only specific test suite with authorization npm run test:auth -- ``` +## ๐Ÿณ Docker +Run application +``` +docker compose up +``` +Run application in watch mode +``` +docker compose watch +``` +Scan docker images for vulnerabilities +``` +npm run docker:scan +``` + # โš™๏ธ Technology Stack ## ๐Ÿฆˆ Developing -* ๐Ÿฆ… **Nest.js** - The Backend Framework +* ๐Ÿฆ… **Nest.js** - The Backend Framework * ๐Ÿ’– **TypeScript** - The Language -* ๐Ÿฆ„ **Prisma** - The ORM -* ๐Ÿ”’ **bcrypt** - The Password Hasher -* ๐ŸŽซ **jsonwebtoken** - The JWT Token Generator -* ๐Ÿ“– **Nest.js/Swagger** - The OpenAPI Documentation +* ๐Ÿฆ„ **Prisma** - The ORM +* ๐Ÿ”’ **bcrypt** - The Password Hasher +* ๐ŸŽซ **jsonwebtoken** - The JWT Token Generator +* ๐Ÿ“– **Nest.js/Swagger** - The OpenAPI Documentation +* ๐Ÿณ **Docker** - The Containerization tool ## ๐Ÿงน Code Quality -* ๐Ÿงช **Jest** - The Test Runner -* ๐Ÿซ‚ **Supertest** - The Testing Framework -* ๐Ÿ”” **ESLint** โ€” Air-bnb base - The Linter -* ๐Ÿ‘ **Prettier** - The Code Formatter -* ๐Ÿ˜Ž **EditorConfig** - The Code Style Enforcer +* ๐Ÿงช **Jest** - The Test Runner +* ๐Ÿซ‚ **Supertest** - The Testing Framework +* ๐Ÿ”” **ESLint** โ€” Air-bnb base - The Linter +* ๐Ÿ‘ **Prettier** - The Code Formatter +* ๐Ÿ˜Ž **EditorConfig** - The Code Style Enforcer -## ๐Ÿ“š External Libraries -* โœŒ๏ธ **dotenv** - The Environment Variables Library -* ๐ŸŒ **cross-env** - The Environment Variables Loader +## ๐Ÿ“š External Libraries +* โœŒ๏ธ **dotenv** - The Environment Variables Library +* ๐ŸŒ **cross-env** - The Environment Variables Loader # ๐Ÿ“ Working with the API ๐Ÿ™ Following the link below, you can find ```Postman``` collection that will make your life easier while working with the API! [postman collection](https://www.postman.com/bold-spaceship-739379/workspace/node-js-service/overview) -![img.png](./public/img.png) +![img.png](public/img.png) ## ๐ŸŒŠ API endpoints The API has the following endpoints: From 680fa48ef9ee83a0371737e502fdb797bbad53b7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 25 Mar 2024 16:07:10 +0200 Subject: [PATCH 45/45] chore: change to reset migrations --- Dockerfile | 2 +- package.json | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 70d8705..ba3206e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,4 +36,4 @@ RUN npm i && npm i @nestjs/cli \ EXPOSE ${PORT} -CMD [ "npm", "run", "start:migrate:dev" ] +CMD [ "npm", "run", "start:migrate:dev" ] diff --git a/package.json b/package.json index 5f2f353..2a72cf4 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,9 @@ "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "docker:scan": "docker login && docker scout cves nodejs2024q1-service-server && docker scout cves postgres:16.2-alpine", - "start:migrate:dev": "npx prisma migrate dev --name init && npm run start:dev" + "prisma:migrate:reset": "npx prisma migrate reset --force", + "prisma:migrate": "npx prisma migrate dev --name init", + "start:migrate:dev": "npm run prisma:migrate:reset && npm run prisma:migrate && npm run start:dev" }, "engines": { "node": "20.0.0"