From e3ec3802687212cfbfa34dc89156db2a63f49d5b Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 06:51:06 +0100 Subject: [PATCH 01/22] chore: bump version up nx version to 24.* up nest version to 11.* --- libs/microorm-database/src/lib/config.ts | 3 + .../src/lib/micro-orm-database.module.ts | 20 +- migrations.json | 142 - package-lock.json | 14252 +++++++++------- package.json | 91 +- 5 files changed, 7863 insertions(+), 6645 deletions(-) delete mode 100644 migrations.json diff --git a/libs/microorm-database/src/lib/config.ts b/libs/microorm-database/src/lib/config.ts index cbdc17cb..fa30ac00 100644 --- a/libs/microorm-database/src/lib/config.ts +++ b/libs/microorm-database/src/lib/config.ts @@ -6,5 +6,8 @@ const { entitiesTs, ...configOther } = ormConfig; export const config: Options = { discovery: { requireEntitiesArray: true }, + contextName: 'default', + // @ts-ignore + registerRequestContext: false, ...configOther, }; diff --git a/libs/microorm-database/src/lib/micro-orm-database.module.ts b/libs/microorm-database/src/lib/micro-orm-database.module.ts index a742dfdd..88aca6dc 100644 --- a/libs/microorm-database/src/lib/micro-orm-database.module.ts +++ b/libs/microorm-database/src/lib/micro-orm-database.module.ts @@ -1,10 +1,24 @@ import { Module } from '@nestjs/common'; import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { MikroOrmCoreModule } from '@mikro-orm/nestjs/mikro-orm-core.module'; import { config } from './config'; @Module({ - imports: [MikroOrmModule.forRoot(config)], - exports: [MikroOrmModule], + imports: [MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware()], + exports: [MikroOrmCoreModule], }) -export class MicroOrmDatabaseModule {} +export class MicroOrmDatabaseModule { + // static async forRootAsync() { + // const microOrmModule = await MikroOrmModule.forRoot(config); + // console.log(microOrmModule.providers); + // return { + // module: MicroOrmDatabaseModule, + // imports: [microOrmModule], + // // imports: [microOrmModule], + // // exports: [MikroOrmCoreModule], + // }; + // } +} + +export { config }; diff --git a/migrations.json b/migrations.json deleted file mode 100644 index a153a5fe..00000000 --- a/migrations.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "migrations": [ - { - "version": "20.0.0-beta.7", - "description": "Migration for v20.0.0-beta.7", - "implementation": "./src/migrations/update-20-0-0/move-use-daemon-process", - "package": "nx", - "name": "move-use-daemon-process" - }, - { - "version": "20.0.1", - "description": "Set `useLegacyCache` to true for migrating workspaces", - "implementation": "./src/migrations/update-20-0-1/use-legacy-cache", - "x-repair-skip": true, - "package": "nx", - "name": "use-legacy-cache" - }, - { - "cli": "nx", - "version": "20.0.0-beta.5", - "description": "replace getJestProjects with getJestProjectsAsync", - "implementation": "./src/migrations/update-20-0-0/replace-getJestProjects-with-getJestProjectsAsync", - "package": "@nx/jest", - "name": "replace-getJestProjects-with-getJestProjectsAsync" - }, - { - "version": "20.2.0-beta.5", - "description": "Update TypeScript ESLint packages to v8.13.0 if they are already on v8", - "implementation": "./src/migrations/update-20-2-0/update-typescript-eslint-v8-13-0", - "package": "@nx/eslint", - "name": "update-typescript-eslint-v8.13.0" - }, - { - "cli": "nx", - "version": "19.6.1-beta.0", - "description": "Ensure Target Defaults are set correctly for Module Federation.", - "factory": "./src/migrations/update-19-6-1/ensure-depends-on-for-mf", - "package": "@nx/angular", - "name": "update-19-6-1-ensure-module-federation-target-defaults" - }, - { - "cli": "nx", - "version": "20.2.0-beta.2", - "description": "Update the ModuleFederationConfig import use @nx/module-federation.", - "factory": "./src/migrations/update-20-2-0/migrate-mf-imports-to-new-package", - "package": "@nx/angular", - "name": "update-20-2-0-update-module-federation-config-import" - }, - { - "cli": "nx", - "version": "20.2.0-beta.2", - "description": "Update the withModuleFederation import use @nx/module-federation/angular.", - "factory": "./src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package", - "package": "@nx/angular", - "name": "update-20-2-0-update-with-module-federation-import" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Update the @angular/cli package version to ~19.0.0.", - "factory": "./src/migrations/update-20-2-0/update-angular-cli", - "package": "@nx/angular", - "name": "update-angular-cli-version-19-0-0" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Add the '@angular/localize/init' polyfill to the 'polyfills' option of targets using esbuild-based executors.", - "factory": "./src/migrations/update-20-2-0/add-localize-polyfill-to-targets", - "package": "@nx/angular", - "name": "add-localize-polyfill-to-targets" - }, - { - "cli": "nx", - "version": "20.2.0-beta.5", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Update '@angular/ssr' import paths to use the new '/node' entry point when 'CommonEngine' is detected.", - "factory": "./src/migrations/update-20-2-0/update-angular-ssr-imports-to-use-node-entry-point", - "package": "@nx/angular", - "name": "update-angular-ssr-imports-to-use-node-entry-point" - }, - { - "cli": "nx", - "version": "20.2.0-beta.6", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Disable the Angular ESLint prefer-standalone rule if not set.", - "factory": "./src/migrations/update-20-2-0/disable-angular-eslint-prefer-standalone", - "package": "@nx/angular", - "name": "disable-angular-eslint-prefer-standalone" - }, - { - "cli": "nx", - "version": "20.2.0-beta.8", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Remove Angular ESLint rules that were removed in v19.0.0.", - "factory": "./src/migrations/update-20-2-0/remove-angular-eslint-rules", - "package": "@nx/angular", - "name": "remove-angular-eslint-rules" - }, - { - "cli": "nx", - "version": "20.2.0-beta.8", - "requires": { "@angular/core": ">=19.0.0" }, - "description": "Remove the deprecated 'tailwindConfig' option from ng-packagr executors. Tailwind CSS configurations located at the project or workspace root will be picked up automatically.", - "factory": "./src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors", - "package": "@nx/angular", - "name": "remove-tailwind-config-from-ng-packagr-executors" - }, - { - "cli": "nx", - "version": "19.6.3-beta.0", - "description": "Migrate proxy config files to match new format from webpack-dev-server v5.", - "implementation": "./src/migrations/update-19-6-3/proxy-config", - "package": "@nx/webpack", - "name": "update-19-6-3-proxy-config" - }, - { - "version": "19.0.0", - "description": "Updates non-standalone Directives, Component and Pipes to 'standalone:false' and removes 'standalone:true' from those who are standalone", - "factory": "./bundles/explicit-standalone-flag#migrate", - "package": "@angular/core", - "name": "explicit-standalone-flag" - }, - { - "version": "19.0.0", - "description": "Updates ExperimentalPendingTasks to PendingTasks", - "factory": "./bundles/pending-tasks#migrate", - "package": "@angular/core", - "name": "pending-tasks" - }, - { - "version": "19.0.0", - "description": "Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with `provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.", - "factory": "./bundles/provide-initializer#migrate", - "optional": true, - "package": "@angular/core", - "name": "provide-initializer" - } - ] -} diff --git a/package-lock.json b/package-lock.json index 2a46cce3..3f3ffde2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,38 +10,40 @@ "license": "MIT", "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/forms": "19.0.3", - "@angular/platform-browser": "19.0.3", - "@angular/platform-browser-dynamic": "19.0.3", - "@angular/router": "19.0.3", + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/compiler": "19.1.7", + "@angular/core": "19.1.7", + "@angular/forms": "19.1.7", + "@angular/platform-browser": "19.1.7", + "@angular/platform-browser-dynamic": "19.1.7", + "@angular/router": "19.1.7", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", "@mikro-orm/mysql": "^6.4.3", - "@mikro-orm/nestjs": "^6.0.2", + "@mikro-orm/nestjs": "^6.1.1", "@mikro-orm/postgresql": "^6.4.3", "@mikro-orm/sql-highlighter": "^1.0.1", - "@nestjs/common": "^10.3.0", - "@nestjs/core": "^10.3.0", - "@nestjs/platform-express": "10.3.3", - "@nestjs/platform-socket.io": "^10.3.7", - "@nestjs/platform-ws": "^10.3.7", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.2", - "@nestjs/websockets": "^10.3.7", + "@nestjs/common": "^11.0.10", + "@nestjs/core": "^11.0.10", + "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-socket.io": "^11.0.10", + "@nestjs/platform-ws": "^11.0.10", + "@nestjs/swagger": "^11.0.4", + "@nestjs/typeorm": "^11.0.0", + "@nestjs/websockets": "^11.0.10", "axios": "^1.6.0", + "change-case-commonjs": "^5.4.4", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "nestjs-pino": "4.0.0", + "nestjs-pino": "4.3.0", "pg": "8.11.3", - "pino-http": "9.0.0", + "pino-http": "10.4.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "socket.io-client": "^4.7.5", + "ts-toolbelt": "^9.6.0", "tslib": "^2.3.0", "typeorm": "^0.3.20", "uuid": "^10.0.0", @@ -50,32 +52,32 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.0.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@angular-eslint/eslint-plugin": "19.0.1", - "@angular-eslint/eslint-plugin-template": "19.0.1", - "@angular-eslint/template-parser": "19.0.1", - "@angular/cli": "~19.0.0", - "@angular/compiler-cli": "19.0.3", - "@angular/language-service": "19.0.3", + "@angular-devkit/build-angular": "19.1.8", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@angular-eslint/eslint-plugin": "19.1.0", + "@angular-eslint/eslint-plugin-template": "19.1.0", + "@angular-eslint/template-parser": "19.1.0", + "@angular/cli": "~19.1.0", + "@angular/compiler-cli": "19.1.7", + "@angular/language-service": "19.1.7", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", - "@nestjs/schematics": "^10.0.1", - "@nestjs/testing": "^10.0.2", - "@nx/angular": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/eslint-plugin": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", - "@nx/nest": "20.2.1", - "@nx/node": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", - "@schematics/angular": "19.0.4", + "@nestjs/schematics": "^11.0.1", + "@nestjs/testing": "^11.0.10", + "@nx/angular": "20.4.6", + "@nx/eslint": "20.4.6", + "@nx/eslint-plugin": "20.4.6", + "@nx/jest": "20.4.6", + "@nx/js": "20.4.6", + "@nx/nest": "20.4.6", + "@nx/node": "20.4.6", + "@nx/web": "20.4.6", + "@nx/webpack": "20.4.6", + "@nx/workspace": "20.4.6", + "@schematics/angular": "19.1.8", "@swc-node/register": "1.9.2", "@swc/core": "1.5.7", "@swc/helpers": "0.5.11", @@ -94,16 +96,17 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.0.1", - "nx": "20.2.1", + "ng-packagr": "19.1.2", + "nx": "20.4.6", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", + "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", - "typescript": "5.6.3", + "typescript": "5.7.3", "verdaccio": "^5.0.4", "webpack-cli": "^5.1.4" } @@ -149,12 +152,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.4.tgz", - "integrity": "sha512-9XwZ21BPYS2vGOOwVB40fsMyuwJT0H1lWaAMo8Umwi6XbKBVfaWbEhjtR9dlarrySKtFuTz9hmTZkIXHLjXPdA==", + "version": "0.1901.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.8.tgz", + "integrity": "sha512-DzvlL1Zg+zOnVmMN3CjE5KzjZAltRZwOwwcso72iWenBPvl/trKzPDlA6ySmpRonm+AR9i9JrdLEUlwczW6/bQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "19.0.4", + "@angular-devkit/core": "19.1.8", "rxjs": "7.8.1" }, "engines": { @@ -164,18 +167,18 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.4.tgz", - "integrity": "sha512-n7fcRdNB7ed5j6aZI+qPI/1LylFv1OiRNgBIeJxX3HEmzQxsHHLcxWog2yZK2Fvw3390xFx/VjZaklITj6tBFA==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.8.tgz", + "integrity": "sha512-LPKbxjW6ZjyujnL/lbkecxEFVoV1ItKNsrlsHU6kq0LsR4/DsIgstnHVIG9KoyJV++IM144TWB1Cr4/Jaxxu+w==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.4", - "@angular-devkit/build-webpack": "0.1900.4", - "@angular-devkit/core": "19.0.4", - "@angular/build": "19.0.4", + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/build-webpack": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@angular/build": "19.1.8", "@babel/core": "7.26.0", - "@babel/generator": "7.26.2", + "@babel/generator": "7.26.3", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-transform-async-generator-functions": "7.25.9", @@ -184,21 +187,21 @@ "@babel/preset-env": "7.26.0", "@babel/runtime": "7.26.0", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.0.4", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@ngtools/webpack": "19.1.8", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", "babel-loader": "9.2.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.24.0", - "fast-glob": "3.3.2", + "esbuild-wasm": "0.24.2", + "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.3", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", + "less": "4.2.1", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", @@ -206,22 +209,22 @@ "open": "10.1.0", "ora": "5.4.1", "picomatch": "4.0.2", - "piscina": "4.7.0", + "piscina": "4.8.0", "postcss": "8.4.49", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.80.7", - "sass-loader": "16.0.3", + "sass": "1.83.1", + "sass-loader": "16.0.4", "semver": "7.6.3", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.36.0", + "terser": "5.37.0", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.96.1", + "webpack": "5.97.1", "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.1.0", + "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, @@ -231,14 +234,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.24.0" + "esbuild": "0.24.2" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0", "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.4", + "@angular/ssr": "^19.1.8", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -246,8 +249,8 @@ "karma": "^6.3.0", "ng-packagr": "^19.0.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -297,1600 +300,1753 @@ "node": ">=14.17.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "aix" + ], + "peer": true, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1900.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.4.tgz", - "integrity": "sha512-eovr5Am8EwxF7d/y0Hbfz/KYWnOXXVXVwquPUcg8JBI19lLbfctz4+71Vjz2qGroijr2FlZztRpmhd498SLt/A==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1900.4", - "rxjs": "7.8.1" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" + "node": ">=18" } }, - "node_modules/@angular-devkit/core": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.4.tgz", - "integrity": "sha512-+imxIj1JLr2hbUYQePHgkTUKr0VmlxNSZvIREcCWtXUcdCypiwhJAtGXv6MfpB4hAx+FJZYEpVWeLwYOS/gW0A==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/@angular-devkit/schematics": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.4.tgz", - "integrity": "sha512-2r6Qs4N5NSPho+qzegCYS8kIgylXyH4DHaS7HJ5+4XvM1I8V8AII8payLWkUK0i29XufVoD5XfPUFnjxZrBfYQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@angular-devkit/core": "19.0.4", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.1.tgz", - "integrity": "sha512-ENnRzQdXKKisX0G2b7FmQu1IfhvPCrpZW2I4KMXNTOEp4+eouIoUzzHgM0dsRaXwB/RUfwBblTuAx8HZHW1oxw==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.1.tgz", - "integrity": "sha512-pjS/G65ilytiQWhpz1EU7kOyNn11ZyonRZmLgH1MoES6LW2m+a9B5+zLSd+JOQxiRIkdcVeyCzRWmku0LmHBsg==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", - "@angular-eslint/utils": "19.0.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.1.tgz", - "integrity": "sha512-PIsv12/Rom7OUbPuSBvwtwt0hH06/cq8LMy1TQHByT2GL7/PRTn+kIrFG+eYx1IyRJXdtXjKcilLVRW8CDoFpA==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", - "@angular-eslint/utils": "19.0.1", - "aria-query": "5.3.2", - "axobject-query": "4.1.0" - }, - "peerDependencies": { - "@typescript-eslint/types": "^7.11.0 || ^8.0.0", - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@angular-eslint/template-parser": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.1.tgz", - "integrity": "sha512-h0d9sPHxjJza+KkEBuVhxGdwWS9te65ZpQbltMzC8Lug6iusIu+bGM2UigKWU5SsFoOwfQ1/4mIJJ7H2+Em+pQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1", - "eslint-scope": "^8.0.2" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@angular-eslint/utils": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.1.tgz", - "integrity": "sha512-t0jlld7GhaZnvKmlqwHEhzteJ1hfTNsqhYycDO1GthXXohswtmS2uePMrD2LDUS/YyHFyDdXLjdxtSmDLifK0Q==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.0.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular/animations": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.3.tgz", - "integrity": "sha512-YWoXM2S5p+Eq6cX1xjtFaai23oVNnbf3u34pEQCyKDjZpqI5lMu8e63lQT0tf7fZttEWlNUYRTwQ9+MpZ0sjzQ==", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.3" + "node": ">=18" } }, - "node_modules/@angular/build": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.4.tgz", - "integrity": "sha512-ubsNjLb54VkZwcPQ21Ke8aAHiIrRIcv7gG3R6/6XOoWeK1K2+tsv8bnO4mz5cHgzWOspLOT7FDC83NJjrKX3Nw==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.4", - "@babel/core": "7.26.0", - "@babel/helper-annotate-as-pure": "7.25.9", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", - "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", - "magic-string": "0.30.12", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", - "semver": "7.6.3", - "vite": "5.4.11", - "watchpack": "2.4.2" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.1.5" - }, - "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.4", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular/cli": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.4.tgz", - "integrity": "sha512-jxnD9qkhelcRMCrHDCxNsWgn6HQCvMIj8uI0T2eB9Vy93q2YWUo/fWl2Sy4gFlR+VNeF+1hYhPLb/vqLLzjWuA==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1900.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@inquirer/prompts": "7.1.0", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.4", - "@yarnpkg/lockfile": "1.1.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.0", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", - "resolve": "1.22.8", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" } }, - "node_modules/@angular/cli/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/@angular/cli/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/@angular/cli/node_modules/validate-npm-package-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/@angular/common": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.3.tgz", - "integrity": "sha512-YyBVZU+LQ38R+/U5vF/b1T3muROKpR0kkupMw7VKnGhQfgrRX5Dk3H2nr9ritt0zPc7TOUuQSlHMf3QWah2GDg==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=18" } }, - "node_modules/@angular/compiler": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.3.tgz", - "integrity": "sha512-cxtK4SlHAPstcXfjwOaoR1dAszrzo2iDF8ZiihbZPgKUG3m27qIU3Lp5XBgxfZPlO4jh6TXkWznY7f6Tyxkb0Q==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.3" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular/compiler-cli": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.3.tgz", - "integrity": "sha512-nayLcC3hSHoGKXCZInMdFcIZJEHYkEGNsdAutgCMuSj+lXCGuRUysuGC0rGzJc2R6nhgfaLJnO8T/O5acqaqdA==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/core": "7.26.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/compiler": "19.0.3", - "typescript": ">=5.5 <5.7" + "node": ">=18" } }, - "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "node_modules/@angular/core": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.3.tgz", - "integrity": "sha512-WM844gDzrbHtcM2TJB9DmfCmenUYyNSI6h924CeppDW5oG8ShinQGiWNjF5oI6EZ4tG60uK3QvCm3kjr1dmbOA==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" + "node": ">=18" } }, - "node_modules/@angular/forms": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.3.tgz", - "integrity": "sha512-8wf8yDR6cW+lOhpzhmxUOiI5Wjr1Kf7o8NuJ2P5K6b7IMNRzRyR5q/6R4NUwtF6aaJ1wNqmSof+goQmtn1HOcw==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=18" } }, - "node_modules/@angular/language-service": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.0.3.tgz", - "integrity": "sha512-SkUFggQayulgMWW4rwslLVCD7woZ1m7dCB87NCQdlZv9NIrHbNkaPfxHzaX3YrdKhw+u65XcttzD7cworcMcVQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": ">=18" } }, - "node_modules/@angular/platform-browser": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.3.tgz", - "integrity": "sha512-vggWHSzOsCpYqnGq5IIN+n7xdEvXfgUGaMdgzPhFMTsnlMTUs5+VEFl9tX9FANHkXKB5S1RttVyvEXRqJM9ncQ==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/core": "19.0.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.3.tgz", - "integrity": "sha512-gFh+QN7JvepnD3mS0XmOtDmfY8h5sSkk2/guesE2A68Na8q+M3fGZlz7I37tCXToLth5us1X0Gi0UPCSESc4SA==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3" + "node": ">=18" } }, - "node_modules/@angular/router": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.3.tgz", - "integrity": "sha512-L/s8crRC6nj5knmHsnPeOXMNdC7vUOSOvTQonXhmT0FdlP9bPnnRrNeVDnLnd8AzjPSBfIFE2eQw6T8jCwdxMA==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "dev": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": ">=14.21.3" }, "peerDependencies": { - "@angular/common": "19.0.3", - "@angular/core": "19.0.3", - "@angular/platform-browser": "19.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "node_modules/@angular-devkit/build-angular/node_modules/less": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", + "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "optional": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=6" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "optional": true, "bin": { - "semver": "bin/semver.js" + "semver": "bin/semver" } }, - "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "node_modules/@angular-devkit/build-angular/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, + "optional": true, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, + "optional": true, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.9.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, + "hasInstallScript": true, + "peer": true, "bin": { - "semver": "bin/semver.js" + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-devkit/build-angular/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, + "optional": true, + "peer": true, "bin": { - "semver": "bin/semver.js" + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1901.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.8.tgz", + "integrity": "sha512-SmuGtTqrm43LiJ+ldAuq/QKyLPt2fS1nfnLTo+zTwgt/YAK+ps8cTPG/FqrURfXXWxgtAaeFX5B+samk8TSuvQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@angular-devkit/architect": "0.1901.8", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "node_modules/@angular-devkit/core": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", + "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "node_modules/@angular-devkit/core/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "node_modules/@angular-devkit/schematics": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", + "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@angular-devkit/core": "19.1.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.1.0.tgz", + "integrity": "sha512-HUJyukRvnh8Z9lIdxdblBRuBaPYEVv4iAYZMw3d+dn4rrM27Nt5oh3/zkwYrrPkt36tZdeXdDWrOuz9jgjVN5w==", + "dev": true }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "node_modules/@angular-eslint/eslint-plugin": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.1.0.tgz", + "integrity": "sha512-TDO0+Ry+oNkxnaLHogKp1k2aey6IkJef5d7hathE4UFT6owjRizltWaRoX6bGw7Qu1yagVLL8L2Se8SddxSPAQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "@angular-eslint/utils": "19.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.1.0.tgz", + "integrity": "sha512-bIUizkCY40mnU8oAO1tLV7uN2H/cHf1evLlhpqlb9JYwc5dT2moiEhNDo61OtOgkJmDGNuThAeO9Xk9hGQc7nA==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "@angular-eslint/utils": "19.1.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "node_modules/@angular-eslint/template-parser": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.1.0.tgz", + "integrity": "sha512-wbMi7adlC+uYqZo7NHNBShpNhFJRZsXLqihqvFpAUt1Ei6uDX8HR6MyMEDZ9tUnlqtPVW5nmbedPyLVG7HkjAA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "eslint-scope": "^8.0.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@angular-eslint/utils": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.1.0.tgz", + "integrity": "sha512-mcb7hPMH/u6wwUwvsewrmgb9y9NWN6ZacvpUvKlTOxF/jOtTdsu0XfV4YB43sp2A8NWzYzX0Str4c8K1xSmuBQ==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@angular-eslint/bundled-angular-compiler": "19.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, + "node_modules/@angular/animations": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.7.tgz", + "integrity": "sha512-EnyQTCNc1nWnjc5V3HPlClpJIS2R2XAfIEUCyI3lE4FLQxcXyhIsM9NmacAZT3Ai8RL+8JVCttPmBZXMpjP6Ug==", + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.7" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "node_modules/@angular/build": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.8.tgz", + "integrity": "sha512-DAnnmbqPmtlY5JOitqWUgXi/yKj8eAcrP0T7hYZwLmcRsb+HsHYWsAQoFaTDw0p9WC5BKPqDBCMIivcuIV/izQ==", "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@babel/core": "7.26.0", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.11", + "watchpack": "2.4.2" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.2" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.8", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "node_modules/@angular/build/node_modules/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.9.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "node_modules/@angular/build/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" } }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "node_modules/@angular/cli": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.8.tgz", + "integrity": "sha512-JmdLj8110DNWaxL03K7I06+nLyBfXgiIqYyrQx5QO9AodGkKHK5rE+7VD8MjZhUymua57HToD0oHaQgThJwTJQ==", "dev": true, "dependencies": { - "@babel/types": "^7.26.3" + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@inquirer/prompts": "7.2.1", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.1.8", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.1", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" }, "bin": { - "parser": "bin/babel-parser.js" + "ng": "bin/ng.js" }, "engines": { - "node": ">=6.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "node_modules/@angular/cli/node_modules/hosted-git-info": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "node_modules/@angular/cli/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@angular/cli/node_modules/npm-package-arg": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "node_modules/@angular/cli/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "node_modules/@angular/cli/node_modules/validate-npm-package-name": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", + "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@angular/common": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.7.tgz", + "integrity": "sha512-MXfUGfWeesTQ12HXgeoVIXsS+r1jZxT2FkLQtqS+NRsRD4T1vlyvD7kTI+Ku1NAjdt3mB8TJ0cZHubvmml8I+Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/core": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", - "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.7.tgz", + "integrity": "sha512-Q3eqqIhMEzrnmFJtUO0K+WPpCfP/JTl9lJXZKe0zgNPdRFUufjSUcPHGzd7OjN2gPpiAvS1yBvENvqs+g/MejQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-decorators": "^7.23.3" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/core": "19.1.7" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@angular/compiler-cli": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.7.tgz", + "integrity": "sha512-Uu/TxfIcE1lStlCLmOPbghG1Y5o83odES89sr7bYNJz2mcG7TEonatf6GTOMzbJNil9FBJt6qnJkDkSjn4nUKw==", "dev": true, + "dependencies": { + "@babel/core": "7.26.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/compiler": "19.1.7", + "typescript": ">=5.5 <5.8" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, + "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true + }, + "node_modules/@angular/core": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.7.tgz", + "integrity": "sha512-P+e4ekJYWMFhWSzJav0R51bFAfUhIOmnqmG9mlI/ZONu2qcTTmyIG9AW5x1qhrMHEH42RaeK60RkKyqgcHaGDg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, + "node_modules/@angular/forms": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.7.tgz", + "integrity": "sha512-GVOCwqIXTpZt+bE3cqkasqpEs5n/aVq04yXLgM+mvVEbmAMibZYpzfg8NARlXCH3zveqhOSTJgsllfbbb7sdDw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@angular/language-service": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.1.7.tgz", + "integrity": "sha512-V2QSihzZhkFaTxiw79PM+YP6LilQbx4IBFANTILNCmsGJxwnFQwMdmAptX6vWXiF/1o7YZ5IX4x8arRZ83YzFQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", - "dev": true, + "node_modules/@angular/platform-browser": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.7.tgz", + "integrity": "sha512-QKakWl+CeVVwn22yjRHBXm6BvDsHoo+9u1pJGGk2smKSYjHW6qAly28+P7FUfVXUQI7rg++M66JwzNOFfYMDQA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/core": "19.1.7" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.7.tgz", + "integrity": "sha512-rp7IXun1fHeScpIni0l2VRxBW5LzokHYfZ69K4BRhE7FpVA6hP2c9fhCJeo7681c/Q882Kom0tmsedOcF/zwMQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "19.1.7", + "@angular/compiler": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, + "node_modules/@angular/router": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.7.tgz", + "integrity": "sha512-4wqfHxVvMmnpRyRhOClo0qX7li1MnWaQ8U1ZMd8gsZgE3SKkOxXdHg/jO4tcbLMLD4QAZ82uB8MBvHl1vVMhKg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.25.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { + "node_modules/@babel/helper-module-imports": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { + "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-classes": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { + "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/helper-validator-option": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "node_modules/@babel/helper-wrap-function": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/parser": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.26.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-for-of": { + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-function-name": { + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-json-strings": { + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -1899,46 +2055,51 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", + "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.23.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1947,15 +2108,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { "node": ">=6.9.0" }, @@ -1963,76 +2120,61 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2044,10 +2186,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2059,46 +2201,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2107,92 +2240,85 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2201,14 +2327,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2217,14 +2342,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2233,10 +2358,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { + "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2248,18 +2373,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { + "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2268,22 +2390,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2292,14 +2407,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2308,10 +2422,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { + "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2323,12 +2437,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { + "node_modules/@babel/plugin-transform-class-properties": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { @@ -2338,31 +2453,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -2371,13 +2489,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { + "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2386,13 +2505,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { + "node_modules/@babel/plugin-transform-destructuring": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { @@ -2402,10 +2520,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { + "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", @@ -2418,139 +2536,74 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2559,2476 +2612,2616 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.10.4", - "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">= 0.12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=0.6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@electric-sql/pglite": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.16.tgz", - "integrity": "sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw==", - "dev": true - }, - "node_modules/@emnapi/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/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 - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@cypress/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.10.4", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">= 6" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@inquirer/checkbox": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.2.tgz", - "integrity": "sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==", + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">= 0.12" } }, - "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=18" + "node": ">=0.6" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@inquirer/core": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", - "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.0.0" } }, - "node_modules/@inquirer/editor": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.1.0.tgz", - "integrity": "sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==", + "node_modules/@electric-sql/pglite": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.16.tgz", + "integrity": "sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw==", + "dev": true + }, + "node_modules/@emnapi/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", - "external-editor": "^3.1.0" - }, + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/expand": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.2.tgz", - "integrity": "sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", - "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" } }, - "node_modules/@inquirer/input": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.2.tgz", - "integrity": "sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/number": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.2.tgz", - "integrity": "sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/password": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.2.tgz", - "integrity": "sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", - "ansi-escapes": "^4.3.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/rawlist": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.2.tgz", - "integrity": "sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/search": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.2.tgz", - "integrity": "sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/select": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.2.tgz", - "integrity": "sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@inquirer/type": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", - "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "minipass": "^7.0.4" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@jercle/yargonaut": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", - "integrity": "sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==", - "dependencies": { - "chalk": "^4.1.2", - "figlet": "^1.5.2", - "parent-require": "^1.0.0" + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@jercle/yargonaut/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "jest-get-type": "^29.6.3" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "*" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" } + ], + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=10.10.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "*" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@inquirer/checkbox": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@inquirer/core": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@inquirer/editor": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jorgebodega/typeorm-factory": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-factory/-/typeorm-factory-1.4.0.tgz", - "integrity": "sha512-c02QHz1FcR8w4Tzv2Ibf2SvxF4LYlna0DktNT9kfMFkMajcbP94KBN4EBpP4ECU/0baY1pflzhFhphlGErUamA==", + "node_modules/@inquirer/expand": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, "dependencies": { - "tslib": "2.4.1" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "typeorm": "^0.3.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jorgebodega/typeorm-factory/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "node_modules/@inquirer/figures": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", + "dev": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@jorgebodega/typeorm-seeding": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-seeding/-/typeorm-seeding-6.0.1.tgz", - "integrity": "sha512-vmjomtkMvOlwKeJtGSVb68519TCGKfENCSKE6zxMvr9GTZ+4XiLvIcp6tM5Irl10Pji9dNHPrXdh9HfTvm18aw==", + "node_modules/@inquirer/input": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, "dependencies": { - "chalk": "4.1.2", - "commander": "9.4.1", - "glob": "8.0.3", - "ora": "5.4.1", - "tslib": "2.4.1" - }, - "bin": { - "typeorm-seeding": "dist/cli.js" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "typeorm": "^0.3.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jorgebodega/typeorm-seeding/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@inquirer/number": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jorgebodega/typeorm-seeding/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "node_modules/@inquirer/password": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2" + }, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jorgebodega/typeorm-seeding/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/@inquirer/prompts": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@types/node": ">=18" } }, - "node_modules/@jorgebodega/typeorm-seeding/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/@inquirer/rawlist": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@jorgebodega/typeorm-seeding/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@inquirer/search": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "devOptional": true, + "node_modules/@inquirer/select": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@inquirer/type": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "devOptional": 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" + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=10.0" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10.0" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=10.0" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "@inquirer/type": "^1.5.5" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=12" }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "dependencies": { - "mute-stream": "^1.0.0" + "minipass": "^7.0.4" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "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==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "sprintf-js": "~1.0.2" + } }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "engines": { "node": ">=8" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==" - }, - "node_modules/@mikro-orm/cli": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.3.tgz", - "integrity": "sha512-DWnYNxoyMgU6L90TGBlT0eziTu6yl15ArnnFoq0kyOjp8JEMRjin+8cizSrKyQ3QiQZ5iop5fB0i9Sp+Hbgd8Q==", + "node_modules/@jercle/yargonaut": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", + "integrity": "sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==", "dependencies": { - "@jercle/yargonaut": "1.1.5", - "@mikro-orm/core": "6.4.3", - "@mikro-orm/knex": "6.4.3", - "fs-extra": "11.2.0", - "tsconfig-paths": "4.2.0", - "yargs": "17.7.2" - }, - "bin": { - "mikro-orm": "cli", - "mikro-orm-esm": "esm" - }, - "engines": { - "node": ">= 18.12.0" + "chalk": "^4.1.2", + "figlet": "^1.5.2", + "parent-require": "^1.0.0" } }, - "node_modules/@mikro-orm/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@jercle/yargonaut/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14.14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@mikro-orm/core": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.3.tgz", - "integrity": "sha512-UTaqKs1bomYtGmEEZ8sNBOmW2OqT5NcMh+pBV2iJ6WLM5MuiIEuNhDMuvvPE5gNEwUzc1HyRhUV87bRDhDIGRg==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "dataloader": "2.2.3", - "dotenv": "16.4.7", - "esprima": "4.0.1", - "fs-extra": "11.2.0", - "globby": "11.1.0", - "mikro-orm": "6.4.3", - "reflect-metadata": "0.2.2" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/b4nan" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/core/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14.14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@mikro-orm/core/node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "node_modules/@mikro-orm/knex": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.3.tgz", - "integrity": "sha512-gVkRD/cIn6qxk/P9nR+IufZxJwuCCdv0AtcGvShxXXvaoIrQPJYDV7HRxBOHCEyNygr6M3Fqpph1oPoT6aezTQ==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "dependencies": { - "fs-extra": "11.2.0", - "knex": "3.1.0", - "sqlstring": "2.3.3" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 18.12.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@mikro-orm/core": "^6.0.0", - "better-sqlite3": "*", - "libsql": "*", - "mariadb": "*" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "libsql": { - "optional": true - }, - "mariadb": { + "node-notifier": { "optional": true } } }, - "node_modules/@mikro-orm/knex/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14.14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@mikro-orm/migrations": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.3.tgz", - "integrity": "sha512-VrsKq95esUBEMhwp9vVX+YUj2+/cNwb8UZ63HfgaqPo+pYj8r1RBSTboFOE9V0Md0n3ol9b5xByfPPa3qHmL0g==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "dependencies": { - "@mikro-orm/knex": "6.4.3", - "fs-extra": "11.2.0", - "umzug": "3.8.2" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/migrations/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=14.14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/mysql": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.3.tgz", - "integrity": "sha512-ZkrrzOWE9ouifU331q70K9BfAOD9SFRiNLNnECnzVrvDPWnthMV0ahGium9HyHpG4nev0Ybg6vnvq9IQzW1brg==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "dependencies": { - "@mikro-orm/knex": "6.4.3", - "mysql2": "3.12.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/nestjs": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@mikro-orm/nestjs/-/nestjs-6.0.2.tgz", - "integrity": "sha512-3bUBnJ0HwwIjsNPb0n7dfTWayqA5iSLHv/zM9juyBADSpJB2oBAd96QlUqDvNi/RckSg0m+ifLVT0Uw8e0+POg==", - "engines": { - "node": ">= 18.12.0" + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0", - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/postgresql": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.4.3.tgz", - "integrity": "sha512-3cGi1gW6ME3SyuRRiJmSBtzHFa6Kavy6bK9rsSAAfXz+Pso6UBsqvesATbruKxDF7/CLdQlIY3CZZHXksUIrQg==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, "dependencies": { - "@mikro-orm/knex": "6.4.3", - "pg": "8.13.1", - "postgres-array": "3.0.2", - "postgres-date": "2.1.0", - "postgres-interval": "4.0.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@mikro-orm/core": "^6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/postgresql/node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "pg-native": ">=3.0.1" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "pg-native": { + "node-notifier": { "optional": true } } }, - "node_modules/@mikro-orm/postgresql/node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" - }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-array": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/postgresql/node_modules/postgres-interval": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", - "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@mikro-orm/sql-highlighter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mikro-orm/sql-highlighter/-/sql-highlighter-1.0.1.tgz", - "integrity": "sha512-iO+FwRNuqNDVlIo5zfgOu2mMGVicX/FqzP+F/A0xpJLHyqvWyXzVwntgAMimBjQaxiX9Rpmc0u3Jq6/A6V6JQA==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.7.6.tgz", - "integrity": "sha512-eD1JZDQ+h5WLdA58MmAE1DzLwvFaGJeeam3Tswc/sEUb4QGT86X4Fme+dMTBRYRoAq/tRYql3DlVTFhdmrUVzg==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@module-federation/sdk": "0.7.6", - "@types/semver": "7.5.8", - "semver": "7.6.3" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/data-prefetch": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.7.6.tgz", - "integrity": "sha512-AMpfnuIAK/Y5M682BUsnc13ARCEKhEvb0tXF4S+l7jfL08oE9gyo+G/nk0LIzZBO2mLDz5g2AydAERanM6gswQ==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6", - "fs-extra": "9.1.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/dts-plugin": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.7.6.tgz", - "integrity": "sha512-K8T8+Ip+fCQkTOxAQbAW47drphN36+WcvcOusn/fsIT+1exdhyvqxSCj8V7MLCtjA9kGDi0jHIGN6MN4p2cV0Q==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@module-federation/error-codes": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/sdk": "0.7.6", - "@module-federation/third-party-dts-extractor": "0.7.6", - "adm-zip": "^0.5.10", - "ansi-colors": "^4.1.3", - "axios": "^1.7.4", - "chalk": "3.0.0", - "fs-extra": "9.1.0", - "isomorphic-ws": "5.0.0", - "koa": "2.15.3", - "lodash.clonedeepwith": "4.5.0", - "log4js": "6.9.1", - "node-schedule": "2.1.1", - "rambda": "^9.1.0", - "ws": "8.18.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "vue-tsc": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@module-federation/dts-plugin/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, "engines": { - "node": ">=10.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@module-federation/enhanced": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.7.6.tgz", - "integrity": "sha512-ivTVuRKhew/25fiblAW22RybYzyacQsvnQG3y9zSNsYbwcj+0u7THWMmsK8vNKxDUpjxuQulCK07BEycDjoB5Q==", - "dev": true, - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.7.6", - "@module-federation/data-prefetch": "0.7.6", - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/manifest": "0.7.6", - "@module-federation/rspack": "0.7.6", - "@module-federation/runtime-tools": "0.7.6", - "@module-federation/sdk": "0.7.6", - "btoa": "^1.2.1", - "upath": "2.0.1" + "node_modules/@jorgebodega/typeorm-factory": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-factory/-/typeorm-factory-1.4.0.tgz", + "integrity": "sha512-c02QHz1FcR8w4Tzv2Ibf2SvxF4LYlna0DktNT9kfMFkMajcbP94KBN4EBpP4ECU/0baY1pflzhFhphlGErUamA==", + "dev": true, + "dependencies": { + "tslib": "2.4.1" }, - "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24", - "webpack": "^5.0.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - }, - "webpack": { - "optional": true - } + "peerDependencies": { + "typeorm": "^0.3.0" } }, - "node_modules/@module-federation/error-codes": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.7.6.tgz", - "integrity": "sha512-XVzX/sRFj1h5JvOOVMoFppxq0t1t3o/AlEICHgWX+dybIwJgz9g4gihZOWVZfz5/xsKGcUwdH5X7Z2nkuYhJEw==", + "node_modules/@jorgebodega/typeorm-factory/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, - "node_modules/@module-federation/managers": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.7.6.tgz", - "integrity": "sha512-NW0LJ6TL13oN004D9e50EalcGZyTYHHgyaeKOc90Omb/HMeHxjyhHx7wl1TLRwVN2E5Rk+IO0JrwgrdlNMfAzg==", + "node_modules/@jorgebodega/typeorm-seeding": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-seeding/-/typeorm-seeding-6.0.1.tgz", + "integrity": "sha512-vmjomtkMvOlwKeJtGSVb68519TCGKfENCSKE6zxMvr9GTZ+4XiLvIcp6tM5Irl10Pji9dNHPrXdh9HfTvm18aw==", "dev": true, "dependencies": { - "@module-federation/sdk": "0.7.6", - "find-pkg": "2.0.0", - "fs-extra": "9.1.0" + "chalk": "4.1.2", + "commander": "9.4.1", + "glob": "8.0.3", + "ora": "5.4.1", + "tslib": "2.4.1" + }, + "bin": { + "typeorm-seeding": "dist/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "typeorm": "^0.3.0" } }, - "node_modules/@module-federation/manifest": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.7.6.tgz", - "integrity": "sha512-xBrFwLjDMUjKRnp+P4X29ZNyhgXSsp+SfrBxVsKJpEESOHalDoNClbo6gXvZAvkBZyo9sY3SJhAwduDwNkg04w==", + "node_modules/@jorgebodega/typeorm-seeding/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/sdk": "0.7.6", - "chalk": "3.0.0", - "find-pkg": "2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@module-federation/node": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.11.tgz", - "integrity": "sha512-ytCNML9Q9dQ7Xi/pTYp4Y+yP/YUiFyyCa8BEKnSt5Ipiqtu4QMxj46EkOIgvLv0nSlK+xOVgAzqtXLI89SfhCg==", + "node_modules/@jorgebodega/typeorm-seeding/node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@jorgebodega/typeorm-seeding/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "dependencies": { - "@module-federation/enhanced": "0.7.6", - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6", - "@module-federation/utilities": "3.1.29", - "btoa": "1.2.1", - "encoding": "^0.1.13", - "node-fetch": "2.7.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, - "peerDependencies": { - "react": "^16||^17||^18", - "react-dom": "^16||^17||^18", - "webpack": "^5.40.0" + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@module-federation/rspack": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.7.6.tgz", - "integrity": "sha512-alfX85C+2AQLXGrtpa08ImwhHIGwFIkJ/6i/XhxpYL5iFu0mC0xRIJPJUw0tiBWdFpP4p+Ykij3hP3FqfvaiKg==", + "node_modules/@jorgebodega/typeorm-seeding/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.7.6", - "@module-federation/dts-plugin": "0.7.6", - "@module-federation/managers": "0.7.6", - "@module-federation/manifest": "0.7.6", - "@module-federation/runtime-tools": "0.7.6", - "@module-federation/sdk": "0.7.6" - }, - "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" + "brace-expansion": "^2.0.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@module-federation/runtime": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.7.6.tgz", - "integrity": "sha512-TEEDbGwaohZ2dMa+Sk/Igq8XpcyfjqJfbL20mdAZeifSFVZYRSCaTd/xIXP7pEw8+5BaCMc4YfCf/XcjFAUrVA==", + "node_modules/@jorgebodega/typeorm-seeding/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "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": { - "@module-federation/error-codes": "0.7.6", - "@module-federation/sdk": "0.7.6" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.7.6.tgz", - "integrity": "sha512-SvokF6gn2sNrTEPG51H0LrowHnf3iNfznO2PzKpxAhZOBdb1pm0wJPwWSMHYrjMdDpjr7bzaqAywnkHdA6lqeQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "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, - "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/webpack-bundler-runtime": "0.7.6" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@module-federation/sdk": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.7.6.tgz", - "integrity": "sha512-MFE+RtsHnutZOCp2eKpa3A/yzZ8tOPmjX7QRdVnB2qqR9JA2SH3ZP5+cYq76tzFQZvU1BCWAQVNMvqGOW2yVZQ==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "isomorphic-rslog": "0.0.6" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.7.6.tgz", - "integrity": "sha512-JME76/rgr41AKXG6kUTQXdQJiMCypN3qHOgPv4VuIag10UdLo/0gdeN6PYronvYmvPOQMfYev80GcEwl4l531A==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "devOptional": 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": { - "find-pkg": "2.0.0", - "fs-extra": "9.1.0", - "resolve": "1.22.8" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@module-federation/utilities": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.29.tgz", - "integrity": "sha512-yhHOgm3mkZBvQzT4HoBJAVhGIa7Nfhpd4Zdc11g0vYEMapU6lfN5HHipUFdj6bLUzHhDyrY6CaF3syqTuabAfQ==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "dependencies": { - "@module-federation/sdk": "0.7.6" + "engines": { + "node": ">=10.0" }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18", - "webpack": "^5.40.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.7.6.tgz", - "integrity": "sha512-kB9hQ0BfwNAcQWGskDEOxYP2z2bB/1ABXKr8MDomCFl2mbW3vvfYMQrb8UhJmJvE3rbGI/iXhJUdgBLNREnjUg==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.7.6", - "@module-federation/sdk": "0.7.6" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", + "dev": true, + "dependencies": { + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "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" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -5038,10 +5231,10 @@ "darwin" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -5051,10 +5244,10 @@ "darwin" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -5064,10 +5257,10 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -5077,10 +5270,10 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -5090,10 +5283,10 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -5103,89 +5296,1014 @@ "win32" ] }, - "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", - "dev": true, - "optional": true, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "engines": { - "node": ">= 10" + "node": ">=8" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" + }, + "node_modules/@mikro-orm/cli": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.3.tgz", + "integrity": "sha512-DWnYNxoyMgU6L90TGBlT0eziTu6yl15ArnnFoq0kyOjp8JEMRjin+8cizSrKyQ3QiQZ5iop5fB0i9Sp+Hbgd8Q==", + "dependencies": { + "@jercle/yargonaut": "1.1.5", + "@mikro-orm/core": "6.4.3", + "@mikro-orm/knex": "6.4.3", + "fs-extra": "11.2.0", + "tsconfig-paths": "4.2.0", + "yargs": "17.7.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "bin": { + "mikro-orm": "cli", + "mikro-orm-esm": "esm" }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" + "engines": { + "node": ">= 18.12.0" } }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@mikro-orm/cli/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=14.14" } }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@mikro-orm/core": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.3.tgz", + "integrity": "sha512-UTaqKs1bomYtGmEEZ8sNBOmW2OqT5NcMh+pBV2iJ6WLM5MuiIEuNhDMuvvPE5gNEwUzc1HyRhUV87bRDhDIGRg==", + "dependencies": { + "dataloader": "2.2.3", + "dotenv": "16.4.7", + "esprima": "4.0.1", + "fs-extra": "11.2.0", + "globby": "11.1.0", + "mikro-orm": "6.4.3", + "reflect-metadata": "0.2.2" + }, "engines": { - "node": ">= 10" + "node": ">= 18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/b4nan" } }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@mikro-orm/core/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=14.14" } }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "node_modules/@mikro-orm/core/node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "node_modules/@mikro-orm/knex": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.3.tgz", + "integrity": "sha512-gVkRD/cIn6qxk/P9nR+IufZxJwuCCdv0AtcGvShxXXvaoIrQPJYDV7HRxBOHCEyNygr6M3Fqpph1oPoT6aezTQ==", + "dependencies": { + "fs-extra": "11.2.0", + "knex": "3.1.0", + "sqlstring": "2.3.3" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0", + "better-sqlite3": "*", + "libsql": "*", + "mariadb": "*" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "libsql": { + "optional": true + }, + "mariadb": { + "optional": true + } + } + }, + "node_modules/@mikro-orm/knex/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@mikro-orm/migrations": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.3.tgz", + "integrity": "sha512-VrsKq95esUBEMhwp9vVX+YUj2+/cNwb8UZ63HfgaqPo+pYj8r1RBSTboFOE9V0Md0n3ol9b5xByfPPa3qHmL0g==", + "dependencies": { + "@mikro-orm/knex": "6.4.3", + "fs-extra": "11.2.0", + "umzug": "3.8.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/migrations/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@mikro-orm/mysql": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.3.tgz", + "integrity": "sha512-ZkrrzOWE9ouifU331q70K9BfAOD9SFRiNLNnECnzVrvDPWnthMV0ahGium9HyHpG4nev0Ybg6vnvq9IQzW1brg==", + "dependencies": { + "@mikro-orm/knex": "6.4.3", + "mysql2": "3.12.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/nestjs": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@mikro-orm/nestjs/-/nestjs-6.1.1.tgz", + "integrity": "sha512-aluD3eTeuCvIePDk5UBanHIhu1zAJQXqWAg47MZdHJmFkNuXn62DCXbD2c4X5TCpKW/m0zjba22ilyZ/AFG9qg==", + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0 || ^7.0.0-dev.0", + "@nestjs/common": "^10.0.0 || ^11.0.5", + "@nestjs/core": "^10.0.0 || ^11.0.5" + } + }, + "node_modules/@mikro-orm/postgresql": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.4.3.tgz", + "integrity": "sha512-3cGi1gW6ME3SyuRRiJmSBtzHFa6Kavy6bK9rsSAAfXz+Pso6UBsqvesATbruKxDF7/CLdQlIY3CZZHXksUIrQg==", + "dependencies": { + "@mikro-orm/knex": "6.4.3", + "pg": "8.13.1", + "postgres-array": "3.0.2", + "postgres-date": "2.1.0", + "postgres-interval": "4.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@mikro-orm/core": "^6.0.0" + } + }, + "node_modules/@mikro-orm/postgresql/node_modules/pg": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "dependencies": { + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/@mikro-orm/postgresql/node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" + }, + "node_modules/@mikro-orm/postgresql/node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@mikro-orm/postgresql/node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@mikro-orm/postgresql/node_modules/postgres-interval": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", + "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@mikro-orm/sql-highlighter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mikro-orm/sql-highlighter/-/sql-highlighter-1.0.1.tgz", + "integrity": "sha512-iO+FwRNuqNDVlIo5zfgOu2mMGVicX/FqzP+F/A0xpJLHyqvWyXzVwntgAMimBjQaxiX9Rpmc0u3Jq6/A6V6JQA==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.8.12.tgz", + "integrity": "sha512-fiSf9Df4RqdKiL1WtS7eCqAWqDnLNwMZ9qU7ZMjXSAhI3wOLzycFflpVx7PWOxSoTJPtc61hwD5lkEpNoHezkg==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.8.12", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.8.12.tgz", + "integrity": "sha512-YjCk6KPBQ4Ml2/2aIKQt11I4jBKOTvK3xHyAQMKPpX5aBbMEwonDhkpTitygUw3SMBdi3CP1KMRDJ3suj3O6Mg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.12", + "@module-federation/sdk": "0.8.12", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.8.12.tgz", + "integrity": "sha512-BhRZsG68XtGzKM0N02/3ldiW+PTc+QaHCMNyiZnk3GcxS0qe6USu7fTQwRIPCC2GONIdoHD+GVYPN/NJWjbTFg==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.12", + "@module-federation/managers": "0.8.12", + "@module-federation/sdk": "0.8.12", + "@module-federation/third-party-dts-extractor": "0.8.12", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/enhanced": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.8.12.tgz", + "integrity": "sha512-uJODfWqL3C87LUu1E0ZLPRqE0sUt6QFH97bMFoCWYhkf8JS7J+wMc4KSc31ApaJs7CeQICXR1CYBAZDSdxkrOQ==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.8.12", + "@module-federation/data-prefetch": "0.8.12", + "@module-federation/dts-plugin": "0.8.12", + "@module-federation/error-codes": "0.8.12", + "@module-federation/inject-external-runtime-core-plugin": "0.8.12", + "@module-federation/managers": "0.8.12", + "@module-federation/manifest": "0.8.12", + "@module-federation/rspack": "0.8.12", + "@module-federation/runtime-tools": "0.8.12", + "@module-federation/sdk": "0.8.12", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.12.tgz", + "integrity": "sha512-K+F4iiV62KY+IpjK6ggn3vI5Yt/T/LUb6xuazY78bhAGwLaHe1DYr7BfSutKMpiB+Dcs6U4dYOBogSMnnl0j4Q==", + "dev": true + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.8.12.tgz", + "integrity": "sha512-/vFW+eiBiqXOKkDYVKl5JXGI0H4Whj10P8JadowxuHcEuR+R7kkXXauYuGYKaxIFqG4zbN3r9su2qxIEEqOsOw==", + "dev": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.8.12" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.8.12.tgz", + "integrity": "sha512-+BBdBMptHiiT2ZsfPovQuHYkse6R1+dmDS6bAinw3UGpb418W8ERp5I4jHeyhEtr3t3mb/dh4sAsYM14/EWJ9Q==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.8.12", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/manifest": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.8.12.tgz", + "integrity": "sha512-UwC6/QK37x7Xr5K+89iKxOy/uQHqFMd49axOhgDmFSrWQOULFQd51EpTOxFXgwZfiq/h0uVBYq/c0GB3Tdu8GA==", + "dev": true, + "dependencies": { + "@module-federation/dts-plugin": "0.8.12", + "@module-federation/managers": "0.8.12", + "@module-federation/sdk": "0.8.12", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node": { + "version": "2.6.26", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.26.tgz", + "integrity": "sha512-5hWUv93LOeJOpwSpi2febxD25kIR0Ondmhpt9FCK0ggSpA8T4hxI2U5d4DN8MOYhSzPdM4EoVHfOT0t9r79MeA==", + "dev": true, + "dependencies": { + "@module-federation/enhanced": "0.9.0", + "@module-federation/runtime": "0.9.0", + "@module-federation/sdk": "0.9.0", + "@module-federation/utilities": "3.1.44", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "react": "^16||^17||^18", + "react-dom": "^16||^17||^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.0.tgz", + "integrity": "sha512-EaUMMmNVx5IRXB8o39tPU05uWuDN38noQbUjwE2xi8Y5xTx3CFZ9tkgXX+tvzcWc+bu4RnaziaI0RtyBfHhHKw==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.9.0", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.0.tgz", + "integrity": "sha512-KFC3lOzW/Hwvcgm/tn7075fqC/ONhA+5zPqDz090EsCQqnWQHodzx0XF88/tTvWdfc3mYK9BGYfsnpjlVGT1zA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.9.0", + "@module-federation/sdk": "0.9.0", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.0.tgz", + "integrity": "sha512-2Uu1sPRT9/uB+pG4vQGkLdpsMVM6FK7howulTdy42u6Dz0c2Ivc//od/noM0KEgWf1p54FAtWzpjkqjO5PyciA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.9.0", + "@module-federation/managers": "0.9.0", + "@module-federation/sdk": "0.9.0", + "@module-federation/third-party-dts-extractor": "0.9.0", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.4", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.0.tgz", + "integrity": "sha512-/fiIc+lZvP7pEiVWe0/0v2ueVcEumew2UNewguHFj3bxyyU5/+/5rHPRV5QIKcLzydrVLvTiS4/dB2Mqd7CVAg==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.0", + "@module-federation/data-prefetch": "0.9.0", + "@module-federation/dts-plugin": "0.9.0", + "@module-federation/error-codes": "0.9.0", + "@module-federation/inject-external-runtime-core-plugin": "0.9.0", + "@module-federation/managers": "0.9.0", + "@module-federation/manifest": "0.9.0", + "@module-federation/rspack": "0.9.0", + "@module-federation/runtime-tools": "0.9.0", + "@module-federation/sdk": "0.9.0", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.0.tgz", + "integrity": "sha512-dNqIs5cQfE4p+WIdiZ64cTSRJ5KjGaV+epvZkGttrNjXW9XAAtE7zgpo7cMQ8GWA3wCGaKnFw7Dn48XcU5ZMNw==", + "dev": true + }, + "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.0.tgz", + "integrity": "sha512-gDvYmcJyuXy1qzBZ6c+AndQUm50iOXmc56C2GN+F9ILAOQ/dcWFfD+OxyjXr80Pvej6qawW9CTEEWHNF4m4a+w==", + "dev": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/managers": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.0.tgz", + "integrity": "sha512-km8fVdS/r3TRLbSCV8IytKaQVuMbXbHvdZsgK4HRIWqGyBbA2q+gbXfWSC90OhdxNA9hhPEipmx+4hvuXDwaFg==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.9.0", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.0.tgz", + "integrity": "sha512-o6+AyKdznP/Pyd6x/1staafUKNxIuXbmmpZxeL3VDvg8uR+6QM5bd/iXnBUgxaznIGQvUwvW/F1JixdgXwp7ug==", + "dev": true, + "dependencies": { + "@module-federation/dts-plugin": "0.9.0", + "@module-federation/managers": "0.9.0", + "@module-federation/sdk": "0.9.0", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.0.tgz", + "integrity": "sha512-Cw5/OGknuPwmkWc3jVj+T/uqtQ33cxDVMuaFIA6qGAiy/WfMyElKnOBe0n3JRaigH/A8qkyN/rNvMynYlTczLA==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.0", + "@module-federation/dts-plugin": "0.9.0", + "@module-federation/inject-external-runtime-core-plugin": "0.9.0", + "@module-federation/managers": "0.9.0", + "@module-federation/manifest": "0.9.0", + "@module-federation/runtime-tools": "0.9.0", + "@module-federation/sdk": "0.9.0" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.0.tgz", + "integrity": "sha512-WByDEbJ/9fEUBOQILQRYX9CpAjCEmiU1MBSRoTg0emRKBcE9Ms5vTBN0XVuO+3gZSeyk08SfmaLtnCaeHK8ABA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.9.0", + "@module-federation/runtime-core": "0.6.21", + "@module-federation/sdk": "0.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { + "version": "0.6.21", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.21.tgz", + "integrity": "sha512-CLQiPP3kpcPbgPkiu/A1VURI2v4geFnEdizlB1tq0c6eDZqb5aLzvp87ZCGDVSuwY7DCq6jh1k+CM2WGge/2xA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.9.0", + "@module-federation/sdk": "0.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.0.tgz", + "integrity": "sha512-ioYVUsUfQjS7tgRBpZ6KFbz8YET2wD/2KmrO4zVaVHZ3RPyJzwVP9sLlDDdyf/Cn/1sQjNLg57FpyBADmY5M1Q==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.9.0", + "@module-federation/webpack-bundler-runtime": "0.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.0.tgz", + "integrity": "sha512-84MklxE6Z79gCAr+6HCyqOpF95pqSah+fGnhLz+g4ePcWf98J73bWfrdOWFO/UfxMRneXKBZBNbpDVvPLgaFeQ==", + "dev": true, + "dependencies": { + "isomorphic-rslog": "0.0.7" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.0.tgz", + "integrity": "sha512-gNMiFxSAkyy85KmdcdapKOP0RVqfuhzosdj92T9xXxR9juuILNS0TtgKbgYwNwvDs/WjOhTON5gz2lsX0kFKRg==", + "dev": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.0.tgz", + "integrity": "sha512-banXhVcgNYTqH13C6E9KrpwJ+UHaTvHfkvCRPs1y2EVvB9guPO6MnQ9Fd1DCwVMfpq3zMtJpPHobAqF5AmkCHQ==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.9.0", + "@module-federation/sdk": "0.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/node/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/node/node_modules/koa": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", + "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/@module-federation/node/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.8.12.tgz", + "integrity": "sha512-G73Cq7VwKdpFZwMd9hEBsE2HLF7mNQEIvLSiW6HOZG/+iWRRED1opiVkrjOmkcg770rChYSqTBiLvUS7HDT5Ow==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.8.12", + "@module-federation/dts-plugin": "0.8.12", + "@module-federation/inject-external-runtime-core-plugin": "0.8.12", + "@module-federation/managers": "0.8.12", + "@module-federation/manifest": "0.8.12", + "@module-federation/runtime-tools": "0.8.12", + "@module-federation/sdk": "0.8.12" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.12.tgz", + "integrity": "sha512-eYohRfambj/qzxz6tEakDn459ROcixWO4zL5gmTEOmwG+jCDnxGR14j1guopyrrpjb6EKFNrPVWtYZTPPfGdQQ==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.12", + "@module-federation/runtime-core": "0.6.20", + "@module-federation/sdk": "0.8.12" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.6.20", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.20.tgz", + "integrity": "sha512-rX7sd/i7tpkAbfMD4TtFt/57SWNC/iv7UYS8g+ad7mnCJggWE1YEKsKSFgcvp4zU3thwR+j2y+kOCwd1sQvxEA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.12", + "@module-federation/sdk": "0.8.12" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.12.tgz", + "integrity": "sha512-H97wR/toSU9+UO9S0VHLmPg/7QgohMI52EZlR0Kh0F4PD6fbiWuO4kBIp7R6g0dMI9D4NVKWTKV8xA9ASU+k7g==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.12", + "@module-federation/webpack-bundler-runtime": "0.8.12" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.12.tgz", + "integrity": "sha512-zFgXYBHbzwIqlrLfn6ewIRXDZCctDDQT2nFhbsZr29yWQgpmW1fm2kJCxQsG0DENGGN1KpzfDoxjjvSKJS/ZHA==", + "dev": true, + "dependencies": { + "isomorphic-rslog": "0.0.7" + } + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.8.12.tgz", + "integrity": "sha512-+ZO5XpBwEhP9v/Tqk51YgswwbAzj4TXKZ54++uVDsLnOh9yydVGJ/b5pQcSrc8B1C55+498tsDEcNsFgZODgMQ==", + "dev": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/utilities": { + "version": "3.1.44", + "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.44.tgz", + "integrity": "sha512-kbINh8YXg9AGTjTeCHu8w6tSZ64S+x+hfK9l7r3GDEKotmbfHJKJ3R5DhhdzBf0OEEJzjDQkKbIJQbKEI+WoYQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.9.0" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.0.tgz", + "integrity": "sha512-84MklxE6Z79gCAr+6HCyqOpF95pqSah+fGnhLz+g4ePcWf98J73bWfrdOWFO/UfxMRneXKBZBNbpDVvPLgaFeQ==", + "dev": true, + "dependencies": { + "isomorphic-rslog": "0.0.7" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.12.tgz", + "integrity": "sha512-zd343RO7/R7Xjh5ym5KdnYQ70z4LBmMxWsa44FS0nyNv04sOq6V1eZSCGKbEhbfqqhbS5Wfj8OzJyedeVvV/OQ==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.12", + "@module-federation/sdk": "0.8.12" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", "cpu": [ "x64" @@ -5372,186 +6490,481 @@ "win32" ], "engines": { - "node": ">= 10" + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nestjs/common": { + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.10.tgz", + "integrity": "sha512-pzGXp14KF2Q4CDZGQgPK4l8zEg7i6cNkb+10yc8ZA5K41cLe3ZbWW1YxtY2e/glHauOJwTLSVjH4tiRVtOTizg==", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.10.tgz", + "integrity": "sha512-f0qB8ztNWZeAD4E4fUdHConmNYCa/A78U7WJu5mX9OLYfOAs3ESYCDfsH9MRUvkA4Ft4Y1uMmyJo5L4fg4+beg==", + "hasInstallScript": true, + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express": { + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.10.tgz", + "integrity": "sha512-UVSf0yaWFBC2Zn2FOWABXxCnyG8XNIXrNnvTFpbUFqaJu1YDdwJ7wQBBqxq9CtJT7ILqSmfhOU7HS0d/0EAxpw==", + "dependencies": { + "cors": "2.8.5", + "express": "5.0.1", + "multer": "1.4.5-lts.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", + "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.0.1", + "content-disposition": "^1.0.0", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "^1.2.1", + "debug": "4.3.6", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "^2.0.0", + "fresh": "2.0.0", + "http-errors": "2.0.0", + "merge-descriptors": "^2.0.0", + "methods": "~1.1.2", + "mime-types": "^3.0.0", + "on-finished": "2.4.1", + "once": "1.4.0", + "parseurl": "~1.3.3", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "router": "^2.0.0", + "safe-buffer": "5.2.1", + "send": "^1.1.0", + "serve-static": "^2.1.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "^2.0.0", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.0.0.tgz", + "integrity": "sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@nestjs/platform-express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@nestjs/platform-express/node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", "engines": { - "node": ">= 10" + "node": ">= 0.6" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, + "node_modules/@nestjs/platform-express/node_modules/mime-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", + "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "mime-db": "^1.53.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nestjs/common": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.3.tgz", - "integrity": "sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==", + "node_modules/@nestjs/platform-express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "iterare": "1.2.1", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "side-channel": "^1.0.6" }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" + "engines": { + "node": ">=0.6" }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@nestjs/core": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.3.tgz", - "integrity": "sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==", - "hasInstallScript": true, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", + "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.2.0", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } + "engines": { + "node": ">= 18" } }, - "node_modules/@nestjs/mapped-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", - "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "class-transformer": "^0.4.0 || ^0.5.0", - "class-validator": "^0.13.0 || ^0.14.0", - "reflect-metadata": "^0.1.12 || ^0.2.0" + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nestjs/platform-express": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.3.tgz", - "integrity": "sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==", + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", + "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", "dependencies": { - "body-parser": "1.20.2", - "cors": "2.8.5", - "express": "4.18.2", - "multer": "1.4.4-lts.1", - "tslib": "2.6.2" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/type-is": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", + "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "engines": { + "node": ">= 0.6" } }, "node_modules/@nestjs/platform-socket.io": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.3.7.tgz", - "integrity": "sha512-T9VbVgEUnbid/RiywN9/8YQ8pAGDP++0nX73l4kIWeDWkz5DEh4aLB7O/JvLA3/xRHdjTZ4RiRZazwqSWi1Sog==", + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-11.0.10.tgz", + "integrity": "sha512-39lAjq0+kZRiMuscDcugoG+onPDciM4jhuf8ZDjVcuSwtib1OGwrFtErSzp/KJsmHPSStgapbNev7eFi32uWQA==", "dependencies": { - "socket.io": "4.7.5", - "tslib": "2.6.2" + "socket.io": "4.8.1", + "tslib": "2.8.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "rxjs": "^7.1.0" } }, "node_modules/@nestjs/platform-ws": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-ws/-/platform-ws-10.3.7.tgz", - "integrity": "sha512-lOvZ8u5UdL0FgAOdWosDXefVgDikPd4j5el81emkx+H0pFsysfHXSSoSvMLQijdhENqHSl3buRhO5n3M3uia1w==", + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/platform-ws/-/platform-ws-11.0.10.tgz", + "integrity": "sha512-tqCf6/+C/lejrbOpznU9/Js7JIthfVZtxipLpZ94GcpM1tO/UMvkbmG6z7HTXqjphrfYHsvMm/gGNy3XvypzcA==", "dependencies": { - "tslib": "2.6.2", - "ws": "8.16.0" + "tslib": "2.8.1", + "ws": "8.18.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "rxjs": "^7.1.0" } }, "node_modules/@nestjs/schematics": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.1.tgz", - "integrity": "sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.1.tgz", + "integrity": "sha512-PHPAUk4sXkfCxiMacD1JFC+vEyzXjZJRCu1KT2MmG2hrTiMDMk5KtMprro148JUefNuWbVyN0uLTJVSmWVzhoA==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.2", - "@angular-devkit/schematics": "17.1.2", - "comment-json": "4.2.3", - "jsonc-parser": "3.2.1", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "comment-json": "4.2.5", + "jsonc-parser": "3.3.1", "pluralize": "8.0.0" }, "peerDependencies": { @@ -5559,25 +6972,25 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.2.tgz", - "integrity": "sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -5585,130 +6998,73 @@ } } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core/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 - }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "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==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.2", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.5", + "@angular-devkit/core": "19.1.7", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics/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 - }, - "node_modules/@nestjs/schematics/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@nestjs/schematics/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "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" - }, - "engines": { - "node": ">=12" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@nestjs/schematics/node_modules/picomatch": { + "node_modules/@nestjs/schematics/node_modules/ajv-formats": { "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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@nestjs/schematics/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "picomatch": "^2.2.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8.6" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@nestjs/swagger": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", - "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.0.4.tgz", + "integrity": "sha512-wrdeQucHirv5hakCgFn34GANmqHG0//X0GF+VumYjEeE3H4AGtztbbgwnw/9XeqVM4mD2HjUFx5WYtJMpJvnWQ==", "dependencies": { - "@microsoft/tsdoc": "^0.15.0", - "@nestjs/mapped-types": "2.0.5", + "@microsoft/tsdoc": "0.15.1", + "@nestjs/mapped-types": "2.1.0", "js-yaml": "4.1.0", "lodash": "4.17.21", - "path-to-regexp": "3.3.0", - "swagger-ui-dist": "5.17.14" + "path-to-regexp": "8.2.0", + "swagger-ui-dist": "5.19.0" }, "peerDependencies": { - "@fastify/static": "^6.0.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", + "@fastify/static": "^8.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -5725,28 +7081,23 @@ } } }, - "node_modules/@nestjs/swagger/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" - }, "node_modules/@nestjs/testing": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.3.tgz", - "integrity": "sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==", + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.0.10.tgz", + "integrity": "sha512-uZcdnvmHXWnvozYOAwZi1elpRRfqIfYqHglCavjhjcj3cH1MVZkwoTqntW3XOPQlT4lf96InjP1exGaW4B9wUg==", "dev": true, "dependencies": { - "tslib": "2.6.2" + "tslib": "2.8.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -5758,45 +7109,30 @@ } }, "node_modules/@nestjs/typeorm": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz", - "integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==", - "dependencies": { - "uuid": "9.0.1" - }, + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0", "typeorm": "^0.3.0" } }, - "node_modules/@nestjs/typeorm/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@nestjs/websockets": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.3.7.tgz", - "integrity": "sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==", + "version": "11.0.10", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-11.0.10.tgz", + "integrity": "sha512-GPIEfqJyAkTHrHGK9w2OU8LJaZAZKW8WpWcTplThLxMelRq7mBkYOaGvc6dpr7fE1wWzWkwY0ZjQEnwnVmmxSg==", "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", - "tslib": "2.6.2" + "tslib": "2.8.1" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/platform-socket.io": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-socket.io": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -5815,9 +7151,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.4.tgz", - "integrity": "sha512-N3WCbQz5ipdAZoSWHNf81RLET6+isq35+GZu9u0StpFtJCpXAmRRAv4vdMUYL7DLOzRmvEgwww6Rd5AwGeLFSw==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.8.tgz", + "integrity": "sha512-uaEQMX0qElCO27R55efEQ/5UjID5KPLtgjwF9VXJ9Eoqsnr7gvKbTBQLtI8uui9aDJRxyvs58SC46E4x2EaAhQ==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -5826,7 +7162,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0", - "typescript": ">=5.5 <5.7", + "typescript": ">=5.5 <5.8", "webpack": "^5.54.0" } }, @@ -6183,56 +7519,39 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" + "consola": "^3.2.3" }, "bin": { "opencollective": "bin/opencollective.js" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" } }, "node_modules/@nx/angular": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.2.1.tgz", - "integrity": "sha512-gXaYO9ECwg397ueA/WCWHrojksaXbNv+erdjXXLG973KNcQFzJqLS/l/1IktVNu0OpQvdAVqCKTpXN5RYlxCJA==", - "dev": true, - "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/js": "20.2.1", - "@nx/module-federation": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.4.6.tgz", + "integrity": "sha512-f2TTSRQMG1PNrj8kdEqqBcHPnqi2WIUUGlhcQ22GDMsG7P7TP10985AvYHVkv4Vbr1NuptYOIuZMzJchNCBWbg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.4.6", + "@nx/eslint": "20.4.6", + "@nx/js": "20.4.6", + "@nx/module-federation": "20.4.6", + "@nx/web": "20.4.6", + "@nx/webpack": "20.4.6", + "@nx/workspace": "20.4.6", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", - "chalk": "^4.1.0", "magic-string": "~0.30.2", "minimatch": "9.0.3", + "picocolors": "^1.1.0", "piscina": "^4.4.0", "semver": "^7.5.3", "tslib": "^2.3.0", @@ -6390,22 +7709,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nx/angular/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@nx/angular/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", @@ -6419,9 +7722,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.2.1.tgz", - "integrity": "sha512-boNTu7Z7oHkYjrYg5Wzg+cQfbEJ2nntRj1eI99w8mp4qz2B4PEEjJOB0BZafR54ZcKpGEbyp/QBB945GsjTUbw==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.4.6.tgz", + "integrity": "sha512-XGnCu4p9HUrs6pDZmfpBF5hmmvXzLvV+oZJP0slFRoi9hVdXiZ31t+Vh0AQc7zSbtPeCxEJDxY4dIJKgdesR0A==", "dev": true, "dependencies": { "ejs": "^3.1.7", @@ -6438,16 +7741,16 @@ } }, "node_modules/@nx/eslint": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.2.1.tgz", - "integrity": "sha512-HY3Sy7AOZR9Z5NZ0kv/aagma/7DviYg+dCH4mHBja5nJmzX0XtAwxcTIzJuo2DBNMw/4aDfGtGgwhXyRhnmXsw==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.4.6.tgz", + "integrity": "sha512-lPVvUrRYaQqkwY0kg4hO0B6GJt+zihmp+zNppbHllq/v5uHZRm0+3RrmJhAdmxlubuR7A49jdQe4fHOlFySpAw==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", "semver": "^7.5.3", "tslib": "^2.3.0", - "typescript": "~5.6.2" + "typescript": "~5.7.2" }, "peerDependencies": { "@zkochan/js-yaml": "0.0.7", @@ -6460,13 +7763,13 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.2.1.tgz", - "integrity": "sha512-cgJWWuORPOWssxq0qC7ZWOiqZoa4cH4kyVMIjsv6CAKFfFvUjIOu/nH19WeRIt8KgTEot3l6li/f+XmYo0GfFw==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.4.6.tgz", + "integrity": "sha512-CsR7aiDKIBqhk5v+6m+Qmlob9CipRx7DvvbCa5tPqFvXCQjjD5/wqisxydd9VAuz84DxjlrXcbA4dqlP8ZF5Lw==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -6671,48 +7974,32 @@ } }, "node_modules/@nx/jest": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.2.1.tgz", - "integrity": "sha512-bTNF3uHF+y0HvP+09MFEce2eqhSku73O8+akJk4M8eEaXlyWjWG54V0x8cYkZV57D8tYPiYQpWlhtLNkQA45YA==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.4.6.tgz", + "integrity": "sha512-yZOZJOQFtpdY3Fu/WYNoDx81TwvF9yfwvalFpLD19bz+2YGl7B89l0S1ZrtSRXFfKXA/w7gb0gmKwthJtQhx9Q==", "dev": true, "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", "@phenomnomnominal/tsquery": "~5.0.1", - "chalk": "^4.1.0", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", "jest-resolve": "^29.4.1", "jest-util": "^29.4.1", "minimatch": "9.0.3", - "resolve.exports": "1.1.0", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", "semver": "^7.5.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, - "node_modules/@nx/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@nx/js": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.2.1.tgz", - "integrity": "sha512-2Ecsk7VRODXys6IgjVVhq+8zzajJzfes5SOdc82DApuNEb/cqj7gTKZlIFvqjup7t3z5yyXFd2Vi9js/JfCcZQ==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.4.6.tgz", + "integrity": "sha512-wHO6tXJNVIW0Z9zKLL/g6qee7K92XJNS4D8irpJB9sOg25fqAzKjwgcK0bPtnRhYsIjLkjh0FsTKIcznxTGnkA==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", @@ -6722,17 +8009,16 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.2.1", - "@nx/workspace": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/workspace": "20.4.6", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", + "babel-plugin-macros": "^3.1.0", "babel-plugin-transform-typescript-metadata": "^0.3.1", "chalk": "^4.1.0", "columnify": "^1.6.0", "detect-port": "^1.5.1", "enquirer": "~2.3.6", - "fast-glob": "3.2.7", "ignore": "^5.0.4", "js-tokens": "^4.0.0", "jsonc-parser": "3.2.0", @@ -6742,6 +8028,7 @@ "ora": "5.3.0", "semver": "^7.5.3", "source-map-support": "0.5.19", + "tinyglobby": "^0.2.10", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0" @@ -6771,22 +8058,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/js/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@nx/js/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -6835,48 +8106,23 @@ } }, "node_modules/@nx/module-federation": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.2.1.tgz", - "integrity": "sha512-yGYjU78WaA19WdbDphYnYbEGYPdiFKUtDHdrDedXPGQQT6P7XD38iLDnGJ/dz1XytEKrAgZeBPKqa8lDKxqgoA==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.4.6.tgz", + "integrity": "sha512-Vs2UpZgzfQZSGtZPZjnFTZncGcOgqW3l94Tia8EqFDDcOg5sl5YRHILowXSs2HVj+wMLqTq1R06JQBazFvpB0Q==", "dev": true, "dependencies": { - "@module-federation/enhanced": "0.7.6", - "@module-federation/node": "2.6.11", - "@module-federation/sdk": "0.7.6", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", - "@nx/web": "20.2.1", + "@module-federation/enhanced": "^0.8.8", + "@module-federation/node": "^2.6.21", + "@module-federation/sdk": "^0.8.8", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", + "@nx/web": "20.4.6", "@rspack/core": "^1.1.5", - "express": "^4.19.2", + "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", "picocolors": "^1.1.0", "tslib": "^2.3.0", - "webpack": "5.88.0" - } - }, - "node_modules/@nx/module-federation/node_modules/ajv": { - "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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@nx/module-federation/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "webpack": "^5.88.0" } }, "node_modules/@nx/module-federation/node_modules/body-parser": { @@ -6930,28 +8176,6 @@ "node": ">= 0.8" } }, - "node_modules/@nx/module-federation/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nx/module-federation/node_modules/estraverse": { - "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" - } - }, "node_modules/@nx/module-federation/node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -7016,18 +8240,6 @@ "node": ">= 0.8" } }, - "node_modules/@nx/module-federation/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 - }, - "node_modules/@nx/module-federation/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 - }, "node_modules/@nx/module-federation/node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -7064,24 +8276,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@nx/module-federation/node_modules/schema-utils": { - "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", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/@nx/module-federation/node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -7136,64 +8330,17 @@ "node": ">= 0.8.0" } }, - "node_modules/@nx/module-federation/node_modules/webpack": { - "version": "5.88.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.0.tgz", - "integrity": "sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/@nx/nest": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.2.1.tgz", - "integrity": "sha512-00+lwnvi3dzOmQiQt0CrZAMIYBKq18KwGFTbMsvzSCbXIjOCC1hOTbL3hiQCH2zdvZJFwDqTwZeC199fkU+l0g==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.4.6.tgz", + "integrity": "sha512-mFBdjXWChZ6tnfuIg7fM4hiEw8HMa+nEJ3jxve+OhY2BjbwUH8ADMjrhu65Ipk6hol56V+hDi7x7VYFHs/rxTg==", "dev": true, "dependencies": { "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/js": "20.2.1", - "@nx/node": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/eslint": "20.4.6", + "@nx/js": "20.4.6", + "@nx/node": "20.4.6", "tslib": "^2.3.0" } }, @@ -7329,22 +8476,22 @@ } }, "node_modules/@nx/node": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.2.1.tgz", - "integrity": "sha512-8agEqP+qJCcIIIlMy+mNhZid7AVmXXLnI8iFktnb8AMjnGcg1qLZIGhqucgpDZjwQP+iGZOlz2gMxWTuc59fSg==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.4.6.tgz", + "integrity": "sha512-chA3cwT5YJJekl9nRztNuJa9fYlfHgSl9iWNrF1D+A/ZA5vJzDAe2XyuZD10pbCGIMl8DkepQT+8uP7/S/jCfA==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/eslint": "20.4.6", + "@nx/jest": "20.4.6", + "@nx/js": "20.4.6", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.2.1.tgz", - "integrity": "sha512-nJcyPZfH6Vq4cG6gRnQ8PcnVOLePeT3exzLnQu0I4I2EtCTPyCSRA3gxoGzZ3qZFMQTsCbwv4HYfdx42AXOTAQ==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.4.6.tgz", + "integrity": "sha512-yYBkXCqx9XDS88IKlbXQUMKAmNE6OA7AwmreDabL0zKCeB5x9qit5iaGwQOYCA7PSdjFQTYvPdKK+S3ytKCJ2w==", "cpu": [ "arm64" ], @@ -7358,9 +8505,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.2.1.tgz", - "integrity": "sha512-SEiN8fjEs010ME4PRP8O9f8qG8AMZBGz8hOkF6ZrdlC+iEi4iyAGpgWFq8PKBlpVW4G5gxR91Y7eVaTKAsgH5w==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.4.6.tgz", + "integrity": "sha512-YeGCTQPmZmWYSJ3Km8rsx3YhohbQNp8grclyEp4KA7GXrPY+AKA9hcy0e5KwF4hPP41EEYkju2Xpl0XdmOfdBQ==", "cpu": [ "x64" ], @@ -7374,9 +8521,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.2.1.tgz", - "integrity": "sha512-/yEKS9q17EG2Ci130McvpZM5YUghH1ql9UXWbVmitufn+RQD90hoblkG/B+cxJeZonrdKAjdpLQ+hfVz+FBd/g==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.4.6.tgz", + "integrity": "sha512-49Ad0ysTWrNARmZxc02bmWfrGT5XKEnb5+Nms+RGzQVs+5WI6yqKx2iuLGrx2CDY0FEY11Z0zFpwvrZPGnnLXw==", "cpu": [ "x64" ], @@ -7390,9 +8537,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.2.1.tgz", - "integrity": "sha512-DPtRjTCJ5++stTGtjqYftCb2c0CNed2s2EZZLQuDP+tikTsLm0d3S3ZaU5eHhqZW35tQuMOVweOfC1nJ3/DTSA==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.4.6.tgz", + "integrity": "sha512-+SMu0xYf2Qim2AC4eYn2SKLXd94UwudMIdPiwbHQUtqRnX88T8rGQKxtINdEAEmIt/KkHyceyJ7lpHGRKmFfbw==", "cpu": [ "arm" ], @@ -7406,9 +8553,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.2.1.tgz", - "integrity": "sha512-ggGwHOEP6UjXeqv6DtRxizeBnX/zRZi8BRJbEJBwAt1cAUnLlklk8d+Hmjs+j/FlFXBV9f+ylpAqoYkplFR8jg==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.4.6.tgz", + "integrity": "sha512-1u+qawDO4R8w6op2mqIECzJ8YEViPhpqyq3RiRyAchPodUgrd1rnYnYj+xgQeED4d+L+djeZfhN6000WDhZ5oA==", "cpu": [ "arm64" ], @@ -7422,9 +8569,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.2.1.tgz", - "integrity": "sha512-HZBGxsBJUFbWVTiyJxqt0tS8tlvp+Tp0D533mGKW75cU0rv9dnmbtTwkkkx+LXqerjSRvNS3Qtj0Uh2w92Vtig==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.4.6.tgz", + "integrity": "sha512-8sFM3Z8k2iojXpL1E/ynlp+BPD8YWCs12cc+qk/4Ke5uOILcpDQ7XZSmzYoNIxp/0fcbZ1bosE+o7Lx4sbpfjQ==", "cpu": [ "arm64" ], @@ -7438,9 +8585,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.2.1.tgz", - "integrity": "sha512-pTytPwGiPRakqz2PKiWTSRNm9taE1U9n0+kRAAFzbOtzeW+eIoebe5xY5QMoZ+XtIZ6pJM2BUOyMD+/TX57r8Q==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.4.6.tgz", + "integrity": "sha512-9t8jPREQN8a2j09O9q9aQI4cP6UXn7tOD+UVYhlQ9EO+EsHKCcaTzszeLoatySVxzeG0RB3vutMgaa8AiS4qcA==", "cpu": [ "x64" ], @@ -7454,9 +8601,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.2.1.tgz", - "integrity": "sha512-p3egqe5zmwiDl6xSwHi2K9UZWiKbZ/s/j4qV+pZttzMyNPfhohTeP+VwQqjTeQ1hPBl2YhwmmktEPsIPYJG7YA==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.4.6.tgz", + "integrity": "sha512-4EO71ND0OJcvinYNc+enB3ouFeKWjCcb73xG2RdjF5s8A9/RFFK6Z3zasYTmGWR06nSLm3mi6xiyiNXWvIdZMA==", "cpu": [ "x64" ], @@ -7470,9 +8617,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.2.1.tgz", - "integrity": "sha512-Wujist6k08pjgWWQ1pjXrCArmMgnyIXNVmDP14cWo1KHecBuxNWa9i62PrxQ0K8MLYMcAzLHJxN9t54GzBbd+g==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.4.6.tgz", + "integrity": "sha512-o8Vurr2c9SMP+a2jrBD3VUkQqmHXqi1yC+NJHMzO7GiVPaCFoJR1IizAECXIiKUXv5dB+WFQow7yzVkQQAjk6g==", "cpu": [ "arm64" ], @@ -7486,9 +8633,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.2.1.tgz", - "integrity": "sha512-tsEYfNV2+CWSQmbh9TM8cX5wk6F2QAH0tfvt4topyOOaR40eszW8qc/eDM/kkJ5nj87BbNEqPBQAYFE0AP1OMA==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.4.6.tgz", + "integrity": "sha512-PtBlsTJHsHeAEawt2HrWkSEsHbwu7MlqFIrw8cS+tg7ZblpesUWva1L3Ylx0hEcQrY7UjMGDR0RVo2DKAUvKZA==", "cpu": [ "x64" ], @@ -7502,13 +8649,13 @@ } }, "node_modules/@nx/web": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.2.1.tgz", - "integrity": "sha512-o8/onqLqxnPw3vW/QQPjiFVE/K3Hclg8tw4pnlzCxis258ywZc8iAtmIZnDJeO3VenMagjRJdzwOZ49yDFvj2Q==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.4.6.tgz", + "integrity": "sha512-MKV4f8MHoAwo6G0ambu9DqRRjcp0xiMtv1Ijj6GWkD7Xru4IEsHWrDUjTSdl3yKg8zKqMY2Bw+UArxa1Xborkg==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -7516,14 +8663,14 @@ } }, "node_modules/@nx/webpack": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.2.1.tgz", - "integrity": "sha512-nw64O2qHMXKiMmDi/MdvQUCBAs18AvhrAjigQ2lINsk643Akg1gI/ZvXUZ2GIZLsdNNWT9jHPm66cUfX2mYpPg==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.4.6.tgz", + "integrity": "sha512-PEiWKZ8bMcWlPzlRUdI76eyV+hQewFaPCL7ttv8YKFYmVWJbfSihiExQ1LRSWIKR2qw0FvzPY8X2bKQzDv603Q==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.2.1", - "@nx/js": "20.2.1", + "@nx/devkit": "20.4.6", + "@nx/js": "20.4.6", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -7596,22 +8743,6 @@ "webpack": "^5.1.0" } }, - "node_modules/@nx/webpack/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@nx/webpack/node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -7855,15 +8986,15 @@ } }, "node_modules/@nx/workspace": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.2.1.tgz", - "integrity": "sha512-YJnOyqJDzuTHOWQ/eFCfBwGg0x3ByxBYk4PPF48tUN21TLoXbq39GP+/I3tsRNm9rvhcOTRoGybWu06t21ty4Q==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.4.6.tgz", + "integrity": "sha512-1rRRN4MJjghDvZSfCNpTn0IDkNJrU6W3VLn8cGjmJXJj8OXxbi3bYc1Ykk+zC99UmSRQ/8+SLorkX+FgTC1ODQ==", "dev": true, "dependencies": { - "@nx/devkit": "20.2.1", + "@nx/devkit": "20.4.6", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.2.1", + "nx": "20.4.6", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } @@ -8276,9 +9407,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -8289,9 +9420,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -8302,9 +9433,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -8315,9 +9446,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -8328,9 +9459,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -8341,9 +9472,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -8354,9 +9485,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -8367,9 +9498,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -8380,9 +9511,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -8393,9 +9524,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -8405,10 +9536,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -8419,9 +9563,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -8432,9 +9576,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -8445,9 +9589,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -8458,9 +9602,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -8471,9 +9615,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -8484,9 +9628,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -8497,9 +9641,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -8897,14 +10041,20 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true + }, "node_modules/@schematics/angular": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.4.tgz", - "integrity": "sha512-1fXBtkA/AjgMPxHLpGlw7NuT/wggCqAwBAmDnSiRnBBV7Pgs/tHorLgh7A9eoUi3c8CYCuAh8zqWNyjBGGigOQ==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.8.tgz", + "integrity": "sha512-ytgClbMPn+i+w1S3QukR/Vdge+sfU9aX49ao+XRwoWdOssHUjmVjQcCEdzu0ucSrNPZnhm34bdDPzADLhln60w==", "dev": true, "dependencies": { - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", "jsonc-parser": "3.3.1" }, "engines": { @@ -8913,12 +10063,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "node_modules/@sigstore/bundle": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", @@ -9361,6 +10505,15 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "devOptional": true }, + "node_modules/@tsd/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-saiCxzHRhUrRxQV2JhH580aQUZiKQUXI38FcAcikcfOomAil4G4lxT0RfrrKywoAYP/rqAdYXYmNRLppcd+hQQ==", + "dev": true, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -9491,11 +10644,6 @@ "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -9543,9 +10691,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "dependencies": { "@types/node": "*", @@ -9665,6 +10813,12 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "node_modules/@types/node": { "version": "18.16.20", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.20.tgz", @@ -9679,6 +10833,12 @@ "@types/node": "*" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -9686,9 +10846,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true }, "node_modules/@types/range-parser": { @@ -9772,9 +10932,9 @@ "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, "dependencies": { "@types/node": "*" @@ -10587,18 +11747,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -10880,6 +12028,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -10921,16 +12070,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "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==", - "deprecated": "package has been renamed to acorn-import-attributes", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -11196,7 +12335,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/array-timsort": { "version": "1.0.3", @@ -11212,6 +12352,15 @@ "node": ">=8" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -11575,14 +12724,18 @@ } }, "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, "node_modules/babel-plugin-polyfill-corejs2": { @@ -11753,19 +12906,22 @@ "dev": true }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "dependencies": { "css-select": "^5.1.0", "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/big.js": { @@ -11815,40 +12971,134 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", + "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.5.2", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", + "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", + "dependencies": { + "mime-db": "^1.53.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/body-parser/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "ms": "2.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/body-parser/node_modules/ms": { + "node_modules/body-parser/node_modules/type-is": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", + "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/bonjour-service": { "version": "1.3.0", @@ -12182,6 +13432,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -12196,6 +13447,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -12214,6 +13492,23 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -12265,6 +13560,11 @@ "node": ">=8" } }, + "node_modules/change-case-commonjs": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case-commonjs/-/change-case-commonjs-5.4.4.tgz", + "integrity": "sha512-b9kVAvkOzngdK/JIMSqP1TixZ4lDvYwk+Lh+EL1+tYjQCp6FCLVQe/VmjwlYXt7MQsvlLaUdX6gJNEsRlQlwlw==" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -12678,9 +13978,9 @@ "dev": true }, "node_modules/comment-json": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", + "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", "dev": true, "dependencies": { "array-timsort": "^1.0.3", @@ -12801,14 +14101,18 @@ } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -12834,6 +14138,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12841,7 +14146,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/cookies": { "version": "0.9.1", @@ -12999,19 +14305,19 @@ } }, "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/create-jest": { @@ -13426,6 +14732,40 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -13497,6 +14837,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -13722,9 +15063,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -13761,6 +15102,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexify": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", @@ -13872,6 +15226,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -13880,7 +15235,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "devOptional": true, + "dev": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -13889,7 +15244,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13907,20 +15262,19 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -13967,23 +15321,23 @@ } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -14093,12 +15447,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -14117,10 +15468,21 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "bin": { @@ -14130,36 +15492,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/esbuild-wasm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", - "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz", + "integrity": "sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -14273,20 +15636,74 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-formatter-pretty": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", + "dev": true, + "dependencies": { + "@types/eslint": "^7.2.13", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-formatter-pretty/node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/eslint-formatter-pretty/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } + "node_modules/eslint-rule-docs": { + "version": "1.1.235", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", + "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", + "dev": true }, "node_modules/eslint-scope": { "version": "8.2.0", @@ -14586,6 +16003,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "engines": { "node": ">=6" } @@ -14600,6 +16018,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" } @@ -14674,6 +16093,7 @@ "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -14721,6 +16141,7 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -14744,6 +16165,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14751,17 +16173,20 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14819,15 +16244,15 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -14902,6 +16327,20 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figlet": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", @@ -14976,6 +16415,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -14993,6 +16433,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15000,7 +16441,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -15248,22 +16690,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -15376,6 +16802,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15528,15 +16955,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -15553,6 +16985,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -15715,11 +17159,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15772,6 +17216,15 @@ "node": ">=0.10.0" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -15799,6 +17252,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -15806,21 +17260,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -15844,9 +17287,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -15928,22 +17371,6 @@ "node": ">=12" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -16044,9 +17471,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "dev": true }, "node_modules/http-proxy": { @@ -16202,12 +17629,12 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -16236,6 +17663,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16386,6 +17814,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -16449,6 +17886,15 @@ "node": ">= 0.10" } }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -16468,11 +17914,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16519,12 +17968,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -16656,6 +18108,24 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -16737,9 +18207,9 @@ } }, "node_modules/isomorphic-rslog": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", - "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.7.tgz", + "integrity": "sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g==", "dev": true, "engines": { "node": ">=14.17.6" @@ -17002,23 +18472,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -17035,24 +18488,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-circus/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -17526,15 +18961,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -18070,9 +19496,9 @@ } }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonfile": { @@ -18404,9 +19830,9 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -18671,9 +20097,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "optional": true, @@ -18688,12 +20114,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/loader-runner": { @@ -19150,9 +20576,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -19237,6 +20663,26 @@ "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -19256,17 +20702,110 @@ "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" - }, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">=10" } }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", @@ -19325,6 +20864,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -19372,6 +20912,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -19420,6 +20969,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -19698,9 +21270,9 @@ } }, "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -19866,9 +21438,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -19965,22 +21537,22 @@ "dev": true }, "node_modules/nestjs-pino": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-4.0.0.tgz", - "integrity": "sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-4.3.0.tgz", + "integrity": "sha512-u/FRi+eRH+ER6cccyr9BBNaHg71qxLgWwDT7a0eGbSVZrSUzQ04O5zTNqydgzihNNHfuam6TBTz1wWdapOWYnQ==", "hasInstallScript": true, "engines": { "node": ">= 14" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "pino-http": "^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "pino-http": "^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/ng-packagr": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.0.1.tgz", - "integrity": "sha512-PnXa/y3ce3v4bKJNtUBS7qcNoyv5g/tSthoMe23NyMV5kjNY4+hJT7h64zK+8tnJWTelCbIpoep7tmSPsOifBA==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.1.2.tgz", + "integrity": "sha512-h8YDp6YdPwAwbl7rs0lJE7vVugobY6m+JogS0hQ7P+52RmslPT8kRCgdvGLIS1JySwPrDFQkPh2PLBaSjwcRqQ==", "dev": true, "dependencies": { "@rollup/plugin-json": "^6.1.0", @@ -19989,7 +21561,7 @@ "ansi-colors": "^4.1.3", "browserslist": "^4.22.1", "chokidar": "^4.0.1", - "commander": "^12.1.0", + "commander": "^13.0.0", "convert-source-map": "^2.0.0", "dependency-graph": "^1.0.0", "esbuild": "^0.24.0", @@ -20002,7 +21574,7 @@ "piscina": "^4.7.0", "postcss": "^8.4.47", "rxjs": "^7.8.1", - "sass": "^1.79.5" + "sass": "^1.81.0" }, "bin": { "ng-packagr": "cli/main.js" @@ -20014,10 +21586,10 @@ "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "tailwindcss": { @@ -20042,9 +21614,9 @@ } }, "node_modules/ng-packagr/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "engines": { "node": ">=18" @@ -20056,12 +21628,6 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/ng-packagr/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "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", @@ -20079,6 +21645,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -20097,17 +21664,20 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -20618,9 +22188,9 @@ "dev": true }, "node_modules/nx": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.2.1.tgz", - "integrity": "sha512-zUw1DT9BW2ajbDZgcUFKfysGqrbJwsMRjPxT6GthuqcLtDc2iJi3+/UBTLsITSeiw4Za4qPVxjaK4+yma9Ju5w==", + "version": "20.4.6", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.4.6.tgz", + "integrity": "sha512-gXRw3urAq4glK6B1+jxHjzXRyuNrFFI7L3ggNg34UmQ46AyT7a6FgjZp2OZ779urwnoQSTvxNfBuD4+RrB31MQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -20648,6 +22218,7 @@ "npm-run-path": "^4.0.1", "open": "^8.4.0", "ora": "5.3.0", + "resolve.exports": "2.0.3", "semver": "^7.5.3", "string-width": "^4.2.3", "tar-stream": "~2.2.0", @@ -20663,16 +22234,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.2.1", - "@nx/nx-darwin-x64": "20.2.1", - "@nx/nx-freebsd-x64": "20.2.1", - "@nx/nx-linux-arm-gnueabihf": "20.2.1", - "@nx/nx-linux-arm64-gnu": "20.2.1", - "@nx/nx-linux-arm64-musl": "20.2.1", - "@nx/nx-linux-x64-gnu": "20.2.1", - "@nx/nx-linux-x64-musl": "20.2.1", - "@nx/nx-win32-arm64-msvc": "20.2.1", - "@nx/nx-win32-x64-msvc": "20.2.1" + "@nx/nx-darwin-arm64": "20.4.6", + "@nx/nx-darwin-x64": "20.4.6", + "@nx/nx-freebsd-x64": "20.4.6", + "@nx/nx-linux-arm-gnueabihf": "20.4.6", + "@nx/nx-linux-arm64-gnu": "20.4.6", + "@nx/nx-linux-arm64-musl": "20.4.6", + "@nx/nx-linux-x64-gnu": "20.4.6", + "@nx/nx-linux-x64-musl": "20.4.6", + "@nx/nx-win32-arm64-msvc": "20.4.6", + "@nx/nx-win32-x64-msvc": "20.4.6" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -20770,9 +22341,9 @@ } }, "node_modules/nx/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -20799,9 +22370,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -20853,7 +22427,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -21381,9 +22954,12 @@ } }, "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "engines": { + "node": ">=16" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -21596,96 +23172,49 @@ } }, "node_modules/pino": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", - "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "dependencies": { - "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/pino-http": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-9.0.0.tgz", - "integrity": "sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.4.0.tgz", + "integrity": "sha512-vjQsKBE+VN1LVchjbfLE7B6nBeGASZNRNKsR68VS0DolTm5R3zo+47JX1wjm0O96dcbvA7vnqt8YqOWlG5nN0w==", "dependencies": { "get-caller-file": "^2.0.5", - "pino": "^8.17.1", - "pino-std-serializers": "^6.2.2", - "process-warning": "^3.0.0" + "pino": "^9.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0" } }, "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" }, "node_modules/pirates": { "version": "4.0.6", @@ -21697,9 +23226,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "optionalDependencies": { "@napi-rs/nice": "^1.0.1" @@ -21726,6 +23255,21 @@ "node": ">= 0.4.0" } }, + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -22518,6 +24062,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, "engines": { "node": ">= 0.6.0" } @@ -22528,9 +24073,19 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -22628,6 +24183,7 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -22668,6 +24224,15 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -22675,9 +24240,9 @@ "dev": true }, "node_modules/rambda": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.0.tgz", - "integrity": "sha512-B7y7goUd+g0hNl5ODGUejNNERQL5gD8uANJ5Y5aHly8v0jKesFlwIe7prPfuJxttDpe3otQzHJ4NXMpTmL9ELA==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", + "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", "dev": true }, "node_modules/randexp": { @@ -22714,6 +24279,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -22766,6 +24332,83 @@ "pify": "^2.3.0" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -22822,6 +24465,19 @@ "node": ">= 10.13.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", @@ -23021,9 +24677,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "engines": { "node": ">=10" @@ -23091,9 +24747,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "dependencies": { "@types/estree": "1.0.6" @@ -23106,27 +24762,46 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", + "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", + "dependencies": { + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -23188,6 +24863,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -23202,9 +24894,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "dependencies": { "chokidar": "^4.0.0", @@ -23222,9 +24914,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz", - "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -23355,6 +25047,7 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -23378,6 +25071,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23385,12 +25079,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/seq-queue": { "version": "0.0.5", @@ -23488,6 +25184,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -23502,6 +25199,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", @@ -23574,15 +25272,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -23679,15 +25428,15 @@ } }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -23696,24 +25445,24 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -23799,9 +25548,9 @@ } }, "node_modules/sonic-boom": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", - "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -23903,1475 +25652,1151 @@ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "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", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/steno": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", - "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.3" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/spdy-transport/node_modules/readable-stream": { + "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": { - "ansi-regex": "^5.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { - "node": ">=8" + "node": ">= 10.x" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, - "engines": { - "node": ">= 12.13.0" + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, - "peerDependencies": { - "webpack": "^5.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" + "minipass": "^7.0.3" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/stylus": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", - "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { - "@adobe/css-tools": "~4.3.3", - "debug": "^4.3.2", - "glob": "^10.4.5", - "sax": "~1.4.1", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://opencollective.com/stylus" + "node": ">=10" } }, - "node_modules/stylus-loader": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", - "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "dependencies": { - "fast-glob": "^3.2.12", - "normalize-path": "^3.0.0" - }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" + "node": ">=8" } }, - "node_modules/stylus/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/stylus/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "graceful-fs": "^4.1.3" } }, - "node_modules/stylus/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=6 <7 || >=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "node": ">= 4.0.0" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { - "node": ">= 10" + "node": ">=10.0.0" } }, - "node_modules/swagger-ui-dist": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", - "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==" - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "engines": { - "node": ">=6" + "node": ">=0.6.19" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "minipass": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "yallist": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "min-indent": "^1.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", - "engines": { - "node": ">=8.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "node_modules/stylus": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "@adobe/css-tools": "~4.3.3", + "debug": "^4.3.2", + "glob": "^10.4.5", + "sax": "~1.4.1", + "source-map": "^0.7.3" }, "bin": { - "terser": "bin/terser" + "stylus": "bin/stylus" }, "engines": { - "node": ">=10" + "node": ">=16" + }, + "funding": { + "url": "https://opencollective.com/stylus" } }, - "node_modules/terser-webpack-plugin": { - "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==", + "node_modules/stylus-loader": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", + "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "fast-glob": "^3.2.12", + "normalize-path": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "stylus": ">=0.52.4", + "webpack": "^5.0.0" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/stylus/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/stylus/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/terser-webpack-plugin/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 - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "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==", + "node_modules/stylus/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "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" + "node_modules/supports-preserve-symlinks-flag": { + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, - "engines": { - "node": "*" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" + "bin": { + "svgo": "bin/svgo" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" + "node": ">= 10" } }, - "node_modules/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "node_modules/swagger-ui-dist": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.19.0.tgz", + "integrity": "sha512-bSVZeYaqanMFeW5ZY3+EejFbsjkjazYxm1I7Lz3xayYz5XU3m2aUzvuPC0jI95WCQdduszHYV3ER4buQoy8DXA==", "dependencies": { - "real-require": "^0.2.0" + "@scarf/scarf": "=1.4.0" } }, - "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 + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=14.14" + "node": ">=10" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, "dependencies": { - "is-number": "^7.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">=8.0" + "node": ">=6" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/tar-stream/node_modules/readable-stream": { + "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", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.6" + "node": ">= 6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "dev": true + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">=8" } }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { - "punycode": "^2.1.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/tree-dump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "dependencies": { + "yallist": "^4.0.0" }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">=8" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" + "mkdirp": "bin/cmd.js" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "engines": { + "node": ">=10" } }, - "node_modules/ts-deepmerge": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-6.2.1.tgz", - "integrity": "sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", "engines": { - "node": ">=14.13.1" + "node": ">=8.0.0" } }, - "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, "bin": { - "ts-jest": "cli.js" + "terser": "bin/terser" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "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", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" + "webpack": "^5.1.0" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { + "@swc/core": { "optional": true }, - "babel-jest": { + "esbuild": { "optional": true }, - "esbuild": { + "uglify-js": { "optional": true } } }, - "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "ajv": "^6.9.1" } }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10.13.0" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, + "node_modules/terser-webpack-plugin/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 + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "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": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "engines": { + "node": ">= 10.13.0" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "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" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "*" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, "engines": { - "node": ">=0.6.x" + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/tuf-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", - "dev": true, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" - }, + "real-require": "^0.2.0" + } + }, + "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 + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/tuf-js/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "dev": true, "dependencies": { - "ms": "^2.1.3" + "fdir": "^6.4.3", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=6.0" + "node": ">=12.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tuf-js/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "safe-buffer": "^5.0.1" + "is-number": "^7.0.0" }, "engines": { - "node": "*" + "node": ">=8.0" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } }, - "node_modules/typanion": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", - "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", "dev": true }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 4.0.0" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "punycode": "^2.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typeorm": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", - "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", - "dependencies": { - "@sqltools/formatter": "^1.2.5", - "app-root-path": "^3.1.0", - "buffer": "^6.0.3", - "chalk": "^4.1.2", - "cli-highlight": "^2.1.11", - "dayjs": "^1.11.9", - "debug": "^4.3.4", - "dotenv": "^16.0.3", - "glob": "^10.3.10", - "mkdirp": "^2.1.3", - "reflect-metadata": "^0.2.1", - "sha.js": "^2.4.11", - "tslib": "^2.5.0", - "uuid": "^9.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "typeorm": "cli.js", - "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", - "typeorm-ts-node-esm": "cli-ts-node-esm.js" - }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=10.0" }, "funding": { - "url": "https://opencollective.com/typeorm" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@google-cloud/spanner": "^5.18.0", - "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", - "hdb-pool": "^0.1.6", - "ioredis": "^5.0.4", - "mongodb": "^5.8.0", - "mssql": "^9.1.1 || ^10.0.1", - "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^6.3.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1 || ^4.0.0", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.3", - "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0" + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" }, - "peerDependenciesMeta": { - "@google-cloud/spanner": { - "optional": true - }, - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "hdb-pool": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-deepmerge": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-6.2.1.tgz", + "integrity": "sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==", + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/ts-jest": { + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { "optional": true }, - "sqlite3": { + "@jest/types": { "optional": true }, - "ts-node": { + "babel-jest": { "optional": true }, - "typeorm-aurora-data-api-driver": { + "esbuild": { "optional": true } } }, - "node_modules/typeorm-pglite": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/typeorm-pglite/-/typeorm-pglite-0.3.2.tgz", - "integrity": "sha512-/URkIx3MXaRqLKXjGfFY1uq8Fp6qSYTP09NjK6MAbsZhNwe7qAqnaWdTGtJ4aMr2e2TDPXT1rCt+w7xszMUzOg==", + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, - "peerDependencies": { - "@electric-sql/pglite": ">= 0.2.12" - } - }, - "node_modules/typeorm/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/typeorm/node_modules/chalk": { + "node_modules/ts-loader/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -25383,1083 +26808,1021 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/typeorm/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "glob": "dist/esm/bin.mjs" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "node_modules/typeorm/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=6" } }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.0.0" }, "engines": { - "node": ">=14.17" + "node": ">=10.13.0" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/uid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "dependencies": { - "@lukeed/csprng": "^1.0.0" - }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/umzug": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.2.tgz", - "integrity": "sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==", + "node_modules/tsd": { + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", + "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", + "dev": true, "dependencies": { - "@rushstack/ts-command-line": "^4.12.2", - "emittery": "^0.13.0", - "fast-glob": "^3.3.2", - "pony-cause": "^2.1.4", - "type-fest": "^4.0.0" + "@tsd/typescript": "~5.4.3", + "eslint-formatter-pretty": "^4.1.0", + "globby": "^11.0.1", + "jest-diff": "^29.0.3", + "meow": "^9.0.0", + "path-exists": "^4.0.0", + "read-pkg-up": "^7.0.0" + }, + "bin": { + "tsd": "dist/cli.js" }, "engines": { - "node": ">=12" + "node": ">=14.16" } }, - "node_modules/umzug/node_modules/type-fest": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", - "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, "engines": { - "node": ">=16" + "node": ">=0.6.x" + } + }, + "node_modules/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "dev": true, + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "node_modules/tuf-js/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/tuf-js/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/typanion": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", + "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { - "qs": "^6.4.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.6" } }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typeorm": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", + "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", "dependencies": { - "imurmurhash": "^0.1.4" + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "dayjs": "^1.11.9", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^10.3.10", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.2.1", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" + "node": ">=16.13.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^5.8.0", + "mssql": "^9.1.1 || ^10.0.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^6.3.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } } }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "node_modules/typeorm-pglite": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/typeorm-pglite/-/typeorm-pglite-0.3.2.tgz", + "integrity": "sha512-/URkIx3MXaRqLKXjGfFY1uq8Fp6qSYTP09NjK6MAbsZhNwe7qAqnaWdTGtJ4aMr2e2TDPXT1rCt+w7xszMUzOg==", "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" + "peerDependencies": { + "@electric-sql/pglite": ">= 0.2.12" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, + "node_modules/typeorm/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" + "node": ">=10" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/verdaccio": { - "version": "5.29.2", - "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.29.2.tgz", - "integrity": "sha512-Ra9Bv8mMsGaFnvFJl80gSNg6yhHRFUYATA03xpVrfqC1Z1IDZt/f0jZ94tPnfyaY1ljUS5jKsZsj6ihN/ZSVbQ==", - "dev": true, + "node_modules/typeorm/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "@cypress/request": "3.0.1", - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/local-storage": "10.3.3", - "@verdaccio/logger-7": "7.0.0-next-7.10", - "@verdaccio/middleware": "7.0.0-next-7.10", - "@verdaccio/search": "7.0.0-next.2", - "@verdaccio/signature": "7.0.0-next.3", - "@verdaccio/streams": "10.2.1", - "@verdaccio/tarball": "12.0.0-next-7.10", - "@verdaccio/ui-theme": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "async": "3.2.5", - "clipanion": "3.2.1", - "compression": "1.7.4", - "cookies": "0.9.1", - "cors": "2.8.5", - "debug": "^4.3.4", - "envinfo": "7.11.0", - "express": "4.18.2", - "express-rate-limit": "5.5.1", - "fast-safe-stringify": "2.1.1", - "handlebars": "4.7.8", - "js-yaml": "4.1.0", - "JSONStream": "1.3.5", - "jsonwebtoken": "9.0.2", - "kleur": "4.1.5", - "lodash": "4.17.21", - "lru-cache": "7.18.3", - "mime": "3.0.0", - "mkdirp": "1.0.4", - "mv": "2.1.1", - "pkginfo": "0.4.1", - "semver": "7.5.4", - "validator": "13.11.0", - "verdaccio-audit": "12.0.0-next-7.10", - "verdaccio-htpasswd": "12.0.0-next-7.10" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { - "verdaccio": "bin/verdaccio" + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12.18" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/verdaccio-audit": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-12.0.0-next-7.10.tgz", - "integrity": "sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==", - "dev": true, - "dependencies": { - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "express": "4.18.2", - "https-proxy-agent": "5.0.1", - "node-fetch": "cjs" + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/verdaccio-audit/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" + "node_modules/typeorm/node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 6.0.0" + "node": ">=14.17" } }, - "node_modules/verdaccio-audit/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">= 6" + "node": ">=0.8.0" } }, - "node_modules/verdaccio-htpasswd": { - "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-12.0.0-next-7.10.tgz", - "integrity": "sha512-+P7kxWgWSxRyTlP+IFySwgvQjt529zXTetNmupUgYtu09qCZMffdZ74aGASuCvWa4Vcqavmytzg8McqCNheFiA==", - "dev": true, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/file-locking": "12.0.0-next.1", - "apache-md5": "1.1.8", - "bcryptjs": "2.4.3", - "core-js": "3.35.0", - "debug": "4.3.4", - "http-errors": "2.0.0", - "unix-crypt-td-js": "1.1.4" + "@lukeed/csprng": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=8" } }, - "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { - "version": "12.0.0-next.1", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-12.0.0-next.1.tgz", - "integrity": "sha512-Zb5G2HEhVRB0jCq4z7QA4dqTdRv/2kIsw2Nkm3j2HqC1OeJRxas3MJAF/OxzbAb1IN32lbg1zycMSk6NcbQkgQ==", - "dev": true, + "node_modules/umzug": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.2.tgz", + "integrity": "sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==", "dependencies": { - "lockfile": "1.0.4" + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "fast-glob": "^3.3.2", + "pony-cause": "^2.1.4", + "type-fest": "^4.0.0" }, "engines": { "node": ">=12" + } + }, + "node_modules/umzug/node_modules/type-fest": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", + "engines": { + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verdaccio/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/verdaccio/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verdaccio/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "qs": "^6.4.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/verdaccio/node_modules/yallist": { + "node_modules/unique-filename": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" + "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=12" + "node": ">= 10.0.0" + } + }, + "node_modules/unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=4", + "yarn": "*" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, - "optional": true, - "os": [ - "android" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "engines": { - "node": ">=12" + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10.12.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "builtins": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { - "node": ">=12" + "node": ">= 0.10" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/verdaccio": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.29.2.tgz", + "integrity": "sha512-Ra9Bv8mMsGaFnvFJl80gSNg6yhHRFUYATA03xpVrfqC1Z1IDZt/f0jZ94tPnfyaY1ljUS5jKsZsj6ihN/ZSVbQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@cypress/request": "3.0.1", + "@verdaccio/config": "7.0.0-next-7.10", + "@verdaccio/core": "7.0.0-next-7.10", + "@verdaccio/local-storage": "10.3.3", + "@verdaccio/logger-7": "7.0.0-next-7.10", + "@verdaccio/middleware": "7.0.0-next-7.10", + "@verdaccio/search": "7.0.0-next.2", + "@verdaccio/signature": "7.0.0-next.3", + "@verdaccio/streams": "10.2.1", + "@verdaccio/tarball": "12.0.0-next-7.10", + "@verdaccio/ui-theme": "7.0.0-next-7.10", + "@verdaccio/url": "12.0.0-next-7.10", + "@verdaccio/utils": "7.0.0-next-7.10", + "async": "3.2.5", + "clipanion": "3.2.1", + "compression": "1.7.4", + "cookies": "0.9.1", + "cors": "2.8.5", + "debug": "^4.3.4", + "envinfo": "7.11.0", + "express": "4.18.2", + "express-rate-limit": "5.5.1", + "fast-safe-stringify": "2.1.1", + "handlebars": "4.7.8", + "js-yaml": "4.1.0", + "JSONStream": "1.3.5", + "jsonwebtoken": "9.0.2", + "kleur": "4.1.5", + "lodash": "4.17.21", + "lru-cache": "7.18.3", + "mime": "3.0.0", + "mkdirp": "1.0.4", + "mv": "2.1.1", + "pkginfo": "0.4.1", + "semver": "7.5.4", + "validator": "13.11.0", + "verdaccio-audit": "12.0.0-next-7.10", + "verdaccio-htpasswd": "12.0.0-next-7.10" + }, + "bin": { + "verdaccio": "bin/verdaccio" + }, "engines": { - "node": ">=12" + "node": ">=12.18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/verdaccio-audit": { + "version": "12.0.0-next-7.10", + "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-12.0.0-next-7.10.tgz", + "integrity": "sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@verdaccio/config": "7.0.0-next-7.10", + "@verdaccio/core": "7.0.0-next-7.10", + "express": "4.18.2", + "https-proxy-agent": "5.0.1", + "node-fetch": "cjs" + }, "engines": { "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/verdaccio-audit/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/verdaccio-audit/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/verdaccio-htpasswd": { + "version": "12.0.0-next-7.10", + "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-12.0.0-next-7.10.tgz", + "integrity": "sha512-+P7kxWgWSxRyTlP+IFySwgvQjt529zXTetNmupUgYtu09qCZMffdZ74aGASuCvWa4Vcqavmytzg8McqCNheFiA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@verdaccio/core": "7.0.0-next-7.10", + "@verdaccio/file-locking": "12.0.0-next.1", + "apache-md5": "1.1.8", + "bcryptjs": "2.4.3", + "core-js": "3.35.0", + "debug": "4.3.4", + "http-errors": "2.0.0", + "unix-crypt-td-js": "1.1.4" + }, "engines": { "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { + "version": "12.0.0-next.1", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-12.0.0-next.1.tgz", + "integrity": "sha512-Zb5G2HEhVRB0jCq4z7QA4dqTdRv/2kIsw2Nkm3j2HqC1OeJRxas3MJAF/OxzbAb1IN32lbg1zycMSk6NcbQkgQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "lockfile": "1.0.4" + }, "engines": { "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">=10.0.0" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/verdaccio/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/verdaccio/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/verdaccio/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, - "optional": true, - "os": [ - "win32" + "engines": [ + "node >=0.6.0" ], - "engines": { - "node": ">=12" + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -26530,16 +27893,16 @@ } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", @@ -26678,9 +28041,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", - "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.13", @@ -26696,10 +28059,9 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "express": "^4.19.2", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.7", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", @@ -27020,27 +28382,6 @@ "node": ">= 0.8.0" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -27300,8 +28641,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -27317,9 +28657,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 4d3bccfd..e4ac00e0 100644 --- a/package.json +++ b/package.json @@ -15,38 +15,40 @@ "private": true, "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.0.3", - "@angular/common": "19.0.3", - "@angular/compiler": "19.0.3", - "@angular/core": "19.0.3", - "@angular/forms": "19.0.3", - "@angular/platform-browser": "19.0.3", - "@angular/platform-browser-dynamic": "19.0.3", - "@angular/router": "19.0.3", + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/compiler": "19.1.7", + "@angular/core": "19.1.7", + "@angular/forms": "19.1.7", + "@angular/platform-browser": "19.1.7", + "@angular/platform-browser-dynamic": "19.1.7", + "@angular/router": "19.1.7", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", "@mikro-orm/mysql": "^6.4.3", - "@mikro-orm/nestjs": "^6.0.2", + "@mikro-orm/nestjs": "^6.1.1", "@mikro-orm/postgresql": "^6.4.3", "@mikro-orm/sql-highlighter": "^1.0.1", - "@nestjs/common": "^10.3.0", - "@nestjs/core": "^10.3.0", - "@nestjs/platform-express": "10.3.3", - "@nestjs/platform-socket.io": "^10.3.7", - "@nestjs/platform-ws": "^10.3.7", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.2", - "@nestjs/websockets": "^10.3.7", + "@nestjs/common": "^11.0.10", + "@nestjs/core": "^11.0.10", + "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-socket.io": "^11.0.10", + "@nestjs/platform-ws": "^11.0.10", + "@nestjs/swagger": "^11.0.4", + "@nestjs/typeorm": "^11.0.0", + "@nestjs/websockets": "^11.0.10", "axios": "^1.6.0", + "change-case-commonjs": "^5.4.4", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", - "nestjs-pino": "4.0.0", + "nestjs-pino": "4.3.0", "pg": "8.11.3", - "pino-http": "9.0.0", + "pino-http": "10.4.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "socket.io-client": "^4.7.5", + "ts-toolbelt": "^9.6.0", "tslib": "^2.3.0", "typeorm": "^0.3.20", "uuid": "^10.0.0", @@ -55,32 +57,32 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.0.4", - "@angular-devkit/core": "19.0.4", - "@angular-devkit/schematics": "19.0.4", - "@angular-eslint/eslint-plugin": "19.0.1", - "@angular-eslint/eslint-plugin-template": "19.0.1", - "@angular-eslint/template-parser": "19.0.1", - "@angular/cli": "~19.0.0", - "@angular/compiler-cli": "19.0.3", - "@angular/language-service": "19.0.3", + "@angular-devkit/build-angular": "19.1.8", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@angular-eslint/eslint-plugin": "19.1.0", + "@angular-eslint/eslint-plugin-template": "19.1.0", + "@angular-eslint/template-parser": "19.1.0", + "@angular/cli": "~19.1.0", + "@angular/compiler-cli": "19.1.7", + "@angular/language-service": "19.1.7", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", - "@nestjs/schematics": "^10.0.1", - "@nestjs/testing": "^10.0.2", - "@nx/angular": "20.2.1", - "@nx/eslint": "20.2.1", - "@nx/eslint-plugin": "20.2.1", - "@nx/jest": "20.2.1", - "@nx/js": "20.2.1", - "@nx/nest": "20.2.1", - "@nx/node": "20.2.1", - "@nx/web": "20.2.1", - "@nx/webpack": "20.2.1", - "@nx/workspace": "20.2.1", - "@schematics/angular": "19.0.4", + "@nestjs/schematics": "^11.0.1", + "@nestjs/testing": "^11.0.10", + "@nx/angular": "20.4.6", + "@nx/eslint": "20.4.6", + "@nx/eslint-plugin": "20.4.6", + "@nx/jest": "20.4.6", + "@nx/js": "20.4.6", + "@nx/nest": "20.4.6", + "@nx/node": "20.4.6", + "@nx/web": "20.4.6", + "@nx/webpack": "20.4.6", + "@nx/workspace": "20.4.6", + "@schematics/angular": "19.1.8", "@swc-node/register": "1.9.2", "@swc/core": "1.5.7", "@swc/helpers": "0.5.11", @@ -99,16 +101,17 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.0.1", - "nx": "20.2.1", + "ng-packagr": "19.1.2", + "nx": "20.4.6", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", + "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", - "typescript": "5.6.3", + "typescript": "5.7.3", "verdaccio": "^5.0.4", "webpack-cli": "^5.1.4" }, From f202ebc33475d1cfed2c4de7b37c819f8d4a4353 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 06:55:38 +0100 Subject: [PATCH 02/22] feat(json-api-nestjs): remove module and refactoring take out modules and use them as dependencies from the outside BREAKING CHANGE: Change type signature, rename npm package --- libs/json-api/json-api-nestjs/package.json | 2 +- libs/json-api/json-api-nestjs/project.json | 15 +- libs/json-api/json-api-nestjs/src/index.ts | 57 +- .../src/lib/constants/constants.ts | 10 + .../src/lib/constants/default.ts | 2 - .../json-api-nestjs/src/lib/constants/di.ts | 24 +- .../src/lib/constants/index.ts | 14 +- .../src/lib/json-api.module.ts | 112 +- .../src/lib/mock-utils/db-for-test | 647 ------------ .../src/lib/mock-utils/index.ts | 62 -- .../mock-utils/microrom/entities/addresses.ts | 72 -- .../mock-utils/microrom/entities/comments.ts | 55 - .../lib/mock-utils/microrom/entities/index.ts | 15 - .../lib/mock-utils/microrom/entities/notes.ts | 44 - .../lib/mock-utils/microrom/entities/roles.ts | 67 -- .../microrom/entities/user-groups.ts | 30 - .../lib/mock-utils/microrom/entities/users.ts | 146 --- .../src/lib/mock-utils/microrom/index.ts | 108 -- .../lib/mock-utils/microrom/utils/index.ts | 3 - .../lib/mock-utils/microrom/utils/init-db.ts | 81 -- .../microrom/utils/provider-entities.ts | 30 - .../mock-utils/microrom/utils/pull-data.ts | 135 --- .../mock-utils/typeorm/entities/addresses.ts | 69 -- .../mock-utils/typeorm/entities/comments.ts | 57 -- .../lib/mock-utils/typeorm/entities/index.ts | 29 - .../lib/mock-utils/typeorm/entities/notes.ts | 44 - .../lib/mock-utils/typeorm/entities/pods.ts | 45 - .../entities/requests-have-pod-locks.ts | 91 -- .../mock-utils/typeorm/entities/requests.ts | 48 - .../lib/mock-utils/typeorm/entities/roles.ts | 58 -- .../typeorm/entities/user-groups.ts | 20 - .../lib/mock-utils/typeorm/entities/users.ts | 133 --- .../src/lib/mock-utils/typeorm/index.ts | 60 -- .../src/lib/mock-utils/typeorm/utils/index.ts | 2 - .../typeorm/utils/provider-entities.ts | 69 -- .../lib/mock-utils/typeorm/utils/pull-data.ts | 122 --- .../atomic-operation.module.ts | 40 +- .../atomic-operation/constants/index.ts | 1 - .../controllers/operation.controller.spec.ts | 31 +- .../controllers/operation.controller.ts | 10 +- .../modules/atomic-operation/factory/index.ts | 4 +- .../factory/map-controller-entity.ts | 6 +- .../factory/map-entity-name-to-entity.ts | 14 +- .../factory/zod-input-operation.ts | 10 +- .../src/lib/modules/atomic-operation/index.ts | 1 - .../pipes/input-operation.pipe.spec.ts | 5 +- .../service/execute.service.spec.ts | 5 - .../service/execute.service.ts | 26 +- .../service/explorer.service.spec.ts | 5 - .../service/explorer.service.ts | 18 +- .../modules/atomic-operation/service/index.ts | 2 +- .../service/swagger.service.ts | 2 +- .../modules/atomic-operation/types/index.ts | 17 +- .../utils/zod/zod-helper.spec.ts | 64 +- .../atomic-operation/utils/zod/zod-helper.ts | 40 +- .../json-api-nestjs/src/lib/modules/index.ts | 5 +- .../lib/modules/micro-orm/constants/index.ts | 2 - .../lib/modules/micro-orm/factory/index.ts | 128 --- .../src/lib/modules/micro-orm/index.ts | 2 - .../micro-orm/micro-orm-json-api.module.ts | 57 -- .../micro-orm/orm-helper/index.spec.ts | 177 ---- .../lib/modules/micro-orm/orm-helper/index.ts | 106 -- .../orm-methods/delete-one/delete-one.spec.ts | 61 -- .../orm-methods/delete-one/delete-one.ts | 20 - .../delete-relationship.spec.ts | 181 ---- .../delete-relationship.ts | 65 -- .../orm-methods/get-all/get-all.spec.ts | 957 ------------------ .../micro-orm/orm-methods/get-all/get-all.ts | 91 -- .../get-all/get-query-for-count.spec.ts | 242 ----- .../get-all/get-query-for-count.ts | 60 -- .../orm-methods/get-one/get-one.spec.ts | 102 -- .../micro-orm/orm-methods/get-one/get-one.ts | 30 - .../get-relationship/get-relationship.spec.ts | 144 --- .../get-relationship/get-relationship.ts | 35 - .../modules/micro-orm/orm-methods/index.ts | 9 - .../orm-methods/patch-one/patch-one.spec.ts | 234 ----- .../orm-methods/patch-one/patch-one.ts | 52 - .../patch-relationship.spec.ts | 134 --- .../patch-relationship/patch-relationship.ts | 52 - .../orm-methods/post-one/post-one.spec.ts | 338 ------- .../orm-methods/post-one/post-one.ts | 23 - .../post-relationship.spec.ts | 147 --- .../post-relationship/post-relationship.ts | 49 - .../lib/modules/micro-orm/service/index.ts | 1 - .../service/micro-orm-util.service.spec.ts | 571 ----------- .../service/micro-orm-util.service.ts | 751 -------------- .../micro-orm/service/microorm-service.ts | 218 ---- .../src/lib/modules/micro-orm/type.ts | 3 - .../lib/modules/mixin/config/bindings.spec.ts | 9 - .../src/lib/modules/mixin/config/bindings.ts | 17 +- .../lib/modules/mixin/controllers/index.ts | 1 + .../json-base.controller.ts | 53 +- .../json-api/json-api.decorator.spec.ts | 21 +- .../decorators/json-api/json-api.decorator.ts | 6 +- .../mixin/factory/zod-validate.factory.ts | 273 +---- .../lib/modules/mixin/helper/utils.spec.ts | 17 - .../src/lib/modules/mixin/helper/utils.ts | 41 - .../bind-controller.spec.ts | 15 +- .../{helper => helpers}/bind-controller.ts | 12 +- .../create-controller.spec.ts | 5 +- .../{helper => helpers}/create-controller.ts | 28 +- .../mixin/{helper => helpers}/index.ts | 1 - .../lib/modules/mixin/helpers/utils.spec.ts | 26 + .../src/lib/modules/mixin/helpers/utils.ts | 45 + .../mixin/interceptors/error.interceptors.ts | 128 +-- .../interceptors/log-time.interceptors.ts | 55 +- .../src/lib/modules/mixin/mixin.module.ts | 60 +- .../check-item-entity.pipe.ts | 13 +- .../src/lib/modules/mixin/pipe/index.spec.ts | 8 +- .../src/lib/modules/mixin/pipe/index.ts | 45 +- .../parse-relationship-name.pipe.spec.ts | 20 +- .../parse-relationship-name.pipe.ts | 19 +- .../pipe/patch-input/patch-input.pipe.spec.ts | 12 +- .../pipe/patch-input/patch-input.pipe.ts | 9 +- .../patch-relationship.pipe.spec.ts | 1 - .../pipe/post-input/post-input.pipe.spec.ts | 13 +- .../mixin/pipe/post-input/post-input.pipe.ts | 9 +- .../post-relationship.pipe.spec.ts | 3 +- .../query-check-select-field.spec.ts | 18 +- .../query-check-select-field.ts | 17 +- .../query-filed-in-include.pipe.spec.ts | 14 +- .../query-filed-in-include.pipe.ts | 10 +- .../pipe/query-input/query-input.pipe.ts | 9 +- .../mixin/pipe/query/query.pipe.spec.ts | 23 +- .../modules/mixin/pipe/query/query.pipe.ts | 9 +- .../mixin/service/entity-param-map.service.ts | 34 + .../mixin/service/error-format.service.ts | 47 + .../src/lib/modules/mixin/service/index.ts | 3 + .../json-api-transformer.service.spec.ts | 230 ++--- .../service/json-api-transformer.service.ts | 223 ++-- .../mixin/swagger/filter-operand-model.ts | 2 +- .../mixin/swagger/method/delete-one.ts | 12 +- .../swagger/method/delete-relationship.ts | 17 +- .../modules/mixin/swagger/method/get-all.ts | 35 +- .../modules/mixin/swagger/method/get-one.ts | 18 +- .../mixin/swagger/method/get-relationship.ts | 18 +- .../modules/mixin/swagger/method/patch-one.ts | 36 +- .../swagger/method/patch-relationship.ts | 21 +- .../modules/mixin/swagger/method/post-one.ts | 34 +- .../mixin/swagger/method/post-relationship.ts | 18 +- .../mixin/swagger/swagger-bind.service.ts | 36 +- .../src/lib/modules/mixin/swagger/utils.ts | 79 +- .../{binding.types.ts => binding.type.ts} | 15 +- .../mixin/types/decorator-options.type.ts | 15 + .../mixin/types/decorator-options.types.ts | 11 - .../src/lib/modules/mixin/types/index.ts | 15 +- .../lib/modules/mixin/types/module.type.ts | 17 + .../lib/modules/mixin/types/module.types.ts | 28 - .../modules/mixin/types/orm-service.type.ts | 53 +- .../src/lib/modules/mixin/types/utils.ts | 68 -- .../src/lib/modules/mixin/types/zod-types.ts | 179 ---- .../zod/zod-input-patch-schema/index.spec.ts | 40 +- .../mixin/zod/zod-input-patch-schema/index.ts | 106 +- .../zod/zod-input-post-schema/index.spec.ts | 57 +- .../mixin/zod/zod-input-post-schema/index.ts | 96 +- .../zod/zod-input-query-schema/fields.spec.ts | 15 +- .../zod/zod-input-query-schema/fields.ts | 33 +- .../zod/zod-input-query-schema/filter.spec.ts | 20 +- .../zod-input-query-schema/filter.test-d.ts | 37 + .../zod/zod-input-query-schema/filter.ts | 179 ++-- .../zod/zod-input-query-schema/include.ts | 7 +- .../zod/zod-input-query-schema/index.spec.ts | 29 +- .../mixin/zod/zod-input-query-schema/index.ts | 27 +- .../mixin/zod/zod-input-query-schema/sort.ts | 3 +- .../mixin/zod/zod-query-schema/fields.spec.ts | 10 +- .../mixin/zod/zod-query-schema/fields.ts | 92 +- .../mixin/zod/zod-query-schema/filter.spec.ts | 58 +- .../mixin/zod/zod-query-schema/filter.ts | 215 ++-- .../zod/zod-query-schema/include.spec.ts | 7 +- .../mixin/zod/zod-query-schema/include.ts | 23 +- .../mixin/zod/zod-query-schema/index.spec.ts | 45 +- .../mixin/zod/zod-query-schema/index.ts | 115 +-- .../mixin/zod/zod-query-schema/sort.spec.ts | 19 +- .../mixin/zod/zod-query-schema/sort.ts | 106 +- .../mixin/zod/zod-share/attributes.spec.ts | 70 +- .../mixin/zod/zod-share/attributes.test-d.ts | 48 + .../modules/mixin/zod/zod-share/attributes.ts | 377 ++++--- .../modules/mixin/zod/zod-share/id.spec.ts | 2 +- .../src/lib/modules/mixin/zod/zod-share/id.ts | 2 +- .../lib/modules/mixin/zod/zod-share/page.ts | 2 - .../mixin/zod/zod-share/rel-data.spec.ts | 3 +- .../modules/mixin/zod/zod-share/rel-data.ts | 2 +- .../mixin/zod/zod-share/relationships.spec.ts | 54 +- .../mixin/zod/zod-share/relationships.ts | 256 +++-- .../lib/modules/mixin/zod/zod-share/type.ts | 20 +- .../lib/modules/mixin/zod/zod-utils.spec.ts | 2 +- .../src/lib/modules/mixin/zod/zod-utils.ts | 44 +- .../lib/modules/type-orm/constants/index.ts | 2 - .../src/lib/modules/type-orm/factory/index.ts | 191 ---- .../src/lib/modules/type-orm/index.ts | 2 - .../modules/type-orm/orm-helper/index.spec.ts | 422 -------- .../lib/modules/type-orm/orm-helper/index.ts | 417 -------- .../orm-methods/delete-one/delete-one.spec.ts | 73 -- .../orm-methods/delete-one/delete-one.ts | 21 - .../delete-relationship.spec.ts | 193 ---- .../delete-relationship.ts | 32 - .../orm-methods/get-all/get-all.spec.ts | 410 -------- .../type-orm/orm-methods/get-all/get-all.ts | 266 ----- .../orm-methods/get-one/get-one.spec.ts | 195 ---- .../type-orm/orm-methods/get-one/get-one.ts | 98 -- .../get-relationship/get-relationship.spec.ts | 132 --- .../get-relationship/get-relationship.ts | 63 -- .../lib/modules/type-orm/orm-methods/index.ts | 9 - .../orm-methods/patch-one/patch-one.spec.ts | 321 ------ .../orm-methods/patch-one/patch-one.ts | 85 -- .../patch-relationship.spec.ts | 234 ----- .../patch-relationship/patch-relationship.ts | 51 - .../orm-methods/post-one/post-one.spec.ts | 274 ----- .../type-orm/orm-methods/post-one/post-one.ts | 46 - .../post-relationship.spec.ts | 209 ---- .../post-relationship/post-relationship.ts | 40 - .../src/lib/modules/type-orm/service/index.ts | 2 - .../type-orm/service/type-orm.service.ts | 137 --- .../service/typeorm-utils.service.spec.ts | 769 -------------- .../type-orm/service/typeorm-utils.service.ts | 683 ------------- .../type-orm/type-orm-json-api.module.ts | 60 -- .../src/lib/modules/type-orm/type.ts | 34 - .../src/lib/types/common-type.ts | 6 + .../src/lib/types/config-param.ts | 45 - .../src/lib/types/entity-param.test-d.ts | 120 +++ .../src/lib/types/entity-param.type.ts | 115 +++ .../src/lib/types/entity-type.ts | 11 + .../src/lib/types/error.types.ts | 2 - .../json-api-nestjs/src/lib/types/index.ts | 8 +- .../src/lib/types/module-common.types.ts | 34 - .../src/lib/types/module-options.test-d.ts | 90 ++ .../src/lib/types/module-options.types.ts | 70 ++ .../src/lib/types/util-types.ts | 24 - .../src/lib/types/utils-type.test-d.ts | 46 + .../src/lib/types/utils-type.ts | 34 + .../utils/___test___/test-classes.helper.ts | 56 + .../src/lib/utils/___test___/test.helper.ts | 355 +++---- .../src/lib/utils/helper.spec.ts | 184 ---- .../json-api-nestjs/src/lib/utils/helper.ts | 122 --- .../json-api-nestjs/src/lib/utils/index.ts | 2 +- .../src/lib/utils/module-helper.spec.ts | 202 ++++ .../src/lib/utils/module-helper.ts | 45 + .../src/lib/utils/nestjs-shared/index.ts | 2 - .../nestjs-shared/lib/types/entity-type.ts | 17 - .../utils/nestjs-shared/lib/types/index.ts | 4 - .../nestjs-shared/lib/types/query-type.ts | 36 - .../nestjs-shared/lib/types/response-body.ts | 76 -- .../lib/types/utils-string.type.ts | 26 - .../utils/nestjs-shared/lib/utils/index.ts | 2 - .../nestjs-shared/lib/utils/object-utils.ts | 21 - .../lib/utils/string-utils.spec.ts | 42 - .../nestjs-shared/lib/utils/string-utils.ts | 38 - .../json-api-nestjs/tsconfig.lib.json | 4 +- .../json-api-nestjs/tsconfig.spec.json | 7 +- 249 files changed, 3288 insertions(+), 16505 deletions(-) create mode 100644 libs/json-api/json-api-nestjs/src/lib/constants/constants.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{controller => controllers}/json-base.controller.ts (50%) delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{helper => helpers}/bind-controller.spec.ts (91%) rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{helper => helpers}/bind-controller.ts (93%) rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{helper => helpers}/create-controller.spec.ts (96%) rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{helper => helpers}/create-controller.ts (68%) rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/{helper => helpers}/index.ts (63%) create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts rename libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/{binding.types.ts => binding.type.ts} (72%) create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/common-type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/types/config-param.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/types/util-types.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/helper.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts create mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts delete mode 100644 libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts diff --git a/libs/json-api/json-api-nestjs/package.json b/libs/json-api/json-api-nestjs/package.json index cfce35c0..ce431afa 100644 --- a/libs/json-api/json-api-nestjs/package.json +++ b/libs/json-api/json-api-nestjs/package.json @@ -1,5 +1,5 @@ { - "name": "json-api-nestjs", + "name": "@klerick/json-api-nestjs", "version": "9.0.0", "engines": { "node": ">= 16.0.0" diff --git a/libs/json-api/json-api-nestjs/project.json b/libs/json-api/json-api-nestjs/project.json index 48451232..10694fc8 100644 --- a/libs/json-api/json-api-nestjs/project.json +++ b/libs/json-api/json-api-nestjs/project.json @@ -3,7 +3,7 @@ "$schema": "../../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/json-api/json-api-nestjs/src", "projectType": "library", - "tags": [], + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs", "type:publish"], "targets": { "build": { "executor": "@nx/js:tsc", @@ -63,6 +63,16 @@ ] } }, + "ts-test": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "tsd --files \"src/**/*.test-d.ts\" -t src/lib/types/index.ts" + ], + "cwd": "{workspaceRoot}/{projectRoot}", + "parallel": false + } + }, "upload-badge": { "executor": "nx:run-commands", "dependsOn": [ @@ -79,5 +89,6 @@ "outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs" } } - } + }, + "implicitDependencies": ["json-api-nestjs-shared"] } diff --git a/libs/json-api/json-api-nestjs/src/index.ts b/libs/json-api/json-api-nestjs/src/index.ts index fc0b6e76..3963ae09 100644 --- a/libs/json-api/json-api-nestjs/src/index.ts +++ b/libs/json-api/json-api-nestjs/src/index.ts @@ -1,24 +1,51 @@ export { JsonApiModule } from './lib/json-api.module'; -export { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './lib/modules'; +export { JsonBaseController } from './lib/modules/mixin/controllers/json-base.controller'; export { JsonApi, InjectService } from './lib/modules/mixin/decorators'; -export { OrmService as JsonApiService } from './lib/modules/mixin/types'; -export { JsonBaseController } from './lib/modules/mixin/controller/json-base.controller'; +export { entityForClass } from './lib/modules/mixin/helpers/utils'; +export { + PrepareParams, + NestProvider, + ValidateQueryError, + UnionToTuple, + EntityParam, + TypeField, + ObjectLiteral, +} from './lib/types'; +export { + JsonApiTransformerService, + ErrorFormatService, +} from './lib/modules/mixin/service'; +export { + MODULE_OPTIONS_TOKEN, + CONTROLLER_OPTIONS_TOKEN, + ASC, + DESC, + FIND_ONE_ROW_ENTITY, + CHECK_RELATION_NAME, + RUN_IN_TRANSACTION_FUNCTION, + ORM_SERVICE, + ENTITY_PARAM_MAP, + DEFAULT_PAGE_SIZE, + DEFAULT_QUERY_PAGE, + CURRENT_ENTITY, +} from './lib/constants'; +export { + OrmService, + OrmService as JsonApiService, + EntityControllerParam, + CheckRelationName, + FindOneRowEntity, + RunInTransaction, + EntityParamMap, +} from './lib/modules/mixin/types'; export { - Query, PatchData, + PatchRelationshipData, PostData, PostRelationshipData, - PatchRelationshipData, + Query, QueryOne, + SortQuery, + Relationships, } from './lib/modules/mixin/zod'; - -export { - EntityRelation, - ResourceObject, - ResourceObjectRelationships, - QueryField, -} from './lib/utils/nestjs-shared'; - -export { excludeMethod } from './lib/modules/mixin/config/bindings'; -export { entityForClass } from './lib/utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts b/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts new file mode 100644 index 00000000..1c47554f --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/constants/constants.ts @@ -0,0 +1,10 @@ +export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController'; +export const JSON_API_MODULE_POSTFIX = 'JsonApiModule'; +export const DEFAULT_CONNECTION_NAME = 'default'; +export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS'); +export const PARAMS_RESOURCE_ID = 'id'; +export const PARAMS_RELATION_NAME = 'relName'; +export const DESC = 'DESC'; +export const ASC = 'ASC'; + +export const SORT_TYPE = [DESC, ASC] as const; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/default.ts b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts index de75ca27..a15de4b8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/default.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/default.ts @@ -1,4 +1,2 @@ -export const DEFAULT_CONNECTION_NAME = 'default'; - export const DEFAULT_QUERY_PAGE = 1; export const DEFAULT_PAGE_SIZE = 20; diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/di.ts b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts index 2d70e17d..ced993f5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/di.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/di.ts @@ -1,20 +1,10 @@ -export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( - 'CURRENT_ENTITY_MANAGER_TOKEN' -); -export const GLOBAL_MODULE_OPTIONS_TOKEN = Symbol('GLOBAL_MODULE_OPTIONS'); export const ORM_SERVICE = Symbol('ORM_SERVICE'); -export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS'); -export const PARAMS_FOR_ZOD_SCHEMA = Symbol('PARAMS_FOR_ZOD_SCHEMA'); -export const FIELD_FOR_ENTITY = Symbol('FIELD_FOR_ENTITY'); -export const CONTROL_OPTIONS_TOKEN = Symbol('CONTROL_OPTIONS_TOKEN'); -export const RUN_IN_TRANSACTION_FUNCTION = Symbol( - 'RUN_IN_TRANSACTION_FUNCTION' -); +export const MODULE_OPTIONS_TOKEN = Symbol('MODULE_OPTIONS_TOKEN'); +export const CONTROLLER_OPTIONS_TOKEN = Symbol('CONTROLLER_OPTIONS_TOKEN'); export const CURRENT_ENTITY = Symbol('CURRENT_ENTITY'); -export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY'); -export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME'); +export const ENTITY_PARAM_MAP = Symbol('ENTITY_PARAM_MAP'); export const ZOD_INPUT_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA'); export const ZOD_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA'); @@ -26,7 +16,9 @@ export const ZOD_POST_RELATIONSHIP_SCHEMA = Symbol( export const ZOD_PATCH_RELATIONSHIP_SCHEMA = Symbol( 'ZOD_PATCH_RELATIONSHIP_SCHEMA' ); -export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); -export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); -export const ENTITY_MAP_PROPS = Symbol('ENTITY_MAP_PROPS'); +export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY'); +export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME'); +export const RUN_IN_TRANSACTION_FUNCTION = Symbol( + 'RUN_IN_TRANSACTION_FUNCTION' +); diff --git a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts index 83b9d181..1e2902a0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/constants/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/constants/index.ts @@ -1,14 +1,4 @@ export * from './default'; -export * from './di'; export * from './reflection'; - -export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController'; -export const JSON_API_MODULE_POSTFIX = 'JsonApiModule'; - -export const PARAMS_RESOURCE_ID = 'id'; -export const PARAMS_RELATION_ID = 'relId'; -export const PARAMS_RELATION_NAME = 'relName'; - -export const DESC = 'DESC'; -export const ASC = 'ASC'; -export const SORT_TYPE = [DESC, ASC] as const; +export * from './di'; +export * from './constants'; diff --git a/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts b/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts index 0e9fad09..8fcb8362 100644 --- a/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/json-api.module.ts @@ -1,80 +1,60 @@ import { DynamicModule, Module } from '@nestjs/common'; -import { DiscoveryModule } from '@nestjs/core'; - +import { OrmModule, ParamsModule } from './types'; +import { prepareConfig, getController } from './utils'; +import { ENTITY_PARAM_MAP } from './constants'; +import { AtomicOperationModule, MixinModule } from './modules'; import { - AnyEntity, - EntityName, - TypeOrmDefaultOptions, - TypeOrmOptions, - MicroOrmOptions, - ResultModuleOptions, -} from './types'; -import { createMixinModule, prepareConfig, createAtomicModule } from './utils'; -import type { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './modules'; + ErrorInterceptors, + LogTimeInterceptors, +} from './modules/mixin/interceptors'; +import { ErrorFormatService } from './modules/mixin/service'; @Module({}) export class JsonApiModule { - public static forRoot( - module: typeof TypeOrmJsonApiModule, - options: TypeOrmOptions - ): DynamicModule; - public static forRoot( - module: typeof MicroOrmJsonApiModule, - options: MicroOrmOptions - ): DynamicModule; - /** - * @deprecated This type of method is deprecated and may be removed in future versions. - * Consider using newer alternatives or updated patterns for module registration. - */ - public static forRoot(options: TypeOrmDefaultOptions): DynamicModule; - public static forRoot( - first: - | typeof TypeOrmJsonApiModule - | typeof MicroOrmJsonApiModule - | TypeOrmDefaultOptions, - second?: TypeOrmOptions | MicroOrmOptions + public static forRoot( + module: M, + options: ParamsModule ): DynamicModule { - let resultOption: ResultModuleOptions = {} as any; - - if (second) { - const module = first as - | typeof TypeOrmJsonApiModule - | typeof MicroOrmJsonApiModule; - resultOption = { - ...prepareConfig(second, module.module), - type: module, - } as ResultModuleOptions; - } else { - const { - TypeOrmJsonApiModule, - } = require('./modules/type-orm/type-orm-json-api.module'); - resultOption = { - ...prepareConfig( - first as TypeOrmDefaultOptions, - TypeOrmJsonApiModule.module - ), - type: TypeOrmJsonApiModule as typeof TypeOrmJsonApiModule, - } as any; - } - - resultOption.imports.unshift(DiscoveryModule); - - const commonOrmModule = resultOption.type.forRoot(resultOption); - - const entitiesMixinModules = resultOption.entities.map( - (entity: EntityName) => - createMixinModule(entity, resultOption, commonOrmModule) + const prepareOptions = prepareConfig(options); + prepareOptions.providers.push( + ErrorInterceptors, + ErrorFormatService, + LogTimeInterceptors ); - - const operationModuleImport = createAtomicModule( - resultOption, - entitiesMixinModules, - commonOrmModule + const commonOrmModule = module.forRoot(prepareOptions); + + if ( + !commonOrmModule.providers || + !commonOrmModule.providers.find( + (i) => 'provide' in i && i.provide === ENTITY_PARAM_MAP + ) + ) + throw new Error( + `The module ${module.name} should be provide ${ENTITY_PARAM_MAP.description}` + ); + + const entitiesModules = prepareOptions.entities.map((entityItem) => + MixinModule.forRoot({ + entity: entityItem, + imports: [commonOrmModule, ...prepareOptions.imports], + ormModule: module, + controller: getController(entityItem, prepareOptions.controllers), + config: prepareOptions, + }) ); + const atomicOperation = prepareOptions.options.operationUrl + ? AtomicOperationModule.forRoot( + prepareOptions.options.operationUrl, + prepareOptions.entities, + entitiesModules, + commonOrmModule + ) + : []; + return { module: JsonApiModule, - imports: [...operationModuleImport, ...entitiesMixinModules], + imports: [...entitiesModules, ...atomicOperation], }; } } diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test b/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test deleted file mode 100644 index fa08bc14..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/db-for-test +++ /dev/null @@ -1,647 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 12.5 --- Dumped by pg_dump version 12.5 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET xmloption = content; -SET client_min_messages = warning; -SET row_security = off; - -create extension "uuid-ossp"; - --- --- Name: comment_kind_enum; Type: TYPE; Schema: public; Owner: - --- - -CREATE TYPE public.comment_kind_enum AS ENUM ( - 'COMMENT', - 'MESSAGE', - 'NOTE' -); - - -SET default_table_access_method = heap; - --- --- Name: addresses; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.addresses ( - id integer NOT NULL, - city character varying(70) DEFAULT NULL::character varying, - state character varying(70) DEFAULT NULL::character varying, - country character varying(70) DEFAULT NULL::character varying, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - array_field text[] -); - - --- --- Name: addresses_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.addresses_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: addresses_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.addresses_id_seq OWNED BY public.addresses.id; - - --- --- Name: comments; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.comments ( - id integer NOT NULL, - text text NOT NULL, - kind public.comment_kind_enum NOT NULL, - created_by integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: comments_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.comments_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: comments_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.comments_id_seq OWNED BY public.comments.id; - - --- --- Name: notes; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.notes ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - text text NOT NULL, - created_by integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - - --- --- Name: migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.migrations ( - id integer NOT NULL, - "timestamp" bigint NOT NULL, - name character varying NOT NULL -); - - --- --- Name: migrations_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.migrations_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: migrations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.migrations_id_seq OWNED BY public.migrations.id; - - --- --- Name: pods; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.pods ( - id integer NOT NULL, - name character varying, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: pods_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.pods_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: pods_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.pods_id_seq OWNED BY public.pods.id; - - --- --- Name: requests; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.requests ( - id integer NOT NULL, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: requests_have_pod_locks; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.requests_have_pod_locks ( - id integer NOT NULL, - request_id integer NOT NULL, - pod_id integer NOT NULL, - external_id integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: requests_have_pod_locks_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.requests_have_pod_locks_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: requests_have_pod_locks_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.requests_have_pod_locks_id_seq OWNED BY public.requests_have_pod_locks.id; - - --- --- Name: requests_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.requests_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.requests_id_seq OWNED BY public.requests.id; - - --- --- Name: roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.roles ( - id integer NOT NULL, - name character varying(128) DEFAULT NULL::character varying, - key character varying(128) NOT NULL, - is_default boolean DEFAULT false, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: roles_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.roles_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: roles_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.roles_id_seq OWNED BY public.roles.id; - - --- --- Name: typeorm_metadata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.typeorm_metadata ( - type character varying NOT NULL, - database character varying, - schema character varying, - "table" character varying, - name character varying, - value text -); - - --- --- Name: users; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.users ( - id integer NOT NULL, - login character varying(100) NOT NULL, - first_name character varying, - last_name character varying, - is_active boolean DEFAULT false, - test_real real[], - test_array_null real[], - manager_id integer, - addresses_id integer, - user_groups_id integer, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - test_date timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - --- --- Name: user_groups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.user_groups ( - id integer NOT NULL, - label character varying NOT NULL -); - - --- --- Name: users_have_roles; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.users_have_roles ( - id integer NOT NULL, - user_id integer NOT NULL, - role_id integer NOT NULL, - created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - --- --- Name: users_have_roles_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.users_have_roles_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: users_have_roles_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.users_have_roles_id_seq OWNED BY public.users_have_roles.id; - - --- --- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.users_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id; - - --- --- Name: user_groups_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.user_groups_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - --- --- Name: user_groups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.user_groups_id_seq OWNED BY public.user_groups.id; - - --- --- Name: addresses id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.addresses ALTER COLUMN id SET DEFAULT nextval('public.addresses_id_seq'::regclass); - - --- --- Name: comments id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments ALTER COLUMN id SET DEFAULT nextval('public.comments_id_seq'::regclass); - - --- --- Name: migrations id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.migrations ALTER COLUMN id SET DEFAULT nextval('public.migrations_id_seq'::regclass); - - --- --- Name: pods id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.pods ALTER COLUMN id SET DEFAULT nextval('public.pods_id_seq'::regclass); - - --- --- Name: requests id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests ALTER COLUMN id SET DEFAULT nextval('public.requests_id_seq'::regclass); - - --- --- Name: requests_have_pod_locks id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks ALTER COLUMN id SET DEFAULT nextval('public.requests_have_pod_locks_id_seq'::regclass); - - --- --- Name: roles id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles ALTER COLUMN id SET DEFAULT nextval('public.roles_id_seq'::regclass); - - --- --- Name: users id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); - - --- --- Name: users id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.user_groups ALTER COLUMN id SET DEFAULT nextval('public.user_groups_id_seq'::regclass); - - --- --- Name: users_have_roles id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles ALTER COLUMN id SET DEFAULT nextval('public.users_have_roles_id_seq'::regclass); - - --- --- Name: requests PK_0428f484e96f9e6a55955f29b5f; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests - ADD CONSTRAINT "PK_0428f484e96f9e6a55955f29b5f" PRIMARY KEY (id); - - --- --- Name: addresses PK_745d8f43d3af10ab8247465e450; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.addresses - ADD CONSTRAINT "PK_745d8f43d3af10ab8247465e450" PRIMARY KEY (id); - - --- --- Name: comments PK_8bf68bc960f2b69e818bdb90dcb; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments - ADD CONSTRAINT "PK_8bf68bc960f2b69e818bdb90dcb" PRIMARY KEY (id); - - --- --- Name: migrations PK_8c82d7f526340ab734260ea46be; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.migrations - ADD CONSTRAINT "PK_8c82d7f526340ab734260ea46be" PRIMARY KEY (id); - - --- --- Name: users_have_roles PK_9bb88c2f9f64bff7570e4108108; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "PK_9bb88c2f9f64bff7570e4108108" PRIMARY KEY (id); - - --- --- Name: users PK_a3ffb1c0c8416b9fc6f907b7433; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY (id); - - --- --- Name: users PK_user_groups; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.user_groups - ADD CONSTRAINT "PK_user_groups" PRIMARY KEY (id); - --- --- Name: pods PK_b00bbc2c7fb41627be2b169f0dd; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.pods - ADD CONSTRAINT "PK_b00bbc2c7fb41627be2b169f0dd" PRIMARY KEY (id); - - --- --- Name: roles PK_c1433d71a4838793a49dcad46ab; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles - ADD CONSTRAINT "PK_c1433d71a4838793a49dcad46ab" PRIMARY KEY (id); - - --- --- Name: requests_have_pod_locks PK_f214657396a396b70a697b04a85; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "PK_f214657396a396b70a697b04a85" PRIMARY KEY (id); - - --- --- Name: users UQ_2d443082eccd5198f95f2a36e2c; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "UQ_2d443082eccd5198f95f2a36e2c" UNIQUE (login); - - --- --- Name: roles UQ_a87cf0659c3ac379b339acf36a2; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.roles - ADD CONSTRAINT "UQ_a87cf0659c3ac379b339acf36a2" UNIQUE (key); - - --- --- Name: IDX_48d6a9a1ab3943e6c6d2a25d2e; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX "IDX_48d6a9a1ab3943e6c6d2a25d2e" ON public.requests_have_pod_locks USING btree (request_id, pod_id); - - --- --- Name: IDX_61c360686dfe8d62a9b03873bf; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX "IDX_61c360686dfe8d62a9b03873bf" ON public.users_have_roles USING btree (user_id, role_id); - - --- --- Name: users FK_2f8d527df0d3acb8aa51945a968; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_2f8d527df0d3acb8aa51945a968" FOREIGN KEY (addresses_id) REFERENCES public.addresses(id); - - --- --- Name: users FK_user_groups; Type: FK CONSTRAINT; Schema: public; Owner: - --- -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_user_groups" FOREIGN KEY (user_groups_id) REFERENCES public.user_groups(id); - - --- --- Name: users_have_roles FK_6e768e03083247102b401b74b46; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "FK_6e768e03083247102b401b74b46" FOREIGN KEY (role_id) REFERENCES public.roles(id); - - --- --- Name: comments FK_980bfefe00ed11685f325d0bd4c; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.comments - ADD CONSTRAINT "FK_980bfefe00ed11685f325d0bd4c" FOREIGN KEY (created_by) REFERENCES public.users(id); - - --- --- Name: notes FK_980bfefe00ed11685f325d0bd4c; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.notes - ADD CONSTRAINT "FK_notes" FOREIGN KEY (created_by) REFERENCES public.users(id); - - --- --- Name: requests_have_pod_locks FK_c7531fe6bbb926bba3f69fcbb55; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "FK_c7531fe6bbb926bba3f69fcbb55" FOREIGN KEY (pod_id) REFERENCES public.pods(id); - - --- --- Name: users_have_roles FK_df6a0246fcd887dd8ffeed2c292; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users_have_roles - ADD CONSTRAINT "FK_df6a0246fcd887dd8ffeed2c292" FOREIGN KEY (user_id) REFERENCES public.users(id); - - --- --- Name: requests_have_pod_locks FK_f3729b493fcdb7309cad08837ff; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.requests_have_pod_locks - ADD CONSTRAINT "FK_f3729b493fcdb7309cad08837ff" FOREIGN KEY (request_id) REFERENCES public.requests(id); - - --- --- Name: users FK_fba2d8e029689aa8fea98e53c91; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.users - ADD CONSTRAINT "FK_fba2d8e029689aa8fea98e53c91" FOREIGN KEY (manager_id) REFERENCES public.users(id); - - --- --- PostgreSQL database dump complete --- diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts deleted file mode 100644 index b9efca01..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { DataType, IMemoryDb, newDb } from 'pg-mem'; -import { readFileSync } from 'fs'; -import { join } from 'path'; -import { v4 } from 'uuid'; -// @ts-ignore -import type { PGlite } from '@electric-sql/pglite'; - -export async function createAndPullSchemaBasePgLite(): Promise { - const db = await Promise.all([ - import('@electric-sql/pglite'), - // @ts-ignore - import('@electric-sql/pglite/contrib/uuid_ossp'), - ]).then( - ([{ PGlite }, { uuid_ossp }]) => - new PGlite({ - extensions: { uuid_ossp }, - database: 'pgLite', - username: 'postgres', - }) - ); - - // await db.exec( - // 'CREATE SCHEMA IF NOT EXISTS public; SET search_path TO public;' - // ); - - // const dump = readFileSync(join(__dirname, 'db-for-test'), { - // encoding: 'utf8', - // }); - // await db.exec(dump); - return db; -} - -export function createAndPullSchemaBase(): IMemoryDb { - const dump = readFileSync(join(__dirname, 'db-for-test'), { - encoding: 'utf8', - }); - const db = newDb({ - autoCreateForeignKeyIndices: true, - }); - - db.public.registerFunction({ - name: 'current_database', - implementation: () => 'test', - }); - - db.public.registerFunction({ - name: 'version', - implementation: () => - 'PostgreSQL 12.5 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 64-bit', - }); - - db.registerExtension('uuid-ossp', (schema) => { - schema.registerFunction({ - name: 'uuid_generate_v4', - returns: DataType.uuid, - implementation: v4, - impure: true, - }); - }); - db.public.none(dump); - return db; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts deleted file mode 100644 index 7952b916..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/addresses.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { - Entity, - PrimaryKey, - Property, - OneToOne, - ArrayType, -} from '@mikro-orm/core'; - -import { Users, IUsers } from '.'; - -export type IAddresses = Addresses; - -@Entity({ - tableName: 'addresses', -}) -export class Addresses { - @PrimaryKey({ - autoincrement: true, - }) - public id!: number; - - @Property({ - columnType: 'varchar', - length: 70, - nullable: true, - }) - public city!: string; - - @Property({ - columnType: 'varchar', - length: 70, - nullable: true, - }) - public state!: string; - - @Property({ - columnType: 'varchar', - length: 68, - nullable: true, - }) - public country!: string; - - @Property({ - name: 'array_field', - type: ArrayType, - columnType: 'varchar[]', - nullable: true, - }) - public arrayField!: string[]; - - @Property({ - length: 0, - name: 'created_at', - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - }) - createdAt: Date = new Date(); - - @Property({ - length: 0, - onUpdate: () => new Date(), - name: 'updated_at', - nullable: true, - columnType: 'timestamp(0) without time zone', - defaultRaw: 'CURRENT_TIMESTAMP(0)', - }) - updatedAt: Date = new Date(); - - @OneToOne(() => Users, (item) => item.addresses) - public user!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts deleted file mode 100644 index 1f42db64..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/comments.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Entity, PrimaryKey, Property, Enum, ManyToOne } from '@mikro-orm/core'; - -export enum CommentKind { - Comment = 'COMMENT', - Message = 'MESSAGE', - Note = 'NOTE', -} - -import { Users, IUsers } from '.'; - -export type IComments = Comments; - -@Entity({ - tableName: 'comments', -}) -export class Comments { - @PrimaryKey({ - autoincrement: true, - }) - public id!: number; - - @Property({ - columnType: 'text', - }) - public text!: string; - - @Enum({ items: () => CommentKind, nativeEnumName: 'comment_kind_enum' }) - public kind!: CommentKind; - - @Property({ - length: 0, - name: 'created_at', - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - }) - createdAt: Date = new Date(); - - @Property({ - length: 0, - onUpdate: () => new Date(), - name: 'updated_at', - nullable: true, - columnType: 'timestamp(0) without time zone', - defaultRaw: 'CURRENT_TIMESTAMP(0)', - }) - updatedAt: Date = new Date(); - - @ManyToOne(() => Users, { - // #TODO need add chaeck for nullable relation to zod - nullable: true, - fieldName: 'created_by', - }) - createdBy!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts deleted file mode 100644 index 451e1a81..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './users'; -export * from './roles'; -export * from './comments'; -export * from './addresses'; -export * from './user-groups'; -export * from './notes'; - -import { Users } from './users'; -import { Roles } from './roles'; -import { Comments } from './comments'; -import { Addresses } from './addresses'; -import { UserGroups } from './user-groups'; -import { Notes } from './notes'; - -export const Entities = [Users, Roles, Comments, Addresses, UserGroups, Notes]; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts deleted file mode 100644 index b3ff70ce..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/notes.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { PrimaryKey, Property, Entity, ManyToOne } from '@mikro-orm/core'; - -import { Users, IUsers } from './index'; - -@Entity({ - tableName: 'notes', -}) -export class Notes { - @PrimaryKey({ - type: 'uuid', - defaultRaw: 'gen_random_uuid()', - }) - public id!: string; - - @Property({ - type: 'text', - nullable: false, - }) - public text!: string; - - @Property({ - length: 0, - name: 'created_at', - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - }) - createdAt: Date = new Date(); - - @Property({ - length: 0, - onUpdate: () => new Date(), - name: 'updated_at', - nullable: true, - columnType: 'timestamp(0) without time zone', - defaultRaw: 'CURRENT_TIMESTAMP(0)', - }) - updatedAt: Date = new Date(); - - @ManyToOne(() => Users, { - fieldName: 'created_by', - }) - public createdBy!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts deleted file mode 100644 index 3dcd026d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/roles.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - Entity, - PrimaryKey, - Property, - ManyToMany, - Collection, -} from '@mikro-orm/core'; - -import { Users, IUsers } from '.'; - -export type IRoles = Roles; - -@Entity({ - tableName: 'roles', -}) -export class Roles { - @PrimaryKey({ - autoincrement: true, - }) - public id!: number; - - @Property({ - type: 'varchar', - length: 128, - nullable: true, - default: 'NULL', - }) - public name!: string; - - @Property({ - type: 'varchar', - length: 128, - nullable: false, - unique: true, - }) - public key!: string; - - @Property({ - name: 'is_default', - type: 'boolean', - default: false, - }) - public isDefault!: boolean; - - @Property({ - length: 0, - name: 'created_at', - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - type: 'timestamp', - }) - createdAt: Date = new Date(); - - @Property({ - length: 0, - onUpdate: () => new Date(), - name: 'updated_at', - nullable: true, - columnType: 'timestamp(0) without time zone', - defaultRaw: 'CURRENT_TIMESTAMP(0)', - }) - updatedAt: Date = new Date(); - - @ManyToMany(() => Users, (item) => item.roles) - public users = new Collection(this); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts deleted file mode 100644 index b62ac057..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/user-groups.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - PrimaryKey, - OneToMany, - Entity, - Property, - Collection, -} from '@mikro-orm/core'; - -import { Users } from './index'; - -@Entity({ - tableName: 'user_groups', -}) -export class UserGroups { - @PrimaryKey({ - autoincrement: true, - }) - public id!: number; - - @Property({ - type: 'string', - length: 50, - unique: true, - columnType: 'varchar', - }) - public label!: string; - - @OneToMany(() => Users, (item) => item.userGroup) - public users = new Collection(this); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts deleted file mode 100644 index 08d1f31c..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/entities/users.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { - Entity, - PrimaryKey, - Property, - OneToOne, - Collection, - ManyToMany, - OneToMany, - ManyToOne, - ArrayType, - Type, -} from '@mikro-orm/core'; - -import { - Addresses, - Roles, - Comments, - Notes, - UserGroups, - IAddresses, -} from './index'; - -export type IUsers = Users; - -export class MyDateType extends Type {} - -@Entity({ - tableName: 'users', -}) -export class Users { - @PrimaryKey({ - autoincrement: true, - }) - public id!: number; - - @Property({ - type: 'string', - length: 100, - unique: true, - }) - public login!: string; - - @Property({ - name: 'first_name', - type: 'varchar', - length: 100, - nullable: true, - }) - public firstName!: string; - - @Property({ - name: 'test_real', - type: new ArrayType((i) => parseFloat(i)), - columnType: 'real[]', - defaultRaw: `ARRAY[]::real[]`, - default: [], - }) - public testReal: number[] = []; - - @Property({ - name: 'test_array_null', - type: new ArrayType((i) => parseFloat(i)), - columnType: 'real[]', - nullable: true, - }) - public testArrayNull!: number[] | null; - - @Property({ - name: 'last_name', - type: 'string', - columnType: 'varchar', - length: 100, - nullable: true, - }) - public lastName!: string; - - @Property({ - name: 'is_active', - type: 'boolean', - nullable: true, - default: false, - }) - public isActive!: boolean; - - @Property({ - name: 'test_date', - type: Date, - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - }) - public testDate!: Date; - - @Property({ - length: 0, - name: 'created_at', - nullable: true, - defaultRaw: 'CURRENT_TIMESTAMP(0)', - columnType: 'timestamp(0) without time zone', - }) - createdAt: Date = new Date(); - - @Property({ - length: 0, - onUpdate: () => new Date(), - name: 'updated_at', - nullable: true, - columnType: 'timestamp(0) without time zone', - defaultRaw: 'CURRENT_TIMESTAMP(0)', - }) - updatedAt: Date = new Date(); - - @OneToOne(() => Addresses, { - owner: true, - fieldName: 'addresses_id', - nullable: true, - }) - public addresses!: IAddresses; - - @OneToOne(() => Users, { - owner: true, - nullable: true, - fieldName: 'manager_id', - }) - public manager!: IUsers; - - @ManyToMany(() => Roles, (role) => role.users, { - owner: true, - pivotTable: 'users_have_roles', - inverseJoinColumn: 'role_id', - joinColumn: 'user_id', - }) - public roles = new Collection(this); - - @OneToMany(() => Comments, (comment) => comment.createdBy) - public comments = new Collection(this); - - @OneToMany(() => Notes, (item) => item.createdBy) - public notes = new Collection(this); - - @ManyToOne(() => UserGroups, { - fieldName: 'user_groups_id', - nullable: true, - }) - public userGroup!: UserGroups; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts deleted file mode 100644 index ed7ef0d9..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; -import { EntityManager, MikroORM } from '@mikro-orm/core'; -import { QueryField } from '../../utils/nestjs-shared'; - -import { - Addresses, - Comments, - Notes, - Roles, - UserGroups, - Users, -} from './entities'; -import { ObjectLiteral } from '../../types'; -import { Query } from '../../modules/mixin/zod'; - -import { - CurrentEntityManager, - CurrentEntityMetadata, - CurrentEntityRepository, - CurrentMicroOrmProvider, - OrmServiceFactory, - EntityPropsMap, -} from '../../modules/micro-orm/factory'; -import { MicroOrmUtilService } from '../../modules/micro-orm/service/micro-orm-util.service'; -import { CURRENT_ENTITY, GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; - -export * from './entities'; -export * from './utils'; - -import { sharedConnect, initMikroOrm, pullAllData } from './utils'; -import { DEFAULT_ARRAY_TYPE } from '../../modules/micro-orm/constants'; -import { JsonApiTransformerService } from '../../modules/mixin/service/json-api-transformer.service'; - -export const entities = [Users, UserGroups, Roles, Comments, Addresses, Notes]; - -export function mockDbPgLiteTestModule(dbName = `test_db_${Date.now()}`) { - const mikroORM = { - provide: MikroORM, - useFactory: async () => { - const knexInst = await sharedConnect(); - return initMikroOrm(knexInst, dbName); - }, - }; - return { - module: MikroOrmModule, - providers: [mikroORM], - exports: [mikroORM], - }; -} - -const readOnlyDbName = `readonly_db_${Date.now()}`; - -export function dbRandomName(readOnly = false) { - if (readOnly) { - return readOnlyDbName; - } - return `test_db_${Date.now()}`; -} - -export async function pullData(em: EntityManager, count = 1) { - for (let i = 0; i < count; i++) { - await pullAllData(em); - } -} - -export function getModuleForPgLite( - entity: E, - dbName = `test_db_${Date.now()}` -): Promise { - return Test.createTestingModule({ - imports: [mockDbPgLiteTestModule(dbName)], - providers: [ - CurrentMicroOrmProvider(), - CurrentEntityManager(), - CurrentEntityMetadata(), - CurrentEntityRepository(entity), - MicroOrmUtilService, - { - provide: CURRENT_ENTITY, - useValue: entity, - }, - OrmServiceFactory(), - EntityPropsMap(entities as any), - { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, - useValue: { options: { arrayType: DEFAULT_ARRAY_TYPE } }, - }, - JsonApiTransformerService, - ], - }).compile(); -} - -export function getDefaultQuery(): Query { - return { - [QueryField.filter]: { - relation: null, - target: null, - }, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: 1, - number: 1, - }, - } satisfies Query; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts deleted file mode 100644 index fa93c59d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './provider-entities'; -export * from './pull-data'; -export * from './init-db'; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts deleted file mode 100644 index a213e21c..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/init-db.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Knex as TypeKnex } from '@mikro-orm/knex'; -import { MikroORM } from '@mikro-orm/core'; -import { PostgreSqlDriver } from '@mikro-orm/postgresql'; -import { SqlHighlighter } from '@mikro-orm/sql-highlighter'; - -import Knex from 'knex'; -import * as ClientPgLite from 'knex-pglite'; - -import { - Addresses, - Comments, - Notes, - Roles, - UserGroups, - Users, -} from '../entities'; - -let knexInst: TypeKnex; - -export async function sharedConnect(): Promise { - // @ts-ignore - // return globalThis.pgLite; - - if (knexInst) { - return knexInst; - } - - const pgLite = await Promise.all([ - import('@electric-sql/pglite'), - // @ts-ignore - import('@electric-sql/pglite/contrib/uuid_ossp'), - ]).then( - ([{ PGlite }, { uuid_ossp }]) => - new PGlite({ - extensions: { uuid_ossp }, - }) - ); - - knexInst = Knex({ - // @ts-ignore - client: ClientPgLite, - dialect: 'postgres', - // @ts-ignore - connection: { pglite: pgLite }, - }); - - return knexInst; -} - -export async function initMikroOrm(knex: TypeKnex, testDbName: string) { - const result = await knex.raw( - `select 1 from pg_database where datname = '${testDbName}'` - ); - - if ((result['rows'] as []).length === 0) { - await knex.raw(`create database ??`, [testDbName]); - } - - const orm = await MikroORM.init({ - highlighter: new SqlHighlighter(), - driver: PostgreSqlDriver, - dbName: testDbName, - driverOptions: knexInst, - entities: [Users, UserGroups, Roles, Comments, Addresses, Notes], - allowGlobalContext: true, - schema: 'public', - debug: - process.env['DB_LOGGING'] !== '0' ? ['query', 'query-params'] : false, - }); - - if ((result['rows'] as []).length === 0) { - const sql = await orm.getSchemaGenerator().getCreateSchemaSQL(); - const statements = sql.split(';').filter((s) => s.trim().length > 0); // Разбиваем на отдельные команды - - for (const statement of statements) { - await orm.em.execute(statement); - } - } - - return orm; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts deleted file mode 100644 index 44087e7a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/provider-entities.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TestingModule } from '@nestjs/testing'; -import { EntityManager } from '@mikro-orm/core'; -import { - Users, - Addresses, - Comments, - Roles, - UserGroups, - Notes, -} from '../entities'; - -export function getRepository(module: TestingModule, emToken: symbol) { - const em = module.get(emToken); - - const userRepository = em.getRepository(Users); - const addressesRepository = em.getRepository(Addresses); - const notesRepository = em.getRepository(Notes); - const commentsRepository = em.getRepository(Comments); - const rolesRepository = em.getRepository(Roles); - const userGroupRepository = em.getRepository(UserGroups); - - return { - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts deleted file mode 100644 index 5ea47448..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/microrom/utils/pull-data.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { EntityManager } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; -import { - Addresses, - CommentKind, - Comments, - Notes, - Roles, - UserGroups, - Users, -} from '../entities'; - -export async function pullAddress() { - const address = new Addresses(); - address.city = faker.location.city(); - address.country = faker.location.country(); - address.arrayField = [ - faker.string.alphanumeric(5), - faker.string.alphanumeric(5), - ]; - address.state = faker.location.state(); - return address; -} - -export async function pullComment() { - const comment = new Comments(); - comment.text = faker.lorem.paragraph(faker.number.int(5)); - comment.kind = CommentKind.Comment; - return comment; -} - -export async function pullNote() { - const note = new Notes(); - note.text = faker.lorem.paragraph(faker.number.int(5)); - return note; -} - -export async function pullRole() { - const role = new Roles(); - role.key = faker.string.alphanumeric(5); - role.name = faker.word.words(); - return role; -} - -export async function pullUser() { - const user = new Users(); - user.firstName = faker.person.firstName(); - user.lastName = faker.person.lastName(); - user.isActive = faker.datatype.boolean(); - user.login = faker.internet.userName({ - lastName: user.lastName, - firstName: user.firstName, - }); - user.testReal = [faker.number.float({ fractionDigits: 4 })]; - user.testArrayNull = null; - - user.testDate = faker.date.anytime(); - - return user; -} - -export async function pullUserGroup() { - const userGroup = new UserGroups(); - userGroup.label = faker.string.alphanumeric(5); - return userGroup; -} - -export async function pullAllData(em: EntityManager) { - const user = await pullUser(); - - const address1 = await pullAddress(); - const address2 = await pullAddress(); - - const note1 = await pullNote(); - const note2 = await pullNote(); - const note3 = await pullNote(); - - const comment1 = await pullComment(); - const comment2 = await pullComment(); - const comment3 = await pullComment(); - const comment4 = await pullComment(); - - const userGroup1 = await pullUserGroup(); - const userGroup2 = await pullUserGroup(); - const userGroup3 = await pullUserGroup(); - - const role1 = await pullRole(); - const role2 = await pullRole(); - const role3 = await pullRole(); - - const roleX1 = await pullRole(); - const roleX2 = await pullRole(); - const roleX3 = await pullRole(); - - const managerUser = await pullUser(); - - user.addresses = address1; - address1.user = user; - user.notes.add(note1, note2, note3); - user.comments.add(comment1, comment2, comment3, comment4); - user.userGroup = userGroup1; - user.roles.add(roleX1, roleX2, roleX3); - user.manager = managerUser; - - managerUser.addresses = address2; - managerUser.userGroup = userGroup3; - managerUser.roles.add(role1, role2); - - await em.persistAndFlush([ - user, - address1, - address2, - note1, - note2, - note3, - comment1, - comment2, - comment3, - comment4, - userGroup1, - userGroup2, - userGroup3, - role1, - role2, - role3, - roleX1, - roleX2, - roleX3, - managerUser, - ]); - - await em.flush(); - - return user; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts deleted file mode 100644 index 3f0c7dab..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/addresses.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - PrimaryGeneratedColumn, - OneToOne, - Column, - Entity, - UpdateDateColumn, -} from 'typeorm'; - -import { Users, IUsers } from './index'; - -export type IAddresses = Addresses; - -@Entity('addresses') -export class Addresses { - @PrimaryGeneratedColumn() - public id!: number; - - @Column({ - type: 'varchar', - length: 70, - nullable: true, - default: 'NULL', - }) - public city!: string; - - @Column({ - type: 'varchar', - length: 70, - nullable: true, - default: 'NULL', - }) - public state!: string; - - @Column({ - type: 'varchar', - length: 68, - nullable: true, - default: 'NULL', - }) - public country!: string; - - @Column({ - name: 'array_field', - type: 'varchar', - nullable: true, - default: 'NULL', - array: true, - }) - public arrayField!: string[]; - - @Column({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @OneToOne(() => Users, (item) => item.addresses) - public user!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts deleted file mode 100644 index c6f3ff8e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/comments.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - PrimaryGeneratedColumn, - Column, - Entity, - JoinColumn, - ManyToOne, - UpdateDateColumn, -} from 'typeorm'; - -export enum CommentKind { - Comment = 'COMMENT', - Message = 'MESSAGE', - Note = 'NOTE', -} - -import { Users, IUsers } from './index'; - -@Entity('comments') -export class Comments { - @PrimaryGeneratedColumn() - public id!: number; - - @Column({ - type: 'text', - nullable: false, - }) - public text!: string; - - @Column({ - type: 'enum', - enum: CommentKind, - nullable: false, - }) - public kind!: CommentKind; - - @Column({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToOne(() => Users, (item) => item.id) - @JoinColumn({ - name: 'created_by', - }) - public createdBy!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts deleted file mode 100644 index ba42e083..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -export * from './users'; -export * from './roles'; -export * from './requests-have-pod-locks'; -export * from './requests'; -export * from './pods'; -export * from './comments'; -export * from './addresses'; -export * from './user-groups'; -export * from './notes'; - -import { Users } from './users'; -import { Roles } from './roles'; -import { Requests } from './requests'; -import { Pods } from './pods'; -import { Comments } from './comments'; -import { Addresses } from './addresses'; -import { UserGroups } from './user-groups'; -import { Notes } from './notes'; - -export const Entities = [ - Users, - Roles, - Requests, - Pods, - Comments, - Addresses, - UserGroups, - Notes, -]; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts deleted file mode 100644 index e8694aca..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/notes.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - PrimaryGeneratedColumn, - Column, - Entity, - JoinColumn, - ManyToOne, - UpdateDateColumn, -} from 'typeorm'; - -import { Users, IUsers } from './index'; - -@Entity('notes') -export class Notes { - @PrimaryGeneratedColumn('uuid') - public id!: string; - - @Column({ - type: 'text', - nullable: false, - }) - public text!: string; - - @Column({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToOne(() => Users, (item) => item.notes) - @JoinColumn({ - name: 'created_by', - }) - public createdBy!: IUsers; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts deleted file mode 100644 index b5fb898f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/pods.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - Column, - CreateDateColumn, - Entity, - ManyToMany, - PrimaryColumn, - UpdateDateColumn, -} from 'typeorm'; - -import { IRequests, Requests } from './index'; - -export type IPods = Pods; - -@Entity('pods') -export class Pods { - @PrimaryColumn() - public id!: string; - - @Column({ - type: 'varchar', - length: 50, - nullable: false, - unique: true, - }) - public name!: string; - - @CreateDateColumn({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToMany(() => Requests, (item) => item.podLocks) - public lockedRequests!: IRequests[]; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts deleted file mode 100644 index 7f1f8125..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests-have-pod-locks.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - AfterLoad, - BeforeInsert, - BeforeRemove, - BeforeUpdate, - Column, - CreateDateColumn, - Entity, - PrimaryGeneratedColumn, - UpdateDateColumn, -} from 'typeorm'; - -export type IRequestsHavePodLocks = RequestsHavePodLocks; - -@Entity('requests_have_pod_locks') -export class RequestsHavePodLocks { - @PrimaryGeneratedColumn() - public id!: number; - - @AfterLoad() - protected getRequestId() { - this.requestId = this.request_id; - } - - @BeforeInsert() - @BeforeUpdate() - @BeforeRemove() - protected setRequestId() { - if (this.requestId) { - this.request_id = this.requestId; - } - } - - public requestId!: number; - - @AfterLoad() - protected getPodId() { - this.podId = this.pod_id; - } - - @BeforeInsert() - @BeforeUpdate() - @BeforeRemove() - protected setPodId() { - if (this.podId) { - this.pod_id = this.podId; - } - } - - public podId!: number; - - @Column({ - name: 'request_id', - type: 'int', - nullable: false, - }) - protected request_id!: number; - - @Column({ - name: 'pod_id', - type: 'int', - nullable: false, - }) - protected pod_id!: number; - - @CreateDateColumn({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @Column({ - name: 'external_id', - type: 'int', - nullable: true, - unsigned: true, - default: 'NULL', - unique: true, - }) - public externalId!: number; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts deleted file mode 100644 index 9bd64266..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/requests.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - PrimaryGeneratedColumn, - Entity, - CreateDateColumn, - UpdateDateColumn, - ManyToMany, - JoinTable, -} from 'typeorm'; - -import { Pods, IPods } from './index'; - -export type IRequests = Requests; - -@Entity('requests') -export class Requests { - @PrimaryGeneratedColumn() - public id!: number; - - @CreateDateColumn({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToMany(() => Pods, (item) => item.lockedRequests) - @JoinTable({ - name: 'requests_have_pod_locks', - inverseJoinColumn: { - referencedColumnName: 'id', - name: 'pod_id', - }, - joinColumn: { - referencedColumnName: 'id', - name: 'request_id', - }, - }) - public podLocks!: IPods[]; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts deleted file mode 100644 index 4689628a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/roles.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - PrimaryGeneratedColumn, - Entity, - Column, - ManyToMany, - UpdateDateColumn, -} from 'typeorm'; - -import { Users, IUsers } from './index'; - -@Entity('roles') -export class Roles { - @PrimaryGeneratedColumn() - public id!: number; - - @Column({ - type: 'varchar', - length: 128, - nullable: true, - default: 'NULL', - }) - public name!: string; - - @Column({ - type: 'varchar', - length: 128, - nullable: false, - unique: true, - }) - public key!: string; - - @Column({ - name: 'is_default', - type: 'boolean', - default: 'false', - }) - public isDefault!: boolean; - - - @Column({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @ManyToMany(() => Users, (item) => item.roles) - public users!: IUsers[]; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts deleted file mode 100644 index a6727416..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/user-groups.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PrimaryGeneratedColumn, OneToMany, Entity, Column } from 'typeorm'; - -import { IUsers, Users } from './index'; - -@Entity('user_groups') -export class UserGroups { - @PrimaryGeneratedColumn() - public id!: number; - - @Column({ - type: 'varchar', - length: 50, - nullable: false, - unique: true, - }) - public label!: string; - - @OneToMany(() => Users, (item) => item.userGroup) - public users!: IUsers[]; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts deleted file mode 100644 index 070ae412..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/entities/users.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { - PrimaryGeneratedColumn, - ManyToMany, - JoinColumn, - JoinTable, - OneToOne, - OneToMany, - Entity, - Column, - UpdateDateColumn, - ManyToOne, -} from 'typeorm'; - -import { Addresses, Roles, Comments, Notes, UserGroups } from './index'; - -export type IUsers = Users; - -@Entity('users') -export class Users { - @PrimaryGeneratedColumn() - public id!: number; - - @Column({ - type: 'varchar', - length: 100, - nullable: false, - unique: true, - }) - public login!: string; - - @Column({ - name: 'first_name', - type: 'varchar', - length: 100, - nullable: true, - default: 'NULL', - }) - public firstName!: string; - - @Column({ - name: 'test_real', - type: 'real', - array: true, - default: [], - }) - public testReal!: number[]; - - @Column({ - name: 'test_array_null', - type: 'real', - array: true, - nullable: true, - }) - public testArrayNull!: number[] | null; - - @Column({ - name: 'last_name', - type: 'varchar', - length: 100, - nullable: true, - default: 'NULL', - }) - public lastName!: string; - - @Column({ - name: 'is_active', - type: 'boolean', - width: 1, - nullable: true, - default: false, - }) - public isActive!: boolean; - - @Column({ - name: 'test_date', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public testDate!: Date; - - @Column({ - name: 'created_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public createdAt!: Date; - - @UpdateDateColumn({ - name: 'updated_at', - type: 'timestamp', - nullable: true, - default: 'CURRENT_TIMESTAMP', - }) - public updatedAt!: Date; - - @OneToOne(() => Addresses, (item) => item.id) - @JoinColumn({ - name: 'addresses_id', - }) - public addresses!: Addresses; - - @OneToOne(() => Users, (item) => item.id) - @JoinColumn({ - name: 'manager_id', - }) - public manager!: Users; - - @ManyToMany(() => Roles, (item) => item.users) - @JoinTable({ - name: 'users_have_roles', - inverseJoinColumn: { - referencedColumnName: 'id', - name: 'role_id', - }, - joinColumn: { - referencedColumnName: 'id', - name: 'user_id', - }, - }) - public roles!: Roles[]; - - @OneToMany(() => Comments, (item) => item.createdBy) - public comments!: Comments[]; - - @OneToMany(() => Notes, (item) => item.createdBy) - public notes!: Notes[]; - - @ManyToOne(() => UserGroups, (userGroup) => userGroup.id) - @JoinColumn({ name: 'user_groups_id' }) - public userGroup!: UserGroups; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts deleted file mode 100644 index f7eba83d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { TypeOrmModule } from '@nestjs/typeorm'; -import { DynamicModule } from '@nestjs/common'; -import { IMemoryDb } from 'pg-mem'; - -import { - Addresses, - Comments, - Notes, - Pods, - Requests, - RequestsHavePodLocks, - Roles, - UserGroups, - Users, -} from './entities'; -import { DataSource } from 'typeorm'; - -export * from './entities'; -export * from './utils'; - -export const entities = [ - Users, - UserGroups, - Roles, - RequestsHavePodLocks, - Requests, - Pods, - Comments, - Addresses, - Notes, -]; - -export function mockDBTestModule(db: IMemoryDb): DynamicModule { - return TypeOrmModule.forRootAsync({ - useFactory() { - return { - type: 'postgres', - // logging: true, - entities: [ - Users, - UserGroups, - Roles, - RequestsHavePodLocks, - Requests, - Pods, - Comments, - Addresses, - Notes, - ], - }; - }, - async dataSourceFactory(options) { - const dataSource: DataSource = await db.adapters.createTypeormDataSource( - options - ); - - return dataSource; - }, - }); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts deleted file mode 100644 index 7cb5aa8b..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './pull-data'; -export * from './provider-entities'; diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts deleted file mode 100644 index f0bca9e1..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/provider-entities.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { DataSource, Repository } from 'typeorm'; -import { Provider } from '@nestjs/common'; -import { getDataSourceToken, getRepositoryToken } from '@nestjs/typeorm'; - -import { - Addresses, - Comments, - Entities, - Notes, - Pods, - Roles, - UserGroups, -} from '../entities'; -import { Users } from '../entities'; -import { DEFAULT_CONNECTION_NAME } from '../../../constants'; -import { TestingModule } from '@nestjs/testing'; - -export function providerEntities( - dataSourceToken: ReturnType -): Provider[] { - return Entities.map((entitiy) => { - return { - provide: getRepositoryToken(entitiy, DEFAULT_CONNECTION_NAME), - useFactory(dataSource: DataSource) { - return dataSource.getRepository(entitiy); - }, - inject: [getDataSourceToken()], - }; - }); -} - -export function getRepository(module: TestingModule) { - const userRepository = module.get>( - getRepositoryToken(Users, DEFAULT_CONNECTION_NAME) - ); - - const addressesRepository = module.get>( - getRepositoryToken(Addresses, DEFAULT_CONNECTION_NAME) - ); - - const notesRepository = module.get>( - getRepositoryToken(Notes, DEFAULT_CONNECTION_NAME) - ); - - const commentsRepository = module.get>( - getRepositoryToken(Comments, DEFAULT_CONNECTION_NAME) - ); - const rolesRepository = module.get>( - getRepositoryToken(Roles, DEFAULT_CONNECTION_NAME) - ); - - const userGroupRepository = module.get>( - getRepositoryToken(UserGroups, DEFAULT_CONNECTION_NAME) - ); - - const podsRepository = module.get>( - getRepositoryToken(Pods, DEFAULT_CONNECTION_NAME) - ); - - return { - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - podsRepository, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts b/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts deleted file mode 100644 index f28c693e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/mock-utils/typeorm/utils/pull-data.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { Repository } from 'typeorm'; -import { faker } from '@faker-js/faker'; -import { - Addresses, - CommentKind, - Comments, - Notes, - Roles, - UserGroups, - Users, -} from '../entities'; - -export async function pullAddress(addressRepo: Repository) { - const address = new Addresses(); - address.city = faker.location.city(); - address.country = faker.location.country(); - address.arrayField = [ - faker.string.alphanumeric(5), - faker.string.alphanumeric(5), - ]; - address.state = faker.location.state(); - return addressRepo.save(address); -} - -export async function pullComment(commentRepo: Repository) { - const comment = new Comments(); - comment.text = faker.lorem.paragraph(faker.number.int(5)); - comment.kind = CommentKind.Comment; - return commentRepo.save(comment); -} - -export async function pullNote(noteRepo: Repository) { - const note = new Notes(); - note.text = faker.lorem.paragraph(faker.number.int(5)); - return noteRepo.save(note); -} - -export async function pullRole(roleRepo: Repository) { - const role = new Roles(); - role.key = faker.string.alphanumeric(5); - role.name = faker.string.alphanumeric(5); - return roleRepo.save(role); -} - -export async function pullUser(userPero: Repository) { - const user = new Users(); - user.firstName = faker.person.firstName(); - user.lastName = faker.person.lastName(); - user.isActive = faker.datatype.boolean(); - user.login = faker.internet.userName({ - lastName: user.lastName, - firstName: user.firstName, - }); - user.testReal = [faker.number.float({ fractionDigits: 4 })]; - user.testArrayNull = null; - - user.testDate = faker.date.anytime(); - - return userPero.save(user); -} - -export async function pullUserGroup(userGroupRepo: Repository) { - const userGroup = new UserGroups(); - userGroup.label = faker.string.alphanumeric(5); - return userGroupRepo.save(userGroup); -} - -export async function pullAllData( - userPero: Repository, - addressRepo?: Repository, - noteRepo?: Repository, - commentRepo?: Repository, - roleRepo?: Repository, - userGroupRepo?: Repository -) { - const user = await pullUser(userPero); - if (addressRepo) { - user.addresses = await pullAddress(addressRepo); - } - - if (noteRepo) { - user.notes = [ - await pullNote(noteRepo), - await pullNote(noteRepo), - await pullNote(noteRepo), - ]; - } - - if (commentRepo) { - user.comments = [ - await pullComment(commentRepo), - await pullComment(commentRepo), - await pullComment(commentRepo), - await pullComment(commentRepo), - ]; - } - - if (userGroupRepo) { - await pullUserGroup(userGroupRepo); - await pullUserGroup(userGroupRepo); - await pullUserGroup(userGroupRepo); - user.userGroup = await pullUserGroup(userGroupRepo); - } - - if (roleRepo) { - await pullRole(roleRepo); - await pullRole(roleRepo); - await pullRole(roleRepo); - user.roles = [ - await pullRole(roleRepo), - await pullRole(roleRepo), - await pullRole(roleRepo), - ]; - } - - user.manager = await pullUser(userPero); - await pullUser(userPero); - await pullUser(userPero); - await pullUser(userPero); - await userPero.save(user); - return user; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts index 46bf6797..7050865f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts @@ -6,7 +6,7 @@ import { Module, NestModule, } from '@nestjs/common'; -import { DiscoveryModule } from '@nestjs/core'; +import { DiscoveryModule, RouterModule } from '@nestjs/core'; import { OperationController } from './controllers'; import { ExplorerService, ExecuteService, SwaggerService } from './service'; @@ -17,13 +17,34 @@ import { ZodInputOperation, AsyncIterate, } from './factory'; -import { ResultModuleOptions } from '../../types'; -import { MAP_CONTROLLER_INTERCEPTORS, OPTIONS } from './constants'; +import { AnyEntity, EntityClass } from '../../types'; +import { MAP_CONTROLLER_INTERCEPTORS } from './constants'; @Module({}) export class AtomicOperationModule implements NestModule { static forRoot( - options: ResultModuleOptions, + operationUrl: string, + entities: EntityClass[], + entityModules: DynamicModule[], + commonModule: DynamicModule + ): DynamicModule[] { + return [ + AtomicOperationModule.factoryModule( + entities, + entityModules, + commonModule + ), + RouterModule.register([ + { + module: AtomicOperationModule, + path: operationUrl, + }, + ]), + ]; + } + + private static factoryModule( + entities: EntityClass[], entityModules: DynamicModule[], commonModule: DynamicModule ): DynamicModule { @@ -35,17 +56,13 @@ export class AtomicOperationModule implements NestModule { ExecuteService, SwaggerService, AsyncIterate, - MapControllerEntity(options.entities, entityModules), - MapEntityNameToEntity(options.entities), + MapControllerEntity(entities, entityModules), + MapEntityNameToEntity(entities), ZodInputOperation(), { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: new Map(), }, - { - provide: OPTIONS, - useValue: options.options, - }, { provide: AsyncLocalStorage, useValue: new AsyncLocalStorage(), @@ -54,6 +71,7 @@ export class AtomicOperationModule implements NestModule { imports: [DiscoveryModule, commonModule], }; } + @Inject(AsyncLocalStorage) private readonly als!: AsyncLocalStorage; configure(consumer: MiddlewareConsumer) { @@ -66,6 +84,6 @@ export class AtomicOperationModule implements NestModule { }; this.als.run(store, () => next()); }) - .forRoutes('*'); + .forRoutes('{*splat}'); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts index ccace714..00798a3f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts @@ -7,4 +7,3 @@ export const ZOD_INPUT_OPERATION = Symbol('ZOD_INPUT_OPERATION'); export const ASYNC_ITERATOR_FACTORY = Symbol('ASYNC_ITERATOR_FACTORY'); export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; -export const OPTIONS = Symbol('OPTIONS'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts index 1206658c..7c89df23 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts @@ -2,18 +2,13 @@ import { Test, TestingModule } from '@nestjs/testing'; import { DiscoveryModule } from '@nestjs/core'; import { HttpException } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { IMemoryDb } from 'pg-mem'; import { OperationController } from './operation.controller'; import { ExecuteService, ExplorerService } from '../service'; import { InputArray, Operation } from '../utils'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; -import { - mockDBTestModule, - providerEntities, - Users, -} from '../../../mock-utils/typeorm'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; + +import { Users } from '../../../utils/___test___/test-classes.helper'; import { ASYNC_ITERATOR_FACTORY, @@ -22,35 +17,23 @@ import { MAP_ENTITY, ZOD_INPUT_OPERATION, MAP_CONTROLLER_INTERCEPTORS, - OPTIONS, } from '../constants'; import { OperationMethode } from '../types'; import { AsyncLocalStorage } from 'async_hooks'; import { ObjectLiteral } from '../../../types'; -import { - CURRENT_DATA_SOURCE_TOKEN, - RUN_IN_TRANSACTION_FUNCTION, -} from '../../../constants'; -import { createAndPullSchemaBase } from '../../../mock-utils'; +import { RUN_IN_TRANSACTION_FUNCTION } from '../../../constants'; describe('OperationController', () => { - let db: IMemoryDb; let operationController: OperationController; let explorerService: ExplorerService; let executeService: ExecuteService; beforeEach(async () => { - db = createAndPullSchemaBase(); const app: TestingModule = await Test.createTestingModule({ - imports: [DiscoveryModule, mockDBTestModule(db)], + imports: [DiscoveryModule], controllers: [OperationController], providers: [ - ...providerEntities(getDataSourceToken()), - { - provide: CURRENT_DATA_SOURCE_TOKEN, - useValue: {}, - }, ExplorerService, ExecuteService, { @@ -73,10 +56,6 @@ describe('OperationController', () => { provide: ZOD_INPUT_OPERATION, useValue: {}, }, - { - provide: OPTIONS, - useValue: {}, - }, { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: {}, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts index 7042e289..a373f589 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts @@ -14,8 +14,8 @@ import { InputOperationPipe } from '../pipes/input-operation.pipe'; import { ExecuteService, ExplorerService } from '../service'; import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; import { OperationMethode, ParamsForExecute } from '../types'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; -import { ObjectLiteral as Entity, ValidateQueryError } from '../../../types'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; +import { ValidateQueryError } from '../../../types'; @Controller('/') export class OperationController { @@ -32,8 +32,8 @@ export class OperationController { op, } = dataInput; - let controller: Type>; - let methodName: OperationMethode; + let controller: Type>; + let methodName: OperationMethode; let module: Module; try { controller = this.explorerService.getControllerByEntityName(type); @@ -63,7 +63,7 @@ export class OperationController { const params = this.explorerService.getParamsForMethod( methodName, dataInput - ); + ) as any; try { module = this.explorerService.getModulesByController(controller); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts index 0dded8b9..cd4165b3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/index.ts @@ -1,4 +1,4 @@ -export * from './zod-input-operation'; +export * from './async-iterator'; export * from './map-controller-entity'; export * from './map-entity-name-to-entity'; -export * from './async-iterator'; +export * from './zod-input-operation'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts index 64d23a17..71287fb5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts @@ -1,11 +1,11 @@ import { DynamicModule, ValueProvider } from '@nestjs/common'; import { Type } from '@nestjs/common/interfaces/type.interface'; -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; +import { EntityClass, AnyEntity } from '../../../types'; import { MapController } from '../types'; import { MAP_CONTROLLER_ENTITY } from '../constants'; export function MapControllerEntity( - entities: EntityClassOrSchema[], + entities: EntityClass[], entityModules: DynamicModule[] ): ValueProvider { const mapController = entities.reduce((acum, entity, index) => { @@ -16,7 +16,7 @@ export function MapControllerEntity( } return acum; - }, new Map>()); + }, new Map, Type>()); return { provide: MAP_CONTROLLER_ENTITY, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts index 848eea94..b0fac8e4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts @@ -1,19 +1,19 @@ -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; import { ValueProvider } from '@nestjs/common'; -import { camelToKebab } from '../../../utils/nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; import { MapEntity } from '../types'; import { MAP_ENTITY } from '../constants'; -import { getEntityName } from '../../mixin/helper'; -import { AnyEntity, EntityTarget } from '../../../types'; +import { AnyEntity, EntityClass } from '../../../types'; + +import { getEntityName } from '@klerick/json-api-nestjs-shared'; export function MapEntityNameToEntity( - entities: EntityClassOrSchema[] + entities: EntityClass[] ): ValueProvider { return { provide: MAP_ENTITY, useValue: entities.reduce( - (acum, item) => acum.set(camelToKebab(getEntityName(item)), item), - new Map>() + (acum, item) => acum.set(kebabCase(getEntityName(item)), item), + new Map>() ), }; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts index 75ddeb40..49ec0c6d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts @@ -2,9 +2,9 @@ import { FactoryProvider } from '@nestjs/common'; import { MAP_CONTROLLER_ENTITY, ZOD_INPUT_OPERATION } from '../constants'; import { MapController } from '../types'; import { zodInputOperation, ZodInputOperation } from '../utils'; -import { ENTITY_MAP_PROPS } from '../../../constants'; -import { ZodEntityProps } from '../../mixin/types'; -import { EntityClass, ObjectLiteral } from '../../../types'; +import { ENTITY_PARAM_MAP } from '../../../constants'; +import { EntityParamMap } from '../../mixin/types'; +import { AnyEntity, EntityClass, ObjectLiteral } from '../../../types'; export function ZodInputOperation(): FactoryProvider< ZodInputOperation @@ -13,10 +13,10 @@ export function ZodInputOperation(): FactoryProvider< provide: ZOD_INPUT_OPERATION, useFactory( mapController: MapController, - entityMapProps: Map, ZodEntityProps> + entityMapProps: EntityParamMap> ) { return zodInputOperation(mapController, entityMapProps); }, - inject: [MAP_CONTROLLER_ENTITY, ENTITY_MAP_PROPS], + inject: [MAP_CONTROLLER_ENTITY, ENTITY_PARAM_MAP], }; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts deleted file mode 100644 index 81ce0c2a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './atomic-operation.module'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts index 643405e1..26e6e704 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts @@ -12,7 +12,7 @@ import { ZodInputOperation } from '../utils'; describe('PatchInputPipe', () => { let patchInputPipe: InputOperationPipe; - let zodInputOperation: ZodInputOperation; + let zodInputOperation: ZodInputOperation; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ @@ -27,7 +27,8 @@ describe('PatchInputPipe', () => { }).compile(); patchInputPipe = module.get(InputOperationPipe); - zodInputOperation = module.get(ZOD_INPUT_OPERATION); + zodInputOperation = + module.get>(ZOD_INPUT_OPERATION); }); afterEach(() => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts index 45723122..0b2215e6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts @@ -7,7 +7,6 @@ import { ASYNC_ITERATOR_FACTORY, KEY_MAIN_INPUT_SCHEMA, MAP_CONTROLLER_INTERCEPTORS, - OPTIONS, } from '../constants'; import { @@ -40,10 +39,6 @@ describe('ExecuteService', () => { get() {}, }, }, - { - provide: OPTIONS, - useValue: {}, - }, { provide: ASYNC_ITERATOR_FACTORY, useValue: { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts index a59606ed..de5d0f8e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts @@ -17,7 +17,7 @@ import { ObjectTyped, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; +} from '@klerick/json-api-nestjs-shared'; import { InterceptorsConsumer, InterceptorsContextCreator, @@ -33,8 +33,8 @@ import { MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; import { IterateFactory } from '../factory'; -import { TypeFromType } from '../../mixin/types'; -import { RunInTransaction, ValidateQueryError } from '../../../types'; +import { TypeFromType, ValidateQueryError } from '../../../types'; +import { RunInTransaction } from '../../mixin/types'; import { RUN_IN_TRANSACTION_FUNCTION } from '../../../constants'; export function isZodError( @@ -48,9 +48,12 @@ export function isZodError( ); } +function assertIsArray(data: unknown): data is Array { + return Array.isArray(data); +} + @Injectable() export class ExecuteService { - // @Inject(CURRENT_DATA_SOURCE_TOKEN) private readonly dataSource!: DataSource; @Inject(ModuleRef) private readonly moduleRef!: ModuleRef & { container: NestContainer; applicationConfig: ApplicationConfig; @@ -97,7 +100,8 @@ export class ExecuteService { ); const resultArray: Array< - ResourceObject | ResourceObjectRelationships + | ResourceObject + | ResourceObjectRelationships > = []; let i = 0; const tmpIdsMap: Record = {}; @@ -134,9 +138,9 @@ export class ExecuteService { itemReplace, ], controller, - // @ts-ignore + // @ts-expect-error inccorect parse controller[methodName], - // @ts-ignore + // @ts-expect-error inccorect parse async () => controller[methodName](...itemReplace) ); @@ -226,9 +230,9 @@ export class ExecuteService { bodyInput.relationships = ObjectTyped.entries(relationships).reduce( (acum, [name, val]) => { - if (!val) throw new Error('Va; undefined'); - const { data } = val; - if (Array.isArray(data)) { + if (!val) throw new Error('Val undefined'); + const { data } = val as any; + if (assertIsArray(data)) { acum[name] = { data: data.map((i) => { if (i === null) return i; @@ -252,7 +256,7 @@ export class ExecuteService { } return acum; }, - { ...relationships } + { ...relationships } as any ); inputParams[inputParams.length - 1] = bodyInput; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts index ec654d2d..1d1ea451 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts @@ -3,7 +3,6 @@ import { ModulesContainer } from '@nestjs/core'; import { MAP_ENTITY, MAP_CONTROLLER_ENTITY, - OPTIONS, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; import { Operation } from '../utils'; @@ -40,10 +39,6 @@ describe('ExplorerService', () => { provide: MAP_CONTROLLER_INTERCEPTORS, useValue: new Map(), }, - { - provide: OPTIONS, - useValue: {}, - }, ], }).compile(); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts index 57bc72b4..e70b0806 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts @@ -1,12 +1,12 @@ import { Inject, Injectable, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { ModulesContainer } from '@nestjs/core'; -import { EntityRelation } from '../../../utils/nestjs-shared'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { MAP_CONTROLLER_ENTITY, MAP_ENTITY } from '../constants'; import { MapController, MapEntity, OperationMethode } from '../types'; -import { ObjectLiteral as Entity } from '../../../types'; + import { InputArray, Operation } from '../utils'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; import { PatchData, PatchRelationshipData, @@ -15,7 +15,7 @@ import { } from '../../mixin/zod'; @Injectable() -export class ExplorerService { +export class ExplorerService { @Inject(ModulesContainer) private readonly modulesContainer!: ModulesContainer; @@ -65,27 +65,27 @@ export class ExplorerService { const { op, ref, ...other } = data; switch (methodName) { case 'postOne': - return [other as PostData]; + return [other as PostData]; case 'patchOne': - return [ref.id as string, other as PatchData]; + return [ref.id as string, other as PatchData]; case 'deleteOne': return [ref.id as string]; case 'deleteRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PostRelationshipData, ]; case 'patchRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PatchRelationshipData, ]; case 'postRelationship': return [ ref.id as string, - ref.relationship as EntityRelation, + ref.relationship as RelationKeys, other as PostRelationshipData, ]; } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts index aaf75a95..b80e6897 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/index.ts @@ -1,3 +1,3 @@ -export * from './explorer.service'; export * from './execute.service'; export * from './swagger.service'; +export * from './explorer.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts index cf263440..d69e3690 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/swagger.service.ts @@ -15,7 +15,7 @@ import { ZOD_INPUT_OPERATION } from '../constants'; export class SwaggerService implements OnModuleInit { @Inject(ModuleRef) private readonly moduleRef!: ModuleRef; @Inject(ZOD_INPUT_OPERATION) - private typeZodInputOperation!: ZodInputOperation; + private typeZodInputOperation!: ZodInputOperation; private initSwagger() { const operationControllerInst = this.moduleRef.get(OperationController); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts index 57fe5ae5..f0068487 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts @@ -1,29 +1,26 @@ import { NestInterceptor, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { Controller } from '@nestjs/common/interfaces'; -import { EntityTarget, ObjectLiteral } from '../../../types'; -import { JsonBaseController } from '../../mixin/controller/json-base.controller'; +import { EntityClass } from '../../../types'; +import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; export type MapControllerInterceptor = Map< Controller, Map<(...arg: any) => any, NestInterceptor[]> >; -export type MapController = Map< - EntityTarget, +export type MapController = Map< + EntityClass, Type >; -export type MapEntity = Map< - string, - EntityTarget ->; +export type MapEntity = Map>; -export type OperationMethode = keyof Omit< +export type OperationMethode = keyof Omit< { [k in keyof JsonBaseController]: string }, 'getAll' | 'getOne' | 'getRelationship' >; export type ParamsForExecute< - E extends ObjectLiteral = ObjectLiteral, + E extends object = object, O extends OperationMethode = OperationMethode > = { methodName: O; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts index 68a9977c..ae7df6bb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts @@ -1,4 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { z, ZodError } from 'zod'; import { Operation, @@ -13,17 +14,16 @@ import { zodUpdate, ZodUpdate, } from './zod-helper'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ENTITY_MAP_PROPS, FIELD_FOR_ENTITY } from '../../../../constants'; -import { JsonBaseController } from '../../../mixin/controller/json-base.controller'; + import { MapController } from '../../types'; import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; -import { - GetFieldForEntity, - TupleOfEntityRelation, - ZodEntityProps, -} from '../../../mixin/types'; -import { EntityClass } from '../../../../types'; + +import { AnyEntity, EntityClass, UnionToTuple } from '../../../../types'; +import { JsonBaseController } from '../../../mixin/controllers/json-base.controller'; +import { mapMock } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { ENTITY_PARAM_MAP } from '../../../../constants'; +import { EntityParamMap } from '../../../mixin/types'; describe('ZodHelperSpec', () => { afterEach(() => { @@ -321,10 +321,9 @@ describe('ZodHelperSpec', () => { describe('zodOperationRel', () => { it('should be correct', () => { const user = 'user'; - const rel = [ - 'address', - 'notes', - ] as unknown as TupleOfEntityRelation; + const rel = ['address', 'notes'] as unknown as UnionToTuple< + RelationKeys + >; const schema = zodOperationRel( user, rel, @@ -353,10 +352,9 @@ describe('ZodHelperSpec', () => { }); it('should be not correct', () => { const user = 'user'; - const rel = [ - 'address', - 'notes', - ] as unknown as TupleOfEntityRelation; + const rel = ['address', 'notes'] as unknown as UnionToTuple< + RelationKeys + >; const schema = zodOperationRel( user, rel, @@ -449,41 +447,25 @@ describe('ZodHelperSpec', () => { }); }); describe('zodInputOperation', () => { - let getField: Map, ZodEntityProps>; + let entityParamMap: EntityParamMap>; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ { - provide: ENTITY_MAP_PROPS, - useValue: new Map([ - [ - Users, - { - relations: [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', - ], - }, - ], - ]), + provide: ENTITY_PARAM_MAP, + useValue: mapMock, }, ], }).compile(); - getField = - module.get, ZodEntityProps>>( - ENTITY_MAP_PROPS - ); + entityParamMap = + module.get>>(ENTITY_PARAM_MAP); }); it('should be correct', () => { const mapController: MapController = new Map([ [Users as any, JsonBaseController], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check: z.infer> = { [KEY_MAIN_INPUT_SCHEMA]: [ { @@ -526,7 +508,7 @@ describe('ZodHelperSpec', () => { const mapController: MapController = new Map([ [Users as any, JsonBaseController], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check = {}; const check1 = { ssdf: 'sdfsdf', @@ -563,7 +545,7 @@ describe('ZodHelperSpec', () => { const mapController: MapController = new Map([ [Users as any, Test], ]); - const schema = zodInputOperation(mapController, getField); + const schema = zodInputOperation(mapController, entityParamMap); const check: z.infer> = { [KEY_MAIN_INPUT_SCHEMA]: [ { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts index a1b83422..3f957cc6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts @@ -1,3 +1,4 @@ +import { getEntityName, RelationKeys } from '@klerick/json-api-nestjs-shared'; import { z, ZodArray, @@ -9,17 +10,12 @@ import { ZodType, ZodUnion, } from 'zod'; -import { camelToKebab } from '../../../../utils/nestjs-shared'; - +import { kebabCase } from 'change-case-commonjs'; import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; import { MapController } from '../../types'; -import { - GetFieldForEntity, - TupleOfEntityRelation, - ZodEntityProps, -} from '../../../mixin/types'; -import { getEntityName } from '../../../mixin/helper'; -import { EntityClass, ObjectLiteral } from '../../../../types'; + +import { AnyEntity, EntityClass, UnionToTuple } from '../../../../types'; +import { EntityParamMap } from '../../../mixin/types'; export enum Operation { add = 'add', @@ -81,17 +77,16 @@ export const zodRemove = (type: T) => }) .strict(); -export type ZodOperationRel< - E extends ObjectLiteral, - O extends Operation -> = ReturnType>; +export type ZodOperationRel = ReturnType< + typeof zodOperationRel +>; -export const zodOperationRel = ( +export const zodOperationRel = ( type: string, - rel: TupleOfEntityRelation, + rel: UnionToTuple>, typeOperation: O ) => { - const literalArray = rel.map((i) => z.literal(i)) as [ + const literalArray = rel.map((i) => z.literal(i as string)) as [ ZodLiteral, ZodLiteral, ...ZodLiteral[] @@ -125,17 +120,16 @@ export type ZodInputArray = ZodArray< 'atleastone' >; -export type ZodInputOperation = - ReturnType>; -export type InputOperation = z.infer< - ZodInputOperation +export type ZodInputOperation = ReturnType< + typeof zodInputOperation >; +export type InputOperation = z.infer>; export type InputArray = z.infer; -export function zodInputOperation( +export function zodInputOperation( mapController: MapController, - entityMapProps: Map, ZodEntityProps> + entityMapProps: EntityParamMap> ) { const array = [] as unknown as [ ZodAdd, @@ -146,7 +140,7 @@ export function zodInputOperation( ZodOperationRel ]; for (const [entity, controller] of mapController.entries()) { - const typeName = camelToKebab(getEntityName(entity)); + const typeName = kebabCase(getEntityName(entity)); const entityMap = entityMapProps.get(entity as any); if (!entityMap) throw new Error('Entity not found in map'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/index.ts index 06b783b6..8bd85b09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/index.ts @@ -1,3 +1,2 @@ -export * from './type-orm'; -export * from './micro-orm'; -export * from './atomic-operation'; +export * from './mixin/mixin.module'; +export * from './atomic-operation/atomic-operation.module'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts deleted file mode 100644 index 116b14aa..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const ENTITY_METADATA_TOKEN = Symbol('ENTITY_METADATA_TOKEN'); -export const DEFAULT_ARRAY_TYPE = ['ArrayType', 'EnumArrayType']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts deleted file mode 100644 index b8a13acc..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/factory/index.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { FactoryProvider } from '@nestjs/common'; -import { - EntityManager, - MikroORM, - EntityRepository, - MetadataStorage, -} from '@mikro-orm/core'; -import { camelToKebab } from '../../../utils/nestjs-shared'; -import { getMikroORMToken } from '@mikro-orm/nestjs'; - -import { - CURRENT_DATA_SOURCE_TOKEN, - CURRENT_ENTITY_MANAGER_TOKEN, - CURRENT_ENTITY_REPOSITORY, - GLOBAL_MODULE_OPTIONS_TOKEN, - RUN_IN_TRANSACTION_FUNCTION, - ORM_SERVICE, - ENTITY_MAP_PROPS, -} from '../../../constants'; - -import { - EntityClass, - ObjectLiteral, - ResultMicroOrmModuleOptions, - RunInTransaction, -} from '../../../types'; -import { ZodEntityProps } from '../../mixin/types'; -import { - getProps, - getRelation, - getPropsType, - getPropsNullable, - getPrimaryColumnName, - getPrimaryColumnType, - getRelationProperty, -} from '../orm-helper'; - -import { getEntityName } from '../../mixin/helper'; -import { ENTITY_METADATA_TOKEN } from '../constants'; -import { MicroOrmService } from '../service'; - -export function CurrentMicroOrmProvider( - connectionName?: string -): FactoryProvider { - return { - provide: CURRENT_DATA_SOURCE_TOKEN, - useFactory: (mikroORM: MikroORM) => { - return mikroORM; - }, - inject: [connectionName ? getMikroORMToken(connectionName) : MikroORM], - }; -} - -export function CurrentEntityManager(): FactoryProvider { - return { - provide: CURRENT_ENTITY_MANAGER_TOKEN, - useFactory: (mikroORM: MikroORM) => mikroORM.em, - inject: [CURRENT_DATA_SOURCE_TOKEN], - }; -} - -export function CurrentEntityRepository( - entity: E -): FactoryProvider> { - return { - provide: CURRENT_ENTITY_REPOSITORY, - useFactory: (entityManager: EntityManager) => - entityManager.getRepository(entity as unknown as EntityClass), - inject: [CURRENT_ENTITY_MANAGER_TOKEN], - }; -} - -export function CurrentEntityMetadata(): FactoryProvider { - return { - provide: ENTITY_METADATA_TOKEN, - useFactory: (mikroORM: MikroORM) => mikroORM.getMetadata(), - inject: [CURRENT_DATA_SOURCE_TOKEN], - }; -} - -export function EntityPropsMap( - entities: EntityClass[] -) { - return { - provide: ENTITY_MAP_PROPS, - inject: [ENTITY_METADATA_TOKEN, GLOBAL_MODULE_OPTIONS_TOKEN], - useFactory: ( - metadataStorage: MetadataStorage, - config: ResultMicroOrmModuleOptions - ) => { - const mapProperty = new Map, ZodEntityProps>(); - const arrayConfig = config.options.arrayType; - for (const item of entities) { - const metadata = metadataStorage.get(item); - const className = getEntityName(item); - mapProperty.set(item, { - props: getProps(metadata), - propsType: getPropsType(metadata, arrayConfig), - propsNullable: getPropsNullable(metadata), - primaryColumnName: getPrimaryColumnName(metadata), - primaryColumnType: getPrimaryColumnType(metadata), - typeName: camelToKebab(className), - className: className, - relations: getRelation(metadata), - relationProperty: getRelationProperty(metadata), - }); - } - return mapProperty; - }, - }; -} - -export function RunInTransactionFactory(): FactoryProvider { - return { - provide: RUN_IN_TRANSACTION_FUNCTION, - inject: [], - useFactory() { - return async (callback) => callback(); - }, - }; -} - -export function OrmServiceFactory() { - return { - provide: ORM_SERVICE, - useClass: MicroOrmService, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts deleted file mode 100644 index a5d7b76f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './micro-orm-json-api.module'; -export * from './type'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts deleted file mode 100644 index 6e9e443f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/micro-orm-json-api.module.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { DynamicModule } from '@nestjs/common'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; - -import { NestProvider, ResultModuleOptions, ObjectLiteral } from '../../types'; -import { GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; -import { - CurrentEntityManager, - CurrentEntityMetadata, - CurrentEntityRepository, - CurrentMicroOrmProvider, - OrmServiceFactory, - RunInTransactionFactory, - EntityPropsMap, -} from './factory'; -import { MicroOrmUtilService } from './service/micro-orm-util.service'; - -export class MicroOrmJsonApiModule { - static module = 'microOrm' as const; - static forRoot(options: ResultModuleOptions): DynamicModule { - const optionProvider = { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, - useValue: options, - }; - - const microOrmModule = MikroOrmModule.forFeature( - options.entities, - options.connectionName - ); - - const currentProvider = [ - ...(options.providers || []), - optionProvider, - CurrentMicroOrmProvider(options.connectionName), - CurrentEntityManager(), - CurrentEntityMetadata(), - RunInTransactionFactory(), - EntityPropsMap(options.entities), - ]; - - const currentImport = [microOrmModule, ...(options.imports || [])]; - - return { - module: MicroOrmJsonApiModule, - imports: currentImport, - providers: currentProvider, - exports: [...currentProvider, ...currentImport], - }; - } - - static getUtilProviders(entity: ObjectLiteral): NestProvider { - return [ - CurrentEntityRepository(entity), - OrmServiceFactory(), - MicroOrmUtilService, - ]; - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts deleted file mode 100644 index fbb9fbdd..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.spec.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { MetadataStorage, MikroORM } from '@mikro-orm/core'; - -import { - Users, - Addresses, - Notes, - Roles, - dbRandomName, - mockDbPgLiteTestModule, - Comments, - UserGroups, -} from '../../../mock-utils/microrom'; -import { - CurrentMicroOrmProvider, - CurrentEntityManager, - CurrentEntityMetadata, -} from '../factory'; - -import { DEFAULT_ARRAY_TYPE, ENTITY_METADATA_TOKEN } from '../constants'; - -import { TypeField } from '../../mixin/types'; - -import { - getProps, - getPropsType, - getPropsNullable, - getPrimaryColumnName, - getPrimaryColumnType, - getRelation, - getRelationProperty, -} from './'; - -describe('microorm-orm-helper-for-map', () => { - let entityMetadataToken: MetadataStorage; - let mikroORM: MikroORM; - let dbName: string; - const config = DEFAULT_ARRAY_TYPE; - beforeAll(async () => { - dbName = dbRandomName(true); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDbPgLiteTestModule(dbName)], - providers: [ - CurrentMicroOrmProvider(), - CurrentEntityManager(), - CurrentEntityMetadata(), - ], - }).compile(); - - entityMetadataToken = module.get(ENTITY_METADATA_TOKEN); - - mikroORM = module.get(MikroORM); - }); - - afterAll(() => { - mikroORM.close(true); - }); - - it('getProps', () => { - const result = getProps(entityMetadataToken.get(Users)); - expect(result.includes('id')).toBe(true); - expect(result.includes('lastName')).toBe(true); - expect(result.includes('createdAt')).toBe(true); - expect(result.includes('updatedAt')).toBe(true); - expect(result.includes('isActive')).toBe(true); - expect(result.includes('login')).toBe(true); - expect(result.includes('firstName')).toBe(true); - expect(result.includes('testReal')).toBe(true); - expect(result.includes('testArrayNull')).toBe(true); - expect(result.includes('testDate')).toBe(true); - - expect(result.includes('userGroup' as any)).toBe(false); - expect(result.includes('notes' as any)).toBe(false); - expect(result.includes('comments' as any)).toBe(false); - expect(result.includes('roles' as any)).toBe(false); - expect(result.includes('manager' as any)).toBe(false); - expect(result.includes('addresses' as any)).toBe(false); - }); - - it('getPropsType', () => { - const result = getPropsType(entityMetadataToken.get(Users), config); - - expect(result).toEqual({ - createdAt: 'date', - firstName: 'string', - id: 'number', - isActive: 'boolean', - lastName: 'string', - login: 'string', - testArrayNull: 'array', - testDate: 'date', - testReal: 'array', - updatedAt: 'date', - }); - }); - - it('getPropsNullable', () => { - const result = getPropsNullable(entityMetadataToken.get(Users)); - expect(result).toEqual([ - 'firstName', - 'testReal', - 'testArrayNull', - 'lastName', - 'isActive', - 'testDate', - 'createdAt', - 'updatedAt', - ]); - }); - - it('getPrimaryColumnName', () => { - const result = getPrimaryColumnName(entityMetadataToken.get(Users)); - expect(result).toBe('id'); - }); - - it('getPrimaryColumnType', () => { - const result = getPrimaryColumnType(entityMetadataToken.get(Users)); - expect(result).toBe(TypeField.number); - }); - - it('getRelation', () => { - const result = getRelation(entityMetadataToken.get(Users)); - expect(result.includes('id' as any)).toBe(false); - expect(result.includes('lastName' as any)).toBe(false); - expect(result.includes('createdAt' as any)).toBe(false); - expect(result.includes('updatedAt' as any)).toBe(false); - expect(result.includes('isActive' as any)).toBe(false); - expect(result.includes('login' as any)).toBe(false); - expect(result.includes('firstName' as any)).toBe(false); - expect(result.includes('testReal' as any)).toBe(false); - expect(result.includes('testArrayNull' as any)).toBe(false); - expect(result.includes('testDate' as any)).toBe(false); - - expect(result.includes('userGroup')).toBe(true); - expect(result.includes('notes')).toBe(true); - expect(result.includes('comments')).toBe(true); - expect(result.includes('roles')).toBe(true); - expect(result.includes('manager')).toBe(true); - expect(result.includes('addresses')).toBe(true); - }); - - it('getRelationProperty', () => { - const result = getRelationProperty(entityMetadataToken.get(Users)); - expect(result).toEqual({ - addresses: { - entityClass: Addresses, - isArray: false, - nullable: true, - }, - comments: { - entityClass: Comments, - isArray: true, - nullable: false, - }, - manager: { - entityClass: Users, - isArray: false, - nullable: true, - }, - notes: { - entityClass: Notes, - isArray: true, - nullable: false, - }, - roles: { - entityClass: Roles, - isArray: true, - nullable: false, - }, - userGroup: { - entityClass: UserGroups, - isArray: false, - nullable: true, - }, - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts deleted file mode 100644 index 1ad4cffc..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-helper/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { EntityKey, EntityMetadata } from '@mikro-orm/core'; -import { ObjectLiteral, ResultMicroOrmModuleOptions } from '../../../types'; -import { - FieldWithType, - FilterNullableProps, - RelationProperty, - TupleOfEntityProps, - TupleOfEntityRelation, - TypeField, - TypeForId, -} from '../../mixin/types'; - -export const getRelation = ( - entityMetadata: EntityMetadata -) => entityMetadata.relations.map((i) => i.name) as TupleOfEntityRelation; - -export const getProps = ( - entityMetadata: EntityMetadata -): TupleOfEntityProps => { - const relations = getRelation(entityMetadata); - - return entityMetadata.props - .map((i) => i.name) - .filter((i) => !relations.includes(i)) as TupleOfEntityProps; -}; - -export const getPropsType = ( - entityMetadata: EntityMetadata, - config: ResultMicroOrmModuleOptions['options']['arrayType'] -): FieldWithType => { - const field = getProps(entityMetadata); - - const result = {} as any; - for (const item of field) { - const props = - entityMetadata.properties[item as unknown as EntityKey]; - - let typeProps: TypeField = TypeField.string; - if (config.includes(props['type'])) { - result[item] = TypeField.array; - continue; - } - - switch (props.runtimeType) { - case 'Date': - typeProps = TypeField.date; - break; - case 'number': - typeProps = TypeField.number; - break; - case 'boolean': - typeProps = TypeField.boolean; - break; - case 'object': - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - result[item] = typeProps; - } - - return result; -}; - -export const getPropsNullable = ( - entityMetadata: EntityMetadata -): FilterNullableProps> => { - return getProps(entityMetadata) - .map((i) => { - // @ts-ignore - const props = entityMetadata.properties[i]; - return props.nullable || props.default !== undefined ? i : false; - }) - .filter((i) => !!i) as FilterNullableProps>; -}; - -export const getPrimaryColumnName = ( - entityMetadata: EntityMetadata -) => entityMetadata.getPrimaryProp().name.toString(); - -export const getPrimaryColumnType = ( - entityMetadata: EntityMetadata -): TypeForId => { - return entityMetadata.getPrimaryProp().runtimeType === 'number' - ? TypeField.number - : TypeField.string; -}; - -export const getRelationProperty = ( - entityMetadata: EntityMetadata -): RelationProperty => { - return entityMetadata.relations.reduce((acum, item) => { - // @ts-expect-error its dynamic creater - acum[item.name] = { - entityClass: item.entity() as any, - nullable: - item.kind === 'm:n' || item.kind === '1:m' - ? false - : (!!item.nullable as any), - isArray: item.kind === 'm:n' || item.kind === ('1:m' as any), - }; - - return acum; - }, {} as RelationProperty); -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts deleted file mode 100644 index 7563183a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { EntityManager, MikroORM } from '@mikro-orm/core'; - -import { - dbRandomName, - getModuleForPgLite, - pullData, - Users, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; -import { deleteOne } from './delete-one'; - -describe('delete-one', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('Delete one item', async () => { - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .limit(1) - .execute('get', true); - - await deleteOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, checkData.id); - - const result = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: checkData.id, - }) - .execute('get', true); - - expect(result).toBe(null); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts deleted file mode 100644 index ccc07ab2..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-one/delete-one.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MicroOrmService } from '../../service'; -import { ObjectLiteral } from '../../../../types'; - -export async function deleteOne( - this: MicroOrmService, - id: number | string -): Promise { - const data = await this.microOrmUtilService - .queryBuilder() - .where({ - [this.microOrmUtilService.currentPrimaryColumn]: id, - }) - .getSingleResult(); - - if (!data) return void 0; - - await this.microOrmUtilService.entityManager.removeAndFlush(data); - - return void 0; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts deleted file mode 100644 index 16004280..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.spec.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { deleteRelationship } from './delete-relationship'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -describe('delete-relationship', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addressForTest: Addresses; - let addresses: Addresses; - let userGroup: UserGroups; - let notes: Collection; - let roles: Collection; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - const data = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) - .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - roles: { - $exists: true, - }, - userGroup: { - $exists: true, - }, - }) - .limit(1) - .getSingleResult(); - - if (!data) throw new Error(); - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = - data); - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('should be ok', async () => { - const saveCount = roles.length; - const [roles1, roles2] = roles; - await deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles', [ - { type: 'roles', id: roles1.id.toString() }, - ]); - - await deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup', { - type: 'user-groups', - id: userGroup.id.toString(), - }); - - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - id: userObject.id, - }) - .getSingleResult(); - - expect(checkData?.roles.length).toBe(saveCount - 1); - expect(checkData?.roles.map((i) => i.id)).not.toContain(roles1.id); - expect(checkData?.userGroup).toBe(null); - }); - - it('should be error', async () => { - await expect( - deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles', { - type: 'roles', - id: '1000', - }) - ).rejects.toThrow(); - - await expect( - deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles', [ - { - type: 'roles', - id: '1000', - }, - ]) - ).rejects.toThrow(); - - await expect( - deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup', [ - { - type: 'user-groups', - id: '10000', - }, - ]) - ).rejects.toThrow(); - await expect( - deleteRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup', { - type: 'user-groups', - id: '10000', - }) - ).rejects.toThrow(); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts deleted file mode 100644 index 1607e545..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/delete-relationship/delete-relationship.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; - -import { PostRelationshipData } from '../../../mixin/zod'; -import { MicroOrmService } from '../../service'; -import { NotFoundException } from '@nestjs/common'; - -export async function deleteRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: MicroOrmService, - id: number | string, - rel: Rel, - input: PostRelationshipData -): Promise { - const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, - input - ); - - // const currentEntityRef = this.microOrmUtilService.entityManager.getReference( - // this.microOrmUtilService.entity, - // id as any - // ); - - const currentEntityRef = await this.microOrmUtilService - .queryBuilder() - .where({ - [this.microOrmUtilService.currentPrimaryColumn]: id, - }) - .getSingleResult(); - - if (!currentEntityRef) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, - path: ['fields'], - }; - throw new NotFoundException([error]); - } - - await this.microOrmUtilService.entityManager.populate(currentEntityRef, [ - rel as any, - ]); - - if (Array.isArray(idsResult)) { - const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); - const relRef = idsResult.map((i) => - this.microOrmUtilService.entityManager.getReference(relEntity, i as any) - ); - currentEntityRef[rel].remove(...relRef); - } else { - if ( - currentEntityRef[rel][this.microOrmUtilService.getPrimaryNameFor(rel)] == - idsResult - ) { - // @ts-ignore - currentEntityRef[rel] = null; - } - } - - await this.microOrmUtilService.entityManager.flush(); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts deleted file mode 100644 index 9a823b3f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.spec.ts +++ /dev/null @@ -1,957 +0,0 @@ -import { EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getDefaultQuery, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { getAll } from './get-all'; - -describe('get-all', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - describe('page', () => { - it('default', async () => { - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - - const checkData = await queryBuilder.clone().limit(1).getResult(); - - const count = await queryBuilder.clone().count(); - const query = getDefaultQuery(); - - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('not default page', async () => { - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - - const checkData = await queryBuilder.clone().limit(5, 5).getResult(); - const count = await queryBuilder.clone().count(); - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 2, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - }); - - describe('order', () => { - it('sort target', async () => { - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - const checkData = await queryBuilder - .clone() - .orderBy({ - lastName: 'DESC', - }) - .limit(5, 5) - .getResult(); - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.sort = { - target: { - lastName: 'DESC', - }, - }; - query.page = { - size: 5, - number: 2, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('sort relation 1:1', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder() - .select(['id', 'login', 'firstName', 'lastName']) - .leftJoinAndSelect('Users.addresses', 'Addresses__addresses', {}, [ - 'state', - ]); - - const checkData = await queryBuilder - .clone() - .orderBy({ - addresses: { - state: 'ASC', - id: 'ASC', - }, - }) - .limit(5, 5) - .getResult(); - - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.fields = { - target: ['login', 'firstName', 'lastName'], - addresses: ['state'], - }; - - query.sort = { - addresses: { - state: 'ASC', - id: 'ASC', - }, - }; - query.page = { - size: 5, - number: 2, - }; - - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('sort relation m:m', async () => { - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - const checkData = await queryBuilder - .clone() - .orderBy({ - roles: { - name: 'DESC', - }, - id: 'ASC', - }) - .limit(5, 5) - .getResult(); - - const count = await queryBuilder - .clone() - .leftJoin('Users.roles', 'Roles__roles') - .distinct() - .count(); - - const query = getDefaultQuery(); - query.sort = { - roles: { - name: 'DESC', - }, - }; - query.page = { - size: 5, - number: 2, - }; - - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - }); - - describe('select', () => { - it('default', async () => { - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - const checkData = await queryBuilder.clone().limit(5).getResult(); - const count = await queryBuilder.clone().count(); - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('target select field', async () => { - const select: ['login', 'firstName', 'lastName'] = [ - 'login', - 'firstName', - 'lastName', - ]; - const queryBuilder = - microOrmServiceUser.microOrmUtilService.queryBuilder(); - const checkData = await queryBuilder - .clone() - .select(['id', ...select]) - .limit(5) - .getResult(); - const count = await queryBuilder.clone().count(); - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.fields = { - target: select, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('relation select field', async () => { - const select: ['login', 'firstName', 'lastName'] = [ - 'login', - 'firstName', - 'lastName', - ]; - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .select(['id', ...select]) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, [ - 'city', - 'state', - ]) - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['name', 'key']); - const checkData = await queryBuilder.clone().limit(5).getResult(); - const count = await queryBuilder.clone().count().distinct(); - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.fields = { - target: select, - addresses: ['city', 'state'], - roles: ['name', 'key'], - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - }); - - describe('include', () => { - it('default', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .leftJoinAndSelect('Users.roles', 'Roles__roles'); - - const checkData = await queryBuilder.clone().limit(5).getResult(); - const count = await queryBuilder.clone().count().distinct(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.include = ['roles']; - - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('include with select', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.addresses', 'Addresses__addresses', {}, [ - 'city', - 'state', - ]); - - const checkData = await queryBuilder.clone().limit(5).getResult(); - const count = await queryBuilder.clone().count().distinct(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.include = ['roles']; - query.fields = { - addresses: ['city', 'state'], - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - }); - - describe('filter', () => { - let rolesData: Roles[]; - let addresses: Addresses[]; - let userGroups: UserGroups[]; - let users: Users[]; - let notes: Notes[]; - beforeAll(async () => { - rolesData = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Roles) - .getResult(); - addresses = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Addresses) - .getResult(); - - userGroups = await microOrmServiceUser.microOrmUtilService - .queryBuilder(UserGroups) - .getResult(); - users = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .getResult(); - notes = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Notes) - .getResult(); - }); - - describe('target', () => { - it('simple filter on target', async () => { - const randUsers = faker.helpers.arrayElements(users); - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - login: { - $in: randUsers.map((i) => i.login), - }, - }); - - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - login: 'DESC', - }) - .getResult(); - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - target: { - login: { - in: randUsers.map((i) => i.login) as [string, ...string[]], - }, - }, - }; - query.sort = { - target: { - login: 'DESC', - }, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('Target relation is null 1:1', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - manager: { - $exists: false, - }, - }); - - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - manager: { - login: 'DESC', - }, - }) - .getResult(); - const count = await queryBuilder.clone().count(); - - const queryBuilder2 = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - addresses: { - $exists: true, - }, - }); - - const checkData2 = await queryBuilder2 - .clone() - .limit(5) - .orderBy({ - addresses: { - city: 'DESC', - }, - }) - .getResult(); - const count2 = await queryBuilder2.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - target: { - manager: { - eq: 'null', - }, - }, - }; - query.sort = { - manager: { - login: 'DESC', - }, - }; - - const query2 = getDefaultQuery(); - query2.page = { - size: 5, - number: 1, - }; - query2.filter = { - target: { - addresses: { - ne: 'null', - }, - }, - }; - query2.sort = { - addresses: { - city: 'DESC', - }, - }; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - - const { totalItems: totalItems2, items: items2 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query2); - - expect(totalItems2).toBe(count2); - expect(JSON.stringify(items2)).toBe(JSON.stringify(checkData2)); - }); - - it('Target relation is null m:1 & 1:m', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - userGroup: { - $exists: false, - }, - }); - - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - login: 'DESC', - }) - .getResult(); - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - target: { - userGroup: { - eq: 'null', - }, - }, - }; - query.sort = { - target: { - login: 'DESC', - }, - }; - - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - - const checkData2 = await queryBuilder - .clone() - .limit(5) - .orderBy({ - userGroup: { - label: 'DESC', - }, - }) - .getResult(); - - const count2 = await queryBuilder.clone().count(); - - const query2 = getDefaultQuery(); - query2.page = { - size: 5, - number: 1, - }; - query2.filter = { - target: { - userGroup: { - eq: 'null', - }, - }, - }; - query2.sort = { - userGroup: { - label: 'DESC', - }, - }; - - const { totalItems: totalItems2, items: items2 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query2); - - expect(totalItems2).toBe(count2); - expect(JSON.stringify(items2)).toBe(JSON.stringify(checkData2)); - - const queryBuilder2 = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - notes: { - $exists: true, - }, - }); - const checkData3 = await queryBuilder2 - .clone() - .limit(5) - .orderBy({ - notes: { - id: 'DESC', - }, - }) - .getResult(); - - const count3 = await queryBuilder2.clone().count().distinct(); - - const query3 = getDefaultQuery(); - query3.page = { - size: 5, - number: 1, - }; - query3.filter = { - target: { - notes: { - ne: 'null', - }, - }, - }; - query3.sort = { - notes: { - id: 'DESC', - }, - }; - - const { totalItems: totalItems3, items: items3 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query3); - expect(totalItems3).toBe(count3); - expect(JSON.stringify(items3)).toBe(JSON.stringify(checkData3)); - - const checkData4 = await queryBuilder2 - .clone() - .limit(5) - .orderBy({ id: 'DESC' }) - .getResult(); - const count4 = await queryBuilder2.clone().count().distinct(); - - const query4 = getDefaultQuery(); - query4.page = { - size: 5, - number: 1, - }; - query4.filter = { - target: { - notes: { - ne: 'null', - }, - }, - }; - query4.sort = { - target: { - id: 'DESC', - }, - }; - - const { totalItems: totalItems4, items: items4 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query4); - expect(totalItems4).toBe(count4); - expect(JSON.stringify(items4)).toBe(JSON.stringify(checkData4)); - }); - - it('Target relation is null m:m', async () => { - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - roles: { - $exists: false, - }, - }); - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - manager: { - login: 'DESC', - }, - }) - .getResult(); - - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - target: { - roles: { - eq: 'null', - }, - }, - }; - query.sort = { - manager: { - login: 'DESC', - }, - }; - const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - - const queryBuilder1 = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - roles: { - $exists: true, - }, - }); - - const checkData1 = await queryBuilder1 - .clone() - .limit(5) - .orderBy({ - roles: { - key: 'DESC', - }, - }) - .getResult(); - - const count1 = await queryBuilder1.clone().count().distinct(); - - const query1 = getDefaultQuery(); - query1.page = { - size: 5, - number: 1, - }; - query1.filter = { - target: { - roles: { - ne: 'null', - }, - }, - }; - query1.sort = { - roles: { - key: 'DESC', - }, - }; - const { totalItems: totalItems1, items: items1 } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query1); - - expect(totalItems1).toBe(count1); - expect(JSON.stringify(items1)).toBe(JSON.stringify(checkData1)); - }); - }); - - describe('relation', () => { - it('relation 1:1', async () => { - const randAddresses = faker.helpers.arrayElements(addresses); - - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .where({ - addresses: { - id: { - $in: randAddresses.map((i) => i.id), - }, - }, - }) - .joinAndSelect('Users.addresses', 'Addresses'); - - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - addresses: { - city: 'DESC', - }, - }) - .getResult(); - - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - relation: { - addresses: { - id: { - in: randAddresses.map((i) => `${i.id}`) as [ - string, - ...string[] - ], - }, - }, - }, - }; - query.sort = { - addresses: { - city: 'DESC', - }, - }; - query.include = ['addresses']; - const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('relation 1:m', async () => { - const randNotes = faker.helpers.arrayElements(notes, 3); - - const quweryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .leftJoinAndSelect('Users.notes', 'Notes', { - id: { $in: randNotes.map((i) => i.id) }, - }) - .where({ - notes: { - id: { - $in: randNotes.map((i) => i.id), - }, - }, - }); - const checkData = await quweryBuilder - .clone() - .limit(5) - .orderBy({ - addresses: { - city: 'DESC', - }, - }) - .getResult(); - const count = await quweryBuilder.clone().count(); - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - relation: { - notes: { - id: { - in: randNotes.map((i) => `${i.id}`) as [string, ...string[]], - }, - }, - }, - }; - query.sort = { - addresses: { - city: 'DESC', - }, - }; - query.include = ['notes']; - const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - - it('relation m:m', async () => { - const randRoles = faker.helpers.arrayElements(rolesData, 3); - - const queryBuilder = microOrmServiceUser.microOrmUtilService - .queryBuilder('Users') - .leftJoinAndSelect('Users.roles', 'Roles__roles', { - key: randRoles[0].key, - }) - .where({ - roles: { - key: { - $eq: randRoles[0].key, - }, - }, - }); - const checkData = await queryBuilder - .clone() - .limit(5) - .orderBy({ - addresses: { - city: 'DESC', - }, - }) - .getResult(); - - const count = await queryBuilder.clone().count(); - - const query = getDefaultQuery(); - query.page = { - size: 5, - number: 1, - }; - query.filter = { - relation: { - roles: { - key: { - eq: `${randRoles[0].key}`, - }, - }, - }, - }; - query.sort = { - addresses: { - city: 'DESC', - }, - }; - - query.include = ['roles']; - - const { totalItems: totalItems, items: items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, query); - - expect(totalItems).toBe(count); - expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); - }); - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts deleted file mode 100644 index e33a71e5..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-all.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { QueryFlag, serialize, wrap } from '@mikro-orm/core'; - -import { ObjectLiteral } from '../../../../types'; -import { MicroOrmService } from '../../service'; -import { Query } from '../../../mixin/zod'; -import { getQueryForCount, getSortObject } from './get-query-for-count'; - -export async function getAll( - this: MicroOrmService, - query: Query -): Promise<{ - totalItems: number; - items: E[]; -}> { - const { page } = query; - const countSubQuery = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, ...[query]); - - const skip = (page.number - 1) * page.size; - const paginationQuery = countSubQuery - .clone() - .select(this.microOrmUtilService.currentPrimaryColumn) - .limit(page.size, skip); - - const collectIdsAlias = 'CollectIds'; - - const queryIdsQuery = this.microOrmUtilService - .queryBuilder(collectIdsAlias) - .select(this.microOrmUtilService.currentPrimaryColumn) - .join(paginationQuery, this.microOrmUtilService.currentAlias, { - [`${collectIdsAlias}.${this.microOrmUtilService.currentPrimaryColumn}`]: - this.microOrmUtilService - .getKnex() - .ref( - `${this.microOrmUtilService.currentAlias}.${this.microOrmUtilService.currentPrimaryColumn}` - ), - }); - - const queryCount = this.microOrmUtilService - .queryBuilder() - .from( - countSubQuery - .clone() - .select(this.microOrmUtilService.currentPrimaryColumn) - ) - .count(this.microOrmUtilService.currentPrimaryColumn, true); - - const resCount = await queryCount.execute('get'); - const count = resCount ? +resCount.count : 0; - - if (count === 0) { - return { - totalItems: count, - items: [], - }; - } - - const resIds = await queryIdsQuery - .distinct() - .setFlag(QueryFlag.DISABLE_PAGINATE) - .execute('all'); - - const idsArray = resIds.map( - (r) => r[this.microOrmUtilService.currentPrimaryColumn] - ); - const resultQueryBuilder = this.microOrmUtilService.queryBuilder().where({ - [this.microOrmUtilService.currentPrimaryColumn]: { - $in: idsArray, - }, - }); - - const sortObject = getSortObject(query); - const resultList = await this.microOrmUtilService - .prePareQueryBuilder(resultQueryBuilder, query) - .orderBy( - Object.keys(sortObject).length > 0 - ? sortObject - : { - [this.microOrmUtilService.currentPrimaryColumn]: 'ASC', - } - ) - .getResult(); - - return { - totalItems: count, - items: resultList.map((i) => wrap(i).toJSON() as E), - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts deleted file mode 100644 index 3364e14e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.spec.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { EntityManager, MikroORM } from '@mikro-orm/core'; -import { FilterOperand } from '../../../../utils/nestjs-shared'; -import { - UserGroups, - Users, - pullAllData, - getDefaultQuery, - dbRandomName, - getModuleForPgLite, -} from '../../../../mock-utils/microrom'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { getQueryForCount } from './get-query-for-count'; -import { MicroOrmService } from '../../service'; - -describe('get-query-for-count', () => { - let mikroORMUserGroup: MikroORM; - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - beforeAll(async () => { - dbName = dbRandomName(true); - const moduleUserGroup = await getModuleForPgLite(UserGroups, dbName); - - mikroORMUserGroup = moduleUserGroup.get(MikroORM); - - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUserGroup.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullAllData(em); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUserGroup.close(true); - mikroORMUsers.close(true); - }); - - it('has only sort data', () => { - const query = getDefaultQuery(); - query.sort = { - target: { - id: 'ASC', - lastName: 'DESC', - }, - userGroup: { - id: 'ASC', - }, - roles: { - name: 'DESC', - }, - }; - - const result = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query]); - - expect(result.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" left join "public"."users_have_roles" as "u2" on "Users"."id" = "u2"."user_id" left join "public"."roles" as "u1" on "u2"."role_id" = "u1"."id" order by "Users"."id" asc, "Users"."last_name" desc, "Users"."user_groups_id" asc, "u1"."name" desc` - ); - }); - - it('has only filter data', () => { - const query = getDefaultQuery(); - query.filter = { - target: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - testReal: { - [FilterOperand.some]: ['test'], - }, - }, - }; - - const query1 = getDefaultQuery(); - query1.filter = { - target: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - }, - relation: { - comments: { - kind: { - [FilterOperand.eq]: 'COMMENT', - }, - }, - userGroup: { - label: { - [FilterOperand.eq]: 'test', - }, - }, - }, - }; - - const query2 = getDefaultQuery(); - query2.filter = { - target: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - }, - relation: { - manager: { - login: { - [FilterOperand.eq]: 'test', - }, - }, - addresses: { - city: { - [FilterOperand.eq]: 'test', - }, - }, - }, - }; - - const query3 = getDefaultQuery(); - query3.filter = { - target: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - }, - relation: { - roles: { - key: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isDefault: { - [FilterOperand.eq]: 'false', - }, - }, - }, - }; - - const result = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query]); - - expect(result.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and "Users"."test_real" && '{test}' order by "Users"."id" asc` - ); - - const result1 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query1]); - - expect(result1.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and (exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id" and "Comments"."kind" = 'COMMENT')) and (exists (select 1 from "public"."user_groups" as "UserGroups" where "UserGroups"."id" = "Users"."user_groups_id" and "UserGroups"."label" = 'test')) order by "Users"."id" asc` - ); - - const result2 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query2]); - expect(result2.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" left join "public"."users" as "u1" on "Users"."manager_id" = "u1"."id" left join "public"."addresses" as "a2" on "Users"."addresses_id" = "a2"."id" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and "u1"."login" = 'test' and "a2"."city" = 'test' order by "Users"."id" asc` - ); - - const result3 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query3]); - expect(result3.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and (exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."roles" as "r1" on "users_have_roles"."role_id" = "r1"."id" where "users_have_roles"."user_id" = "Users"."id" and "r1"."key" = 'test' and "r1"."key" != 'test2' and "r1"."is_default" = 'false')) order by "Users"."id" asc` - ); - }); - - it('has only filter data with sort', () => { - const query1 = getDefaultQuery(); - query1.filter = { - relation: { - roles: { - key: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isDefault: { - [FilterOperand.eq]: 'false', - }, - }, - }, - }; - query1.sort = { - target: { - id: 'ASC', - lastName: 'DESC', - }, - userGroup: { - id: 'ASC', - }, - roles: { - name: 'DESC', - }, - }; - - const result1 = getQueryForCount.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, ...[query1]); - expect(result1.getFormattedQuery()).toBe( - `select "Users".* from "public"."users" as "Users" left join "public"."users_have_roles" as "u2" on "Users"."id" = "u2"."user_id" left join "public"."roles" as "u1" on "u2"."role_id" = "u1"."id" where "u1"."key" = 'test' and "u1"."key" != 'test2' and "u1"."is_default" = 'false' order by "Users"."id" asc, "Users"."last_name" desc, "Users"."user_groups_id" asc, "u1"."name" desc` - ); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts deleted file mode 100644 index ccc2dda6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-all/get-query-for-count.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; - -import { MicroOrmService } from '../../service'; -import { Query } from '../../../mixin/zod'; -import { ObjectLiteral } from '../../../../types'; -import type { QBQueryOrderMap, EntityKey } from '@mikro-orm/core'; - -export function getSortObject( - query: Query -): QBQueryOrderMap { - const { sort } = query; - const sortObject: QBQueryOrderMap = {}; - if (!sort) return sortObject; - - const { target = {}, ...relation } = sort; - for (const [filed, sortType] of ObjectTyped.entries(target)) { - sortObject[filed] = sortType; - } - - for (const [relationName, orderConfig = {}] of ObjectTyped.entries( - relation - )) { - const name = relationName as unknown as EntityKey; - sortObject[name] = {}; - for (const [field, sortType] of ObjectTyped.entries(orderConfig)) { - sortObject[name][field] = sortType; - } - } - return sortObject; -} - -export function getQueryForCount( - this: MicroOrmService, - query: Query -) { - const querySelect = this.microOrmUtilService.queryBuilder(); - const sortObject = getSortObject(query); - querySelect.orderBy( - Object.keys(sortObject).length > 0 - ? sortObject - : { - [this.microOrmUtilService.currentPrimaryColumn]: 'ASC', - } - ); - - const expressionArrayForTarget = - this.microOrmUtilService.getFilterExpressionForTarget(query); - const expressionArrayForRelation = - this.microOrmUtilService.getFilterExpressionForRelation(query); - - const resultExpression = [ - ...expressionArrayForTarget, - ...expressionArrayForRelation, - ]; - for (const expression of resultExpression) { - querySelect.andWhere(expression); - } - - return querySelect; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts deleted file mode 100644 index e6fcaf70..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { EntityManager, MikroORM } from '@mikro-orm/core'; - -import { - dbRandomName, - getDefaultQuery, - getModuleForPgLite, - pullData, - Users, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { getOne } from './get-one'; -import { NotFoundException } from '@nestjs/common'; - -describe('get-one', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('Get one item', async () => { - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .limit(1) - .getSingleResult(); - const query = getDefaultQuery(); - if (!checkData) throw new Error('Result is null'); - const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, checkData.id, query); - - expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); - }); - - it('Get one item with select', async () => { - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .select(['id', 'firstName', 'isActive']) - .leftJoinAndSelect('Users.addresses', 'Addresses__addresses') - .leftJoinAndSelect('Users.comments', 'Comments__comments', {}, ['text']) - .leftJoinAndSelect('Users.manager', 'Users__manager', {}, ['login']) - .where({ - comments: { - $exists: true, - }, - }) - .limit(1) - .getSingleResult(); - if (!checkData) throw new Error('Result is null'); - const query = getDefaultQuery(); - query.include = ['addresses', 'comments', 'manager']; - query.fields = { - target: ['firstName', 'isActive'], - comments: ['text'], - manager: ['login'], - }; - const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, checkData.id, query); - - expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); - }); - it('Should be error', async () => { - expect.assertions(1); - const query = getDefaultQuery(); - try { - await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, 1000, query); - } catch (e) { - expect(e).toBeInstanceOf(NotFoundException); - } - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts deleted file mode 100644 index 3e01eecb..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-one/get-one.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NotFoundException } from '@nestjs/common'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { QueryOne } from '../../../mixin/zod'; -import { MicroOrmService } from '../../service'; -import { serialize, wrap } from '@mikro-orm/core'; - -export async function getOne( - this: MicroOrmService, - id: number | string, - query: QueryOne -): Promise { - const queryBuilder = this.microOrmUtilService.queryBuilder().where({ - [this.microOrmUtilService.currentPrimaryColumn]: id, - }); - - const resultItem = await this.microOrmUtilService - .prePareQueryBuilder(queryBuilder, query) - .getSingleResult(); - - if (!resultItem) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, - path: ['fields'], - }; - throw new NotFoundException([error]); - } - - return wrap(resultItem).toJSON() as E; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts deleted file mode 100644 index 4454590c..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.spec.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { - Collection, - EntityManager, - MikroORM, - NotFoundError, -} from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { getRelationship } from './get-relationship'; -import { NotFoundException } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -describe('get-relationship', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addressForTest: Addresses; - let addresses: Addresses; - let userGroup: UserGroups; - let notes: Collection; - let roles: Collection; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - const data = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) - .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - addresses: { - $exists: true, - }, - roles: { - $exists: true, - }, - userGroup: { - $exists: true, - }, - }) - .getSingleResult(); - - if (!data) throw new Error(); - - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = - data); - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('should be ger result', async () => { - const { addresses: addressesResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'addresses'); - - expect(addressesResult.id).toBe(addresses.id); - - const { userGroup: userGroupResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup'); - - expect(userGroupResult.id).toBe(userGroup.id); - - const { roles: rolesResult } = await getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles'); - for (const i of roles.map((i) => i.id)) { - expect(rolesResult.map((i) => i.id)).toContain(i); - } - }); - - it('should be error', async () => { - await expect( - getRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, '20000', 'roles') - ).rejects.toThrow(NotFoundException); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts deleted file mode 100644 index 09dbd99e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/get-relationship/get-relationship.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; -import { NotFoundException } from '@nestjs/common'; - -import { MicroOrmService } from '../../service'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { serialize } from '@mikro-orm/core'; - -export async function getRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->(this: MicroOrmService, id: number | string, rel: Rel): Promise { - const result = await this.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect( - `${this.microOrmUtilService.currentAlias}.${rel.toString()}`, - rel.toString(), - {}, - [this.microOrmUtilService.getPrimaryNameFor(rel)] - ) - .where({ - [this.microOrmUtilService.currentPrimaryColumn]: id, - }) - .getSingleResult(); - - if (!result) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, - path: ['fields'], - }; - throw new NotFoundException([error]); - } - - return serialize(result, { forceObject: true }) as unknown as E; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts deleted file mode 100644 index 9c1365d1..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './get-all/get-all'; -export * from './get-one/get-one'; -export * from './delete-one/delete-one'; -export * from './post-one/post-one'; -export * from './patch-one/patch-one'; -export * from './get-relationship/get-relationship'; -export * from './delete-relationship/delete-relationship'; -export * from './post-relationship/post-relationship'; -export * from './patch-relationship/patch-relationship'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts deleted file mode 100644 index 222ea525..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { patchOne } from './patch-one'; - -import { - BadRequestException, - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; - -describe('patch-one', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addresses: Addresses; - let addressForTest: Addresses; - let userGroup: UserGroups; - let notes: Collection; - let roles: Collection; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - const data = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) - .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - addresses: { - $exists: true, - }, - roles: { - $exists: true, - }, - notes: { - $exists: true, - }, - userGroup: { - $exists: true, - }, - comments: { - $exists: true, - }, - }) - .limit(1) - .execute('get', true); - - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = - data); - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('should be update attr', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - const result = await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, userObject.id, { - id: userObject.id.toString(), - attributes: otherAttr, - type: 'users', - }); - - const fromDb = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: userObject.id, - }) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') - .leftJoinAndSelect('Users.comments', 'Comments_comments') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.notes', 'Notes__notes') - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') - .limit(1) - .getSingleResult(); - - expect(result).toEqual(fromDb); - }); - - it('should be update relation', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - const setRoles = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Roles) - .limit(2, 5) - .getResult(); - - const result = await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, userObject.id, { - id: userObject.id.toString(), - attributes: otherAttr, - type: 'users', - relationships: { - addresses: { - data: { - id: addressForTest.id.toString(), - type: 'addresses', - }, - }, - comments: { - data: [], - }, - userGroup: { - data: null, - }, - roles: { - data: setRoles.map((i) => ({ id: i.id.toString(), type: 'roles' })), - }, - }, - }); - - const fromDb = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: userObject.id, - }) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') - .leftJoinAndSelect('Users.comments', 'Comments_comments') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.notes', 'Notes__notes') - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') - .limit(1) - .getSingleResult(); - - expect(result).toEqual(fromDb); - }); - - it('should be error', async () => { - await expect( - patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, 1, { - attributes: {}, - type: 'users', - }) - ).rejects.toThrow(UnprocessableEntityException); - - await expect( - patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, 10000, { - id: '10000', - attributes: {}, - type: 'users', - }) - ).rejects.toThrow(NotFoundException); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts deleted file mode 100644 index 3897f3c9..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-one/patch-one.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { MicroOrmService } from '../../service'; -import { PatchData } from '../../../mixin/zod'; - -export async function patchOne( - this: MicroOrmService, - id: number | string, - inputData: PatchData -): Promise { - const { id: idBody, attributes, relationships } = inputData; - - if (`${id}` !== idBody) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Data 'id' must be equal to url param`, - path: ['data', 'id'], - }; - - throw new UnprocessableEntityException([error]); - } - - const existEntity = await this.microOrmUtilService - .queryBuilder() - .where({ - [this.microOrmUtilService.currentPrimaryColumn]: id, - }) - .getSingleResult(); - - if (!existEntity) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, - path: ['data', 'id'], - }; - throw new NotFoundException([error]); - } - - if (attributes) { - const attrTarget = this.microOrmUtilService.createEntity(attributes as any); - - for (const [props, val] of ObjectTyped.entries(attrTarget)) { - if (!(props in attributes)) continue; - existEntity[props] = val; - } - } - return this.microOrmUtilService.saveEntity(existEntity, relationships); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts deleted file mode 100644 index 5018a6b2..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { patchRelationship } from './patch-relationship'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -describe('patch-relationship', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addressForTest: Addresses; - let addresses: Addresses; - let userGroup: UserGroups[]; - let notes: Collection; - let roles: Roles[]; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - userObject = (await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .limit(1) - .getSingleResult()) as Users; - - roles = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Roles) - .getResult(); - - userGroup = await microOrmServiceUser.microOrmUtilService - .queryBuilder(UserGroups) - .getResult(); - - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('should be ok', async () => { - const roles1 = faker.helpers.arrayElement(roles); - const roles2 = faker.helpers.arrayElement(roles); - const roles3 = faker.helpers.arrayElement(roles); - const userGroup1 = faker.helpers.arrayElement(userGroup); - const saveIdUserGroup = userGroup1.id; - await patchRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles', [ - { type: 'roles', id: roles1.id.toString() }, - { type: 'roles', id: roles2.id.toString() }, - { type: 'roles', id: roles3.id.toString() }, - ]); - - await patchRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup', { - type: 'user-groups', - id: saveIdUserGroup.toString(), - }); - - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - id: userObject.id, - }) - .getSingleResult(); - - expect(checkData?.roles.map((i) => i.id)).toEqual( - expect.arrayContaining([roles1.id, roles2.id, roles3.id]) - ); - - expect(checkData?.roles.map((i) => i.id)).toHaveLength( - [roles1.id, roles2.id, roles3.id].length - ); - expect(checkData?.userGroup.id).toBe(saveIdUserGroup); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts deleted file mode 100644 index 38074d38..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/patch-relationship/patch-relationship.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { - PatchRelationshipData, - PostRelationshipData, -} from '../../../mixin/zod'; -import { getRelationship } from '../get-relationship/get-relationship'; -import { MicroOrmService } from '../../service'; - -export async function patchRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: MicroOrmService, - id: number | string, - rel: Rel, - input: PatchRelationshipData -): Promise { - const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, - input - ); - const currentEntityRef = this.microOrmUtilService.entityManager.getReference( - this.microOrmUtilService.entity, - id as any - ); - - const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); - - if (Array.isArray(idsResult)) { - const relRef = idsResult.map((i) => - this.microOrmUtilService.entityManager.getReference(relEntity, i as any) - ); - currentEntityRef[rel].removeAll(); - currentEntityRef[rel].add(...relRef); - } else { - // @ts-ignore - currentEntityRef[rel] = this.microOrmUtilService.entityManager.getReference( - relEntity, - idsResult as any - ); - } - - await this.microOrmUtilService.entityManager.flush(); - - return getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts deleted file mode 100644 index 9132f0d6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.spec.ts +++ /dev/null @@ -1,338 +0,0 @@ -import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { postOne } from './post-one'; -import { BadRequestException } from '@nestjs/common'; - -describe('post-one', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addressForTest: Addresses; - let addresses: Addresses; - let userGroup: UserGroups; - let notes: Collection; - let roles: Collection; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - const data = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) - .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - addresses: { - $exists: true, - }, - roles: { - $exists: true, - }, - notes: { - $exists: true, - }, - userGroup: { - $exists: true, - }, - comments: { - $exists: true, - }, - }) - .limit(1) - .execute('get', true); - - ({ roles, notes, userGroup, addresses, comments, ...userObject as any } = - data); - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('simple create', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - attributes: otherAttr, - type: 'users', - }); - - const { id: newId } = result; - - const fromDb = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: newId, - }) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') - .leftJoinAndSelect('Users.comments', 'Comments_comments') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.notes', 'Notes__notes') - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') - .limit(1) - .getSingleResult(); - - expect(result).toEqual(fromDb); - }); - - it('simple create withId', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - id: id.toString(), - attributes: otherAttr, - type: 'users', - }); - - const { id: newId } = result; - - const fromDb = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: newId, - }) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') - .leftJoinAndSelect('Users.comments', 'Comments_comments') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.notes', 'Notes__notes') - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') - .limit(1) - .getSingleResult(); - - expect(newId).toBe(id.toString()); - expect(result).toEqual(fromDb); - }); - - it('create with relation', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - attributes: otherAttr, - type: 'users', - relationships: { - addresses: { - data: { - id: addressForTest.id.toString(), - type: 'addresses', - }, - }, - comments: { - data: comments.map((i) => ({ - id: i.id.toString(), - type: 'comments', - })), - }, - roles: { - data: roles.map((i) => ({ - id: i.id.toString(), - type: 'roles', - })), - }, - notes: { - data: notes.map((i) => ({ - id: i.id.toString(), - type: 'notes', - })), - }, - userGroup: { - data: { - id: userGroup.id.toString(), - type: 'user-groups', - }, - }, - manager: { - data: { - id: userObject.id.toString(), - type: 'users', - }, - }, - }, - }); - - const { id: newId } = result; - - const fromDb = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .where({ - id: newId, - }) - .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') - .leftJoinAndSelect('Users.comments', 'Comments_comments') - .leftJoinAndSelect('Users.roles', 'Roles__roles') - .leftJoinAndSelect('Users.notes', 'Notes__notes') - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') - .limit(1) - .getSingleResult(); - - expect(result).toEqual(fromDb); - }); - - it('should be error', async () => { - const { - id, - manager: mewManager, - userGroup: newUserGroup, - addresses: newAddresses, - comments: newComments, - notes: newNotes, - roles: newRoles, - ...otherAttr - } = newUser; - - await expect( - postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - attributes: otherAttr, - type: 'users', - relationships: { - addresses: { - data: { - id: '999999', - type: 'addresses', - }, - }, - }, - }) - ).rejects.toThrow(BadRequestException); - - await expect( - postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - attributes: otherAttr, - type: 'users', - relationships: { - roles: { - data: [ - { - id: '999999', - type: 'addresses', - }, - ], - }, - }, - }) - ).rejects.toThrow(BadRequestException); - - await expect( - postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(microOrmServiceUser, { - attributes: otherAttr, - type: 'users', - relationships: { - // @ts-expect-error check run time error - incorrectRel: { - data: [ - { - id: '999999', - type: 'addresses', - }, - ], - }, - }, - }) - ).rejects.toThrow(BadRequestException); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts deleted file mode 100644 index 239733c6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-one/post-one.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ObjectLiteral } from '../../../../types'; -import { MicroOrmService } from '../../service'; -import { PostData } from '../../../mixin/zod'; - -export async function postOne( - this: MicroOrmService, - inputData: PostData -): Promise { - const { attributes, relationships, id } = inputData; - - const idObject = id - ? { [this.microOrmUtilService.currentPrimaryColumn.toString()]: id } - : {}; - - const attributesObject = { - ...attributes, - ...idObject, - }; - - const entityIns = this.microOrmUtilService.createEntity(attributesObject); - - return this.microOrmUtilService.saveEntity(entityIns, relationships); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts deleted file mode 100644 index 2444afa3..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.spec.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; -import { faker } from '@faker-js/faker'; - -import { - Addresses, - dbRandomName, - getModuleForPgLite, - Notes, - pullData, - Roles, - UserGroups, - Users, - Comments, - pullAddress, -} from '../../../../mock-utils/microrom'; -import { MicroOrmService } from '../../service'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - ORM_SERVICE, -} from '../../../../constants'; - -import { postRelationship } from './post-relationship'; -import { BadRequestException } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -describe('post-relationshipa', () => { - let mikroORMUsers: MikroORM; - let microOrmServiceUser: MicroOrmService; - let em: EntityManager; - let dbName: string; - let addressForTest: Addresses; - let addresses: Addresses; - let userGroup: UserGroups[]; - let notes: Collection; - let roles: Roles[]; - let comments: Collection; - let userObject: Users; - let newUser: Users; - beforeAll(async () => { - dbName = dbRandomName(); - const moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); - mikroORMUsers = moduleUsers.get(MikroORM); - em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); - await pullData(em, 10); - }); - - beforeEach(async () => { - userObject = (await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .limit(1) - .getSingleResult()) as Users; - - roles = await microOrmServiceUser.microOrmUtilService - .queryBuilder(Roles) - .getResult(); - - userGroup = await microOrmServiceUser.microOrmUtilService - .queryBuilder(UserGroups) - .getResult(); - - const firstName = faker.person.firstName(); - const lastName = faker.person.lastName(); - newUser = { - id: faker.number.int({ min: 0, max: 999999 }), - firstName: firstName, - lastName: lastName, - isActive: faker.datatype.boolean(), - login: faker.internet.userName({ - lastName: firstName, - firstName: lastName, - }), - testReal: [faker.number.float({ fractionDigits: 4 })], - testArrayNull: null, - testDate: faker.date.anytime(), - } as Users; - - addressForTest = await pullAddress(); - await em.persistAndFlush(addressForTest); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - mikroORMUsers.close(true); - }); - - it('should be ok', async () => { - const roles1 = faker.helpers.arrayElement(roles); - const roles2 = faker.helpers.arrayElement(roles); - const roles3 = faker.helpers.arrayElement(roles); - const userGroup1 = faker.helpers.arrayElement(userGroup); - const saveIdUserGroup = userGroup1.id; - - const checkDataBefore = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - id: userObject.id, - }) - .getSingleResult(); - - const saveRolesIds = checkDataBefore?.roles.map((i) => i.id) || []; - - await postRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'roles', [ - { type: 'roles', id: roles1.id.toString() }, - { type: 'roles', id: roles2.id.toString() }, - { type: 'roles', id: roles3.id.toString() }, - ]); - - await postRelationship.call< - MicroOrmService, - Parameters>>, - ReturnType>> - >(microOrmServiceUser, userObject.id, 'userGroup', { - type: 'user-groups', - id: saveIdUserGroup.toString(), - }); - - const checkData = await microOrmServiceUser.microOrmUtilService - .queryBuilder() - .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) - .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) - .where({ - id: userObject.id, - }) - .getSingleResult(); - - expect(checkData?.roles.map((i) => i.id)).toEqual( - expect.arrayContaining([roles1.id, roles2.id, roles3.id]) - ); - - expect(checkData?.roles.map((i) => i.id)).toHaveLength( - [roles1.id, roles2.id, roles3.id].length + saveRolesIds.length - ); - expect(checkData?.userGroup.id).toBe(saveIdUserGroup); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts deleted file mode 100644 index 77e8edcb..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/orm-methods/post-relationship/post-relationship.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { PostRelationshipData } from '../../../mixin/zod'; -import { getRelationship } from '../get-relationship/get-relationship'; -import { MicroOrmService } from '../../service'; - -export async function postRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: MicroOrmService, - id: number | string, - rel: Rel, - input: PostRelationshipData -): Promise { - const idsResult = await this.microOrmUtilService.validateRelationInputData( - rel, - input - ); - - const currentEntityRef = this.microOrmUtilService.entityManager.getReference( - this.microOrmUtilService.entity, - id as any - ); - - const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); - - if (Array.isArray(idsResult)) { - const relRef = idsResult.map((i) => - this.microOrmUtilService.entityManager.getReference(relEntity, i as any) - ); - currentEntityRef[rel].add(...relRef); - } else { - // @ts-ignore - currentEntityRef[rel] = this.microOrmUtilService.entityManager.getReference( - relEntity, - idsResult as any - ); - } - - await this.microOrmUtilService.entityManager.flush(); - - return getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts deleted file mode 100644 index 7fab7d49..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './microorm-service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts deleted file mode 100644 index 49af1af9..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.spec.ts +++ /dev/null @@ -1,571 +0,0 @@ -import { FilterOperand } from '../../../utils/nestjs-shared'; -import { MikroORM, RawQueryFragment } from '@mikro-orm/core'; -import { TestingModule } from '@nestjs/testing/testing-module'; - -import { MicroOrmUtilService } from './micro-orm-util.service'; - -import { - dbRandomName, - getDefaultQuery, - getModuleForPgLite, - Roles, - UserGroups, - Users, -} from '../../../mock-utils/microrom'; - -describe('MicroOrmUtilService', () => { - let mikroORMUserGroup: MikroORM; - let mikroORMUsers: MikroORM; - let mikroORMRoles: MikroORM; - let microOrmUtilsServiceUserGroups: MicroOrmUtilService; - let microOrmUtilsServiceUsers: MicroOrmUtilService; - let microOrmUtilsServiceRoles: MicroOrmUtilService; - let moduleRoles: TestingModule; - let moduleUsers: TestingModule; - let moduleUserGroup: TestingModule; - - let dbName: string; - - beforeAll(async () => { - dbName = dbRandomName(true); - moduleUserGroup = await getModuleForPgLite(UserGroups, dbName); - - microOrmUtilsServiceUserGroups = - moduleUserGroup.get>(MicroOrmUtilService); - mikroORMUserGroup = moduleUserGroup.get(MikroORM); - - moduleUsers = await getModuleForPgLite(Users, dbName); - microOrmUtilsServiceUsers = - moduleUsers.get>(MicroOrmUtilService); - - mikroORMUsers = moduleUsers.get(MikroORM); - - moduleRoles = await getModuleForPgLite(Roles, dbName); - microOrmUtilsServiceRoles = - moduleRoles.get>(MicroOrmUtilService); - mikroORMRoles = moduleRoles.get(MikroORM); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(async () => { - await mikroORMUserGroup.close(true); - await mikroORMUsers.close(true); - await mikroORMRoles.close(true); - }); - - it('currentAlias', () => { - expect(microOrmUtilsServiceUserGroups.currentAlias).toBe('UserGroups'); - }); - - it('currentPrimaryColumn', () => { - expect(microOrmUtilsServiceUserGroups.currentPrimaryColumn).toBe('id'); - }); - - it('getAliasForEntity relation', () => { - expect(() => - microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'login') - ).toThrowError( - expect.objectContaining({ - message: expect.stringContaining('relation not found'), - }) - ); - - expect(() => - microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'notes') - ).toThrowError( - expect.objectContaining({ - message: expect.stringContaining('Many to many relation expected'), - }) - ); - - expect( - microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'roles') - ).toBe('users_have_roles'); - }); - - it('queryBuilder', () => { - const resultUserGroups = microOrmUtilsServiceUserGroups.queryBuilder(); - expect(resultUserGroups.mainAlias.aliasName).toBe('UserGroups'); - expect(resultUserGroups.mainAlias.entityName).toBe('UserGroups'); - - const resultUsers = microOrmUtilsServiceUserGroups.queryBuilder(Users); - expect(resultUsers.mainAlias.aliasName).toBe('Users'); - expect(resultUsers.mainAlias.entityName).toBe('Users'); - - const resultTestUsersAlias = microOrmUtilsServiceUserGroups.queryBuilder( - Users, - 'TestUsers' - ); - expect(resultTestUsersAlias.mainAlias.entityName).toBe('Users'); - expect(resultTestUsersAlias.mainAlias.aliasName).toBe('TestUsers'); - - const resultTestUsersOnlyAlias = - microOrmUtilsServiceUserGroups.queryBuilder('TestUserGroups'); - expect(resultTestUsersOnlyAlias.mainAlias.entityName).toBe('UserGroups'); - expect(resultTestUsersOnlyAlias.mainAlias.aliasName).toBe('TestUserGroups'); - }); - - it('defaultOrder', () => { - expect(microOrmUtilsServiceUserGroups.defaultOrder).toEqual({ id: 'ASC' }); - }); - describe('getFilterExpressionForTarget', () => { - it('expression for target field, target is null, should be null expression array', () => { - const query = getDefaultQuery(); - const result = - microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); - - expect(result).toEqual([]); - }); - it('expression for target field with target field', async () => { - const nullableField = 'id'; - const nullableFieldValue = null; - const notNullableField = 'login'; - const notNullableFieldValue = null; - const regexpField = 'firstName'; - const regexpFieldValue = 'firstName'; - - const otherFiled = 'lastName'; - const otherFiledValue1: [string, string, string] = ['1', '3', '4']; - const otherFiledValue2 = 'test'; - const otherFiledValue3 = 'test2'; - - const arrayField = 'testReal'; - const query = getDefaultQuery(); - query.filter.target = { - [nullableField]: { - [FilterOperand.eq]: nullableFieldValue, - }, - [notNullableField]: { - [FilterOperand.ne]: notNullableFieldValue, - }, - [regexpField]: { - [FilterOperand.regexp]: regexpFieldValue, - }, - [otherFiled]: { - [FilterOperand.in]: otherFiledValue1, - [FilterOperand.nin]: otherFiledValue1, - [FilterOperand.like]: otherFiledValue2, - [FilterOperand.gt]: otherFiledValue3, - }, - [arrayField]: { - [FilterOperand.some]: otherFiledValue1, - }, - }; - - const [ - id, - login, - regexpFieldConditional, - otherFiledConditional, - arrayFieldConditional, - ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); - - expect(id).toEqual({ - [nullableField]: { - ['$' + FilterOperand.eq]: nullableFieldValue, - }, - }); - - expect(login).toEqual({ - [notNullableField]: { - ['$' + FilterOperand.ne]: notNullableFieldValue, - }, - }); - - expect(regexpFieldConditional).toEqual({ - [regexpField]: { - ['$re']: regexpFieldValue, - }, - }); - expect(otherFiledConditional).toEqual({ - [otherFiled]: { - ['$' + FilterOperand.in]: otherFiledValue1, - ['$' + FilterOperand.nin]: otherFiledValue1, - ['$' + FilterOperand.like]: otherFiledValue2, - ['$' + FilterOperand.gt]: otherFiledValue3, - }, - }); - expect(arrayFieldConditional).toEqual({ - [arrayField]: { - ['$overlap']: otherFiledValue1, - }, - }); - }); - - it('expression for target field with relation field not exist', async () => { - const oneToOneToMyself = 'manager'; - const oneToOneToOther = 'addresses'; - const manyToMany = 'roles'; - const oneToMany = 'comments'; - const manyToOne = 'userGroup'; - - const query = getDefaultQuery(); - query.filter.target = { - [oneToOneToMyself]: { - [FilterOperand.eq]: 'null', - }, - [oneToOneToOther]: { - [FilterOperand.eq]: 'null', - }, - [manyToMany]: { - [FilterOperand.eq]: 'null', - }, - [oneToMany]: { - [FilterOperand.eq]: 'null', - }, - [manyToOne]: { - [FilterOperand.eq]: 'null', - }, - }; - - const [ - oneToOneToMyselfEq, - oneToOneToOtherEq, - manyToManyEq, - oneToManyEq, - manyToOneEq, - ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); - - expect(oneToOneToMyselfEq).toEqual({ - [oneToOneToMyself]: { $exists: false }, - }); - expect(oneToOneToOtherEq).toEqual({ - [oneToOneToOther]: { $exists: false }, - }); - expect(manyToOneEq).toEqual({ [manyToOne]: { $exists: false } }); - expect(manyToManyEq).toBeInstanceOf(RawQueryFragment); - expect(oneToManyEq).toBeInstanceOf(RawQueryFragment); - if (!(oneToManyEq instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - if (!(manyToManyEq instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - - expect(manyToManyEq.sql).toBe( - 'not exists (select 1 from "public"."users_have_roles" as "users_have_roles" where "users_have_roles"."user_id" = "Users"."id")' - ); - expect(oneToManyEq.sql).toBe( - 'not exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id")' - ); - }); - it('expression for target field with relation field exist', async () => { - const oneToOneToMyself = 'manager'; - const oneToOneToOther = 'addresses'; - const manyToMany = 'roles'; - const oneToMany = 'comments'; - const manyToOne = 'userGroup'; - - const query = getDefaultQuery(); - query.filter.target = { - [oneToOneToMyself]: { - [FilterOperand.ne]: 'null', - }, - [oneToOneToOther]: { - [FilterOperand.ne]: 'null', - }, - [manyToMany]: { - [FilterOperand.ne]: 'null', - }, - [oneToMany]: { - [FilterOperand.ne]: 'null', - }, - [manyToOne]: { - [FilterOperand.ne]: 'null', - }, - }; - - const [ - oneToOneToMyselfNe, - oneToOneToOtherNe, - manyToManyNe, - oneToManyNe, - manyToOneNe, - ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); - - expect(oneToOneToMyselfNe).toEqual({ - [oneToOneToMyself]: { $exists: true }, - }); - expect(oneToOneToOtherNe).toEqual({ - [oneToOneToOther]: { $exists: true }, - }); - expect(manyToOneNe).toEqual({ [manyToOne]: { $exists: true } }); - expect(manyToManyNe).toBeInstanceOf(RawQueryFragment); - expect(oneToManyNe).toBeInstanceOf(RawQueryFragment); - if (!(oneToManyNe instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - if (!(manyToManyNe instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - - expect(manyToManyNe.sql).toBe( - 'exists (select 1 from "public"."users_have_roles" as "users_have_roles" where "users_have_roles"."user_id" = "Users"."id")' - ); - expect(oneToManyNe.sql).toBe( - 'exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id")' - ); - }); - - it('expression for target field with relation field exist with sort and include', async () => { - const oneToOneToMyself = 'manager'; - const oneToOneToOther = 'addresses'; - const manyToMany = 'roles'; - const oneToMany = 'comments'; - const manyToOne = 'userGroup'; - - const query = getDefaultQuery(); - query.filter.target = { - [oneToOneToMyself]: { - [FilterOperand.ne]: 'null', - }, - [oneToOneToOther]: { - [FilterOperand.ne]: 'null', - }, - [manyToMany]: { - [FilterOperand.ne]: 'null', - }, - [oneToMany]: { - [FilterOperand.ne]: 'null', - }, - [manyToOne]: { - [FilterOperand.ne]: 'null', - }, - }; - - query.sort = { - [manyToMany]: { key: 'ASC' }, - }; - query.include = [oneToMany]; - - const [ - oneToOneToMyselfNe, - oneToOneToOtherNe, - manyToManyNe, - oneToManyNe, - manyToOneNe, - ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); - - expect(oneToOneToMyselfNe).toEqual({ - [oneToOneToMyself]: { $exists: true }, - }); - expect(oneToOneToOtherNe).toEqual({ - [oneToOneToOther]: { $exists: true }, - }); - expect(manyToOneNe).toEqual({ [manyToOne]: { $exists: true } }); - expect(manyToManyNe).toEqual({ roles: { $exists: true } }); - expect(oneToManyNe).toEqual({ comments: { $exists: true } }); - }); - }); - - describe('getFilterExpressionForRelation', () => { - it('expression for relation field OneToMany and ManyToOne', async () => { - const query = getDefaultQuery(); - - query.filter.relation = { - comments: { - kind: { - [FilterOperand.eq]: 'test', - }, - }, - userGroup: { - label: { - [FilterOperand.eq]: 'test', - }, - }, - }; - - const [comments, userGroup] = - microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); - - if (!(userGroup instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - - expect(userGroup.sql).toBe( - `exists (select 1 from "public"."user_groups" as "UserGroups" where "UserGroups"."id" = "Users"."user_groups_id" and "UserGroups"."label" = 'test')` - ); - - if (!(comments instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - - expect(comments.sql).toBe( - `exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id" and "Comments"."kind" = 'test')` - ); - }); - - it('expression for relation field OneToMany and ManyToOne with sort', async () => { - const query = getDefaultQuery(); - query.sort = { - userGroup: { - label: 'ASC', - }, - comments: { - kind: 'ASC', - }, - }; - query.filter.relation = { - comments: { - kind: { - [FilterOperand.eq]: 'test', - }, - }, - userGroup: { - label: { - [FilterOperand.eq]: 'test', - }, - }, - }; - - const [comments, userGroup] = - microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); - - expect(userGroup).toEqual({ userGroup: { label: { $eq: 'test' } } }); - - expect(comments).toEqual({ comments: { kind: { $eq: 'test' } } }); - }); - - it('expression for relation field OneToOne', async () => { - const query = getDefaultQuery(); - - query.filter.relation = { - manager: { - login: { - [FilterOperand.eq]: 'test', - }, - }, - addresses: { - city: { - [FilterOperand.eq]: 'test', - }, - }, - }; - const [manager, addresses] = - microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); - expect(manager).toEqual({ manager: { login: { $eq: 'test' } } }); - expect(addresses).toEqual({ addresses: { city: { $eq: 'test' } } }); - }); - - it('expression for relation field ManyToMany', async () => { - const query = getDefaultQuery(); - const queryRoles = getDefaultQuery(); - - query.filter.relation = { - roles: { - key: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isDefault: { - [FilterOperand.eq]: 'false', - }, - }, - }; - - queryRoles.filter.relation = { - users: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - }, - }; - - const [roles] = - microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); - - if (!(roles instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - - expect(roles.sql).toBe( - `exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."roles" as "r1" on "users_have_roles"."role_id" = "r1"."id" where "users_have_roles"."user_id" = "Users"."id" and "r1"."key" = 'test' and "r1"."key" != 'test2' and "r1"."is_default" = 'false')` - ); - - const [users] = - microOrmUtilsServiceRoles.getFilterExpressionForRelation(queryRoles); - - if (!(users instanceof RawQueryFragment)) - throw new Error('Is not RawQueryFragment'); - expect(users.sql).toBe( - `exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."users" as "u1" on "users_have_roles"."user_id" = "u1"."id" where "users_have_roles"."role_id" = "Roles"."id" and "u1"."login" = 'test' and "u1"."login" != 'test2' and "u1"."is_active" = 'false')` - ); - }); - - it('expression for relation field ManyToMany with sort', async () => { - const query = getDefaultQuery(); - const queryRoles = getDefaultQuery(); - - query.filter.relation = { - roles: { - key: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isDefault: { - [FilterOperand.eq]: 'false', - }, - }, - }; - query.sort = { - roles: { key: 'ASC' }, - }; - - queryRoles.filter.relation = { - users: { - login: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - isActive: { - [FilterOperand.eq]: 'false', - }, - }, - }; - - queryRoles.sort = { - users: { login: 'ASC' }, - }; - - const [roles] = - microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); - - expect(roles).toEqual({ - roles: { - isDefault: { $eq: 'false' }, - key: { $eq: 'test', $ne: 'test2' }, - }, - }); - - const [users] = - microOrmUtilsServiceRoles.getFilterExpressionForRelation(queryRoles); - - expect(users).toEqual({ - users: { - isActive: { $eq: 'false' }, - login: { $eq: 'test', $ne: 'test2' }, - }, - }); - }); - - it('getConditionalForJoin', () => { - const query = getDefaultQuery(); - query.filter.relation = { - roles: { - key: { - [FilterOperand.eq]: 'test', - [FilterOperand.ne]: 'test2', - }, - }, - }; - const result = microOrmUtilsServiceRoles.getConditionalForJoin( - query, - 'roles' - ); - expect(result).toEqual({ - key: { $eq: 'test', $ne: 'test2' }, - }); - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts deleted file mode 100644 index 3401d88d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/micro-orm-util.service.ts +++ /dev/null @@ -1,751 +0,0 @@ -import { - BadRequestException, - Inject, - Injectable, - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { - EntityClass, - EntityKey, - EntityProperty, - EntityRepository, - type QBFilterQuery, - QBQueryOrderMap, - raw, - ReferenceKind, - EntityData, - Collection, -} from '@mikro-orm/core'; -import { - Knex, - SqlEntityManager, - QueryBuilder, - type Field, -} from '@mikro-orm/knex'; -import { - camelToKebab, - EntityRelation, - FilterOperand, - ObjectTyped, -} from '../../../utils/nestjs-shared'; - -import { - ASC, - CURRENT_ENTITY, - CURRENT_ENTITY_MANAGER_TOKEN, - CURRENT_ENTITY_REPOSITORY, -} from '../../../constants'; - -import { ObjectLiteral, ValidateQueryError } from '../../../types'; -import { Query, QueryOne, Relationships } from '../../mixin/zod'; -import { In } from 'typeorm'; -import { TupleOfEntityRelation } from '../../mixin/types'; -import { InputValidateData, ValidateReturn } from '../../type-orm/service'; - -type RelationshipsResult = { - [K in EntityRelation]: E[K] extends Collection ? E[K] : E[K] | null; -}; - -function isRelationField( - relationField: string[], - field: any -): asserts field is EntityKey { - if (relationField.includes(field)) return; - const error: ValidateQueryError = { - code: 'unrecognized_keys', - path: ['data', 'relationships'], - message: `Resource for relation '${field.toString()}' does not exist`, - keys: [field], - }; - - throw new BadRequestException([error]); -} -const getErrorObject = ( - props: string, - message: string -): ValidateQueryError => ({ - code: 'invalid_arguments', - path: ['data', 'relationships'], - message, -}); - -Injectable(); -export class MicroOrmUtilService { - @Inject(CURRENT_ENTITY_MANAGER_TOKEN) - public readonly entityManager!: SqlEntityManager; - @Inject(CURRENT_ENTITY_REPOSITORY) - private entityRepository!: EntityRepository; - @Inject(CURRENT_ENTITY) public readonly entity!: EntityClass; - - private _relationsName!: EntityKey[]; - private _relationMap = new Map, EntityProperty>(); - private _relationPropsMap = new Map, EntityKey[]>(); - get relationsName() { - if (!this._relationsName) { - this._relationsName = this.metadata.relations.map((r) => r.name); - } - - return this._relationsName; - } - - getRelationProps(entity: EntityClass) { - const props = this._relationPropsMap.get(entity); - if (props) { - return props; - } - const relMetaData = this.entityManager.getMetadata(entity); - const relation = relMetaData.relations.map((i) => i.name); - const newProps = relMetaData.props - .filter((r) => !relation.includes(r.name)) - .map((r) => r.name); - this._relationPropsMap.set(entity, newProps); - - return newProps; - } - - getRelation(name: EntityKey) { - let relation = this._relationMap.get(name); - if (!relation) { - relation = this.metadata.relations.find((r) => r.name === name); - if (!relation) { - throw new Error(`Relation ${name} not found in ${this.metadata.name}`); - } - this._relationMap.set(name, relation); - } - - return relation; - } - - get currentAlias() { - return this.entityRepository.getEntityName(); - } - - get metadata() { - return this.entityManager.getMetadata().get(this.entity); - } - - get currentPrimaryColumn() { - return this.metadata.getPrimaryProp().name; - } - - get defaultOrder(): QBQueryOrderMap { - return { - [this.currentPrimaryColumn]: ASC, - }; - } - - getAliasForEntity(entity: EntityClass) { - return this.entityManager.getRepository(entity).getEntityName(); - } - - getAliasForPivotTable(relName: keyof T): string; - getAliasForPivotTable( - entity: EntityClass, - relName: keyof T - ): string; - getAliasForPivotTable( - entity: EntityClass | keyof T, - relName?: keyof T - ): string { - if (!relName) { - relName = entity as keyof T; - entity = this.entity; - } else { - entity = entity as EntityClass; - } - - const propsRelation = this.entityManager - .getMetadata() - .get(entity) - .relations.find((r) => r.name.toString() === relName.toString()); - if (!propsRelation) - throw new Error(`${relName.toString()} relation not found`); - if (propsRelation.kind !== ReferenceKind.MANY_TO_MANY) - throw new Error('Many to many relation expected'); - - return this.entityManager - .getRepository(propsRelation.pivotEntity) - .getEntityName(); - } - - queryBuilder( - entity: EntityClass, - alias: string - ): QueryBuilder; - queryBuilder( - entity: EntityClass - ): QueryBuilder; - queryBuilder( - alias: string - ): QueryBuilder; - queryBuilder(): QueryBuilder; - queryBuilder( - ...arg: - | [entity: EntityClass, alias: string] - | [entity: EntityClass] - | [alias: string] - | [undefined, undefined] - ): QueryBuilder { - let [entity, alias] = arg; - - if (entity && !alias) { - if (typeof entity === 'string') { - alias = entity; - entity = this.entity; - } else { - alias = this.getAliasForEntity(entity); - } - } - if (!entity) { - alias = this.currentAlias; - entity = this.entity; - } - - if (!entity || !alias) { - throw new Error('entity or alias not found'); - } - - return this.entityManager.createQueryBuilder( - entity, - alias - ); - } - - getFilterExpressionForTarget( - query: Query - ): QBFilterQuery[] { - const result: QBFilterQuery[] = []; - const filterTarget = this.getFilterObject(query, 'target'); - const { sort, include } = query; - if (!filterTarget) return result; - - for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { - const tmpField = fieldName as unknown as EntityKey; - - if (filter === undefined) continue; - const filterObject: QBFilterQuery = { - [tmpField]: {}, - }; - let subQueryExpression: QBFilterQuery | undefined; - for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; - - if (!this.relationsName.includes(tmpField)) { - const operandForMiroOrmResult = this.extractedResultOperand(operand); - filterObject[tmpField.toString()][operandForMiroOrmResult] = value; - continue; - } - - const relation = this.getRelation(tmpField); - switch (relation.kind) { - case ReferenceKind.MANY_TO_MANY: - case ReferenceKind.ONE_TO_MANY: { - if (sort && tmpField in sort) { - filterObject[tmpField.toString()]['$exists'] = - operand === FilterOperand.ne; - break; - } - - if (include && include.includes(tmpField)) { - filterObject[tmpField.toString()]['$exists'] = - operand === FilterOperand.ne; - break; - } - - const subQuery = - this.getSubQueryForRelation(tmpField).getFormattedQuery(); - const type = operand === FilterOperand.ne ? 'exists' : 'not exists'; - const resultQuery = `${type} (${subQuery})`; - subQueryExpression = raw(resultQuery); - break; - } - default: - filterObject[tmpField.toString()]['$exists'] = - operand === FilterOperand.ne; - } - } - - result.push(subQueryExpression ? subQueryExpression : filterObject); - } - - return result; - } - - getConditionalForJoin( - query: Query, - key: string - ): QBFilterQuery { - const filterRelation = this.getFilterObject(query, 'relation'); - - if (!filterRelation) return {}; - if (!(key in filterRelation)) return {}; - - for (const [key, reletionConditional] of ObjectTyped.entries( - filterRelation - )) { - if (key !== key) continue; - if (!reletionConditional) continue; - - for (const [field, conditional] of ObjectTyped.entries( - reletionConditional - )) { - if (!conditional) continue; - return Object.entries(conditional).reduce((acum, [operand, value]) => { - acum[field.toString()] = { - ...(acum[field.toString()] || {}), - [this.extractedResultOperand(operand as FilterOperand)]: value, - }; - return acum; - }, {} as QBFilterQuery); - } - } - - return {}; - } - - private extractedResultOperand(operand: FilterOperand) { - return operand === 'regexp' - ? '$re' - : operand === 'some' - ? '$overlap' - : (('$' + operand) as `$${FilterOperand}`); - } - - getFilterExpressionForRelation( - query: Query - ): QBFilterQuery[] { - const result: QBFilterQuery[] = []; - const filterRelation = this.getFilterObject(query, 'relation'); - const sort = query.sort; - if (!filterRelation) return result; - - for (const [relationField, propsFilter] of ObjectTyped.entries( - filterRelation - )) { - const fieldName = relationField as unknown as EntityKey; - const relationProps = this.getRelation(fieldName); - if (!propsFilter) continue; - if (!this.relationsName.includes(fieldName)) continue; - const filterObject: QBFilterQuery = { - [relationField]: {}, - }; - let subQueryExpression: - | ReturnType - | undefined; - for (const [relationFieldProps, filter] of ObjectTyped.entries( - propsFilter - )) { - const fieldProps = relationFieldProps as unknown as EntityKey; - if (!filter) continue; - for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; - switch (relationProps.kind) { - case ReferenceKind.MANY_TO_MANY: - case ReferenceKind.ONE_TO_MANY: - case ReferenceKind.MANY_TO_ONE: - { - if (sort && relationField in sort) { - filterObject[fieldName][fieldProps] = filterObject[fieldName][ - fieldProps - ] = filterObject[fieldName][fieldProps] || {}; - filterObject[fieldName][fieldProps][ - this.extractedResultOperand(operand) - ] = value; - } else { - if (!subQueryExpression) { - subQueryExpression = this.getSubQueryForRelation(fieldName); - } - const expression = - relationProps.kind === ReferenceKind.MANY_TO_MANY - ? { - [this.getInverseFieldForManyToMany(fieldName)]: { - [fieldProps]: { - [this.extractedResultOperand(operand)]: value, - }, - }, - } - : { - [fieldProps]: { - [this.extractedResultOperand(operand)]: value, - }, - }; - subQueryExpression.where(expression, '$and'); - } - } - break; - default: - filterObject[fieldName][fieldProps] = - filterObject[fieldName][fieldProps] || {}; - filterObject[fieldName][fieldProps][ - this.extractedResultOperand(operand) - ] = value; - } - } - } - if (subQueryExpression) { - const resultQuery = `exists (${subQueryExpression.getFormattedQuery()})`; - result.push(raw(resultQuery)); - subQueryExpression = undefined; - } else { - result.push(filterObject); - } - } - - return result; - } - - getKnex(): Knex { - return this.entityManager.getKnex(); - } - - prePareQueryBuilder( - queryBuilder: QueryBuilder, - query: Query | QueryOne - ): QueryBuilder { - const { fields, include } = query; - const relationFields: Record = {}; - - if (fields) { - const { target, ...relations } = fields; - Object.assign(relationFields, relations); - if (target) { - if (!target.includes(this.currentPrimaryColumn)) { - target.unshift(this.currentPrimaryColumn); - } - queryBuilder.select(target as unknown as Field); - } - } - - const resultInclude = new Set([ - ...[...(include || []), ...ObjectTyped.keys(relationFields)], - ]); - - for (const item of resultInclude) { - const relationProps = this.getRelation( - item as unknown as EntityKey - ); - const relationEntity = relationProps.entity() as EntityClass; - const relationAlias = this.getAliasForEntity(relationEntity); - const mainAlias = this.currentAlias; - - const condition: QBFilterQuery = this.getConditionalForJoin( - query as Query, - item - ); - - let selectJoin: string[] = this.getRelationProps(relationEntity); - if (item in relationFields) { - const tmpSet = new Set([ - ...relationFields[item], - this.getPrimaryNameFor(item as any), - ]); - - selectJoin = [...tmpSet]; - } - - queryBuilder.leftJoinAndSelect( - `${mainAlias}.${item}`, - `${relationAlias}__${item}`, - condition, - selectJoin - ); - } - return queryBuilder; - } - - getPrimaryNameFor(rel: EntityRelation) { - const relationEntity = this.getRelation( - rel as unknown as EntityKey - ).entity() as EntityClass; - return this.entityManager.getMetadata().get(relationEntity).getPrimaryProp() - .name; - } - - private getFilterObject( - query: Query, - filterType: 'target' | 'relation' - ) { - const { filter } = query; - if (!filter) return null; - return filter[filterType]; - } - - private getSubQueryForRelation(propsName: EntityKey) { - const relation = this.getRelation(propsName); - - let pivotTableName; - let filedCheck: string | undefined; - let expressionColumnName: string | undefined = this.currentPrimaryColumn; - if (relation.kind === ReferenceKind.MANY_TO_MANY) { - pivotTableName = this.getAliasForPivotTable(propsName); - filedCheck = relation.joinColumns.at(0); - } else if (relation.kind === ReferenceKind.ONE_TO_MANY) { - pivotTableName = this.getAliasForEntity(relation.entity() as any); - filedCheck = relation.mappedBy; - } else { - expressionColumnName = relation.joinColumns.at(0); - pivotTableName = this.getAliasForEntity(relation.entity() as any); - filedCheck = relation.referencedColumnNames.at(0); - } - - if (!filedCheck) throw new Error('filedCheck not found'); - if (!expressionColumnName) - throw new Error('expressionColumnName not found'); - - return this.entityManager - .createQueryBuilder(pivotTableName, pivotTableName) - .select(raw('1')) - .from(pivotTableName) - .where({ - [filedCheck]: this.entityManager - .getKnex() - .ref(`${this.currentAlias}.${expressionColumnName}`), - }); - } - - private getInverseFieldForManyToMany(propsName: EntityKey) { - const relation = this.getRelation(propsName); - const pivotTableName = this.getAliasForPivotTable(propsName); - - const pivotMetaData = this.entityManager.getMetadata().get(pivotTableName); - - const props = pivotMetaData.props.find( - (prop) => - prop.targetMeta && - prop.targetMeta.properties[propsName] && - prop.targetMeta.properties[propsName].entity() === relation.entity() - ); - - if (!props) - throw new Error( - `ManyToMany relation ${propsName} not found in ${pivotTableName}` - ); - - return props.inversedBy || props.mappedBy; - } - - createEntity(params: EntityData) { - return this.entityManager.create(this.entity, params, { - partial: true, - persist: false, - }); - } - - private async *asyncIterateFindRelationships( - relationships: NonNullable> - ): AsyncGenerator> { - for (const entries of ObjectTyped.entries(relationships)) { - const [props, dataItem] = entries; - isRelationField(this.relationsName, props); - const propsKey = props as unknown as EntityKey; - if (dataItem === undefined) continue; - - const { data } = dataItem; - if (data === undefined) continue; - if (data === null) { - yield { [props]: null } as RelationshipsResult; - continue; - } - const isArray = Array.isArray(data); - if (isArray && data.length === 0) { - yield { [props]: [] } as RelationshipsResult; - continue; - } - - const condition = isArray - ? { - $in: data.map((i) => (i || {}).id), - } - : { - $eq: data['id'], - }; - - const relationProps = this.metadata.properties[propsKey]; - const relationEntity = relationProps.entity() as EntityClass; - const metadata = this.entityManager.getMetadata().get(relationEntity); - const primaryName = metadata.getPrimaryProp().name; - - const queryBuilder = this.queryBuilder( - relationEntity, - this.getAliasForEntity(relationEntity) - ) - .select([primaryName]) - .where({ - [primaryName]: condition, - }); - let result: typeof relationEntity | (typeof relationEntity)[]; - let error: BadRequestException | undefined = undefined; - if (isArray) { - const tmpResult = await queryBuilder.getResult(); - - if (tmpResult.length === 0 || data.length !== tmpResult.length) { - const msg = `Resource '${metadata.className}' with ids '${data - .map((i) => (i || {})['id']) - .filter((i) => !tmpResult.find((r) => r[primaryName] == i)) - .join(',')}' does not exist`; - error = new BadRequestException([getErrorObject(props, msg)]); - } - result = tmpResult; - } else { - const tmpResult = await queryBuilder.getSingleResult(); - if (!tmpResult) - error = new BadRequestException([ - getErrorObject( - props, - `Resource '${metadata.className}' with id '${data.id}' does not exist` - ), - ]); - result = tmpResult; - } - if (error) throw error; - yield { [props]: result } as RelationshipsResult; - } - } - - async saveEntity( - targetInstance: E, - relationships?: Relationships - ): Promise { - if (relationships) { - for await (const item of this.asyncIterateFindRelationships( - relationships - )) { - const itemProps = ObjectTyped.entries(item).at(0); - if (!itemProps) continue; - const [nameProps, data] = itemProps; - - if ((targetInstance[nameProps] as any) instanceof Collection) { - targetInstance[nameProps].removeAll(); - targetInstance[nameProps].add(...(data as [])); - } else { - Object.assign(targetInstance, item); - } - } - } - - await this.entityManager.persistAndFlush(targetInstance); - - return targetInstance; - } - - async validateRelationInputData< - Rel extends EntityRelation, - In extends InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends null | InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends null | InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise> { - const property = Reflect.get(this.metadata.properties, rel); - const isArray = Array.isArray(inputData); - - if ( - [ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes( - property.kind - ) && - !isArray - ) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - path: ['data'], - message: 'Body data should be array', - }; - - throw new UnprocessableEntityException([error]); - } - - if ( - [ReferenceKind.ONE_TO_ONE, ReferenceKind.MANY_TO_ONE].includes( - property.kind - ) && - isArray - ) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - path: ['data'], - message: 'Body data should be object', - }; - - throw new UnprocessableEntityException([error]); - } - - if (inputData === null) { - const result = null; - return result as ValidateReturn; - } - if (isArray && inputData.length === 0) { - const result: any[] = []; - return result as ValidateReturn; - } - - const prepareData = isArray ? inputData : [inputData]; - - const errors: ValidateQueryError[] = []; - let i = 0; - const relationEntity = this.getRelation(rel as any).entity(); - const typeName = camelToKebab( - this.entityManager.getMetadata().get(relationEntity).className - ); - - for (const prepareItem of prepareData) { - if (prepareItem.type !== typeName) { - const path = isArray ? ['data', i.toString()] : ['data']; - errors.push({ - code: 'invalid_arguments', - path: path, - message: `Type should be equal to type of relName: "${rel.toString()}". Type of ${rel.toString()} is "${typeName}" but receive - "${ - prepareItem.type - }"`, - }); - } - i++; - } - if (errors.length) { - throw new UnprocessableEntityException(errors); - } - - const checkResult = await this.queryBuilder(relationEntity as any) - .where({ - [this.getPrimaryNameFor(rel)]: { - $in: prepareData.map((i) => i.id), - }, - }) - .getResult(); - - if (checkResult.length === prepareData.length) { - return ( - isArray ? inputData.map((i) => i.id) : inputData.id - ) as ValidateReturn; - } - - const resulDataMap = checkResult.reduce((acum, item) => { - acum[item[this.getPrimaryNameFor(rel)]] = true; - return acum; - }, {} as Record); - - i = 0; - for (const item of prepareData) { - if (!resulDataMap[item.id]) { - const path = isArray ? ['data', i.toString(), 'id'] : ['data', 'id']; - errors.push({ - code: 'invalid_arguments', - path: path, - message: `Not exist item "${ - item.id - }" in relation "${rel.toString()}"`, - }); - } - i++; - } - throw new NotFoundException(errors); - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts deleted file mode 100644 index 2cf332fe..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/service/microorm-service.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { - EntityRelation, - QueryField, - ResourceObject, - ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; -import { Inject } from '@nestjs/common'; - -import { ObjectLiteral } from '../../../types'; -import { OrmService } from '../../mixin/types'; -import { - PatchData, - PatchRelationshipData, - PostData, - PostRelationshipData, - Query, - QueryOne, -} from '../../mixin/zod'; - -import { - getAll, - getOne, - deleteOne, - postOne, - patchOne, - getRelationship, - deleteRelationship, - patchRelationship, - postRelationship, -} from '../orm-methods'; -import { MicroOrmUtilService } from './micro-orm-util.service'; -import { JsonApiTransformerService } from '../../mixin/service/json-api-transformer.service'; - -export class MicroOrmService implements OrmService { - @Inject(MicroOrmUtilService) microOrmUtilService!: MicroOrmUtilService; - @Inject(JsonApiTransformerService) - jsonApiTransformerService!: JsonApiTransformerService; - - async getAll(query: Query): Promise> { - const { page } = query; - const { totalItems, items } = await getAll.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, query); - - const { data, included } = this.jsonApiTransformerService.transformData( - items, - query - ); - - const meta = { - totalItems: totalItems, - pageNumber: page.number, - pageSize: page.size, - }; - - return { - meta, - data, - ...(included ? { included } : {}), - }; - } - - async getOne( - id: number | string, - query: QueryOne - ): Promise> { - const result = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, query); - const { data, included } = this.jsonApiTransformerService.transformData( - result, - query - ); - return { - meta: {}, - data, - ...(included ? { included } : {}), - }; - } - - async deleteOne(id: number | string): Promise { - await deleteOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id); - } - - async postOne(inputData: PostData): Promise> { - const result = await postOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, inputData); - - const { relationships } = inputData; - const fakeQuery: Query = { - [QueryField.fields]: null, - [QueryField.include]: Object.keys(relationships || {}), - } as any; - - const resultForResponse = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, result[this.microOrmUtilService.currentPrimaryColumn], fakeQuery); - - const { data, included } = this.jsonApiTransformerService.transformData( - resultForResponse, - fakeQuery - ); - - return { - meta: {}, - data, - ...(included ? { included } : {}), - }; - } - async patchOne( - id: number | string, - inputData: PatchData - ): Promise> { - await patchOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, inputData); - - const { relationships } = inputData; - const fakeQuery: Query = { - [QueryField.fields]: null, - [QueryField.include]: Object.keys(relationships || {}), - } as any; - - const resultForResponse = await getOne.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, fakeQuery); - - const { data, included } = this.jsonApiTransformerService.transformData( - resultForResponse, - fakeQuery - ); - - return { - meta: {}, - data, - ...(included ? { included } : {}), - }; - } - - async getRelationship>( - id: number | string, - rel: Rel - ): Promise> { - const result = await getRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel); - - return { - meta: {}, - data: this.jsonApiTransformerService.transformRel(result, rel), - }; - } - - async deleteRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise { - await deleteRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } - - async postRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise> { - const result = await postRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - - return { - meta: {}, - data: this.jsonApiTransformerService.transformRel(result, rel), - }; - } - - async patchRelationship>( - id: number | string, - rel: Rel, - input: PatchRelationshipData - ): Promise> { - const result = await patchRelationship.call< - MicroOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - - return { - meta: {}, - data: this.jsonApiTransformerService.transformRel(result, rel), - }; - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts deleted file mode 100644 index 8e1d71b9..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/micro-orm/type.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type MicroOrmParam = { - arrayType?: string[]; -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts deleted file mode 100644 index 4c256991..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Bindings, excludeMethod } from './bindings'; - -describe('bindings', () => { - it('excludeMethod', () => { - expect(excludeMethod(['patchRelationship'])).toEqual( - Object.keys(Bindings).filter((i) => i !== 'patchRelationship') - ); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts index 346a17df..bfe6c55d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/config/bindings.ts @@ -1,8 +1,7 @@ import { Body, Param, Query, RequestMethod } from '@nestjs/common'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; -import { BindingsConfig, MethodName } from '../types'; -import { JsonBaseController } from '../controller/json-base.controller'; +import { BindingsConfig } from '../types'; +import { JsonBaseController } from '../controllers/json-base.controller'; import { PARAMS_RELATION_NAME, PARAMS_RESOURCE_ID } from '../../../constants'; import { @@ -188,15 +187,3 @@ const Bindings: BindingsConfig = { }; export { Bindings }; - -export function excludeMethod( - names: Array> -): Array { - const tmpObject = names.reduce( - (acum, key) => ((acum[key] = true), acum), - {} as Record, boolean> - ); - return ObjectTyped.keys(Bindings).filter( - (method) => !tmpObject[method] - ) as Array; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts new file mode 100644 index 00000000..fa836432 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/index.ts @@ -0,0 +1 @@ +export * from './json-base.controller'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts similarity index 50% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts index 146d54eb..f4b33ad5 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controller/json-base.controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/controllers/json-base.controller.ts @@ -1,12 +1,9 @@ import { - EntityRelation, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; -import { ORM_SERVICE_PROPS } from '../../../constants'; -import { MethodName } from '../types'; -import { ObjectLiteral } from '../../../types'; import { PatchData, PatchRelationshipData, @@ -15,21 +12,29 @@ import { Query, QueryOne, } from '../zod'; -import { OrmService } from '../types'; -type RequestMethodeObject = { - [K in MethodName]: OrmService[K]; +import { OrmService, MethodName } from '../types'; + +import { ORM_SERVICE_PROPS } from '../../../constants'; + +type RequestMethodeObject = { + [K in MethodName]: OrmService[K]; }; -export class JsonBaseController - implements RequestMethodeObject +export class JsonBaseController + implements RequestMethodeObject { - private [ORM_SERVICE_PROPS]!: OrmService; + private [ORM_SERVICE_PROPS]!: OrmService; - getOne(id: string | number, query: QueryOne): Promise> { + getOne( + id: string | number, + query: QueryOne + ): Promise> { return this[ORM_SERVICE_PROPS].getOne(id, query); } - getAll(query: Query): Promise> { + getAll( + query: Query + ): Promise> { return this[ORM_SERVICE_PROPS].getAll(query); } deleteOne(id: string | number): Promise { @@ -38,30 +43,32 @@ export class JsonBaseController patchOne( id: string | number, - inputData: PatchData - ): Promise> { + inputData: PatchData + ): Promise> { return this[ORM_SERVICE_PROPS].patchOne(id, inputData); } - postOne(inputData: PostData): Promise> { + postOne( + inputData: PostData + ): Promise> { return this[ORM_SERVICE_PROPS].postOne(inputData); } - getRelationship>( + getRelationship>( id: string | number, relName: Rel - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].getRelationship(id, relName); } - postRelationship>( + postRelationship>( id: string | number, relName: Rel, input: PostRelationshipData - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].postRelationship(id, relName, input); } - deleteRelationship>( + deleteRelationship>( id: string | number, relName: Rel, input: PostRelationshipData @@ -69,11 +76,11 @@ export class JsonBaseController return this[ORM_SERVICE_PROPS].deleteRelationship(id, relName, input); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return this[ORM_SERVICE_PROPS].patchRelationship(id, relName, input); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts index fd246eb9..fd4f39a4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.spec.ts @@ -6,27 +6,28 @@ import { } from '../../../../constants'; import { JsonApi } from './json-api.decorator'; -import { excludeMethod, Bindings } from '../../config/bindings'; +import { Bindings } from '../../config/bindings'; import { DecoratorOptions } from '../../types'; +import { excludeMethod } from '../../helpers'; describe('InjectServiceDecorator', () => { it('should save entity in class', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} - @JsonApi(testedEntity) + @JsonApi(SomeEntity) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, SomeClass); - expect(data).toBe(testedEntity); + expect(data).toBe(SomeEntity); }); it('should save options in class', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const apiOptions: DecoratorOptions = { allowMethod: ['getAll', 'deleteRelationship'], }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, SomeClass); @@ -34,13 +35,13 @@ describe('InjectServiceDecorator', () => { }); it('should save options in class using helpFunction', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const example = ['getAll', 'deleteRelationship']; const apiOptions: DecoratorOptions = { allowMethod: excludeMethod(example as any), }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data: DecoratorOptions = Reflect.getMetadata( @@ -54,13 +55,13 @@ describe('InjectServiceDecorator', () => { }); it('should save options in class and correctly set overrideRoute', () => { - const testedEntity = class SomeEntity {}; + class SomeEntity {} const apiOptions: DecoratorOptions = { allowMethod: ['getAll', 'deleteRelationship'], overrideRoute: '123', }; - @JsonApi(testedEntity, apiOptions) + @JsonApi(SomeEntity, apiOptions) class SomeClass {} const data = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, SomeClass); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts index c73f8594..ec045148 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts @@ -2,11 +2,11 @@ import { JSON_API_DECORATOR_ENTITY, JSON_API_DECORATOR_OPTIONS, } from '../../../../constants'; -import { EntityClass, ObjectLiteral } from '../../../../types'; +import { AnyEntity, EntityClass } from '../../../../types'; import { DecoratorOptions } from '../../types'; -export function JsonApi( - entity: EntityClass, +export function JsonApi( + entity: EntityClass, options?: DecoratorOptions ): ClassDecorator { return (target): typeof target => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts index 942c24c6..53f5dc46 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/factory/zod-validate.factory.ts @@ -1,15 +1,3 @@ -import { FactoryProvider, ValueProvider } from '@nestjs/common'; - -import { - ZOD_INPUT_QUERY_SCHEMA, - ZOD_QUERY_SCHEMA, - ZOD_POST_SCHEMA, - ZOD_PATCH_SCHEMA, - ZOD_POST_RELATIONSHIP_SCHEMA, - ZOD_PATCH_RELATIONSHIP_SCHEMA, - ENTITY_MAP_PROPS, -} from '../../../constants'; - import { zodInputQuery, ZodInputQuery, @@ -24,253 +12,68 @@ import { zodPatchRelationship, ZodPatchRelationship, } from '../zod'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { - AllFieldWithType, - ArrayPropsForEntity, - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - RelationTree, - ResultGetField, - ZodEntityProps, -} from '../types'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; -function getEntityMap( - entityMapProps: Map, ZodEntityProps>, - entity: Function & { prototype: E } -) { - const entityMap = entityMapProps.get(entity); - if (!entityMap) throw new Error('Entity not found in map'); - return entityMap; -} - -export function getParamsForOatchANdPostZod( - entityMapProps: Map, ZodEntityProps>, - entity: Function & { prototype: E } -) { - const entityMap = getEntityMap(entityMapProps, entity); - - const { - primaryColumnType, - typeName, - propsType, - primaryColumnName, - propsNullable, - relationProperty, - } = entityMap; - const fieldWithType = {} as FieldWithType; - const propsDb = {} as PropsForField; - const relationArrayProps = {} as RelationPropsArray; - const relationPopsName = {} as RelationPropsTypeName; - const primaryColumnTypeForRel = {} as RelationPrimaryColumnType; - - for (const [name, type] of ObjectTyped.entries(propsType)) { - Reflect.set(propsDb, name, { - type: type, - isArray: type === 'array', - isNullable: (propsNullable as any[]).includes(name), - }); - if (name === primaryColumnName) continue; - Reflect.set(fieldWithType, name, type); - } - - for (const [name, value] of ObjectTyped.entries(relationProperty)) { - const relEntityMap = getEntityMap(entityMapProps, value.entityClass); - - Reflect.set(relationArrayProps, name, value.isArray); - Reflect.set(relationPopsName, name, relEntityMap.className); - Reflect.set(primaryColumnTypeForRel, name, relEntityMap.primaryColumnType); - } +import { + ZOD_INPUT_QUERY_SCHEMA, + ZOD_QUERY_SCHEMA, + ZOD_POST_SCHEMA, + ZOD_PATCH_SCHEMA, + ZOD_POST_RELATIONSHIP_SCHEMA, + ZOD_PATCH_RELATIONSHIP_SCHEMA, +} from '../../../constants'; - return { - primaryColumnType, - typeName: typeName as any, - fieldWithType, - propsDb: propsDb as PropsForField, - primaryColumnName: primaryColumnName as EntityProps, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - }; -} +import { EntityParamMapService } from '../service'; +import { FactoryProvider, ValueProvider } from '@nestjs/common'; -export function ZodInputQuerySchema( - entity: EntityClass -): FactoryProvider> { +export function ZodInputQuerySchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_INPUT_QUERY_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const entityMap = getEntityMap(entityMapProps, entity); - - const { props, relations, relationProperty } = entityMap; - - const entityRelationStructure = ObjectTyped.entries( - relationProperty - ).reduce((acum, [name, value]) => { - const relMap = getEntityMap(entityMapProps, value.entityClass); - Reflect.set(acum, name, relMap.props); - return acum; - }, {} as RelationTree); - - return zodInputQuery( - { - field: props, - relations: relations, - } as ResultGetField, - entityRelationStructure - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodInputQuery(entityParamMapService); }, }; } - -export function ZodQuerySchema( - entity: EntityClass -): FactoryProvider> { +export function ZodQuerySchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_QUERY_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const entityMap = getEntityMap(entityMapProps, entity); - - const { - props, - relations, - relationProperty, - propsType: propsTypeEntity, - } = entityMap; - - const propsType = { ...propsTypeEntity } as AllFieldWithType; - - const propsArray = { target: {} } as ArrayPropsForEntity; - - for (const [name, type] of ObjectTyped.entries(propsTypeEntity)) { - if (type !== 'array') continue; - Reflect.set(propsArray.target, name, true); - } - - const entityRelationStructure = {} as RelationTree; - for (const [name, value] of ObjectTyped.entries(relationProperty)) { - const relMap = getEntityMap(entityMapProps, value.entityClass); - - if (!(name in propsArray)) { - Reflect.set(propsArray, name, {}); - } - for (const [relNameField, type] of ObjectTyped.entries( - relMap.propsType - )) { - if (type !== 'array') continue; - const propsArrayObject = Reflect.get(propsArray, name); - Reflect.set(propsArrayObject, relNameField, true); - } - - Reflect.set(propsType, name, relMap.propsType); - Reflect.set(entityRelationStructure, name, relMap.props); - } - const entityFieldsStructure = { - field: props, - relations: relations, - } as ResultGetField; - - return zodQuery( - entityFieldsStructure, - entityRelationStructure, - propsArray, - propsType - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodQuery(entityParamMapService); }, }; } - -export function ZodPostSchema( - entity: EntityClass -): FactoryProvider> { +export function ZodPostSchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_POST_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(entityMapProps, entity); - - return zodPost( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodPost(entityParamMapService); }, }; } -export function ZodPatchSchema( - entity: EntityClass -): FactoryProvider> { +export function ZodPatchSchema< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { return { provide: ZOD_PATCH_SCHEMA, - inject: [ - { - token: ENTITY_MAP_PROPS, - optional: false, - }, - ], - useFactory: (entityMapProps: Map, ZodEntityProps>) => { - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(entityMapProps, entity); - - return zodPatch( - primaryColumnType, - typeName as I, - fieldWithType, - propsDb, - primaryColumnName as EntityProps, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ); + inject: [EntityParamMapService], + useFactory: (entityParamMapService: EntityParamMapService) => { + return zodPatch(entityParamMapService); }, }; } - export const ZodInputPostRelationshipSchema: ValueProvider = { provide: ZOD_POST_RELATIONSHIP_SCHEMA, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts deleted file mode 100644 index fd1d708e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getEntityName, nameIt } from './'; - -describe('Test utils', () => { - it('getEntityName', () => { - expect(getEntityName('Entity')).toBe('Entity'); - expect(getEntityName(class EntityClass {})).toBe('EntityClass'); - class EntityClassInst {} - const tmp = new EntityClassInst(); - expect(getEntityName(tmp as any)).toBe('EntityClassInst'); - }); - - it('nameIt', () => { - const newNameClass = 'newNameClass'; - const newClass = nameIt(newNameClass, class {}); - expect(getEntityName(newClass)).toBe(newNameClass); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts deleted file mode 100644 index 88ebd7cc..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EntityTarget, ObjectLiteral } from '../../../types'; - -import { upperFirstLetter } from '../../../utils/nestjs-shared'; - -export const nameIt = ( - name: string, - cls: new (...rest: unknown[]) => Record -) => - ({ - [name]: class extends cls { - constructor(...arg: unknown[]) { - super(...arg); - } - }, - }[name]); - -export const getEntityName = ( - entity: EntityTarget -): string => { - if (typeof entity === 'string') { - return entity; - } - - if ('name' in entity) { - return entity['name']; - } - - if ('constructor' in entity && 'name' in entity.constructor) { - return entity['constructor']['name']; - } - - return `${entity}`; -}; - -export function getProviderName( - entity: EntityTarget, - name: string -) { - const entityName = getEntityName(entity); - return `${upperFirstLetter(entityName)}${name}`; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts similarity index 91% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts index bf60890e..94ed83c4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.spec.ts @@ -3,12 +3,11 @@ import { PATH_METADATA, ROUTE_ARGS_METADATA, } from '@nestjs/common/constants'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; import { bindController } from './bind-controller'; -import { Users } from '../../../mock-utils/typeorm'; -import { DEFAULT_CONNECTION_NAME } from '../../../constants'; + import { ParseIntPipe, Query, @@ -20,8 +19,8 @@ import { import { OrmService } from '../types'; import { PatchData } from '../zod'; import { JsonApi } from '../decorators'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { excludeMethod } from '../config/bindings'; +import { JsonBaseController } from '../controllers/json-base.controller'; +import { excludeMethod } from './utils'; import { Bindings } from '../config/bindings'; @@ -30,6 +29,8 @@ mapParams.set(Query, RouteParamtypes.QUERY); mapParams.set(Body, RouteParamtypes.BODY); mapParams.set(Param, RouteParamtypes.PARAM); +class Users {} + describe('bindController', () => { it('Should be all methode', () => { class Controller {} @@ -123,10 +124,10 @@ describe('bindController', () => { return undefined; } } - class Controller extends JsonBaseController { + class Controller extends JsonBaseController { override patchOne( @Param('id', SomePipes) id: string | number, - @Body(SomePipes) inputData: PatchData + @Body(SomePipes) inputData: PatchData ): ReturnType['patchOne']> { return super.patchOne(id, inputData); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts similarity index 93% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts index de5c6d66..282dabf9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/bind-controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/bind-controller.ts @@ -13,14 +13,18 @@ import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; import { Bindings } from '../config/bindings'; -import { DecoratorOptions, MixinOptions, MethodName } from '../types'; -import { NestController, ExtractNestType } from '../../../types'; +import { DecoratorOptions, EntityControllerParam, MethodName } from '../types'; +import { + ModuleMixinOptions, + NestController, + ExtractNestType, +} from '../../../types'; import { JSON_API_DECORATOR_OPTIONS } from '../../../constants'; export function bindController( controller: ExtractNestType, - entity: MixinOptions['entity'], - config: MixinOptions['config'] + entity: ModuleMixinOptions['entity'], + config: EntityControllerParam ): void { for (const methodName in Bindings) { const { name, path, parameters, method, implementation } = diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts similarity index 96% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts index 9060696b..1940b9ac 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.spec.ts @@ -5,8 +5,7 @@ import { PROPERTY_DEPS_METADATA, } from '@nestjs/common/constants'; import { createController } from './create-controller'; -import { Users } from '../../../mock-utils/typeorm'; -import { JsonBaseController } from '../controller/json-base.controller'; +import { JsonBaseController } from '../controllers/json-base.controller'; import { JSON_API_CONTROLLER_POSTFIX, ORM_SERVICE, @@ -15,6 +14,8 @@ import { import { InjectService, JsonApi } from '../decorators'; import { ErrorInterceptors, LogTimeInterceptors } from '../interceptors'; +class Users {} + describe('createController', () => { it('Should be error', () => { class TestController {} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts similarity index 68% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts index 7a10058a..ed7558f2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/create-controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/create-controller.ts @@ -1,23 +1,22 @@ -import { Controller, Inject, Type, UseInterceptors } from '@nestjs/common'; - -import { camelToKebab } from '../../../utils/nestjs-shared'; - +import { Controller, Inject, UseInterceptors } from '@nestjs/common'; +import { kebabCase } from 'change-case-commonjs'; +import { ModuleMixinOptions, NestController } from '../../../types'; +import { DecoratorOptions } from '../types'; import { getProviderName, nameIt } from './utils'; +import { JsonBaseController } from '../controllers'; import { - JSON_API_CONTROLLER_POSTFIX, JSON_API_DECORATOR_OPTIONS, - ORM_SERVICE, ORM_SERVICE_PROPS, + ORM_SERVICE, + JSON_API_CONTROLLER_POSTFIX, } from '../../../constants'; -import { JsonBaseController } from '../controller/json-base.controller'; import { ErrorInterceptors, LogTimeInterceptors } from '../interceptors'; - -import { DecoratorOptions, MixinOptions } from '../types'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; export function createController( - entity: MixinOptions['entity'], - controller?: MixinOptions['controller'] -): Type { + entity: ModuleMixinOptions['entity'], + controller?: ModuleMixinOptions['controller'] +): NestController[number] { const controllerClass = controller || nameIt( @@ -25,7 +24,7 @@ export function createController( JsonBaseController ); - const entityName = entity.name; + const entityName = getEntityName(entity); if ( !Object.prototype.isPrototypeOf.call(JsonBaseController, controllerClass) @@ -43,7 +42,8 @@ export function createController( const controllerPath = decoratorOptions && decoratorOptions['overrideRoute'] ? decoratorOptions['overrideRoute'].toString() - : `${camelToKebab(entityName)}`; + : `${kebabCase(entityName)}`; + Controller(controllerPath)(controllerClass); Inject(ORM_SERVICE)(controllerClass.prototype, ORM_SERVICE_PROPS); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts similarity index 63% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts index 7f0e8bc2..08395854 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helper/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/index.ts @@ -1,3 +1,2 @@ export * from './utils'; export * from './create-controller'; -export * from './bind-controller'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts new file mode 100644 index 00000000..d7a5e1eb --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.spec.ts @@ -0,0 +1,26 @@ +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { nameIt, excludeMethod, getProviderName } from './utils'; +import { Bindings } from '../config/bindings'; +import { JSON_API_CONTROLLER_POSTFIX } from '../../../constants'; + +describe('Test utils', () => { + it('nameIt', () => { + const newNameClass = 'newNameClass'; + const newClass = nameIt(newNameClass, class {}); + expect(getEntityName(newClass)).toBe(newNameClass); + }); + + it('excludeMethod', () => { + expect(excludeMethod(['patchRelationship'])).toEqual( + Object.keys(Bindings).filter((i) => i !== 'patchRelationship') + ); + }); + + it('getProviderName', () => { + class BookList {} + expect(getProviderName(BookList, JSON_API_CONTROLLER_POSTFIX)).toEqual( + 'BookList' + JSON_API_CONTROLLER_POSTFIX + ); + }); +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts new file mode 100644 index 00000000..f07264fb --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts @@ -0,0 +1,45 @@ +import { getEntityName, ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { pascalCase } from 'change-case-commonjs'; + +import { AnyEntity, EntityClass } from '../../../types'; +import { MethodName } from '../types'; + +import { Bindings } from '../config/bindings'; +import { Type } from '@nestjs/common/interfaces'; +import { JSON_API_DECORATOR_ENTITY } from '../../../constants'; + +export const nameIt = ( + name: string, + cls: new (...rest: unknown[]) => Record +) => + ({ + [name]: class extends cls { + constructor(...arg: unknown[]) { + super(...arg); + } + }, + }[name]); + +export function getProviderName( + entity: EntityClass, + name: string +) { + const entityName = getEntityName(entity); + return `${pascalCase(entityName)}${name}`; +} + +export function excludeMethod( + names: Array> +): Array { + const tmpObject = names.reduce( + (acum, key) => ((acum[key] = true), acum), + {} as Record, boolean> + ); + return ObjectTyped.keys(Bindings).filter( + (method) => !tmpObject[method] + ) as Array; +} + +export function entityForClass(type: Type): EntityClass { + return Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, type); +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts index 9d5d086e..e7803276 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/error.interceptors.ts @@ -1,120 +1,36 @@ import { - InternalServerErrorException, CallHandler, ExecutionContext, Inject, Injectable, NestInterceptor, } from '@nestjs/common'; +import { ResourceObject } from '@klerick/json-api-nestjs-shared'; +import { ErrorFormatService } from '../service'; import { catchError, Observable, throwError } from 'rxjs'; -import { ObjectLiteral } from '../../../types'; -// import { QueryFailedError, Repository } from 'typeorm'; -// import { DriverUtils } from 'typeorm/driver/DriverUtils'; -// -// import { -// CONTROL_OPTIONS_TOKEN, -// CURRENT_ENTITY_REPOSITORY, -// } from '../../constants'; -// import { ConfigParam, Entity, ValidateQueryError } from '../../types'; -// import { -// MysqlError, -// MysqlErrorCode, -// PostgresError, -// PostgresErrorCode, -// } from '../../helper'; -// import { HttpException } from '@nestjs/common'; -// #TODO need implement + @Injectable() -export class ErrorInterceptors - implements NestInterceptor -{ - // @Inject(CURRENT_ENTITY_REPOSITORY) private repository!: Repository; - // @Inject(CONTROL_OPTIONS_TOKEN) private config!: ConfigParam; +export class ErrorInterceptors implements NestInterceptor { + @Inject(ErrorFormatService) private errorFormatService!: ErrorFormatService; + + private static _instance: ErrorInterceptors; + constructor() { + if (ErrorInterceptors._instance) { + return ErrorInterceptors._instance; + } + ErrorInterceptors._instance = this; + } intercept( context: ExecutionContext, - next: CallHandler - ): Observable | Promise> { - return next.handle(); - // return next.handle().pipe( - // catchError((error) => { - // if (error instanceof QueryFailedError) { - // return throwError(() => this.prepareDataBaseError(error)); - // } - // - // if (error instanceof HttpException) { - // return throwError(() => error); - // } - // - // const errorObject: ValidateQueryError = { - // code: 'internal_error', - // message: this.config.debug ? error.message : 'Internal Server Error', - // path: [], - // }; - // const descriptionOrOptions = this.config.debug ? error : undefined; - // return throwError( - // () => - // new InternalServerErrorException( - // [errorObject], - // descriptionOrOptions - // ) - // ); - // }) - // ); + next: CallHandler> + ): Observable> { + return next + .handle() + .pipe( + catchError((error) => + throwError(() => this.errorFormatService.formatError(error)) + ) + ); } - - // private prepareDataBaseError(error: QueryFailedError): HttpException { - // const errorObject: ValidateQueryError = { - // code: 'internal_error', - // message: this.config.debug ? error.message : 'Internal Server Error', - // path: [], - // }; - // - // if (DriverUtils.isMySQLFamily(this.repository.manager.connection.driver)) { - // const { errorCode, errorMsg } = this.prepareMysqlError(error.driverError); - // if (MysqlError[errorCode]) { - // return MysqlError[errorCode](this.repository.metadata, errorMsg); - // } - // } - // - // if ( - // DriverUtils.isPostgresFamily(this.repository.manager.connection.driver) - // ) { - // const { errorCode, errorMsg, detail } = this.preparePostgresError( - // error.driverError - // ); - // - // if (PostgresError[errorCode]) { - // return PostgresError[errorCode]( - // this.repository.metadata, - // errorMsg, - // detail - // ); - // } - // } - // - // return new InternalServerErrorException([errorObject]); - // } - // - // private prepareMysqlError(error: any): { - // errorCode: MysqlErrorCode; - // errorMsg: string; - // } { - // return { - // errorCode: error.errno, - // errorMsg: error.message, - // }; - // } - // - // private preparePostgresError(error: any): { - // errorCode: PostgresErrorCode; - // errorMsg: string; - // detail: string; - // } { - // return { - // errorCode: error.code, - // errorMsg: error.message, - // detail: error.detail, - // }; - // } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts index 2b6b2797..48ace2bc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/interceptors/log-time.interceptors.ts @@ -1,30 +1,39 @@ -import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common'; +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { ResourceObject } from '@klerick/json-api-nestjs-shared'; + import { map, Observable } from 'rxjs'; -import { ObjectLiteral } from '../../../types'; -// import { Entity, ResourceObject } from '../../types'; +@Injectable() +export class LogTimeInterceptors implements NestInterceptor { + private static _instance: LogTimeInterceptors; + constructor() { + if (LogTimeInterceptors._instance) { + return LogTimeInterceptors._instance; + } + LogTimeInterceptors._instance = this; + } -export class LogTimeInterceptors - implements NestInterceptor -{ intercept( context: ExecutionContext, - // next: CallHandler> - next: CallHandler - ): Observable | Promise> { - const now = Date.now(); - return next.handle(); - // .pipe( - // map((r) => { - // const response = context.switchToHttp().getResponse(); - // const time = Date.now() - now; - // response.setHeader('x-response-time', time); - // if (r && r.meta) { - // r.meta['time'] = time; - // } - // - // return r; - // }) - // ); + next: CallHandler> + ): Observable> { + const now = performance.now(); + return next.handle().pipe( + map((r) => { + const response = context.switchToHttp().getResponse(); + const time = performance.now() - now; + response.setHeader('x-response-time', time); + if (r && r.meta) { + r.meta['time'] = time; + } + + return r; + }) + ); } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts index 0326a314..13aadcb9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/mixin.module.ts @@ -1,19 +1,17 @@ import { DynamicModule } from '@nestjs/common'; - -import { MixinOptions, DecoratorOptions } from './types'; -import { createController } from './helper'; +import { DiscoveryModule } from '@nestjs/core'; +import { ModuleMixinOptions } from '../../types'; +import { createController, getProviderName, nameIt } from './helpers'; import { + CONTROLLER_OPTIONS_TOKEN, + CURRENT_ENTITY, JSON_API_DECORATOR_OPTIONS, - CONTROL_OPTIONS_TOKEN, JSON_API_MODULE_POSTFIX, - CURRENT_ENTITY, - FIND_ONE_ROW_ENTITY, - CHECK_RELATION_NAME, } from '../../constants'; -import { ConfigParam, RequiredFromPartial } from '../../types'; -import { MicroOrmParam } from '../micro-orm'; -import { TypeOrmParam } from '../type-orm'; -import { bindController, getProviderName, nameIt } from './helper'; +import { DecoratorOptions, EntityControllerParam } from './types'; +import { bindController } from './helpers/bind-controller'; +import { EntityParamMapService, JsonApiTransformerService } from './service'; +import { SwaggerBindService } from './swagger'; import { ZodInputQuerySchema, ZodPostSchema, @@ -22,27 +20,24 @@ import { ZodInputPatchRelationshipSchema, ZodInputPostRelationshipSchema, } from './factory'; -import { SwaggerBindService } from './swagger'; -import { JsonApiTransformerService } from './service/json-api-transformer.service'; export class MixinModule { - static forRoot(options: MixinOptions): DynamicModule { - const { entity, controller, imports, ormModule } = options; + static forRoot(mixinOptions: ModuleMixinOptions): DynamicModule { + const { entity, controller, imports, ormModule, config } = mixinOptions; const controllerClass = createController(entity, controller); const decoratorOptions: DecoratorOptions = Reflect.getMetadata(JSON_API_DECORATOR_OPTIONS, controllerClass) || {}; - const moduleConfig: RequiredFromPartial< - ConfigParam & (MicroOrmParam | TypeOrmParam) - > = { - ...options.config, + const moduleConfig: EntityControllerParam = { + ...config.options, ...decoratorOptions, }; bindController(controllerClass, entity, moduleConfig); + const optionProvider = { - provide: CONTROL_OPTIONS_TOKEN, + provide: CONTROLLER_OPTIONS_TOKEN, useValue: moduleConfig, }; @@ -51,16 +46,6 @@ export class MixinModule { useValue: entity, }; - const findOneRowEntityProvider = { - provide: FIND_ONE_ROW_ENTITY, - useValue: undefined, - }; - - const checkRelationNameProvider = { - provide: CHECK_RELATION_NAME, - useValue: undefined, - }; - return { module: nameIt( getProviderName(entity, JSON_API_MODULE_POSTFIX), @@ -70,19 +55,18 @@ export class MixinModule { providers: [ optionProvider, currentEntityProvider, - findOneRowEntityProvider, - checkRelationNameProvider, + EntityParamMapService, JsonApiTransformerService, - ...ormModule.getUtilProviders(entity), - ZodInputQuerySchema(entity), - ZodQuerySchema(entity), - ZodPatchSchema(entity), - ZodPostSchema(entity), SwaggerBindService, + ZodInputQuerySchema(), + ZodPostSchema(), + ZodQuerySchema(), + ZodPatchSchema(), ZodInputPatchRelationshipSchema, ZodInputPostRelationshipSchema, + ...ormModule.getUtilProviders(entity), ], - imports: imports, + imports: [...imports, DiscoveryModule], }; } } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts index 8244d3aa..8bc9ef92 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts @@ -1,16 +1,15 @@ import { Inject, NotFoundException, PipeTransform } from '@nestjs/common'; import { ValidateQueryError } from '../../../../types'; import { CURRENT_ENTITY, FIND_ONE_ROW_ENTITY } from '../../../../constants'; -import { EntityTarget, ObjectLiteral } from '../../../../types'; +import { EntityClass } from '../../../../types'; import { FindOneRowEntity } from '../../types'; -import { getEntityName } from '../../helper'; -export class CheckItemEntityPipe< - E extends ObjectLiteral, - I extends string | number -> implements PipeTransform> +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +export class CheckItemEntityPipe + implements PipeTransform> { - @Inject(CURRENT_ENTITY) private currentEntity!: EntityTarget; + @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; @Inject(FIND_ONE_ROW_ENTITY) private findOneRowEntity!: | FindOneRowEntity | undefined; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts index 6970b810..f6728a09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.spec.ts @@ -1,8 +1,8 @@ import { INJECTABLE_WATERMARK } from '@nestjs/common/constants'; import { PipeTransform } from '@nestjs/common/interfaces'; -import { MixinOptions } from '../types'; import { factoryMixin } from './index'; +import { ModuleMixinOptions } from '../../../types'; describe('factoryMixin', () => { class TestEntity {} @@ -21,7 +21,7 @@ describe('factoryMixin', () => { it('should return a pipe class with a new name', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); expect(pipeClass.name).toBe('TestEntityTestPipe'); @@ -29,7 +29,7 @@ describe('factoryMixin', () => { it('should return a pipe class that is Injectable', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); expect(isInjectable(pipeClass)).toBe(true); @@ -37,7 +37,7 @@ describe('factoryMixin', () => { it('should preserve the behavior of the original pipe', () => { const pipeClass = factoryMixin( - TestEntity as MixinOptions['entity'], + TestEntity as ModuleMixinOptions['entity'], TestPipe ); const instance = new pipeClass(); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts index b7c0cc13..87448f10 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/index.ts @@ -1,9 +1,7 @@ import { Injectable, ParseIntPipe } from '@nestjs/common'; -import { upperFirstLetter } from '../../../utils/nestjs-shared'; +import { pascalCase } from 'change-case-commonjs'; -import { PipeMixin } from '../../../types'; -import { MixinOptions } from '../types'; -import { nameIt } from '../helper'; +import { ModuleMixinOptions, PipeMixin } from '../../../types'; import { QueryInputPipe } from './query-input'; import { QueryPipe } from './query'; @@ -15,12 +13,17 @@ import { PatchInputPipe } from './patch-input'; import { ParseRelationshipNamePipe } from './parse-relationship-name'; import { PostRelationshipPipe } from './post-relationship'; import { PatchRelationshipPipe } from './patch-relationship'; +import { nameIt } from '../helpers'; +import { EntityControllerParam } from '../types'; -export function factoryMixin(entity: MixinOptions['entity'], pipe: PipeMixin) { +export function factoryMixin( + entity: ModuleMixinOptions['entity'], + pipe: PipeMixin +) { const entityName = entity.name; const pipeClass = nameIt( - `${upperFirstLetter(entityName)}${pipe.name}`, + `${pascalCase(entityName)}${pipe.name}`, pipe ) as PipeMixin; @@ -29,61 +32,67 @@ export function factoryMixin(entity: MixinOptions['entity'], pipe: PipeMixin) { return pipeClass; } -export function queryInputMixin(entity: MixinOptions['entity']): PipeMixin { +export function queryInputMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, QueryInputPipe); } -export function queryMixin(entity: MixinOptions['entity']): PipeMixin { +export function queryMixin(entity: ModuleMixinOptions['entity']): PipeMixin { return factoryMixin(entity, QueryPipe); } export function queryFiledInIncludeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, QueryFiledInIncludePipe); } export function queryCheckSelectFieldMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, QueryCheckSelectField); } export function idPipeMixin( - entity: MixinOptions['entity'], - config?: MixinOptions['config'] + entity: ModuleMixinOptions['entity'], + config?: EntityControllerParam ): PipeMixin { return config && config.pipeForId ? config.pipeForId : (ParseIntPipe as any); } export function checkItemEntityPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, CheckItemEntityPipe); } -export function postInputPipeMixin(entity: MixinOptions['entity']): PipeMixin { +export function postInputPipeMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, PostInputPipe); } -export function patchInputPipeMixin(entity: MixinOptions['entity']): PipeMixin { +export function patchInputPipeMixin( + entity: ModuleMixinOptions['entity'] +): PipeMixin { return factoryMixin(entity, PatchInputPipe); } export function postRelationshipPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, PostRelationshipPipe); } export function patchRelationshipPipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, PatchRelationshipPipe); } export function parseRelationshipNamePipeMixin( - entity: MixinOptions['entity'] + entity: ModuleMixinOptions['entity'] ): PipeMixin { return factoryMixin(entity, ParseRelationshipNamePipe); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts index 2709180b..c3c10d12 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts @@ -2,12 +2,15 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UnprocessableEntityException } from '@nestjs/common'; import { ParseRelationshipNamePipe } from './parse-relationship-name.pipe'; import { CURRENT_ENTITY, CHECK_RELATION_NAME } from '../../../../constants'; -import { EntityTarget } from 'typeorm/common/EntityTarget'; +import { EntityParam, EntityClass } from '../../../../types'; describe('CheckItemEntityPipe', () => { - let pipe: ParseRelationshipNamePipe; + let pipe: ParseRelationshipNamePipe< + object, + keyof EntityParam['relationProperty'] + >; let checkRelationNameMock: jest.Mock; - let mockEntityTarget: EntityTarget; + let mockEntityTarget: EntityClass; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -18,10 +21,13 @@ describe('CheckItemEntityPipe', () => { ], }).compile(); - pipe = module.get>( - ParseRelationshipNamePipe - ); - mockEntityTarget = module.get>(CURRENT_ENTITY); + pipe = module.get< + ParseRelationshipNamePipe< + object, + keyof EntityParam['relationProperty'] + > + >(ParseRelationshipNamePipe); + mockEntityTarget = module.get>(CURRENT_ENTITY); checkRelationNameMock = module.get(CHECK_RELATION_NAME); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts index de555df3..5b142523 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts @@ -3,20 +3,21 @@ import { UnprocessableEntityException, Inject, } from '@nestjs/common'; -import { EntityRelation } from '../../../../utils/nestjs-shared'; -import { ValidateQueryError } from '../../../../types'; + +import { EntityParam, ValidateQueryError } from '../../../../types'; import { CHECK_RELATION_NAME, CURRENT_ENTITY } from '../../../../constants'; -import { EntityTarget, ObjectLiteral } from '../../../../types'; -import { CheckRelationNme } from '../../types'; -import { getEntityName } from '../../helper'; +import { EntityClass } from '../../../../types'; +import { CheckRelationName } from '../../types'; + +import { getEntityName } from '@klerick/json-api-nestjs-shared'; export class ParseRelationshipNamePipe< - E extends ObjectLiteral, - I extends EntityRelation + E extends object, + I extends keyof EntityParam['relationProperty'] > implements PipeTransform { - @Inject(CURRENT_ENTITY) private currentEntity!: EntityTarget; - @Inject(CHECK_RELATION_NAME) private checkRelationName!: CheckRelationNme; + @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; + @Inject(CHECK_RELATION_NAME) private checkRelationName!: CheckRelationName; transform(value: string): I { if (!this.checkRelationName || typeof this.checkRelationName !== 'function') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts index 7e54641f..3e52b35d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.spec.ts @@ -10,11 +10,11 @@ import { PostData, ZodPost } from '../../zod'; import { JSONValue } from '../../types'; import { ZOD_PATCH_SCHEMA } from '../../../../constants'; -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('PostInputPipe', () => { - let pipe: PatchInputPipe; - let mockSchema: ZodPost; + let pipe: PatchInputPipe; + let mockSchema: ZodPost; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,13 +29,13 @@ describe('PostInputPipe', () => { ], }).compile(); - pipe = module.get>(PatchInputPipe); - mockSchema = module.get>(ZOD_PATCH_SCHEMA); + pipe = module.get>(PatchInputPipe); + mockSchema = module.get>(ZOD_PATCH_SCHEMA); }); it('should transform JSONValue to PostData on success', () => { const input: JSONValue = { key: 'value' } as any; - const expectedData: PostData = { id: 1, key: 'value' } as any; + const expectedData: PostData = { id: 1, key: 'value' } as any; jest .spyOn(mockSchema, 'parse') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts index 3fd108af..3f6dc334 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-input/patch-input.pipe.ts @@ -10,18 +10,17 @@ import { errorMap } from 'zod-validation-error'; import { JSONValue } from '../../types'; import { PatchData, ZodPatch } from '../../zod'; import { ZOD_PATCH_SCHEMA } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; -export class PatchInputPipe - implements PipeTransform> +export class PatchInputPipe + implements PipeTransform> { @Inject(ZOD_PATCH_SCHEMA) private zodInputPatchSchema!: ZodPatch; - transform(value: JSONValue): PatchData { + transform(value: JSONValue): PatchData { try { return this.zodInputPatchSchema.parse(value, { errorMap: errorMap, - })['data'] as PatchData; + })['data'] as PatchData; } catch (e) { if (e instanceof ZodError) { throw new BadRequestException(e.issues); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts index 8c591419..0454ce2b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/patch-relationship/patch-relationship.pipe.spec.ts @@ -1,4 +1,3 @@ -import { IMemoryDb } from 'pg-mem'; import { Test, TestingModule } from '@nestjs/testing'; import { InternalServerErrorException, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts index 01481275..a61eae00 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.spec.ts @@ -9,12 +9,11 @@ import { PostInputPipe } from './post-input.pipe'; import { PostData, ZodPost } from '../../zod'; import { JSONValue } from '../../types'; import { ZOD_POST_SCHEMA } from '../../../../constants'; - -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('PostInputPipe', () => { - let pipe: PostInputPipe; - let mockSchema: ZodPost; + let pipe: PostInputPipe; + let mockSchema: ZodPost; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,13 +28,13 @@ describe('PostInputPipe', () => { ], }).compile(); - pipe = module.get>(PostInputPipe); - mockSchema = module.get>(ZOD_POST_SCHEMA); + pipe = module.get>(PostInputPipe); + mockSchema = module.get>(ZOD_POST_SCHEMA); }); it('should transform JSONValue to PostData on success', () => { const input: JSONValue = { key: 'value' } as any; - const expectedData: PostData = { id: 1, key: 'value' } as any; + const expectedData: PostData = { id: 1, key: 'value' } as any; jest .spyOn(mockSchema, 'parse') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts index 5059b8ce..3956098d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-input/post-input.pipe.ts @@ -9,18 +9,17 @@ import { errorMap } from 'zod-validation-error'; import { PostData, ZodPost } from '../../zod'; import { ZOD_POST_SCHEMA } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; import { JSONValue } from '../../types'; -export class PostInputPipe - implements PipeTransform> +export class PostInputPipe + implements PipeTransform> { @Inject(ZOD_POST_SCHEMA) private zodInputPostSchema!: ZodPost; - transform(value: JSONValue): PostData { + transform(value: JSONValue): PostData { try { return this.zodInputPostSchema.parse(value, { errorMap: errorMap, - })['data'] as PostData; + })['data'] as PostData; } catch (e) { if (e instanceof ZodError) { throw new BadRequestException(e.issues); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts index 8833734d..038529c1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/post-relationship/post-relationship.pipe.spec.ts @@ -1,6 +1,5 @@ -import { IMemoryDb } from 'pg-mem'; import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; + import { InternalServerErrorException, BadRequestException, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts index 161204f6..f877b959 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.spec.ts @@ -1,19 +1,19 @@ import { Test, TestingModule } from '@nestjs/testing'; import { BadRequestException } from '@nestjs/common'; -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { QueryCheckSelectField } from './query-check-select-field'; -import { Users } from '../../../../mock-utils/typeorm'; -import { CONTROL_OPTIONS_TOKEN } from '../../../../constants'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { CONTROLLER_OPTIONS_TOKEN } from '../../../../constants'; import { Query } from '../../zod'; -import { ConfigParam, ObjectLiteral } from '../../../../types'; +import { EntityControllerParam } from '../../types'; -function getDefaultQuery() { +function getDefaultQuery() { const filter = { relation: null, target: null, }; - const defaultQuery: Query = { + const defaultQuery: Query = { [QueryField.filter]: filter, [QueryField.fields]: null, [QueryField.include]: null, @@ -29,12 +29,12 @@ function getDefaultQuery() { describe('QueryCheckSelectField', () => { let queryCheckSelectField: QueryCheckSelectField; - let configParam: ConfigParam; + let configParam: EntityControllerParam; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ { - provide: CONTROL_OPTIONS_TOKEN, + provide: CONTROLLER_OPTIONS_TOKEN, useValue: { requiredSelectField: false, debug: false, @@ -47,7 +47,7 @@ describe('QueryCheckSelectField', () => { queryCheckSelectField = module.get>( QueryCheckSelectField ); - configParam = module.get(CONTROL_OPTIONS_TOKEN); + configParam = module.get(CONTROLLER_OPTIONS_TOKEN); }); it('Is valid', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts index 7b98707f..bb973785 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-check-select-field/query-check-select-field.ts @@ -1,17 +1,14 @@ import { BadRequestException, Inject, PipeTransform } from '@nestjs/common'; -import { CONTROL_OPTIONS_TOKEN } from '../../../../constants'; -import { - ConfigParam, - ObjectLiteral, - ValidateQueryError, -} from '../../../../types'; +import { CONTROLLER_OPTIONS_TOKEN } from '../../../../constants'; +import { ValidateQueryError } from '../../../../types'; import { Query } from '../../zod'; +import { EntityControllerParam } from '../../types'; -export class QueryCheckSelectField - implements PipeTransform, Query> +export class QueryCheckSelectField + implements PipeTransform, Query> { - @Inject(CONTROL_OPTIONS_TOKEN) private configParam!: ConfigParam; - transform(value: Query): Query { + @Inject(CONTROLLER_OPTIONS_TOKEN) private configParam!: EntityControllerParam; + transform(value: Query): Query { if (this.configParam.requiredSelectField && value.fields === null) { const error: ValidateQueryError = { code: 'invalid_arguments', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts index 71dc33e4..0a226d8d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.spec.ts @@ -1,7 +1,7 @@ import { BadRequestException } from '@nestjs/common'; -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { QueryFiledInIncludePipe } from './query-filed-in-include.pipe'; -import { Users } from '../../../../mock-utils/typeorm'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; import { Query } from '../../zod'; describe('QueryFiledInIncludePipe', () => { @@ -12,7 +12,7 @@ describe('QueryFiledInIncludePipe', () => { }); it('Should be ok', () => { - const check: Query = { + const check: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -28,7 +28,7 @@ describe('QueryFiledInIncludePipe', () => { }, }; - const check2: Query = { + const check2: Query = { [QueryField.fields]: null, [QueryField.include]: ['roles'], [QueryField.filter]: { @@ -51,7 +51,7 @@ describe('QueryFiledInIncludePipe', () => { }); it('Should be not ok', () => { - const check: Query = { + const check: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -66,7 +66,7 @@ describe('QueryFiledInIncludePipe', () => { size: 1, }, }; - const check2: Query = { + const check2: Query = { [QueryField.fields]: { roles: ['id'], }, @@ -86,7 +86,7 @@ describe('QueryFiledInIncludePipe', () => { }, }; - const check3: Query = { + const check3: Query = { [QueryField.fields]: null, [QueryField.include]: null, [QueryField.filter]: { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts index 8ce987eb..ba621c0c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-filed-on-include/query-filed-in-include.pipe.ts @@ -1,13 +1,13 @@ import { BadRequestException, PipeTransform } from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; +import { ValidateQueryError } from '../../../../types'; import { Query } from '../../zod'; -export class QueryFiledInIncludePipe - implements PipeTransform, Query> +export class QueryFiledInIncludePipe + implements PipeTransform, Query> { - transform(value: Query): Query { + transform(value: Query): Query { const errors: ValidateQueryError[] = []; const { fields, include, sort, filter } = value; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts index c1129549..f4ba6cb8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query-input/query-input.pipe.ts @@ -9,15 +9,14 @@ import { errorMap } from 'zod-validation-error'; import { ZOD_INPUT_QUERY_SCHEMA } from '../../../../constants'; import { ZodInputQuery, InputQuery } from '../../zod'; import { JSONValue } from '../../types'; -import { ObjectLiteral } from '../../../../types'; -export class QueryInputPipe - implements PipeTransform> +export class QueryInputPipe + implements PipeTransform> { @Inject(ZOD_INPUT_QUERY_SCHEMA) - private zodInputQuerySchema!: ZodInputQuery; + private zodInputQuerySchema!: ZodInputQuery; - transform(value: JSONValue): InputQuery { + transform(value: JSONValue): InputQuery { try { return this.zodInputQuerySchema.parse(value, { errorMap: errorMap, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts index 6f62baa4..f2d69856 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.spec.ts @@ -3,18 +3,17 @@ import { InternalServerErrorException, } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { FilterOperand, QueryField } from '@klerick/json-api-nestjs-shared'; import { ZodError } from 'zod'; import { QueryPipe } from './query.pipe'; import { ASC, ZOD_QUERY_SCHEMA } from '../../../../constants'; import { ZodQuery, InputQuery, Query } from '../../zod'; -import { FilterOperand, QueryField } from '../../../../utils/nestjs-shared'; - -type MockEntity = { id: number; name: string }; +import { Users } from '../../../../utils/___test___/test-classes.helper'; describe('QueryPipe', () => { - let queryPipe: QueryPipe; - let zodQuerySchemaMock: ZodQuery; + let queryPipe: QueryPipe; + let zodQuerySchemaMock: ZodQuery; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -29,12 +28,12 @@ describe('QueryPipe', () => { ], }).compile(); - queryPipe = module.get>(QueryPipe); - zodQuerySchemaMock = module.get>(ZOD_QUERY_SCHEMA); + queryPipe = module.get>(QueryPipe); + zodQuerySchemaMock = module.get>(ZOD_QUERY_SCHEMA); }); it('should parse the query successfully using the zod schema', () => { - const inputQuery: InputQuery = { + const inputQuery: InputQuery = { [QueryField.fields]: { target: ['id', 'name'], }, @@ -50,9 +49,9 @@ describe('QueryPipe', () => { [QueryField.sort]: { target: { id: ASC } }, [QueryField.page]: { number: 1, size: 10 }, }; - const parsedQuery: Query = { + const parsedQuery: Query = { [QueryField.fields]: { - target: ['id', 'name'], + target: ['id', 'lastName'], }, [QueryField.filter]: { relation: null, @@ -79,7 +78,7 @@ describe('QueryPipe', () => { const inputQuery = { id: 1, name: 'Invalid', - } as unknown as InputQuery; + } as unknown as InputQuery; const zodError = new ZodError([]); jest.spyOn(zodQuerySchemaMock, 'parse').mockImplementation(() => { @@ -93,7 +92,7 @@ describe('QueryPipe', () => { const inputQuery = { id: 1, name: 'Invalid', - } as unknown as InputQuery; + } as unknown as InputQuery; const unexpectedError = new Error('Unexpected error'); jest.spyOn(zodQuerySchemaMock, 'parse').mockImplementation(() => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts index d4c5d359..488e8136 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/query/query.pipe.ts @@ -8,15 +8,14 @@ import { ZodError } from 'zod'; import { ZOD_QUERY_SCHEMA } from '../../../../constants'; import { ZodQuery, Query, InputQuery } from '../../zod'; -import { ObjectLiteral } from '../../../../types'; -export class QueryPipe - implements PipeTransform, Query> +export class QueryPipe + implements PipeTransform, Query> { @Inject(ZOD_QUERY_SCHEMA) - private zodQuerySchema!: ZodQuery; + private zodQuerySchema!: ZodQuery; - transform(value: InputQuery): Query { + transform(value: InputQuery): Query { try { return this.zodQuerySchema.parse(value); } catch (e) { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts new file mode 100644 index 00000000..23714ca1 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts @@ -0,0 +1,34 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ENTITY_PARAM_MAP, CURRENT_ENTITY } from '../../../constants'; +import { EntityParamMap } from '../types'; +import { AnyEntity, EntityClass, EntityParam } from '../../../types'; + +@Injectable() +export class EntityParamMapService< + E extends object, + IdKey extends string = 'id' +> { + @Inject(ENTITY_PARAM_MAP) private readonly entityParamMap!: EntityParamMap< + EntityClass + >; + + @Inject(CURRENT_ENTITY) private readonly currentEntity!: EntityClass; + + private _entityParaMap!: EntityParam; + + getParamMap( + entity: EntityClass + ): EntityParam { + const paramMap = this.entityParamMap.get(entity); + if (!paramMap) throw new Error(`Param map for: ${entity.name} not found`); + + return paramMap as unknown as EntityParam; + } + + get entityParaMap(): EntityParam { + if (!this._entityParaMap) { + this._entityParaMap = this.getParamMap(this.currentEntity); + } + return this._entityParaMap; + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts new file mode 100644 index 00000000..5c355b89 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts @@ -0,0 +1,47 @@ +import { + HttpException, + Inject, + Injectable, + InternalServerErrorException, +} from '@nestjs/common'; +import { MODULE_OPTIONS_TOKEN } from '../../../constants'; +import { EntityControllerParam } from '../types'; +import { ValidateQueryError } from '../../../types'; +import { HttpExceptionOptions } from '@nestjs/common/exceptions/http.exception'; + +@Injectable() +export class ErrorFormatService { + @Inject(MODULE_OPTIONS_TOKEN) private config!: EntityControllerParam; + private defaultErrorMsg = 'Internal Server Error'; + formatError(error: unknown): HttpException { + if (error instanceof HttpException) { + return error; + } + + const errMessage = + error instanceof Error + ? this.config.debug + ? error.message + : this.defaultErrorMsg + : this.defaultErrorMsg; + + const errorObject: ValidateQueryError = { + code: 'internal_error', + message: errMessage, + path: [], + }; + + const descriptionOrOptions: HttpExceptionOptions = this.config.debug + ? { + description: this.defaultErrorMsg, + cause: error instanceof Error ? error : undefined, + } + : { + description: this.defaultErrorMsg, + }; + return new InternalServerErrorException( + [errorObject], + descriptionOrOptions + ); + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts new file mode 100644 index 00000000..438f47b4 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/index.ts @@ -0,0 +1,3 @@ +export * from './entity-param-map.service'; +export * from './json-api-transformer.service'; +export * from './error-format.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts index 3b9444f7..a5729b22 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts @@ -1,53 +1,30 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ApplicationConfig } from '@nestjs/core'; +import { faker } from '@faker-js/faker'; import { JsonApiTransformerService } from './json-api-transformer.service'; +import { EntityParamMapService } from './entity-param-map.service'; +import { usersEntityParamMapMockData } from '../../../utils/___test___/test.helper'; import { - Addresses, - Roles, Users, - Notes, + Roles, + Addresses, Comments, - UserGroups, - dbRandomName, - mockDbPgLiteTestModule, -} from '../../../mock-utils/microrom'; - -import { faker } from '@faker-js/faker'; -import { Collection, MikroORM } from '@mikro-orm/core'; -import { - CurrentEntityManager, - CurrentEntityMetadata, - CurrentMicroOrmProvider, - EntityPropsMap, -} from '../../micro-orm/factory'; -import { - CURRENT_ENTITY, - ENTITY_MAP_PROPS, - GLOBAL_MODULE_OPTIONS_TOKEN, -} from '../../../constants'; -import { DEFAULT_ARRAY_TYPE } from '../../micro-orm/constants'; -import { EntityClass } from '../../../types'; -import { ZodEntityProps } from '../types'; +} from '../../../utils/___test___/test-classes.helper'; +import { EntityParam } from '../../../types'; +import { Collection } from '@mikro-orm/core'; +import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; describe('JsonApiTransformerService - extractAttributes', () => { - let service: JsonApiTransformerService; + let service: JsonApiTransformerService; const userObject: Users = {} as Users; const urlPrefix = 'api'; const version = '1'; - let mikroORM: MikroORM; - let dbName: string; - let mapProps: Map, ZodEntityProps>; - let mapPropsUser: ZodEntityProps; + let mapPropsService: EntityParamMapService; + let mapPropsUser: EntityParam; beforeAll(async () => { - dbName = dbRandomName(true); const module: TestingModule = await Test.createTestingModule({ - imports: [mockDbPgLiteTestModule(dbName)], providers: [ - CurrentMicroOrmProvider(), - CurrentEntityManager(), - CurrentEntityMetadata(), - JsonApiTransformerService, { provide: ApplicationConfig, useValue: { @@ -59,43 +36,27 @@ describe('JsonApiTransformerService - extractAttributes', () => { }, }, { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap([ - Addresses, - Roles, - Users, - Notes, - Comments, - UserGroups, - ] as any), - { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, - useValue: { options: { arrayType: DEFAULT_ARRAY_TYPE } }, + provide: EntityParamMapService, + useValue: usersEntityParamMapMockData, }, + JsonApiTransformerService, ], }).compile(); service = module.get>( JsonApiTransformerService ); - mapProps = module.get(ENTITY_MAP_PROPS); - const mapPropsUserCheck = mapProps.get(Users); - if (!mapPropsUserCheck) throw new Error('Not found map property for Users'); - mapPropsUser = mapPropsUserCheck; - mikroORM = module.get(MikroORM); - }); - - afterAll(() => { - mikroORM.close(true); + mapPropsService = module.get>( + EntityParamMapService + ); + mapPropsUser = mapPropsService.getParamMap(Users); }); beforeEach(async () => { userObject.id = faker.number.int(); userObject.firstName = faker.person.firstName(); userObject.lastName = faker.person.lastName(); - userObject.isActive = faker.datatype.boolean(); + userObject.isActive = null; userObject.login = faker.internet.userName({ lastName: userObject.lastName, firstName: userObject.firstName, @@ -108,7 +69,11 @@ describe('JsonApiTransformerService - extractAttributes', () => { describe('extractAttributes', () => { it('should extract specified fields from an object', () => { - const fields: (keyof Users)[] = ['firstName', 'lastName', 'login']; + const fields: PropertyKeys[] = [ + 'firstName', + 'lastName', + 'login', + ]; const result = service.extractAttributes(userObject, fields); expect(result).toEqual({ @@ -172,7 +137,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { ] as unknown as Collection; userObject.manager = null as any; - userObject.notes = [] as any; }); it('should transform relationships without "include" option enabled', () => { @@ -197,7 +161,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { it('should transform relationships with "include" option enabled', () => { const query = { include: ['roles'] } as any; - const result = service.transformRelationships( + const result = service.transformRelationships( userObject, mapPropsUser, query @@ -212,7 +176,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'roles') { acum[i]['data'] = userObject.roles.map((relName) => ({ id: relName.id.toString(), - type: mapProps.get(Roles)?.typeName, + type: mapPropsService.getParamMap(Roles)?.typeName, })); } return acum; @@ -234,7 +198,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'addresses') { acum[i]['data'] = { id: userObject.addresses.id.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, }; } return acum; @@ -256,9 +220,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { if (i === 'manager') { acum[i]['data'] = null; } - if (i === 'notes') { - acum[i]['data'] = []; - } return acum; }, {} as Record); @@ -270,7 +231,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.transformRelationships( userObject, - { ...mapPropsUser, relations: [] as any }, + { ...mapPropsUser, relationProperty: {} as any }, query ); @@ -297,7 +258,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { userObject.roles = [roleFake] as unknown as Collection; userObject.manager = null as any; - userObject.notes = [] as any; }); it('should by include', () => { @@ -307,65 +267,49 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.extractIncluded([userObject], query); const rolesInclude = result.find( - (i) => i.type === mapProps.get(Roles)?.typeName + (i) => i.type === mapPropsService.getParamMap(Roles)?.typeName ); const addressesInclude = result.find( - (i) => i.type === mapProps.get(Addresses)?.typeName + (i) => i.type === mapPropsService.getParamMap(Addresses)?.typeName ); const managerInclude = result.find( - (i) => i.type === mapProps.get(Users)?.typeName - ); - const notesInclude = result.find( - (i) => i.type === mapProps.get(Notes)?.typeName + (i) => i.type === mapPropsService.getParamMap(Users)?.typeName ); - expect(notesInclude).toBe(undefined); expect(managerInclude).toBe(undefined); const { id: roleId, ...checkRolesAttr } = roleFake; expect(rolesInclude).toEqual({ id: roleId.toString(), - type: mapProps.get(Roles)?.typeName, + type: mapPropsService.getParamMap(Roles)?.typeName, attributes: checkRolesAttr, links: { - self: `/api/v1/${mapProps.get(Roles)?.typeName}/${roleId}`, - }, - relationships: { - users: { - links: { - self: `/api/v${version}/${ - mapProps.get(Roles)?.typeName - }/${roleId}/relationships/users`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Roles)?.typeName + }/${roleId}`, }, + relationships: {}, }); const { id: addressesId, ...addressesAttr } = userObject.addresses; expect(addressesInclude).toEqual({ id: addressesId.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, attributes: addressesAttr, links: { - self: `/api/v1/${mapProps.get(Addresses)?.typeName}/${addressesId}`, - }, - relationships: { - user: { - links: { - self: `/api/v${version}/${ - mapProps.get(Addresses)?.typeName - }/${addressesId}/relationships/user`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Addresses)?.typeName + }/${addressesId}`, }, + relationships: {}, }); }); - it('should ne include by custom select', () => { + it('should be include by custom select', () => { const userObject = { id: faker.number.int(), firstName: faker.person.firstName(), isActive: faker.datatype.boolean(), - } as any; + } as unknown as Users; userObject.addresses = { id: faker.number.int(), city: faker.location.city(), @@ -380,7 +324,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { { id: faker.number.int(), text: faker.lorem.text(), - kind: undefined, + kind: 'COMMENT', createdAt: undefined, updatedAt: undefined, createdBy: undefined, @@ -404,13 +348,13 @@ describe('JsonApiTransformerService - extractAttributes', () => { addresses: undefined, manager: undefined, userGroup: undefined, - }; + } as any; const query = { include: ['addresses', 'comments', 'manager'], fields: { target: ['firstName', 'isActive'], - comments: ['text'], + comments: ['kind'], manager: ['login'], }, } as any; @@ -418,60 +362,54 @@ describe('JsonApiTransformerService - extractAttributes', () => { const result = service.extractIncluded([userObject], query); const rolesInclude = result.find( - (i) => i.type === mapProps.get(Roles)?.typeName + (i) => i.type === mapPropsService.getParamMap(Roles)?.typeName ); const addressesInclude = result.find( - (i) => i.type === mapProps.get(Addresses)?.typeName + (i) => i.type === mapPropsService.getParamMap(Addresses)?.typeName ); const managerInclude = result.find( - (i) => i.type === mapProps.get(Users)?.typeName + (i) => i.type === mapPropsService.getParamMap(Users)?.typeName ); const commentsInclude = result.find( - (i) => i.type === mapProps.get(Comments)?.typeName - ); - const notesInclude = result.find( - (i) => i.type === mapProps.get(Notes)?.typeName + (i) => i.type === mapPropsService.getParamMap(Comments)?.typeName ); - expect(notesInclude).toBe(undefined); expect(rolesInclude).toBe(undefined); const { id: addressesId, ...addressesAttr } = userObject.addresses; expect(addressesInclude).toEqual({ id: addressesId.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, attributes: addressesAttr, links: { - self: `/api/v1/${mapProps.get(Addresses)?.typeName}/${addressesId}`, - }, - relationships: { - user: { - links: { - self: `/api/v${version}/${ - mapProps.get(Addresses)?.typeName - }/${addressesId}/relationships/user`, - }, - }, + self: `/api/v1/${ + mapPropsService.getParamMap(Addresses)?.typeName + }/${addressesId}`, }, + relationships: {}, }); const { id: commentsId } = userObject.comments[0]; + expect(commentsInclude).toEqual({ id: commentsId.toString(), - type: mapProps.get(Comments)?.typeName, + type: mapPropsService.getParamMap(Comments)?.typeName, attributes: query.fields.comments.reduce((acum: any, field: any) => { + // @ts-ignore acum[field] = userObject.comments[0][field]; return acum; }, {}), links: { - self: `/api/v1/${mapProps.get(Comments)?.typeName}/${commentsId}`, + self: `/api/v1/${ + mapPropsService.getParamMap(Comments)?.typeName + }/${commentsId}`, }, relationships: { - createdBy: { + user: { links: { self: `/api/v1/${ - mapProps.get(Comments)?.typeName - }/${commentsId}/relationships/createdBy`, + mapPropsService.getParamMap(Comments)?.typeName + }/${commentsId}/relationships/user`, }, }, }, @@ -481,57 +419,53 @@ describe('JsonApiTransformerService - extractAttributes', () => { expect(managerInclude).toEqual({ id: managerId.toString(), - type: mapProps.get(Users)?.typeName, + type: mapPropsService.getParamMap(Users)?.typeName, attributes: query.fields.manager.reduce((acum: any, field: any) => { + // @ts-ignore acum[field] = userObject.manager[field]; return acum; }, {}), links: { - self: `/api/v1/${mapProps.get(Users)?.typeName}/${managerId}`, + self: `/api/v1/${ + mapPropsService.getParamMap(Users)?.typeName + }/${managerId}`, }, relationships: { addresses: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/addresses`, }, }, manager: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/manager`, }, }, roles: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/roles`, }, }, userGroup: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/userGroup`, }, }, comments: { links: { self: `/api/v1/${ - mapProps.get(Users)?.typeName + mapPropsService.getParamMap(Users)?.typeName }/${managerId}/relationships/comments`, }, }, - notes: { - links: { - self: `/api/v1/${ - mapProps.get(Users)?.typeName - }/${managerId}/relationships/notes`, - }, - }, }, }); }); @@ -541,7 +475,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { const query = { include: [] } as any; const result = service.transformItem(userObject, mapPropsUser, query); - const { id, manager, notes, roles, addresses, ...checkAttr } = userObject; + const { id, manager, roles, addresses, ...checkAttr } = userObject; expect(result).toEqual({ id: userObject.id.toString(), @@ -576,11 +510,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/comments`, }, }, - notes: { - links: { - self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/notes`, - }, - }, }, }); }); @@ -634,7 +563,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { addresses: { data: { id: userObject.addresses.id.toString(), - type: mapProps.get(Addresses)?.typeName, + type: mapPropsService.getParamMap(Addresses)?.typeName, }, links: { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/addresses`, @@ -662,11 +591,6 @@ describe('JsonApiTransformerService - extractAttributes', () => { self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/userGroup`, }, }, - notes: { - links: { - self: `/api/v1/${mapPropsUser.typeName}/${userObject.id}/relationships/notes`, - }, - }, }, }); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts index 6cd7bc6b..13b733c6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts @@ -2,51 +2,45 @@ import { Inject, Injectable, VersioningType } from '@nestjs/common'; import { ApplicationConfig } from '@nestjs/core'; import { Attributes, - camelToKebab, - Data, - DataResult, - EntityRelation, Include, - MainData, ObjectTyped, + PropertyKeys, Relationships, ResourceData, ResourceObject, -} from '../../../utils/nestjs-shared'; + BaseMainData, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; +import { RoutePathFactory } from '@nestjs/core/router/route-path-factory'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { ENTITY_MAP_PROPS, CURRENT_ENTITY } from '../../../constants'; -import { - EntityProps, - RelationProperty, - ZodEntityProps, - ZodParams, -} from '../types'; +import { EntityParam, EntityClass } from '../../../types'; import { Query, QueryOne } from '../zod'; -import { RoutePathFactory } from '@nestjs/core/router/route-path-factory'; +import { EntityParamMapService } from './entity-param-map.service'; + +function assertColumnName( + entity: E, + columnName: string +): asserts columnName is keyof EntityClass { + const entityType = entity as EntityClass; + if (!(columnName in entityType)) { + throw new Error(`${columnName} not exist in ${entityType.name}`); + } +} Injectable(); -export class JsonApiTransformerService { +export class JsonApiTransformerService< + E extends object, + IdKey extends string = 'id' +> { @Inject(ApplicationConfig) private applicationConfig!: ApplicationConfig; - @Inject(ENTITY_MAP_PROPS) private entityMapProps!: Map< - EntityClass, - ZodEntityProps - >; - @Inject(CURRENT_ENTITY) private currentEntity!: EntityClass; - - private _urlPath!: string[]; - private _currentMapProps!: ZodEntityProps; - get currentMapProps(): ZodEntityProps { - if (!this._currentMapProps) { - const result = this.entityMapProps.get(this.currentEntity); - if (!result) - throw new Error('Not found map for ' + this.currentEntity.name); + @Inject(EntityParamMapService) + private entityParamMapService!: EntityParamMapService; - this._currentMapProps = result; - } + private _urlPath!: string[]; - return this._currentMapProps; + get currentMapProps(): EntityParam { + return this.entityParamMapService.entityParaMap; } get urlPath() { @@ -77,21 +71,21 @@ export class JsonApiTransformerService { public transformData( data: E, - query: QueryOne - ): Pick, 'data' | 'included'>; + query: QueryOne + ): Pick, 'data' | 'included'>; public transformData( data: E[], - query: Query - ): Pick, 'data' | 'included'>; + query: Query + ): Pick, 'data' | 'included'>; public transformData( data: E | E[], - query: Query + query: Query ): - | Pick, 'data' | 'included'> - | Pick, 'data' | 'included'> { + | Pick, 'data' | 'included'> + | Pick, 'data' | 'included'> { if (Array.isArray(data)) { const resultData: Pick< - ResourceObject, + ResourceObject, 'data' | 'included' > = { data: data.map((item) => @@ -106,7 +100,10 @@ export class JsonApiTransformerService { return resultData; } - const resultData: Pick, 'data' | 'included'> = { + const resultData: Pick< + ResourceObject, + 'data' | 'included' + > = { data: this.transformItem(data, this.currentMapProps, query), }; @@ -117,42 +114,48 @@ export class JsonApiTransformerService { return resultData; } - public transformItem( + public transformItem( item: T, - mapProps: ZodEntityProps, - query: Query - ): ResourceData { + mapProps: EntityParam, + query: Query + ): ResourceData { const { fields } = query; - const target = Reflect.get(fields || {}, 'target'); + const targetField = fields && fields.target ? fields.target : null; + assertColumnName(item, mapProps.primaryColumnName); + const props = ObjectTyped.keys(mapProps.propsType).filter((i) => { + if (i.toString() === mapProps.primaryColumnName.toString()) { + return false; + } + if (!targetField) { + return true; + } + + return (targetField as any[]).includes(i); + }); + return { - id: item[mapProps.primaryColumnName].toString(), + id: `${item[mapProps.primaryColumnName]}`, type: mapProps.typeName, - attributes: this.extractAttributes( - item, - mapProps.props.filter((i) => { - if (i === mapProps.primaryColumnName) { - return false; - } - if (!target) { - return true; - } - - return (target as string[]).includes(i); - }) - ), + attributes: this.extractAttributes(item, props), links: { self: this.getLink(mapProps.typeName, item[mapProps.primaryColumnName]), }, - relationships: this.transformRelationships(item, mapProps, query), + relationships: this.transformRelationships( + item, + mapProps, + query + ), }; } - public transformRel>( + public transformRel>( item: E, rel: Rel - ): DataResult { + ): BaseMainData['data'] { const relProps = Reflect.get(this.currentMapProps.relationProperty, rel); - const relationMapPops = this.entityMapProps.get(relProps.entityClass); + const relationMapPops = this.entityParamMapService.getParamMap( + relProps.entityClass as EntityClass + ); if (!relationMapPops) throw new Error('Not found props map for ' + relProps.entityClass); const props = item[rel]; @@ -161,49 +164,55 @@ export class JsonApiTransformerService { return props.map((i: any) => ({ type: relationMapPops.typeName, id: i[relationMapPops.primaryColumnName].toString(), - })); + })) as BaseMainData['data']; } else { + assertColumnName(item[rel] as any, relationMapPops.primaryColumnName); return props ? ({ type: relationMapPops.typeName, - id: props[relationMapPops.primaryColumnName].toString(), + id: (props[relationMapPops.primaryColumnName] as any).toString(), } as any) : null; } } - public transformRelationships( + public transformRelationships< + T extends object = E, + TIdKey extends string = IdKey + >( item: T, - mapProps: ZodEntityProps, - query: Query - ): Relationships { + mapProps: EntityParam, + query: Query + ): Relationships { const { include } = query; - const includeMap = new Map((include || []).map((i) => [i, true])); + const primaryColumnName = mapProps.primaryColumnName; + assertColumnName(item, primaryColumnName); - return mapProps.relations.reduce((acum, i: keyof RelationProperty) => { - acum[i as keyof Relationships] = { + return ObjectTyped.keys(mapProps.relationProperty).reduce((acum, i) => { + acum[i as keyof Relationships] = { links: { self: this.getLink( mapProps.typeName, - item[mapProps.primaryColumnName], + item[primaryColumnName], 'relationships', - i + i.toString() ), }, }; - if (includeMap.has(i)) { - const relationMapPops = this.entityMapProps.get( - mapProps.relationProperty[i].entityClass + if (includeMap.has(i as any)) { + const relationMapPops = this.entityParamMapService.getParamMap( + mapProps.relationProperty[i].entityClass as EntityClass ); if (!relationMapPops) throw new Error( 'Not found props map for ' + mapProps.relationProperty[i].entityClass.name ); + if (mapProps.relationProperty[i].isArray) { - if (item[i] && Array.isArray(item[i]) && item[i].length > 0) { + if (item[i] && Array.isArray(item[i]) && (item[i] as []).length > 0) { // @ts-expect-error incorrect parse acum[i as keyof Relationships]['data'] = item[i].map( (rel: any) => ({ @@ -216,24 +225,30 @@ export class JsonApiTransformerService { acum[i as keyof Relationships]['data'] = []; } } else { - // @ts-expect-error incorrect parse - acum[i as keyof Relationships]['data'] = item[i] - ? { - id: item[i][relationMapPops.primaryColumnName].toString(), - type: relationMapPops.typeName, - } - : null; + const relPrimaryColumnName = relationMapPops.primaryColumnName; + const relType = item[i] as object; + if (item[i]) { + assertColumnName(relType, relPrimaryColumnName); + // @ts-expect-error incorrect parse + acum[i as keyof Relationships]['data'] = { + id: `${relType[relPrimaryColumnName]}`, + type: relationMapPops.typeName, + }; + } else { + // @ts-expect-error incorrect parse + acum[i as keyof Relationships]['data'] = null; + } } } return acum; - }, {} as Relationships); + }, {} as Relationships); } - public extractAttributes( + public extractAttributes( item: T, - fields: (keyof T)[] - ): Attributes { + fields: PropertyKeys[] + ): Attributes { const mapFields = fields.reduce((acum, field) => { acum[field.toString()] = true; return acum; @@ -244,13 +259,13 @@ export class JsonApiTransformerService { acum[name] = value; } return acum; - }, {} as Attributes); + }, {} as Attributes); } - public extractIncluded( + public extractIncluded( data: T[], - query: Query - ): Include[] { + query: Query + ): Include[] { const includeArray: any[] = []; const { include } = query; if (!include) return []; @@ -258,15 +273,15 @@ export class JsonApiTransformerService { const relationProps = this.currentMapProps.relationProperty[relationPropsFromInclude]; if (!relationProps) continue; - const relationMapProp = this.entityMapProps.get( - relationProps.entityClass + const relationMapProp = this.entityParamMapService.getParamMap( + relationProps.entityClass as EntityClass ); if (!relationMapProp) throw new Error( 'Not found props for relation ' + relationPropsFromInclude + 'in' + - this.currentEntity.name + this.currentMapProps.className ); const { fields } = query; @@ -281,7 +296,7 @@ export class JsonApiTransformerService { target: selectFieldForInclude && Array.isArray(selectFieldForInclude) && - selectFieldForInclude.length > 0 + (selectFieldForInclude as []).length > 0 ? selectFieldForInclude : null, }, @@ -294,19 +309,19 @@ export class JsonApiTransformerService { if (Array.isArray(propRel)) { for (const i of propRel as any) { includeArray.push( - this.transformItem( + this.transformItem( i, - relationMapProp as unknown as ZodEntityProps, - queryForInclude as Query + relationMapProp as unknown as EntityParam, + queryForInclude as Query ) ); } } else { includeArray.push( - this.transformItem( + this.transformItem( propRel, - relationMapProp as unknown as ZodEntityProps, - queryForInclude as Query + relationMapProp as unknown as EntityParam, + queryForInclude as Query ) ); } diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts index c5ae1563..a71b36ee 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/filter-operand-model.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { FilterOperand as FilterOperandType } from '../../../utils/nestjs-shared'; +import { FilterOperand as FilterOperandType } from '@klerick/json-api-nestjs-shared'; const title = 'is equal to the conditional of query'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts index 0a1d527f..f99fe501 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts @@ -1,20 +1,20 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; -import { TypeField, ZodEntityProps } from '../../types'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { errorSchema, getEntityMapProps } from '../utils'; +import { EntityClass, TypeField } from '../../../../types'; +import { errorSchema } from '../utils'; +import { EntityParamMapService } from '../../service'; -export function deleteOne( +export function deleteOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { primaryColumnType } = mapEntity.getParamMap(entity); ApiParam({ name: 'id', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts index 2b1c2b8b..a5bf2092 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts @@ -2,26 +2,29 @@ import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; +import { EntityClass, TypeField } from '../../../../types'; import { zodPatchRelationship } from '../../zod'; -import { errorSchema, getEntityMapProps } from '../utils'; +import { errorSchema } from '../utils'; import { ReferenceObject, SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EntityParamMapService } from '../../service'; -export function deleteRelationship( +export function deleteRelationship< + E extends object, + IdKey extends string = 'id' +>( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Delete list of relation for resource "${entityName}"`, @@ -39,7 +42,7 @@ export function deleteRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts index 772290dd..1bd7652c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts @@ -1,25 +1,34 @@ import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger'; import { Type } from '@nestjs/common'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { ZodEntityProps } from '../../types'; -import { errorSchema, getEntityMapProps, jsonSchemaResponse } from '../utils'; +import { EntityClass } from '../../../../types'; + +import { + assertIsKeysOfObject, + errorSchema, + jsonSchemaResponse, +} from '../utils'; import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../../../constants'; +import { EntityParamMapService } from '../../service'; -export function getAll( +export function getAll( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ): void { const { props, relations, relationProperty, primaryColumnName } = - getEntityMapProps(mapEntity, entity); + mapEntity.getParamMap(entity); + + assertIsKeysOfObject(entity, props); + assertIsKeysOfObject(entity, relations); + const entityRelationStructure = {} as any; const relationTree = ObjectTyped.entries(relationProperty).reduce( (acum, [name, props]) => { - const relMap = getEntityMapProps(mapEntity, props.entityClass); + const relMap = mapEntity.getParamMap(props.entityClass as any); acum.push(...relMap.props.map((i) => `${name.toLocaleString()}.${i}`)); entityRelationStructure[name] = relMap.props; return acum; @@ -125,14 +134,14 @@ export function getAll( let sortSeveral = { summary: 'Sort several field', description: 'Sort several field', - value: `${props[1]},-${props[0]}`, + value: `${String(props[1])},-${String(props[0])}`, }; if (relations.length > 0) { ApiQuery({ name: 'include', required: false, - enum: relations, + enum: relations as any, style: 'simple', isArray: true, description: `"${entity.name}" resource item has been extended with existing relations`, @@ -163,7 +172,9 @@ export function getAll( sortSeveral = { summary: 'Sort several field with relation', description: 'Sort several field relation', - value: `${props[1]},-${relationTree[2]},${relationTree[1]},-${props[0]}`, + value: `${String(props[1])},-${relationTree[2]},${ + relationTree[1] + },-${String(props[0])}`, }; } @@ -181,7 +192,7 @@ export function getAll( sortDesc: { summary: 'Sort field by DESC', description: 'Sort field by DESC', - value: `-${props[1]}`, + value: `-${String(props[1])}`, }, sortAscRelation, sortDescRelation, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts index 05fdb3d7..aa5b96ac 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts @@ -1,16 +1,16 @@ import { ApiOperation, ApiParam, ApiQuery, ApiResponse } from '@nestjs/swagger'; -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { Type } from '@nestjs/common'; -import { TypeField, ZodEntityProps } from '../../types'; -import { errorSchema, getEntityMapProps, jsonSchemaResponse } from '../utils'; -import { EntityClass, ObjectLiteral } from '../../../../types'; +import { errorSchema, jsonSchemaResponse } from '../utils'; +import { EntityClass, TypeField } from '../../../../types'; +import { EntityParamMapService } from '../../service'; -export function getOne( +export function getOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; @@ -21,11 +21,11 @@ export function getOne( relationProperty, primaryColumnName, primaryColumnType, - } = getEntityMapProps(mapEntity, entity); + } = mapEntity.getParamMap(entity); const entityRelationStructure = ObjectTyped.entries(relationProperty).reduce( (acum, [name, props]) => { - const relMap = getEntityMapProps(mapEntity, props.entityClass); + const relMap = mapEntity.getParamMap(props.entityClass as any); acum[name] = relMap.props; return acum; }, @@ -81,7 +81,7 @@ export function getOne( ApiQuery({ name: 'include', required: false, - enum: relations, + enum: relations as any, style: 'simple', isArray: true, description: `"${entity.name}" resource item has been extended with existing relations`, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts index ce881025..5fb34738 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts @@ -1,24 +1,20 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { EntityClass, TypeField } from '../../../../types'; +import { errorSchema, schemaTypeForRelation } from '../utils'; +import { EntityParamMapService } from '../../service'; -export function getRelationship( +export function getRelationship( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Get list of relation for resource "${entityName}"`, @@ -36,7 +32,7 @@ export function getRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts index 24113795..c18ddb86 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts @@ -6,31 +6,22 @@ import { import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; +import { EntityClass, TypeField } from '../../../../types'; + import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPatch } from '../../zod'; -import { getParamsForOatchANdPostZod } from '../../factory'; +import { EntityParamMapService } from '../../service'; -export function patchOne( +export function patchOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(mapEntity, entity); + const primaryColumnType = mapEntity.entityParaMap.primaryColumnType; ApiOperation({ summary: `Update item of resource "${entityName}"`, @@ -46,18 +37,9 @@ export function patchOne( ApiBody({ description: `Json api schema for update "${entityName}" item`, - schema: generateSchema( - zodPatch( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ) - ) as SchemaObject | ReferenceObject, + schema: generateSchema(zodPatch(mapEntity)) as + | SchemaObject + | ReferenceObject, required: true, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts index 9301fd62..88b2fbe0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts @@ -6,25 +6,24 @@ import { import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { TypeField, ZodEntityProps } from '../../types'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { EntityClass, TypeField } from '../../../../types'; +import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; +import { EntityParamMapService } from '../../service'; -export function patchRelationship( +export function patchRelationship< + E extends object, + IdKey extends string = 'id' +>( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiOperation({ summary: `Update list of relation for resource "${entityName}"`, @@ -42,7 +41,7 @@ export function patchRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller.prototype, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts index 10c35021..a6fafbfb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts @@ -6,30 +6,19 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Type } from '@nestjs/common'; -import { EntityClass, ObjectLiteral } from '../../../../types'; -import { ZodEntityProps } from '../../types'; +import { EntityClass } from '../../../../types'; import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPost } from '../../zod'; -import { getParamsForOatchANdPostZod } from '../../factory'; +import { EntityParamMapService } from '../../service'; -export function postOne( +export function postOne( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel, - } = getParamsForOatchANdPostZod(mapEntity, entity); ApiOperation({ summary: `Create item of resource "${entityName}"`, @@ -38,18 +27,9 @@ export function postOne( ApiBody({ description: `Json api schema for new "${entityName}" item`, - schema: generateSchema( - zodPost( - primaryColumnType, - typeName, - fieldWithType, - propsDb, - primaryColumnName, - relationArrayProps, - relationPopsName, - primaryColumnTypeForRel - ) - ) as SchemaObject | ReferenceObject, + schema: generateSchema(zodPost(mapEntity)) as + | SchemaObject + | ReferenceObject, required: true, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts index 3e9fe208..b1f41ec2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts @@ -6,25 +6,21 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; -import { - errorSchema, - getEntityMapProps, - schemaTypeForRelation, -} from '../utils'; +import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; -import { TypeField, ZodEntityProps } from '../../types'; -import { EntityClass, ObjectLiteral } from '../../../../types'; +import { EntityClass, TypeField } from '../../../../types'; +import { EntityParamMapService } from '../../service'; -export function postRelationship( +export function postRelationship( controller: Type, descriptor: PropertyDescriptor, entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, methodName: string ) { const entityName = entity.name; - const { relations, primaryColumnType } = getEntityMapProps(mapEntity, entity); + const { relations, primaryColumnType } = mapEntity.getParamMap(entity); ApiParam({ name: 'id', @@ -37,7 +33,7 @@ export function postRelationship( name: 'relName', required: true, type: 'string', - enum: relations, + enum: relations as any, description: `Relation name of resource "${entityName}"`, })(controller, methodName, descriptor); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts index 383607b3..58ab5489 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts @@ -2,52 +2,46 @@ import { Injectable, OnModuleInit, Inject } from '@nestjs/common'; import { DECORATORS } from '@nestjs/swagger/dist/constants'; import { ApiExtraModels, ApiTags } from '@nestjs/swagger'; import { DiscoveryService } from '@nestjs/core'; -import { ObjectTyped } from '../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { PARAMTYPES_METADATA } from '@nestjs/common/constants'; import { - CONTROL_OPTIONS_TOKEN, + CONTROLLER_OPTIONS_TOKEN, CURRENT_ENTITY, JSON_API_CONTROLLER_POSTFIX, JSON_API_DECORATOR_ENTITY, - PARAMS_FOR_ZOD_SCHEMA, - ENTITY_MAP_PROPS, } from '../../../constants'; -import { getProviderName, nameIt } from '../helper'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { EntityClass, ObjectLiteral } from '../../../types'; -import { - DecoratorOptions, - EntityProps, - ZodEntityProps, - ZodParams, -} from '../types'; +import { getProviderName, nameIt } from '../helpers'; +import { JsonBaseController } from '../controllers'; +import { EntityClass } from '../../../types'; +import { DecoratorOptions } from '../types'; import { FilterOperand } from './filter-operand-model'; import { createApiModels } from './utils'; import { Bindings } from '../config/bindings'; import { swaggerMethod } from './method'; +import { EntityParamMapService } from '../service'; @Injectable() -export class SwaggerBindService +export class SwaggerBindService implements OnModuleInit { @Inject(CURRENT_ENTITY) private entity!: EntityClass; @Inject(DiscoveryService) private discoveryService!: DiscoveryService; - @Inject(CONTROL_OPTIONS_TOKEN) private config!: DecoratorOptions; + @Inject(CONTROLLER_OPTIONS_TOKEN) private config!: DecoratorOptions; - @Inject(ENTITY_MAP_PROPS) private mapEntity!: Map< - EntityClass, - ZodEntityProps + @Inject(EntityParamMapService) private mapEntity!: EntityParamMapService< + E, + IdKey >; - onModuleInit(): any { + onModuleInit() { this.initSwagger(); } public initSwagger() { const controllerName = nameIt( - getProviderName(this.entity.name, JSON_API_CONTROLLER_POSTFIX), + getProviderName(this.entity, JSON_API_CONTROLLER_POSTFIX), JsonBaseController ).name; @@ -65,7 +59,7 @@ export class SwaggerBindService if (!controllerInst) throw new Error(`Controller for ${this.entity.name} is empty`); - const mapProps = this.mapEntity.get(this.entity); + const mapProps = this.mapEntity.getParamMap(this.entity); if (!mapProps) throw new Error(`ZodEntityProps for ${this.entity.name} is empty`); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts index 85607ea1..d7ae58a2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts @@ -1,13 +1,36 @@ import { ApiProperty } from '@nestjs/swagger'; import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; + import { - ObjectTyped, - EntityRelation, - camelToKebab, -} from '../../../utils/nestjs-shared'; + AnyEntity, + EntityClass, + EntityParam, + RelationProperty, + TypeField, +} from '../../../types'; -import { EntityProps, TypeField, ZodEntityProps, ZodParams } from '../types'; -import { EntityClass, ObjectLiteral } from '../../../types'; +import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; +import { EntityParamMap } from '../types'; +import { EntityParamMapService } from '../service'; + +export function assertIsKeysOfObject( + object: EntityClass, + element: any +): asserts element is readonly [keyof E] { + if (!Array.isArray(element)) { + throw new Error(element + ' is not keys of ' + object.name); + } + if (false) throw new Error(element + ' not exist in ' + object.name); +} + +export function assertIsKeyOfObject( + object: EntityClass, + element: unknown +): asserts element is PropertyKeys { + if (false) throw new Error(element + 'not exist in ' + object.name); +} export const errorSchema = { type: 'object', @@ -48,20 +71,24 @@ export const errorSchema = { }, }; -export function jsonSchemaResponse( +export function jsonSchemaResponse< + E extends object, + IdKey extends string = 'id' +>( entity: EntityClass, - mapEntity: Map, ZodEntityProps>, + mapEntity: EntityParamMapService, array = false ) { const { propsType, relations, relationProperty, primaryColumnName } = - getEntityMapProps(mapEntity, entity); + mapEntity.getParamMap(entity); + assertIsKeysOfObject(entity, relations); const dataType = { type: 'object', properties: { type: { type: 'string', - const: camelToKebab(entity.name), + const: kebabCase(entity.name), }, id: { type: 'string', @@ -71,6 +98,7 @@ export function jsonSchemaResponse( properties: ObjectTyped.entries(propsType) .filter(([name]) => name !== primaryColumnName) .reduce((acum, [name, type]) => { + assertIsKeyOfObject(entity, name); switch (type) { case TypeField.array: acum[name.toString()] = { @@ -106,15 +134,16 @@ export function jsonSchemaResponse( }, relationships: { type: 'object', - properties: relations.reduce((acum, name) => { + properties: ObjectTyped.keys( + relationProperty as RelationProperty> + ).reduce((acum, name) => { const dataItem = { type: 'object', properties: { type: { type: 'string', - const: getEntityMapProps( - mapEntity, - Reflect.get(relationProperty, name).entityClass + const: mapEntity.getParamMap( + Reflect.get(relationProperty, name).entityClass as any ).typeName, }, id: { @@ -127,7 +156,7 @@ export function jsonSchemaResponse( type: 'array', items: dataItem, }; - acum[name.toString()] = { + acum[name] = { type: 'object', properties: { links: { @@ -221,19 +250,25 @@ export function jsonSchemaResponse( }; } -export function createApiModels( +export function createApiModels( entity: EntityClass, - mapEntity: ZodEntityProps + mapEntity: EntityParam ): EntityClass { const { propsType, props, relations, propsNullable, relationProperty } = mapEntity; + assertIsKeysOfObject(entity, propsNullable); + assertIsKeysOfObject(entity, relations); for (const name of props) { let currentType: any; let required = false; let isArray = false; - required = !(propsNullable as any).includes(name); - const type = Reflect.get(propsType, name); + + assertIsKeyOfObject(entity, name); + + required = !propsNullable.includes(name); + + const type = propsType[name]; isArray = type === 'array'; switch (type) { case TypeField.date: @@ -248,7 +283,7 @@ export function createApiModels( default: currentType = String; } - if (relations.includes(name as string)) { + if (relations.includes(name)) { const propsRel = Reflect.get(relationProperty, name); currentType = propsRel.entityClass; isArray = propsRel.isArray; @@ -300,8 +335,8 @@ export const schemaTypeForRelation = { }, }; -export function getEntityMapProps( - mapEntity: Map, ZodEntityProps>, +export function getEntityMapProps( + mapEntity: EntityParamMap>, entity: EntityClass ) { const entityMap = mapEntity.get(entity); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts similarity index 72% rename from libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts rename to libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts index eebff2fc..949dc6b1 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.types.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts @@ -1,8 +1,8 @@ -import { PipeTransform, RequestMethod } from '@nestjs/common'; import { Type } from '@nestjs/common/interfaces'; -import { PipeFabric } from './module.types'; -import { JsonBaseController } from '../controller/json-base.controller'; -import { ObjectLiteral } from '../../../types'; +import { PipeTransform, RequestMethod } from '@nestjs/common'; +import { JsonBaseController } from '../controllers/json-base.controller'; +import { AnyEntity, EntityClass, PipeMixin } from '../../../types'; +import { EntityControllerParam } from './decorator-options.type'; export type MethodName = | 'getAll' @@ -27,11 +27,16 @@ type MapNameToTypeMethod = { getRelationship: RequestMethod.GET; }; +export type PipeFabric = >( + entity: Entity, + config?: EntityControllerParam +) => PipeMixin; + export interface Binding { path: string; method: MapNameToTypeMethod[T]; name: T; - implementation: JsonBaseController[T]; + implementation: JsonBaseController[T]; parameters: { decorator: ( property?: string, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts new file mode 100644 index 00000000..ea545b87 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.type.ts @@ -0,0 +1,15 @@ +import { MethodName } from './binding.type'; + +import { PrepareParams } from '../../../types'; + +type ControllerOptions = { + allowMethod: Array; + overrideRoute: string; +}; + +export type DecoratorOptions> = Partial< + ControllerOptions & Omit['options'], 'operationUrl'> +>; + +export type EntityControllerParam> = + PrepareParams['options'] & DecoratorOptions; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts deleted file mode 100644 index 4911b5dd..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/decorator-options.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MethodName } from './binding.types'; - -import { RequiredFromPartial, ConfigParam } from '../../../types'; -import { MicroOrmParam } from '../../micro-orm'; -import { TypeOrmParam } from '../../type-orm'; - -export type DecoratorOptions = Partial< - { - allowMethod: Array; - } & RequiredFromPartial ->; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts index d3876db6..25e600cf 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/index.ts @@ -1,6 +1,11 @@ -export * from './module.types'; -export * from './decorator-options.types'; -export * from './binding.types'; -export * from './utils'; -export * from './zod-types'; +export * from './binding.type'; +export * from './decorator-options.type'; export * from './orm-service.type'; +export * from './module.type'; +export type JSONValue = + | string + | number + | boolean + | null + | { [x: string]: JSONValue } + | Array; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts new file mode 100644 index 00000000..d2598f2a --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts @@ -0,0 +1,17 @@ +import { EntityClass, EntityParam } from '../../../types'; + +export type EntityParamMap = Map>; + +export type CheckRelationName = ( + entity: EntityClass, + params: string +) => boolean; + +export type FindOneRowEntity = ( + entity: EntityClass, + params: number | string +) => Promise; + +export type RunInTransaction< + F extends (...arg: any[]) => Promise = (...arg: any[]) => Promise +> = (arg: F) => ReturnType; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts deleted file mode 100644 index 768387c6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.types.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - AnyEntity, - EntityName, - NestImport, - NestController, - RequiredFromPartial, - ConfigParam, - PipeMixin, - ExtractNestType, - ResultModuleOptions, -} from '../../../types'; -import { MicroOrmParam } from '../../micro-orm'; -import { TypeOrmParam } from '../../type-orm'; - -type Controller = ExtractNestType; - -export interface MixinOptions { - entity: EntityName; - controller: Controller | undefined; - config: RequiredFromPartial; - imports: NestImport; - ormModule: ResultModuleOptions['type']; -} - -export type PipeFabric = >( - entity: Entity, - config?: MixinOptions['config'] -) => PipeMixin; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts index 546a8303..21ee0f36 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/orm-service.type.ts @@ -1,10 +1,9 @@ -import { EntityTarget, ObjectLiteral } from '../../../types'; - import { - EntityRelation, ResourceObject, ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; + import { PatchData, PatchRelationshipData, @@ -14,42 +13,42 @@ import { QueryOne, } from '../zod'; -export interface OrmService { - getAll(query: Query): Promise>; - getOne(id: number | string, query: QueryOne): Promise>; +export interface OrmService { + getAll( + query: Query + ): Promise>; + getOne( + id: number | string, + query: QueryOne + ): Promise>; deleteOne(id: number | string): Promise; - postOne(inputData: PostData): Promise>; patchOne( id: number | string, - inputData: PatchData - ): Promise>; - getRelationship>( + inputData: PatchData + ): Promise>; + postOne( + inputData: PostData + ): Promise>; + + getRelationship>( id: number | string, rel: Rel - ): Promise>; - postRelationship>( + ): Promise>; + postRelationship>( id: number | string, rel: Rel, input: PostRelationshipData - ): Promise>; - deleteRelationship>( + ): Promise>; + + deleteRelationship>( id: number | string, rel: Rel, input: PostRelationshipData ): Promise; - patchRelationship>( + + patchRelationship>( id: number | string, rel: Rel, input: PatchRelationshipData - ): Promise>; + ): Promise>; } - -export type FindOneRowEntity = ( - entity: EntityTarget, - params: number | string -) => Promise; - -export type CheckRelationNme = ( - entity: EntityTarget, - params: string -) => boolean; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts deleted file mode 100644 index c254ca95..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/utils.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Type } from '@nestjs/common/interfaces'; - -import { - EntityField, - EntityRelation, - TypeOfArray, - EntityProps, -} from '../../../utils/nestjs-shared'; - -import { ObjectLiteral as Entity } from '../../../types'; - -export { EntityField, EntityProps, EntityRelation, TypeOfArray }; - -export type EntityPropsArray = { - [P in keyof T]: T[P] extends EntityField - ? IsArray extends true - ? P - : never - : never; -}[keyof T]; - -type UnionToIntersection = ( - U extends never ? never : (arg: U) => never -) extends (arg: infer I) => void - ? I - : never; - -export type UnionToTupleMain = UnionToIntersection< - T extends never ? never : (t: T) => T -> extends (_: never) => infer W - ? UnionToTupleMain, [...A, W]> - : A; - -export type UnionToTuple = UnionToTupleMain extends readonly [ - string, - ...string[] -] - ? UnionToTupleMain - : never; - -export type TypeCast = A extends T ? A : never; - -export type CastProps = K extends keyof E ? E[K] : never; - -export type TypeFromType = T extends Type ? A : never; - -export type ConcatStringArray = T extends [ - infer F extends string, - ...infer R extends string[] -] - ? `${F}${ConcatStringArray}` - : ''; - -export type Concat = ConcatStringArray< - [E, '.', F] ->; - -export type ValueOf = T[keyof T]; - -export type JSONValue = - | string - | number - | boolean - | null - | { [x: string]: JSONValue } - | Array; - -export type IsArray = [Extract] extends [never] ? false : true; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts deleted file mode 100644 index c6298320..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/zod-types.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { Type } from '@nestjs/common'; -import { z } from 'zod'; - -import { - EntityProps, - EntityRelation, - UnionToTuple, - CastProps, - TypeOfArray, - EntityPropsArray, - IsArray, -} from './utils'; -import { - EntityTarget, - ObjectLiteral as Entity, - ObjectLiteral, -} from '../../../types'; -import { Collection } from '@mikro-orm/core'; - -export enum PropsNameResultField { - field = 'field', - relations = 'relations', -} - -export type ResultGetField = { - [PropsNameResultField.field]: TupleOfEntityProps; - [PropsNameResultField.relations]: TupleOfEntityRelation; -}; - -export type TupleOfEntityProps< - E, - Props = UnionToTuple> -> = Props extends readonly [string, ...string[]] ? Props : never; -export type TupleOfEntityRelation< - E, - Props = UnionToTuple> -> = Props extends readonly [string, ...string[]] ? Props : never; - -export type RelationTree = { - [K in keyof RelationType]: TypeOfArray extends Entity - ? ResultGetField>['field'] - : never; -}; - -export type RelationType = { - [K in EntityRelation]: Type>>; -}; - -export type ZodInfer any> = z.infer>; - -export type GetFieldForEntity = ( - entity: EntityTarget -) => ResultGetField; - -export type ZodParams< - E extends Entity, - P extends EntityProps, - I = string -> = { - entityFieldsStructure: ResultGetField; - entityRelationStructure: RelationTree; - propsArray: ArrayPropsForEntity; - propsType: AllFieldWithType; - typeId: TypeForId; - typeName: I; - fieldWithType: FieldWithType; - propsDb: PropsForField; - primaryColumn: P; - relationArrayProps: RelationPropsArray; - relationPopsName: RelationPropsTypeName; - primaryColumnType: RelationPrimaryColumnType; -}; - -export type PropsArray = { [K in EntityPropsArray]: true }; - -export type ArrayPropsForEntity = { - target: PropsArray; -} & { - [K in ResultGetField['relations'][number]]: PropsArray< - TypeOfArray> - >; -}; - -export enum TypeField { - array = 'array', - date = 'date', - number = 'number', - boolean = 'boolean', - string = 'string', - object = 'object', -} -export type TypeForId = Extract; - -export type FieldWithType = { - [K in EntityProps]: IsArray extends true - ? TypeField.array - : E[K] extends Date - ? TypeField.date - : E[K] extends number - ? TypeField.number - : E[K] extends boolean - ? TypeField.boolean - : E[K] extends object - ? TypeField.object - : TypeField.string; -}; - -export type AllFieldWithType = FieldWithType & { - [K in EntityRelation]: E[K] extends (infer U extends Entity)[] - ? FieldWithType - : E[K] extends Entity - ? FieldWithType - : never; -}; - -export type PropsForField = { - [K in EntityProps]: PropsFieldItem; -} & { - [K in EntityRelation]: PropsFieldItem; -}; - -export type ColumnType = - | T - | typeof Number - | typeof Date - | typeof Boolean; - -export type PropsFieldItem = { - type: ColumnType; - isArray: boolean; - isNullable: boolean; -}; - -export type RelationPropsArray = { - [K in EntityRelation]: E[K] extends unknown[] - ? true - : E[K] extends Collection> - ? true - : false; -}; - -export type RelationPropsTypeName = { - [K in EntityRelation]: string; -}; - -export type RelationPrimaryColumnType = { - [K in EntityRelation]: TypeForId; -}; - -export type FilterNullableProps< - T, - Props extends readonly (keyof T)[] -> = Props extends [infer Head, ...infer Tail] - ? Head extends keyof T - ? null extends T[Head] - ? [Head, ...FilterNullableProps] - : FilterNullableProps - : FilterNullableProps - : []; - -export type RelationProperty = { - [K in TupleOfEntityRelation[number]]: { - entityClass: TypeOfArray>; - nullable: [Extract] extends [never] ? false : true; - isArray: E[K] extends unknown[] ? true : false; - }; -}; - -export type ZodEntityProps = { - props: TupleOfEntityProps; - propsType: FieldWithType; - propsNullable: FilterNullableProps>; - primaryColumnName: I; - primaryColumnType: TypeForId; - typeName: string; - className: string; - relations: TupleOfEntityRelation; - relationProperty: RelationProperty; -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts index a8b89a19..6408d93f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.spec.ts @@ -1,39 +1,9 @@ -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeField, - TypeForId, -} from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; import { zodPatch, PatchData } from './'; import { ZodError } from 'zod'; -import { - fieldTypeUsers as fieldWithType, - propsDb, - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const typeId: TypeForId = TypeField.number; - -const primaryColumn: EntityProps = 'id'; - -const schema = zodPatch( - typeId, - 'users', - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType -); +const schema = zodPatch(usersEntityParamMapMockData); describe('zodPatch', () => { it('should be ok', () => { @@ -46,11 +16,11 @@ describe('zodPatch', () => { testArrayNull: null, }; const relationships = { - notes: { + roles: { data: [ { - type: 'notes', - id: 'dsfsdf', + type: 'roles', + id: '1', }, ], }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts index b1444e11..b1514d3a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-patch-schema/index.ts @@ -9,67 +9,46 @@ import { zodType, ZodType, } from '../zod-share'; -import { ObjectLiteral } from '../../../../types'; -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeForId, -} from '../../types'; -import { ZodPost } from '../zod-input-post-schema'; -type ZodPatchPatchShape = { +import { EntityParamMapService } from '../../service'; +import { TypeForId } from '../../../../types'; + +type ZodPatchPatchShape = { id: ZodId; - type: ZodType; - attributes: ZodOptional>; - relationships: ZodOptional>; + type: ZodType; + attributes: ZodOptional>; + relationships: ZodOptional>; }; -type ZodInputPatchSchema = ZodObject< - ZodPatchPatchShape, +type ZodInputPatchSchema = ZodObject< + ZodPatchPatchShape, 'strict' >; -type ZodInputPatchDataShape = { - data: ZodInputPatchSchema; +type ZodInputPatchDataShape = { + data: ZodInputPatchSchema; }; -function getShape( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodInputPatchSchema { +function getShape( + entityParamMapService: EntityParamMapService +): ZodInputPatchSchema { const shape = { - id: zodId(typeId), - type: zodType(typeName), - attributes: zodAttributes( - fieldWithType, - propsDb, - primaryColumn, - true - ).optional(), - relationships: zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - true - ).optional(), + id: zodId( + entityParamMapService.entityParaMap.primaryColumnType as TypeForId + ), + type: zodType(entityParamMapService.entityParaMap.typeName), + attributes: zodAttributes(entityParamMapService, true).optional(), + relationships: zodRelationships(entityParamMapService, true).optional(), }; return z.object(shape).strict(); } -function zodDataShape( - shape: ZodInputPatchSchema -): ZodPatch { +export function zodPatch( + entityParamMapService: EntityParamMapService +): ZodPatch { + const shape = getShape(entityParamMapService); + return z .object({ data: shape, @@ -77,35 +56,10 @@ function zodDataShape( .strict(); } -export function zodPatch( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodPatch { - const shape = getShape( - typeId, - typeName, - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType - ); - - return zodDataShape(shape); -} - -export type ZodPatch = ZodObject< - ZodInputPatchDataShape, +export type ZodPatch = ZodObject< + ZodInputPatchDataShape, 'strict' >; -export type PatchData< - E extends ObjectLiteral, - N extends string = string -> = z.infer>['data']; +export type PatchData = z.infer< + ZodPatch +>['data']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts index 70e41e5d..8a5e6ac8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.spec.ts @@ -1,30 +1,8 @@ -import { EntityProps, TypeField, TypeForId } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; -import { zodPost } from './'; import { ZodError } from 'zod'; +import { zodPost } from './'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { - fieldTypeUsers as fieldWithType, - propsDb, - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; - -const typeId: TypeForId = TypeField.number; - -const primaryColumn: EntityProps = 'id'; - -const schema = zodPost( - typeId, - 'users', - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType -); +const schema = zodPost(usersEntityParamMapMockData); describe('zodPost', () => { it('should be ok', () => { @@ -33,20 +11,35 @@ describe('zodPost', () => { const attributes = { login: 'login', lastName: 'sdfsdf', - isActive: true, + firstName: 'sdds', + isActive: 'null', testDate: date.toISOString(), + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, testReal: [`${real}`], testArrayNull: null, }; const relationships = { - notes: { + roles: { data: [ { - type: 'notes', - id: 'dsfsdf', + type: 'roles', + id: '1', }, ], }, + addresses: { + data: { + type: 'addresses', + id: '1', + }, + }, + manager: { + data: { + type: 'users', + id: '1', + }, + }, }; const check = { data: { @@ -75,6 +68,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, relationships, @@ -86,6 +81,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, }, @@ -97,6 +94,8 @@ describe('zodPost', () => { attributes: { ...attributes, ['testDate']: date, + createdAt: date, + updatedAt: date, testReal: [real], }, }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts index 74302679..e79363b3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-post-schema/index.ts @@ -1,6 +1,6 @@ import { z, ZodObject, ZodOptional } from 'zod'; -import { ObjectLiteral } from '../../../../types'; +import { TypeForId } from '../../../../types'; import { ZodId, zodId, @@ -11,60 +11,42 @@ import { ZodRelationships, zodRelationships, } from '../zod-share'; -import { - EntityProps, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - TypeForId, -} from '../../types'; +import { EntityParamMapService } from '../../service'; -type ZodInputPostShape = { +type ZodInputPostShape = { id: ZodOptional; - type: ZodType; - attributes: ZodAttributes; - relationships: ZodOptional>; + type: ZodType; + attributes: ZodAttributes; + relationships: ZodOptional>; }; -type ZodInputPostSchema = ZodObject< - ZodInputPostShape, +type ZodInputPostSchema = ZodObject< + ZodInputPostShape, 'strict' >; -type ZodInputPostDataShape = { - data: ZodInputPostSchema; +type ZodInputPostDataShape = { + data: ZodInputPostSchema; }; -function getShape( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodInputPostSchema { +function getShape( + entityParamMapService: EntityParamMapService +): ZodInputPostSchema { const shape = { - id: zodId(typeId).optional(), - type: zodType(typeName), - attributes: zodAttributes(fieldWithType, propsDb, primaryColumn, false), - relationships: zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - false + id: zodId( + entityParamMapService.entityParaMap.primaryColumnType as TypeForId ).optional(), + type: zodType(entityParamMapService.entityParaMap.typeName), + attributes: zodAttributes(entityParamMapService, false), + relationships: zodRelationships(entityParamMapService, false).optional(), }; return z.object(shape).strict(); } -function zodDataShape( - shape: ZodInputPostSchema -): ZodPost { +function zodDataShape( + shape: ZodInputPostSchema +): ZodPost { return z .object({ data: shape, @@ -72,38 +54,22 @@ function zodDataShape( .strict(); } -export function zodPost( - typeId: TypeForId, - typeName: N, - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType -): ZodPost { - const shape = getShape( - typeId, - typeName, - fieldWithType, - propsDb, - primaryColumn, - relationArrayProps, - relationPopsName, - primaryColumnType - ); +export function zodPost( + entityParamMapService: EntityParamMapService +): ZodPost { + const shape = getShape(entityParamMapService); return zodDataShape(shape); } -export type ZodPost = ZodObject< - ZodInputPostDataShape, +export type ZodPost = ZodObject< + ZodInputPostDataShape, 'strict' >; -export type Post = z.infer< - ZodPost +export type Post = z.infer< + ZodPost >; -export type PostData = Post< +export type PostData = Post< E, - N + IdKey >['data']; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts index eb999c51..8978de09 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.spec.ts @@ -1,14 +1,8 @@ import { zodFieldsInputQuery } from './fields'; -import { ResultGetField } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { userFieldsStructure } from '../../../../utils/___test___/test.helper'; - -const validRelationList: ResultGetField['relations'] = - userFieldsStructure['relations']; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodFieldsInputQuerySchema', () => { - const schema = zodFieldsInputQuery(validRelationList); + const schema = zodFieldsInputQuery(usersEntityParamMapMockData); it('should validate successfully with a valid target and relation', () => { const targetInput = 'field1,field2'; @@ -88,6 +82,7 @@ describe('zodFieldsInputQuerySchema', () => { }; const result = schema.safeParse(input); + expect.assertions(5); expect(result.success).toBe(false); if (!result.success) { @@ -95,13 +90,13 @@ describe('zodFieldsInputQuerySchema', () => { 'Expected string, received null' ); expect(result.error.issues[1].message).toContain( - 'Expected string, received boolean' + 'Expected string, received array' ); expect(result.error.issues[2].message).toContain( 'Expected string, received number' ); expect(result.error.issues[3].message).toContain( - 'Expected string, received array' + ' Fields should be have only props: ["target","addresses","manager","roles","comments","userGroup"]' ); } }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts index 93d94c81..25b672c6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/fields.ts @@ -1,9 +1,9 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField, ZodInfer } from '../../types'; +import { EntityParam } from '../../../../types'; import { nonEmptyObject, getValidationErrorForStrict } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodRules() { return z @@ -14,26 +14,34 @@ function getZodRules() { type ZodRule = ReturnType; -export function zodFieldsInputQuery( - relationList: ResultGetField['relations'] +export function zodFieldsInputQuery( + entityParamMapService: EntityParamMapService ) { const target = z.object({ target: getZodRules(), }); - const relation = relationList.reduce( + const relation = entityParamMapService.entityParaMap.relations.reduce( (acum, item) => ({ ...acum, - [item]: getZodRules(), + [item as PropertyKey]: getZodRules(), }), {} as { - [K in ResultGetField['relations'][number]]: ZodRule; + [K in EntityParam['relations'][number] & PropertyKey]: ZodRule; } ); return target .merge(z.object(relation)) - .strict(getValidationErrorForStrict(['target', ...relationList], 'Fields')) + .strict( + getValidationErrorForStrict( + [ + 'target', + ...(entityParamMapService.entityParaMap.relations as string[]), + ], + 'Fields' + ) + ) .refine(nonEmptyObject(), { message: 'Validation error: Need select field for target or relation', }) @@ -54,6 +62,7 @@ export function zodFieldsInputQuery( }); } -export type ZodFieldsInputQuery = ZodInfer< - typeof zodFieldsInputQuery ->; +export type ZodFieldsInputQuery< + E extends object, + IdKey extends string +> = z.infer>>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts index 1455300a..95a32fd3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.spec.ts @@ -1,17 +1,9 @@ import { zodFilterInputQuery } from './filter'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ResultGetField } from '../../types'; - -import { - userFieldsStructure, - userRelations, -} from '../../../../utils/___test___/test.helper'; - -const userFields: ResultGetField['field'] = userFieldsStructure['field']; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodFilterInputQuery', () => { it('should return transformed result with relation and target when valid data is provided', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { login: { eq: 'johndoe' }, addresses: { eq: 'null' }, @@ -36,14 +28,14 @@ describe('zodFilterInputQuery', () => { }); it('should return null relation and target when no data is provided', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const result = schema.parse({}); expect(result).toEqual({ relation: null, target: null }); }); it('should ignore invalid fields and not include them in the result', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { invalidField: { eq: 'should be ignored' }, login: { eq: 'johndoe', gte: '123' }, @@ -58,7 +50,7 @@ describe('zodFilterInputQuery', () => { }); it('should handle nested relations correctly', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const input = { 'manager.firstName': { like: 'Jane' }, 'manager.lastName': { nin: 'Doe,Jim' }, @@ -78,7 +70,7 @@ describe('zodFilterInputQuery', () => { }); it('should throw a validation error for invalid structures', () => { - const schema = zodFilterInputQuery(userFields, userRelations); + const schema = zodFilterInputQuery(usersEntityParamMapMockData); const invalidInput = { login: { unknownOperator: 'invalid' }, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts new file mode 100644 index 00000000..0bdcd177 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.test-d.ts @@ -0,0 +1,37 @@ +import { ZodFilterInputQuery } from './filter'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { expectAssignable, expectNotAssignable } from 'tsd'; + +type FilterType = ZodFilterInputQuery; +const checkShape = { + target: { + id: { + some: '', + eq: '', + }, + testArrayNull: { + some: '', + }, + addresses: { + eq: 'null', + }, + }, + relation: { + addresses: { + arrayField: { + in: '', + }, + }, + }, +} satisfies FilterType; +expectAssignable(checkShape); +expectNotAssignable({ + ...checkShape, + notAllow: {}, +}); +expectNotAssignable({ + ...checkShape, + addresses: { + in: null, + }, +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts index 53f69f68..8e651cfb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/filter.ts @@ -1,25 +1,33 @@ import { FilterOperand, - ObjectTyped, isString, -} from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; + ObjectTyped, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodType } from 'zod'; +import { EntityParamMapService } from '../../service'; +import { getRelationProps, oneOf, stringLongerThan } from '../zod-utils'; import { - RelationTree, - ResultGetField, + EntityParam, + EntityRelationProps, UnionToTuple, - ZodInfer, -} from '../../types'; -import { ObjectLiteral } from '../../../../types'; +} from '../../../../types'; + +type FilterType = Partial<{ + [key in FilterOperand]: string | string[]; +}>; -import { oneOf, stringLongerThan } from '../zod-utils'; +type OutPutFilter = { + relation: null | Record>; + target: null | Record; +}; const arrayOp = { [FilterOperand.in]: true, [FilterOperand.nin]: true, [FilterOperand.some]: true, }; + function convertToFilterObject( value: Record | string ): Partial<{ @@ -41,36 +49,6 @@ function convertToFilterObject( } } -type FilterType = Partial<{ - [key in FilterOperand]: string | string[]; -}>; - -type OutPutFilter = { - relation: null | Record>; - target: null | Record; -}; - -function getZodRulesForRelation() { - return z - .union([ - z - .object({ - [FilterOperand.eq]: z - .union([z.literal('null'), z.null()]) - .transform(() => null), - }) - .strict(), - z - .object({ - [FilterOperand.ne]: z - .union([z.literal('null'), z.null()]) - .transform(() => null), - }) - .strict(), - ]) - .optional(); -} - function getZodRulesForFilterOperator() { const filterConditional = z .union([z.string().refine(stringLongerThan()), z.null(), z.number()]) @@ -94,28 +72,46 @@ function getZodRulesForFilterOperator() { return z.union([filterConditional, conditional]).optional(); } -function shapeForArray< - R extends readonly [string, ...string[]], - Z extends ZodRulesForRelation | ZodRulesForFilterOperator ->(fields: R, zodSchema: Z) { - return fields.reduce( - (acum, item) => ({ - ...acum, - [item]: zodSchema, - }), - {} as { - [K in R[number]]: Z; - } - ); +export type ZodRulesForFilterOperator = ReturnType< + typeof getZodRulesForFilterOperator +>; + +function getZodRulesForRelation() { + return z + .union([ + z + .object({ + [FilterOperand.eq]: z + .union([z.literal('null'), z.null()]) + .transform(() => null), + }) + .strict(), + z + .object({ + [FilterOperand.ne]: z + .union([z.literal('null'), z.null()]) + .transform(() => null), + }) + .strict(), + ]) + .optional(); } -function getTupleConcatRelationFields( - relationList: RelationTree -): UnionToTuple< +type ZodRulesForRelation = ReturnType; + +export type ConcatRelationField< + E extends object, + IdKey extends string +> = UnionToTuple< { - [K in keyof RelationTree]: `${K & string}.${RelationTree[K][number]}`; - }[keyof RelationTree] -> { + [K in keyof EntityRelationProps]: `${K & + string}.${EntityRelationProps[K][number] & string}`; + }[keyof EntityRelationProps] +>; + +function getTupleConcatRelationFields( + relationList: EntityRelationProps +): ConcatRelationField { const result: string[] = []; for (const [key, val] of ObjectTyped.entries(relationList)) { @@ -125,37 +121,65 @@ function getTupleConcatRelationFields( } } - return result as any; + return result as ConcatRelationField; } -type ZodRulesForRelation = ReturnType; -type ZodRulesForFilterOperator = ReturnType< - typeof getZodRulesForFilterOperator ->; +export type ShapeArrayInput = + | EntityParam['props'] + | EntityParam['relations'] + | ConcatRelationField; + +export function shapeForArray< + E extends object, + Z extends ZodType, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList, zodSchema: Z) { + return fields.reduce( + (acum, item) => ({ + ...acum, + [item as PropertyKey]: zodSchema, + }), + {} as { + [K in PropsList[number] & PropertyKey]: Z; + } + ); +} -export function zodFilterInputQuery( - fields: ResultGetField['field'], - relationList: RelationTree +export function zodFilterInputQuery( + entityParamMapService: EntityParamMapService ) { const target = z.object( - shapeForArray(fields, getZodRulesForFilterOperator()) + shapeForArray< + E, + ZodRulesForFilterOperator, + IdKey, + EntityParam['props'] + >(entityParamMapService.entityParaMap.props, getZodRulesForFilterOperator()) ); - const relationTuple = ObjectTyped.keys(relationList) as UnionToTuple< - keyof RelationTree - >; - const relations = z.object( - shapeForArray(relationTuple, getZodRulesForRelation()) + shapeForArray< + E, + ZodRulesForRelation, + IdKey, + EntityParam['relations'] + >(entityParamMapService.entityParaMap.relations, getZodRulesForRelation()) ); + const relationList = getRelationProps(entityParamMapService); + const relationFields = z.object( - shapeForArray( + shapeForArray< + E, + ZodRulesForFilterOperator, + IdKey, + ConcatRelationField + >( getTupleConcatRelationFields(relationList), getZodRulesForFilterOperator() ) ); - return target .merge(relations) .merge(relationFields) @@ -191,6 +215,7 @@ export function zodFilterInputQuery( }); } -export type ZodFilterInputQuery = ZodInfer< - typeof zodFilterInputQuery ->; +export type ZodFilterInputQuery< + E extends object, + IdKey extends string +> = z.infer>>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts index b5a72ad8..dd5e8448 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/include.ts @@ -1,6 +1,5 @@ +import { isString } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { isString } from '../../../../utils/nestjs-shared'; -import { ZodInfer } from '../../types'; export function zodIncludeInputQuery() { return z @@ -15,4 +14,6 @@ export function zodIncludeInputQuery() { }); } -export type ZodIncludeInputQuery = ZodInfer; +export type ZodIncludeInputQuery = z.infer< + ReturnType +>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts index dc0691c7..9a89e07d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.spec.ts @@ -1,24 +1,11 @@ -import { QueryField, ObjectTyped } from '../../../../utils/nestjs-shared'; -import { zodInputQuery } from './index'; - -import { ResultGetField, TupleOfEntityRelation } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { - userFieldsStructure, - userRelations, -} from '../../../../utils/___test___/test.helper'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const userFields: ResultGetField['field'] = userFieldsStructure['field']; - -const entityFieldsStructure = { - field: userFields, - relations: ObjectTyped.keys(userRelations) as TupleOfEntityRelation, -}; +import { zodInputQuery } from './index'; describe('zodInputQuery', () => { it('should validate a correct input query object', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: { target: 'login', @@ -40,7 +27,7 @@ describe('zodInputQuery', () => { }); it('should throw an error for an invalid field in the input query', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['invalidRelation.invalidField'], [QueryField.filter]: { id: 1 }, @@ -53,7 +40,7 @@ describe('zodInputQuery', () => { }); it('should throw an error if an unexpected key is present in the input query', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['roles.name'], [QueryField.filter]: { id: 1 }, @@ -67,7 +54,7 @@ describe('zodInputQuery', () => { }); it('should throw an error when a required field is missing', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.fields]: ['roles.name'], [QueryField.include]: ['roles'], @@ -79,7 +66,7 @@ describe('zodInputQuery', () => { }); it('should validate input with empty but valid fields', () => { - const schema = zodInputQuery(entityFieldsStructure, userRelations); + const schema = zodInputQuery(usersEntityParamMapMockData); const input = { [QueryField.page]: { number: 1, size: 10 }, }; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts index ac58dd4d..00e4f0e6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/index.ts @@ -1,27 +1,20 @@ -import { QueryField } from '../../../../utils/nestjs-shared'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { z } from 'zod'; -import { RelationTree, ResultGetField } from '../../types'; -import { ObjectLiteral } from '../../../../types'; +import { EntityParamMapService } from '../../service'; import { zodFieldsInputQuery } from './fields'; import { zodFilterInputQuery } from './filter'; import { zodIncludeInputQuery } from './include'; import { zodSortInputQuery } from './sort'; import { zodPageInputQuery } from '../zod-share'; -export function zodInputQuery( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree +export function zodInputQuery( + entityParamMapService: EntityParamMapService ) { return z .object({ - [QueryField.fields]: zodFieldsInputQuery( - entityFieldsStructure.relations - ), - [QueryField.filter]: zodFilterInputQuery( - entityFieldsStructure.field, - entityRelationStructure - ), + [QueryField.fields]: zodFieldsInputQuery(entityParamMapService), + [QueryField.filter]: zodFilterInputQuery(entityParamMapService), [QueryField.include]: zodIncludeInputQuery(), [QueryField.sort]: zodSortInputQuery(), [QueryField.page]: zodPageInputQuery(), @@ -33,7 +26,9 @@ export function zodInputQuery( ); } -export type ZodInputQuery = ReturnType< - typeof zodInputQuery +export type ZodInputQuery = ReturnType< + typeof zodInputQuery +>; +export type InputQuery = z.infer< + ZodInputQuery >; -export type InputQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts index 105fab4e..1142a6f2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-input-query-schema/sort.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import { ASC, DESC } from '../../../../constants'; -import { ZodInfer } from '../../types'; export function zodSortInputQuery() { return z @@ -34,4 +33,4 @@ export function zodSortInputQuery() { }); } -export type ZodSortInputQuery = ZodInfer; +export type ZodSortInputQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts index 704960e0..07da2780 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.spec.ts @@ -1,17 +1,11 @@ import { zodFieldsQuery } from './fields'; -import { Users } from '../../../../mock-utils/typeorm'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { - userFields, - userRelations, -} from '../../../../utils/___test___/test.helper'; - -const schema = zodFieldsQuery(userFields, userRelations); +const schema = zodFieldsQuery(usersEntityParamMapMockData); describe('zodFieldsQuerySchema', () => { it('should validate a target field correctly', () => { const input = { target: ['id'] }; const result = schema.safeParse(input); - expect(result.success).toBe(true); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts index 5b8f65c8..ea8eb6d4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/fields.ts @@ -1,13 +1,23 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodObject } from 'zod'; -import { nonEmptyObject, uniqueArray } from '../zod-utils'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField, RelationTree } from '../../types'; +import { getRelationProps, nonEmptyObject, uniqueArray } from '../zod-utils'; +import { + EntityParam, + EntityRelationProps, + NonEmptyStringTuple, +} from '../../../../types'; +import { EntityParamMapService } from '../../service'; + +function getZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList) { + const fieldsProps: NonEmptyStringTuple = fields as any; -function getZodRules(fields: K) { return z - .enum(fields) + .enum(fieldsProps) .array() .nonempty() .refine(uniqueArray(), { @@ -16,40 +26,58 @@ function getZodRules(fields: K) { .optional(); } -type ZodRule = ReturnType< - typeof getZodRules ->; +type ShapeArrayInput = + | EntityParam['props'] + | EntityRelationProps[keyof EntityRelationProps]; + +type ZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +> = ReturnType>; -type TargetRelationShape = { - [K in keyof RelationTree]: ZodRule[K]>; +type ZodFieldsShape = { + target: ZodFieldRule['props']>; +} & { + [K in keyof EntityRelationProps]: ZodFieldRule< + E, + IdKey, + EntityRelationProps[K] + >; }; -export function zodFieldsQuery( - fields: ResultGetField['field'], - relationList: RelationTree -) { - const target = { - target: getZodRules(fields), - }; +function getShapeFields( + entityParamMapService: EntityParamMapService +): ZodObject, 'strict'> { + const relationList = getRelationProps(entityParamMapService); - const relation = {} as TargetRelationShape; + const fieldShape = ObjectTyped.entries(relationList).reduce( + (acum, [key, val]) => ({ + ...acum, + [key as PropertyKey]: getZodFieldRule(val), + }), + { + target: getZodFieldRule['props']>( + entityParamMapService.entityParaMap.props + ), + } as ZodFieldsShape + ); - for (const [key, value] of ObjectTyped.entries(relationList)) { - relation[key] = getZodRules(value); - } + return z.object(fieldShape).strict('Should be only target of relation'); +} - return z - .object({ - ...target, - ...relation, - }) - .strict('Should be only target of relation') +export function zodFieldsQuery( + entityParamMapService: EntityParamMapService +) { + return getShapeFields(entityParamMapService) .refine(nonEmptyObject(), { message: 'Validation error: Select target or relation fields', }) .nullable(); } -export type ZodFieldsQuery = ReturnType< - typeof zodFieldsQuery +export type ZodFieldsQuery = ReturnType< + typeof zodFieldsQuery +>; +export type FieldsQuery = z.infer< + ZodFieldsQuery >; -export type FieldsQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts index dbc637f8..b6df96b6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.spec.ts @@ -1,44 +1,16 @@ -import { zodFilterQuery } from './filter'; -import { Users } from '../../../../mock-utils/typeorm'; -import { ArrayPropsForEntity } from '../../types'; import { ZodError } from 'zod'; -import { ZodFilterInputQuery } from '../zod-input-query-schema/filter'; - -import { - userFields, - userRelations, - propsType, -} from '../../../../utils/___test___/test.helper'; -const propsArray: ArrayPropsForEntity = { - target: { - testArrayNull: true, - testReal: true, - }, - addresses: { - arrayField: true, - }, - userGroup: {}, - manager: { - testArrayNull: true, - testReal: true, - }, - comments: {}, - notes: {}, - roles: {}, -}; +import { zodFilterQuery } from './filter'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { ZodFilterInputQuery } from '../zod-input-query-schema/filter'; -const schema = zodFilterQuery( - userFields, - userRelations, - propsArray, - propsType -); +const schema = zodFilterQuery(usersEntityParamMapMockData); describe('Check "filter" zod schema', () => { describe('Valid schema', () => { it('Valid schema - check1', () => { - const check1: ZodFilterInputQuery = { + const check1: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -52,7 +24,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check2', () => { - const check2: ZodFilterInputQuery = { + const check2: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -74,7 +46,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check3', () => { - const check3: ZodFilterInputQuery = { + const check3: ZodFilterInputQuery = { target: null, relation: null, }; @@ -83,7 +55,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check4', () => { - const check4: ZodFilterInputQuery = { + const check4: ZodFilterInputQuery = { target: null, relation: { comments: { @@ -103,7 +75,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check5', () => { - const check5: ZodFilterInputQuery = { + const check5: ZodFilterInputQuery = { target: null, relation: { comments: { @@ -123,7 +95,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check6', () => { - const check6: ZodFilterInputQuery = { + const check6: ZodFilterInputQuery = { target: { id: { gte: '1213', @@ -140,7 +112,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check7', () => { - const check7: ZodFilterInputQuery = { + const check7: ZodFilterInputQuery = { target: { isActive: { eq: 'true', @@ -153,7 +125,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check8', () => { - const check8: ZodFilterInputQuery = { + const check8: ZodFilterInputQuery = { target: { createdAt: { eq: '2023-12-08T09:40:58.020Z', @@ -166,7 +138,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check9', () => { - const check9: ZodFilterInputQuery = { + const check9: ZodFilterInputQuery = { target: { createdAt: { eq: 'null', @@ -181,7 +153,7 @@ describe('Check "filter" zod schema', () => { }); it('Valid schema - check10', () => { - const check: ZodFilterInputQuery = { + const check: ZodFilterInputQuery = { target: { id: { gte: '1213', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts index 8253787c..26648edd 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/filter.ts @@ -1,33 +1,20 @@ -import { z, ZodOptional } from 'zod'; import { FilterOperand, - ObjectTyped, FilterOperandOnlyInNin, FilterOperandOnlySimple, -} from '../../../../utils/nestjs-shared'; + ObjectTyped, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodOptional } from 'zod'; +import { EntityParamMapService } from '../../service'; +import { EntityParam, TypeField, TypeOfConstructor } from '../../../../types'; import { - AllFieldWithType, - ArrayPropsForEntity, - RelationTree, - ResultGetField, - IsArray, - TypeField, - EntityProps, - TypeOfArray, - CastProps, - TypeCast, - PropsArray, -} from '../../types'; -import { ObjectLiteral } from '../../../../types'; -import { - stringLongerThan, arrayItemStringLongerThan, - stringMustBe, elementOfArrayMustBe, - oneOf, - guardIsKeyOfObject, nonEmptyObject, + oneOf, + stringLongerThan, + stringMustBe, } from '../zod-utils'; const zodRuleForString = z.union([ @@ -49,6 +36,10 @@ const zodNullRule = z.union([ z.literal(null).transform((r) => 'null' as const), ]); +const zodRuleForArrayField = z + .object({ [FilterOperand.some]: zodRuleStringArray }) + .strict(); + const zodRuleFilterRelationSchema = z.union([ z .object({ @@ -61,9 +52,6 @@ const zodRuleFilterRelationSchema = z.union([ }) .strict(), ]); -const zodRuleForArrayField = z - .object({ [FilterOperand.some]: zodRuleStringArray }) - .strict(); function getZodRulesForField(type: TypeField = TypeField.string) { const simpleShape = ObjectTyped.entries(FilterOperandOnlySimple).reduce( @@ -111,119 +99,120 @@ function getZodRulesForField(type: TypeField = TypeField.string) { ); } -function getFilterPropsShapeForEntity( - fields: ResultGetField['field'], - propsArrayTarget: PropsArray, - propsType: AllFieldWithType -) { - return fields.reduce( - (acum, field) => ({ - ...acum, - [field]: (Reflect.get(propsArrayTarget, field) - ? zodRuleForArrayField - : getZodRulesForField(propsType[field as EntityProps]) - ).optional(), - }), - {} as FilterProps['field']> - ); -} - -function getZodRulesForRelationShape( - shape: FilterProps['field']> +function getZodRulesForRelationShape( + shape: FilterProps ) { return z.object(shape).strict().optional().refine(nonEmptyObject()); } type ZodRuleForString = typeof zodRuleForString; type ZodRuleStringArray = typeof zodRuleStringArray; -type ZodRuleFilterRelationSchema = typeof zodRuleFilterRelationSchema; type ZodRuleForArrayField = typeof zodRuleForArrayField; +type ZodRuleFilterRelationSchema = typeof zodRuleFilterRelationSchema; type ZodRulesForField = ReturnType; -type ZodRulesForRelationShape = ReturnType< - typeof getZodRulesForRelationShape +type ZodRulesForRelationShape< + E extends object, + IdKey extends string +> = ReturnType>; + +type RelTypeBase< + E extends object, + IdKey extends string, + Rel extends keyof EntityParam['relationProperty'] +> = TypeOfConstructor< + EntityParam['relationProperty'][Rel]['entityClass'] >; -type FilterProps< - E extends ObjectLiteral, - P extends readonly [string, ...string[]] -> = { - [Props in P[number]]: Props extends keyof E - ? IsArray extends true +type RelType< + E extends object, + IdKey extends string, + Rel extends keyof EntityParam['relationProperty'] +> = RelTypeBase extends object + ? RelTypeBase + : never; + +type RelationFilterProps = { + [R in keyof EntityParam< + E, + IdKey + >['relationProperty']]: ZodRulesForRelationShape, IdKey>; +}; + +export type FilterProps = { + [Props in EntityParam['props'][number] & + PropertyKey]: Props extends keyof E + ? E[Props] extends TypeField.array ? ZodOptional : ZodOptional : never; }; -type RelationType = TypeCast< - TypeOfArray>, - ObjectLiteral ->; - -type RelationFilterProps = { - [R in keyof RelationTree]: ZodRulesForRelationShape>; +type TargetRelationShape = { + [Props in EntityParam['relations'][number] & + PropertyKey]: ZodOptional; }; -type TargetRelationShape = { - [K in ResultGetField['relations'][number]]: ZodOptional; -}; +type ResultTargetType = FilterProps< + E, + IdKey +> & + TargetRelationShape; + +function getFilterPropsShapeForEntity( + entityParam: EntityParam +): FilterProps { + return entityParam.props.reduce((acum, field) => { + const propertyType = Reflect.get( + entityParam.propsType, + field as PropertyKey + ); + const value = + propertyType === TypeField.array + ? zodRuleForArrayField + : getZodRulesForField(propertyType); -export function zodFilterQuery( - fields: ResultGetField['field'], - relationTree: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -) { - const { target: propsArrayTarget, ...otherRelationPropsArray } = propsArray; + Reflect.set(acum, field as PropertyKey, value.optional()); - const fieldsFilterProps = getFilterPropsShapeForEntity( - fields, - propsArrayTarget, - propsType - ); + return acum; + }, {} as FilterProps); +} - const targetRelation = ObjectTyped.keys(relationTree).reduce( +export function zodFilterQuery( + entityParamMapService: EntityParamMapService +) { + const targetResult = entityParamMapService.entityParaMap.relations.reduce( (acum, item) => ({ ...acum, - [item]: zodRuleFilterRelationSchema.optional(), + [item as PropertyKey]: zodRuleFilterRelationSchema.optional(), }), - {} as TargetRelationShape + getFilterPropsShapeForEntity( + entityParamMapService.entityParaMap + ) as ResultTargetType ); - const relationFilterProps = ObjectTyped.keys(relationTree).reduce( - (acum, name) => { - type F = typeof name; - type RT = RelationType; - type RTF = ResultGetField['field']; - - guardIsKeyOfObject(otherRelationPropsArray, name); - const relationField = relationTree[name] as RTF; - const relationPropsArray = otherRelationPropsArray[ - name - ] as PropsArray; - const relationPropsType = propsType[name] as AllFieldWithType; - - const filterProps = getFilterPropsShapeForEntity( - relationField, - relationPropsArray, - relationPropsType - ); - - const zodFilter = getZodRulesForRelationShape(filterProps); - - return { - ...acum, - [name]: zodFilter.optional(), - }; - }, - {} as RelationFilterProps - ); + const relationFilterProps = ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [relName, relProps]) => { + type RT = TypeOfConstructor extends object + ? TypeOfConstructor + : never; + const relParams = entityParamMapService.getParamMap( + relProps.entityClass as any + ) as EntityParam; + + const zodFilter = getZodRulesForRelationShape( + getFilterPropsShapeForEntity(relParams) + ); + + return { + ...acum, + [relName]: zodFilter.optional(), + }; + }, {} as RelationFilterProps); const targetShapeFilter = { target: z - .object({ - ...fieldsFilterProps, - ...targetRelation, - }) + .object(targetResult) .strict() .optional() .refine(nonEmptyObject()) @@ -239,7 +228,9 @@ export function zodFilterQuery( return z.object(targetShapeFilter).strict().refine(nonEmptyObject()); } -export type ZodFilterQuery = ReturnType< - typeof zodFilterQuery +export type ZodFilterQuery = ReturnType< + typeof zodFilterQuery +>; +export type FilterQuery = z.infer< + ZodFilterQuery >; -export type FilterQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts index 97d00ecd..438b4f82 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.spec.ts @@ -1,10 +1,7 @@ import { zodIncludeQuery } from './include'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -import { Users } from '../../../../mock-utils/typeorm'; - -import { relationList } from '../../../../utils/___test___/test.helper'; - -const schema = zodIncludeQuery(relationList); +const schema = zodIncludeQuery(usersEntityParamMapMockData); describe('zodIncludeQuery', () => { it('should validate an array of relations successfully', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts index cf8e87a0..bc3e5bd7 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/include.ts @@ -1,13 +1,17 @@ import { z } from 'zod'; -import { ObjectLiteral } from '../../../../types'; -import { ResultGetField } from '../../types'; import { uniqueArray } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; +import { NonEmptyStringTuple } from '../../../../types'; -export function zodIncludeQuery( - relationList: ResultGetField['relations'] +export function zodIncludeQuery( + entityParamMapService: EntityParamMapService ) { + const relationProps: NonEmptyStringTuple< + typeof entityParamMapService.entityParaMap.relations + > = entityParamMapService.entityParaMap.relations as any; + return z - .enum(relationList) + .enum(relationProps) .array() .nonempty() .refine(uniqueArray(), { @@ -16,7 +20,10 @@ export function zodIncludeQuery( .nullable(); } -export type ZodIncludeQuery = ReturnType< - typeof zodIncludeQuery +export type ZodIncludeQuery< + E extends object, + IdKey extends string +> = ReturnType>; +export type IncludeQuery = z.infer< + ZodIncludeQuery >; -export type IncludeQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts index 93ca9fc3..2ff1b314 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.spec.ts @@ -1,44 +1,17 @@ -import { FilterOperand, QueryField } from '../../../../utils/nestjs-shared'; -import { zodQuery } from './index'; -import { ArrayPropsForEntity } from '../../types'; -import { Users } from '../../../../mock-utils/typeorm'; -import { InputQuery } from '../zod-input-query-schema'; -import { ASC } from '../../../../constants'; +import { FilterOperand, QueryField } from '@klerick/json-api-nestjs-shared'; -import { - userFieldsStructure as userFields, - userRelations, - propsType, -} from '../../../../utils/___test___/test.helper'; +import { ASC } from '../../../../constants'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; -const propsArray: ArrayPropsForEntity = { - target: { - testArrayNull: true, - testReal: true, - }, - addresses: { - arrayField: true, - }, - userGroup: {}, - manager: { - testArrayNull: true, - testReal: true, - }, - comments: {}, - notes: {}, - roles: {}, -}; +import { InputQuery } from '../zod-input-query-schema'; +import { zodQuery } from './index'; -const schemaQuery = zodQuery( - userFields, - userRelations, - propsArray, - propsType -); +const schemaQuery = zodQuery(usersEntityParamMapMockData); describe('schemaQuery.parse', () => { it('should successfully parse valid input', () => { - const validInput: InputQuery = { + const validInput: InputQuery = { [QueryField.fields]: { target: [ 'id', @@ -81,7 +54,7 @@ describe('schemaQuery.parse', () => { }); it('should handle nested relations', () => { - const validInput: InputQuery = { + const validInput: InputQuery = { [QueryField.fields]: { target: [ 'id', diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts index 9483f211..a881d7ad 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/index.ts @@ -1,99 +1,72 @@ -import { QueryField } from '../../../../utils/nestjs-shared'; import { z, ZodObject } from 'zod'; - -import { ObjectLiteral } from '../../../../types'; -import { - AllFieldWithType, - ArrayPropsForEntity, - RelationTree, - ResultGetField, -} from '../../types'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; import { zodFieldsQuery, ZodFieldsQuery } from './fields'; import { zodFilterQuery, ZodFilterQuery } from './filter'; -import { zodSortQuery, ZodSortQuery } from './sort'; import { zodIncludeQuery, ZodIncludeQuery } from './include'; +import { zodSortQuery, ZodSortQuery, SortQuery } from './sort'; import { zodPageInputQuery, ZodPageInputQuery } from '../zod-share'; -type Shape = { - [QueryField.fields]: ZodFieldsQuery; - [QueryField.filter]: ZodFilterQuery; - [QueryField.include]: ZodIncludeQuery; - [QueryField.sort]: ZodSortQuery; +import { EntityParamMapService } from '../../service'; + +export { SortQuery }; + +type Shape = { + [QueryField.fields]: ZodFieldsQuery; + [QueryField.filter]: ZodFilterQuery; + [QueryField.include]: ZodIncludeQuery; + [QueryField.sort]: ZodSortQuery; [QueryField.page]: ZodPageInputQuery; }; -function getShape( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): Shape { +function getShape( + entityParamMapService: EntityParamMapService +): Shape { return { - [QueryField.fields]: zodFieldsQuery( - entityFieldsStructure.field, - entityRelationStructure - ), - [QueryField.filter]: zodFilterQuery( - entityFieldsStructure.field, - entityRelationStructure, - propsArray, - propsType - ), - [QueryField.include]: zodIncludeQuery(entityFieldsStructure.relations), - [QueryField.sort]: zodSortQuery( - entityFieldsStructure.field, - entityRelationStructure - ), + [QueryField.fields]: zodFieldsQuery(entityParamMapService), + [QueryField.filter]: zodFilterQuery(entityParamMapService), + [QueryField.include]: zodIncludeQuery(entityParamMapService), + [QueryField.sort]: zodSortQuery(entityParamMapService), [QueryField.page]: zodPageInputQuery(), }; } -function getZodResultSchema( - shape: Shape -): ZodObject, 'strict'> { +function getZodResultSchema( + shape: Shape +): ZodObject, 'strict'> { return z.object(shape).strict(); } - -export function zodQuery( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): ZodResultSchema { - const shape = getShape( - entityFieldsStructure, - entityRelationStructure, - propsArray, - propsType - ); - return getZodResultSchema(shape); +export function zodQuery( + entityParamMapService: EntityParamMapService +) { + return getZodResultSchema(getShape(entityParamMapService)); } -export type ZodResultSchema = ReturnType< - typeof getZodResultSchema +export type ZodQuery = ZodObject< + Shape, + 'strict' +>; +export type Query = z.infer< + ZodObject, 'strict'> >; -export type ZodQuery = ReturnType>; -export type Query = z.infer>; -function zodQueryOne( - entityFieldsStructure: ResultGetField, - entityRelationStructure: RelationTree, - propsArray: ArrayPropsForEntity, - propsType: AllFieldWithType -): ZodObject, QueryField.fields | QueryField.include>, 'strict'> { +function zodQueryOne( + entityParamMapService: EntityParamMapService +): ZodObject< + Pick, QueryField.fields | QueryField.include>, + 'strict' +> { return z .object({ - [QueryField.fields]: zodFieldsQuery( - entityFieldsStructure.field, - entityRelationStructure - ), - [QueryField.include]: zodIncludeQuery(entityFieldsStructure.relations), + [QueryField.fields]: zodFieldsQuery(entityParamMapService), + [QueryField.include]: zodIncludeQuery(entityParamMapService), }) .strict(); } -export type ZodQueryOne = ReturnType< - typeof zodQueryOne +export type ZodQueryOne = ReturnType< + typeof zodQueryOne +>; +export type QueryOne = z.infer< + ZodQueryOne >; -export type QueryOne = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts index 53ede399..9f151492 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.spec.ts @@ -2,12 +2,9 @@ import { zodSortQuery } from './sort'; import { ASC, DESC } from '../../../../constants'; -import { - userFields, - userRelations, -} from '../../../../utils/___test___/test.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; -const schema = zodSortQuery(userFields, userRelations); +const schema = zodSortQuery(usersEntityParamMapMockData); describe('zodSortQuery', () => { it('should create a Zod schema with target and relations', () => { const parsedData = schema.parse({ @@ -16,7 +13,6 @@ describe('zodSortQuery', () => { manager: { lastName: ASC }, roles: { name: DESC }, comments: { kind: DESC }, - notes: { text: ASC }, userGroup: { label: ASC }, }); @@ -26,13 +22,12 @@ describe('zodSortQuery', () => { manager: { lastName: ASC }, roles: { name: DESC }, comments: { kind: DESC }, - notes: { text: ASC }, userGroup: { label: ASC }, }); }); it('should throw an error for an invalid field in target', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({ @@ -42,7 +37,7 @@ describe('zodSortQuery', () => { }); it('should throw an error for invalid fields in relations', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({ @@ -52,7 +47,7 @@ describe('zodSortQuery', () => { }); it('should allow partial relations and target', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); const parsedData = schema.parse({ target: { id: ASC }, @@ -66,7 +61,7 @@ describe('zodSortQuery', () => { }); it('should fail if an empty object is not allowed', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse({}); @@ -77,7 +72,7 @@ describe('zodSortQuery', () => { }); it('should fail if the input is not a valid object', () => { - const schema = zodSortQuery(userFields, userRelations); + const schema = zodSortQuery(usersEntityParamMapMockData); expect(() => { schema.parse([]); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts index 7951749e..7dab6a80 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-query-schema/sort.ts @@ -1,60 +1,96 @@ -import { ObjectTyped } from '../../../../utils/nestjs-shared'; -import { z } from 'zod'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodObject } from 'zod'; -import { RelationTree, ResultGetField } from '../../types'; -import { ObjectLiteral } from '../../../../types'; +import { EntityParam, EntityRelationProps } from '../../../../types'; import { SORT_TYPE } from '../../../../constants'; -import { nonEmptyObject } from '../zod-utils'; +import { getRelationProps, nonEmptyObject } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodSortRule() { return z.enum(SORT_TYPE).optional(); } -function getZodFieldRule(fields: F) { +function getZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +>(fields: PropsList, zodSchema: ZodSortRule) { const targetShape = fields.reduce( (acum, item) => ({ ...acum, - [item]: getZodSortRule(), + [item as PropertyKey]: zodSchema, }), - {} as { [K in F[number]]: ZodSortRule } + {} as { [K in PropsList[number] & PropertyKey]: ZodSortRule } ); return z.object(targetShape).strict().refine(nonEmptyObject()).optional(); } +type ShapeArrayInput = + | EntityParam['props'] + | EntityRelationProps[keyof EntityRelationProps]; + type ZodSortRule = ReturnType; -type ZodFieldRule = ReturnType< - typeof getZodFieldRule ->; +type ZodFieldRule< + E extends object, + IdKey extends string, + PropsList extends ShapeArrayInput +> = ReturnType>; + +type ZodSortTarget = { + target: ZodFieldRule['props']>; +}; + +type ZodSortRelation = { + [K in keyof EntityRelationProps]: ZodFieldRule< + E, + IdKey, + EntityRelationProps[K] + >; +}; +type ZodSortShape = ZodSortTarget< + E, + IdKey +> & + ZodSortRelation; + +function zodSortObject( + entityParamMapService: EntityParamMapService +): ZodObject, 'strict'> { + const zodSortRule = getZodSortRule(); + const relationList = getRelationProps(entityParamMapService); + + const sortShape = ObjectTyped.entries(relationList).reduce( + (acum, [key, val]) => ({ + ...acum, + [key as PropertyKey]: getZodFieldRule( + val, + zodSortRule + ), + }), + { + target: getZodFieldRule['props']>( + entityParamMapService.entityParaMap.props, + zodSortRule + ), + } as ZodSortShape + ); -export function zodSortQuery( - fields: ResultGetField['field'], - relationList: RelationTree + return z.object(sortShape).strict(); +} + +export function zodSortQuery( + entityParamMapService: EntityParamMapService ) { - const zodRelationShape = {} as { - [K in keyof RelationTree]: ZodFieldRule[K]>; - }; - const zodTargetShape: { target: ZodFieldRule['field']> } = { - target: getZodFieldRule(fields), - }; - - for (const [key, val] of ObjectTyped.entries(relationList)) { - if (key === 'target') continue; - zodRelationShape[key] = getZodFieldRule(val); - } - - return z - .object({ - ...zodTargetShape, - ...zodRelationShape, - }) - .strict() + return zodSortObject(entityParamMapService) .partial() .refine(nonEmptyObject()) .nullable(); } -export type ZodSortQuery = ReturnType< - typeof zodSortQuery +export type ZodSortQuery = ReturnType< + typeof zodSortQuery +>; +export type SortQuery = z.infer< + ZodSortQuery >; -export type SortQuery = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts index 7011ef35..3a260e5b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.spec.ts @@ -1,40 +1,37 @@ import { ZodError } from 'zod'; import { zodAttributes, ZodAttributes, Attributes } from './attributes'; -import { Addresses, Users } from '../../../../mock-utils/typeorm'; -import { PropsForField } from '../../types'; - import { - fieldTypeUsers, - propsDb, - fieldTypeAddresses, + addressesEntityParamMapMockData, + usersEntityParamMapMockData, } from '../../../../utils/___test___/test.helper'; +import { + Users, + Addresses, +} from '../../../../utils/___test___/test-classes.helper'; describe('attributes', () => { - type SchemaTypeUsers = Attributes; - type SchemaTypeAddresses = Attributes; - describe('Attributes for post', () => { - let schemaUsers: ZodAttributes; - let schemaAddresses: ZodAttributes; + type SchemaTypeUsers = Attributes; + type SchemaTypeAddresses = Attributes; + let schemaUsers: ZodAttributes; + let schemaAddresses: ZodAttributes; beforeEach(() => { - schemaUsers = zodAttributes(fieldTypeUsers, propsDb, 'id', false); - schemaAddresses = zodAttributes( - fieldTypeAddresses, - {} as PropsForField, - 'id', - false - ); + schemaUsers = zodAttributes(usersEntityParamMapMockData, false); + schemaAddresses = zodAttributes(addressesEntityParamMapMockData, false); }); it('should be ok', () => { const date = new Date(); const check: SchemaTypeUsers = { login: 'login', - isActive: true, + isActive: 'null', lastName: 'sdsdf', testReal: [123.123, 123.123], testArrayNull: [], testDate: date.toISOString() as any, + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, + firstName: '', }; const check2: SchemaTypeAddresses = { @@ -48,16 +45,20 @@ describe('attributes', () => { const check3: SchemaTypeUsers = { login: 'login', - isActive: true, lastName: 'sdsdf', testReal: [123.123, 123.123], testArrayNull: null as any, testDate: date.toISOString() as any, + firstName: '', + createdAt: date.toISOString() as any, + updatedAt: date.toISOString() as any, }; expect(schemaUsers.parse(check)).toEqual({ ...check, testDate: date, + createdAt: date, + updatedAt: date, }); expect(schemaAddresses.parse(check2)).toEqual({ ...check2, @@ -68,6 +69,8 @@ describe('attributes', () => { expect(schemaUsers.parse(check3)).toEqual({ ...check3, testDate: date, + createdAt: date, + updatedAt: date, }); }); @@ -95,29 +98,22 @@ describe('attributes', () => { }); describe('Attributes for patch', () => { - let schemaUsers: ZodAttributes; - let schemaAddresses: ZodAttributes; + type SchemaTypeUsers = Attributes; + type SchemaTypeAddresses = Attributes; + let schemaUsers: ZodAttributes; + let schemaAddresses: ZodAttributes; beforeEach(() => { - schemaUsers = zodAttributes( - fieldTypeUsers, - propsDb, - 'id', - true - ); - schemaAddresses = zodAttributes( - fieldTypeAddresses, - {} as PropsForField, - 'id', - true - ); + schemaUsers = zodAttributes(usersEntityParamMapMockData, true); + schemaAddresses = zodAttributes(addressesEntityParamMapMockData, true); }); it('should be ok', () => { const date = new Date(); const check: SchemaTypeUsers = { login: 'login', - isActive: true, testDate: date.toISOString() as any, + firstName: '', + testReal: [], }; const check2: SchemaTypeAddresses = { @@ -125,12 +121,16 @@ describe('attributes', () => { state: 'state', createdAt: date.toISOString() as any, updatedAt: date.toISOString() as any, + city: '', + country: '', }; const check3: SchemaTypeUsers = { testReal: [123.123, 123.123], testArrayNull: null as any, testDate: date.toISOString() as any, + login: '', + firstName: '', }; expect(schemaUsers.parse(check)).toEqual({ diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts new file mode 100644 index 00000000..cbe90b95 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.test-d.ts @@ -0,0 +1,48 @@ +import { expectType } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { Attributes, IsNullableProps } from './attributes'; + +type CheckNotNullableArray = IsNullableProps; +type CheckNullableArray = IsNullableProps; +type CheckNullable = IsNullableProps; +type CheckNotNullable = IsNullableProps; + +expectType(false); +expectType(true); +expectType(true); +expectType(false); + +type CheckAttrPost = { + testReal: number[]; + login: string; + firstName: string; + testArrayNull?: number[] | null | undefined; + testDate: Date; + createdAt: Date; + updatedAt: Date; + lastName?: string | null | undefined; + isActive?: string | null | undefined; +}; + +type IsEqualsAttrPost = Any.Equals, CheckAttrPost>; +expectType(1); + +type CheckAttrPatch = { + testReal?: number[] | undefined; + login?: string | undefined; + firstName?: string | undefined; + testArrayNull?: number[] | null | undefined; + testDate?: Date | undefined; + createdAt?: Date | undefined; + updatedAt?: Date | undefined; + lastName?: string | null | undefined; + isActive?: string | null | undefined; +}; + +type IsEqualsAttrPatch = Any.Equals< + Attributes, + CheckAttrPatch +>; +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts index 1f29bcdd..32db14ba 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/attributes.ts @@ -1,202 +1,287 @@ -import { - EntityProps, - ObjectTyped, - TypeOfArray, -} from '../../../../utils/nestjs-shared'; -import { z, ZodArray, ZodNullable } from 'zod'; - -import { ObjectLiteral } from '../../../../types'; -import { - FieldWithType, - PropsFieldItem, - PropsForField, - TypeField, -} from '../../types'; -import { nonEmptyObject } from '../zod-utils'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { z, ZodArray, ZodType } from 'zod'; + +import { EntityParam, TypeField } from '../../../../types'; +import { nonEmptyObject, setOptionalOrNot } from '../zod-utils'; +import { ResultSchema } from './type'; +import { EntityParamMapService } from '../../service'; const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); type Literal = z.infer; type Json = Literal | { [key: string]: Json } | Json[]; -function getZodRulesForNumber(isNullable: boolean) { +export function getZodRulesForNumber< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.preprocess((x) => Number(x), z.number()); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForString(isNullable: boolean) { +function getZodRulesForString< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.string(); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForDate(isNullable: boolean) { +function getZodRulesForDate< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.coerce.date(); - if (isNullable) schema.nullable().optional(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForBoolean(isNullable: boolean) { +function getZodRulesForBoolean< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const schema = z.boolean(); - if (isNullable) schema.nullable(); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodSchemaForJson(isNullable: boolean) { +function getZodSchemaForJson< + Null extends true | false, + isPatch extends true | false +>(isNullable: Null, isPatch: isPatch) { const tmpSchema = isNullable ? literalSchema.nullable() : literalSchema; const schema: z.ZodType = z.lazy(() => z.union([tmpSchema, z.array(tmpSchema), z.record(tmpSchema)]) ); - return isNullable ? schema.optional() : schema; + return setOptionalOrNot(schema, isNullable, isPatch); } -function getZodRulesForArray( - propsField: PropsFieldItem -): - | ZodArray, 'many'> - | ZodNullable, 'many'>> { - const type = propsField.type as T; - let schema: ZodRulesForArray; - - if (!propsField) { - schema = getZodRulesForString(false) as ZodRulesForArray; - } else { - switch (type) { - case 'number': - case 'real': - case 'integer': - case 'bigint': - case 'double': - case 'numeric': - case Number: - schema = getZodRulesForNumber(false) as ZodRulesForArray; - break; - case 'date': - case Date: - schema = getZodRulesForDate(false) as ZodRulesForArray; - break; - case 'boolean': - case Boolean: - schema = getZodRulesForBoolean(false) as ZodRulesForArray; - break; - default: - schema = getZodRulesForString(false) as ZodRulesForArray; - } - } +type ZodRulesResultArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ResultSchema< + ZodArray, 'many'>, + Null, + isPatch +>; - if (propsField.isNullable) { - return schema.array().nullable() as ZodNullable< - ZodArray, 'many'> - >; +function getZodRulesForArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +>( + propsField: T, + isNullable: Null, + isPatch: isPatch +): ZodRulesResultArray { + let schema: ZodType; + switch (propsField) { + case TypeField.number: + schema = getZodRulesForNumber(false, false); + break; + case TypeField.date: + schema = getZodRulesForDate(false, false); + break; + case TypeField.boolean: + schema = getZodRulesForBoolean(false, false); + break; + default: + schema = getZodRulesForString(false, false); } - return schema.array() as ZodArray, 'many'>; + + return setOptionalOrNot(schema.array(), isNullable, isPatch) as ResultSchema< + ZodArray, 'many'>, + Null, + isPatch + >; } -type ZodRulesForArray = T extends number - ? ReturnType - : T extends Date - ? ReturnType - : T extends boolean - ? ReturnType - : ReturnType; - -type ZodRulesForType = ReturnType< - T extends TypeField.array - ? typeof getZodRulesForArray - : T extends TypeField.date - ? typeof getZodRulesForDate +type ZodRulesForArray< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ReturnType>; + +export type ZodRulesForType< + T extends TypeField, + Null extends true | false, + isPatch extends true | false +> = ReturnType< + T extends TypeField.date + ? typeof getZodRulesForDate : T extends TypeField.boolean - ? typeof getZodRulesForBoolean + ? typeof getZodRulesForBoolean : T extends TypeField.number - ? typeof getZodRulesForNumber + ? typeof getZodRulesForNumber : T extends TypeField.object - ? typeof getZodSchemaForJson - : typeof getZodRulesForString + ? typeof getZodSchemaForJson + : typeof getZodRulesForString >; -function buildSchema( - fieldType: T, - propsField: P -): ZodRulesForType { - let schema: ZodRulesForType; - switch (fieldType) { - case TypeField.array: - schema = getZodRulesForArray(propsField) as ZodRulesForType; - break; +export type IsNullableProps< + E extends object, + IdKey extends string, + K extends keyof E +> = K extends EntityParam['propsNullable'][number] ? true : false; +type IsTypeArray = T extends TypeField.array ? 1 : 0; +type Props = EntityParam< + E, + IdKey +>['propsType']; + +type PropsArray = EntityParam< + E, + IdKey +>['propsArrayType']; + +type OmitPrimary = Omit< + Props, + IdKey +>; + +type ZodRules< + E extends object, + IdKey extends string, + P extends keyof E, + IsArray extends 1 | 0, + isPatch extends boolean +> = IsArray extends 1 + ? P extends keyof PropsArray + ? ZodRulesForArray< + PropsArray[P], + IsNullableProps, + isPatch + > + : never + : P extends keyof Props + ? ZodRulesForType[P], IsNullableProps, isPatch> + : never; + +export type ShapeAttributesType< + E extends object, + IdKey extends string, + isPatch extends boolean +> = { + [K in keyof OmitPrimary]: ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch + >; +}; + +function assertPropsIsarrayProps( + paramMap: EntityParam, + propsName: unknown +): propsName is keyof PropsArray { + return Reflect.get(paramMap.propsType, `${propsName}`) === TypeField.array; +} + +function buildSchema< + E extends object, + IdKey extends string, + isPatch extends boolean, + K extends keyof Props +>( + paramMap: EntityParam, + propsName: K, + isPatch: isPatch +): ZodRules[K]>, isPatch> { + // @ts-expect-error need check in tuple + const isNullable = paramMap.propsNullable.includes(propsName); + if (assertPropsIsarrayProps(paramMap, propsName)) { + const arrayPropsType = paramMap.propsArrayType[propsName]; + + return getZodRulesForArray(arrayPropsType, isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch + >; + } + + const propsType = paramMap.propsType[propsName]; + switch (propsType) { case TypeField.date: - schema = getZodRulesForDate(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForDate(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.boolean: - schema = getZodRulesForBoolean(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForBoolean(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.number: - schema = getZodRulesForNumber(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForNumber(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; case TypeField.object: - schema = getZodSchemaForJson(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodSchemaForJson(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; - break; default: - schema = getZodRulesForString(propsField.isNullable) as ZodRulesForType< - T, - I + return getZodRulesForString(isNullable, isPatch) as ZodRules< + E, + IdKey, + K, + IsTypeArray[K]>, + isPatch >; } +} - return schema; +function assertOmitKeysProps( + primaryColumnName: EntityParam['primaryColumnName'], + key: keyof Props +): key is keyof OmitPrimary { + return !(key.toString() === primaryColumnName); } export function zodAttributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, S extends true | false = false ->( - fieldWithType: FieldWithType, - propsDb: PropsForField, - primaryColumn: EntityProps, - isPatch: S -) { - const objectShape = {} as { - [K in keyof Omit, keyof EntityProps>]: ZodRulesForType< - FieldWithType[K], - TypeOfArray - >; - }; - - for (const [nameList, type] of ObjectTyped.entries(fieldWithType)) { - if (nameList === primaryColumn) continue; - const name = nameList as keyof Omit, keyof EntityProps>; - const propsField = propsDb[name]; - objectShape[name] = buildSchema< - typeof type, - typeof propsField, - TypeOfArray - >(type, propsField || {}); - } - const zodSchema = z.object(objectShape).strict(); - if (isPatch) { - return zodSchema.partial().refine(nonEmptyObject()); - } - return zodSchema.refine(nonEmptyObject()); +>(entityParamMapService: EntityParamMapService, isPatch: S) { + const paramsMap = entityParamMapService.entityParaMap; + + const objectShape = ObjectTyped.keys(paramsMap.propsType).reduce( + (acum, key) => { + if (assertOmitKeysProps(paramsMap.primaryColumnName, key)) { + acum[key] = buildSchema(paramsMap, key, isPatch); + } + + return acum; + }, + {} as ShapeAttributesType + ); + + return z.object(objectShape).strict().refine(nonEmptyObject()); } export type ZodAttributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, K extends true | false = false -> = ReturnType>; +> = ReturnType>; export type Attributes< - E extends ObjectLiteral, + E extends object, + IdKey extends string, K extends true | false = false -> = z.infer>; +> = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts index d5ba401b..d3b401eb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.spec.ts @@ -1,7 +1,7 @@ import { ZodError } from 'zod'; import { ZodId, zodId } from './id'; -import { TypeField } from '../../types'; +import { TypeField } from '../../../../types'; describe('zodIdSchema', () => { let numberStringSchema: ZodId; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts index 030ed201..74fea57e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/id.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TypeField, TypeForId } from '../../types'; +import { TypeField, TypeForId } from '../../../../types'; const reg = new RegExp('^-?\\d+$'); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts index 2682313b..352c49da 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/page.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import { DEFAULT_PAGE_SIZE, DEFAULT_QUERY_PAGE } from '../../../../constants'; -import { ObjectLiteral } from '../../../../types'; export function zodPageInputQuery() { return z @@ -20,4 +19,3 @@ export function zodPageInputQuery() { } export type ZodPageInputQuery = ReturnType; -export type PageInputQuery = z.infer; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts index fe3e3122..169bfa7f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.spec.ts @@ -1,6 +1,7 @@ import { zodRelData, ZodRelData } from './rel-data'; -import { TypeField } from '../../types'; + import { ZodError } from 'zod'; +import { TypeField } from '../../../../types'; describe('zodDataSchema', () => { let zodData: ZodRelData; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts index 619b9fc1..04dd9f13 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/rel-data.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { TypeForId } from '../../types'; +import { TypeForId } from '../../../../types'; import { nonEmptyObject } from '../zod-utils'; import { zodType, zodId } from './'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts index 3f101754..94d19697 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.spec.ts @@ -1,23 +1,16 @@ import { z, ZodError } from 'zod'; import { zodRelationships, ZodRelationships } from './relationships'; -import { Users } from '../../../../mock-utils/typeorm'; -import { - relationArrayProps, - relationPopsName, - primaryColumnType, -} from '../../../../utils/___test___/test.helper'; +import { Users } from '../../../../utils/___test___/test-classes.helper'; +import { usersEntityParamMapMockData } from '../../../../utils/___test___/test.helper'; describe('zodRelationships', () => { - let relationshipsSchema: ZodRelationships; - describe('POST', () => { + let relationshipsSchema: ZodRelationships; beforeAll(() => { relationshipsSchema = zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, + usersEntityParamMapMockData, false ); }); @@ -38,20 +31,18 @@ describe('zodRelationships', () => { id: '1', }, }, + addresses: { + data: { + type: 'addresses', + id: '1', + }, + }, manager: { data: { type: 'users', id: '1', }, }, - notes: { - data: [ - { - type: 'notes', - id: 'id', - }, - ], - }, }; expect(relationshipsSchema.parse(check)).toEqual(check); }); @@ -106,6 +97,14 @@ describe('zodRelationships', () => { const check16 = { manager: [], }; + const check17 = { + userGroup: { + data: { + type: 'user-groups', + id: '1', + }, + }, + }; const arrayCheck = [ check1, check2, @@ -123,6 +122,7 @@ describe('zodRelationships', () => { check14, check15, check16, + check17, ]; expect.assertions(arrayCheck.length); for (const item of arrayCheck) { @@ -136,13 +136,9 @@ describe('zodRelationships', () => { }); describe('PATCH', () => { + let relationshipsSchema: ZodRelationships; beforeAll(() => { - relationshipsSchema = zodRelationships( - relationArrayProps, - relationPopsName, - primaryColumnType, - true - ); + relationshipsSchema = zodRelationships(usersEntityParamMapMockData, true); }); it('Should be ok', () => { @@ -159,14 +155,6 @@ describe('zodRelationships', () => { id: '1', }, }, - notes: { - data: [ - { - type: 'notes', - id: 'id', - }, - ], - }, }; expect(relationshipsSchema.parse(check)).toEqual(check); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts index 3a6dd520..3204bfeb 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/relationships.ts @@ -1,157 +1,147 @@ import { z } from 'zod'; -import { - camelToKebab, - KebabCase, - ObjectTyped, -} from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; import { - RelationPropsArray, - RelationPropsTypeName, - RelationPrimaryColumnType, + EntityParam, TypeForId, -} from '../../types'; -import { zodRelData } from './rel-data'; -import { nonEmptyObject } from '../zod-utils'; - -function getZodRuleForData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - if (isPatch) { - return zodRelData(typeName, primaryType).nullable(); - } - return zodRelData(typeName, primaryType); -} + RelationProperty, + TypeField, +} from '../../../../types'; -function getZodRuleForArrayData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - const dataArraySchema = getZodRuleForData( - typeName, - primaryType, - false - ).array(); - if (isPatch) { - return dataArraySchema; - } - return dataArraySchema.nonempty(); -} - -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends true, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType>; -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends false, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType>; -function getZodDataShape< - K extends string, - P extends TypeForId, - I extends boolean, - T extends true | false = false ->( - typeName: K, - primaryType: P, - isArray: I, - isPatch: T -): ReturnType< - typeof getZodRuleForArrayData | typeof getZodRuleForData -> { - return isArray - ? getZodRuleForArrayData(typeName, primaryType, isPatch) - : getZodRuleForData(typeName, primaryType, isPatch); -} +import { zodRelData } from './rel-data'; +import { nonEmptyObject, setOptionalOrNot } from '../zod-utils'; +import { EntityParamMapService } from '../../service'; function getZodResultData< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { - return z - .object({ - data: getZodDataShape(typeName, primaryType, false, isPatch), - }) - .optional(); + TypeName extends string, + Type extends TypeForId, + IsNull extends true | false = false, + IsPatch extends true | false = false +>(typeName: TypeName, primaryType: Type, isNull: IsNull, isPatch: IsPatch) { + const dataScheme = z.object({ + data: setOptionalOrNot(zodRelData(typeName, primaryType), isNull, isPatch), + }); + return setOptionalOrNot(dataScheme.refine(nonEmptyObject()), isNull, isPatch); } -function getZodResultDataArray< - K extends string, - P extends TypeForId, - T extends true | false = false ->(typeName: K, primaryType: P, isPatch: T) { +function getZodResultDataArray( + typeName: TypeName, + primaryType: Type +) { return z .object({ - data: getZodDataShape(typeName, primaryType, true, isPatch), + data: zodRelData(typeName, primaryType).array(), }) .optional(); } +type IsArrayRelation< + E extends object, + R extends keyof RelationProperty +> = RelationProperty[R]['isArray']; + +type IsNullableRelation< + E extends object, + R extends keyof RelationProperty +> = RelationProperty[R]['nullable']; + +type EntityParamForRel< + E extends object, + R extends keyof RelationProperty, + IdKey extends string +> = EntityParam[R]['entityClass'], IdKey>; + +type RelPrimaryColumnType = IdKey extends TypeForId + ? IdKey + : TypeField.string; + +type ZodResultDataArray< + E extends object, + R extends keyof RelationProperty, + IdKey extends string +> = ReturnType< + typeof getZodResultDataArray< + EntityParamForRel['typeName'], + RelPrimaryColumnType['primaryColumnType']> + > +>; + type ZodResultData< - K extends string, - P extends TypeForId, - I extends boolean, - T extends true | false = false -> = I extends true - ? ReturnType> - : ReturnType>; + E extends object, + R extends keyof RelationProperty, + IdKey extends string, + IsPatch extends boolean +> = ReturnType< + typeof getZodResultData< + EntityParamForRel['typeName'], + RelPrimaryColumnType['primaryColumnType']>, + IsNullableRelation, + IsPatch + > +>; + +type ZodData< + E extends object, + R extends keyof RelationProperty, + IdKey extends string, + IsPatch extends boolean, + IsArray extends boolean +> = IsArray extends true + ? ZodResultDataArray + : ZodResultData; + +export type ZodRelationShape< + E extends object, + IdKey extends string, + IsPatch extends true | false = false +> = { + [K in keyof RelationProperty]: ZodData< + E, + K, + IdKey, + IsPatch, + IsArrayRelation + >; +}; export function zodRelationships< - E extends ObjectLiteral, - S extends true | false = false ->( - relationArrayProps: RelationPropsArray, - relationPopsName: RelationPropsTypeName, - primaryColumnType: RelationPrimaryColumnType, - isPatch: S -) { - const shape = {} as { - [K in keyof RelationPropsArray]: ZodResultData< - KebabCase[K]>, - RelationPrimaryColumnType[K], - RelationPropsArray[K], - S - >; - }; - - for (const [props, value] of ObjectTyped.entries(relationArrayProps)) { - const typeName = camelToKebab(relationPopsName[props]); - const primaryType = primaryColumnType[props]; - shape[props] = ( - value === true - ? getZodResultDataArray(typeName, primaryType, isPatch) - : getZodResultData(typeName, primaryType, isPatch) - ) as ZodResultData; - } + E extends object, + IdKey extends string, + IsPatch extends true | false = false +>(entityParamMapService: EntityParamMapService, isPatch: IsPatch) { + const shape = ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [key, val]) => { + const relEntityParaMap = entityParamMapService.getParamMap( + val.entityClass as any + ) as EntityParamForRel; + + if (val.isArray) { + acum[key] = getZodResultDataArray( + relEntityParaMap.typeName, + relEntityParaMap.primaryColumnType as TypeForId + ) as ZodData; + } else { + acum[key] = getZodResultData( + relEntityParaMap.typeName, + relEntityParaMap.primaryColumnType as TypeForId, + val.nullable, + isPatch + ) as ZodData; + } + return acum; + }, {} as ZodRelationShape); return z.object(shape).strict().refine(nonEmptyObject()); } export type ZodRelationships< - T extends ObjectLiteral, - K extends true | false = false -> = ReturnType>; + E extends object, + IdKey extends string, + S extends true | false = false +> = ReturnType>; export type Relationships< - T extends ObjectLiteral, - K extends true | false = false -> = z.infer>; + E extends object, + IdKey extends string, + S extends true | false = false +> = z.infer>; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts index 297952d1..8c905410 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-share/type.ts @@ -1,4 +1,4 @@ -import { z } from 'zod'; +import { z, ZodNullable, ZodOptional, ZodType as InnerZodType } from 'zod'; export function zodType(type: T) { return z.literal(type); @@ -6,3 +6,21 @@ export function zodType(type: T) { export type ZodType = ReturnType>; export type Type = z.infer>; + +type ResultPatchSchema< + Schema extends InnerZodType, + Null extends true | false +> = Null extends true ? ZodOptional> : ZodOptional; + +type ResultPostSchema< + Schema extends InnerZodType, + Null extends true | false +> = Null extends true ? ZodOptional> : Schema; + +export type ResultSchema< + Schema extends InnerZodType, + Null extends true | false, + isPatch extends true | false +> = isPatch extends true + ? ResultPatchSchema + : ResultPostSchema; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts index 33346a35..dd3be42a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.spec.ts @@ -8,7 +8,7 @@ import { stringMustBe, guardIsKeyOfObject, } from './zod-utils'; -import { TypeField } from '../types'; +import { TypeField } from '../../../types'; describe('zod-utils', () => { describe('guardIsKeyOfObject', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts index 50dc7040..9c6e48fe 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/zod/zod-utils.ts @@ -1,4 +1,10 @@ -import { TypeField } from '../types'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; + +import { ZodType } from 'zod'; + +import { EntityRelationProps, TypeField } from '../../../types'; +import { EntityParamMapService } from '../service'; +import { ResultSchema } from './zod-share'; export const nonEmptyObject = () => @@ -67,3 +73,39 @@ export function guardIsKeyOfObject( throw new Error('Type guard error'); } + +export function getRelationProps( + entityParamMapService: EntityParamMapService +) { + return ObjectTyped.entries( + entityParamMapService.entityParaMap.relationProperty + ).reduce((acum, [name, value]) => { + const relMap = entityParamMapService.getParamMap(value.entityClass as any); + Reflect.set(acum, name, relMap.props); + return acum; + }, {} as EntityRelationProps); +} + +export function setOptionalOrNot< + Schema extends ZodType, + Null extends true | false, + isPatch extends true | false +>( + schema: Schema, + isNullable: Null, + isPatch: isPatch +): ResultSchema { + if (isPatch) { + return (isNullable ? schema.nullable() : schema).optional() as ResultSchema< + Schema, + Null, + isPatch + >; + } else { + return (isNullable ? schema.nullable().optional() : schema) as ResultSchema< + Schema, + Null, + isPatch + >; + } +} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts deleted file mode 100644 index b5faede6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const SUB_QUERY_ALIAS_FOR_PAGINATION = 'subQueryWithLimitOffset'; -export const ALIAS_FOR_PAGINATION = 'aliasForPagination'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts deleted file mode 100644 index bfc13543..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/factory/index.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { FactoryProvider } from '@nestjs/common'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { camelToKebab } from '../../../utils/nestjs-shared'; -import { DataSource, EntityManager, Repository } from 'typeorm'; - -import { - CURRENT_ENTITY_MANAGER_TOKEN, - FIND_ONE_ROW_ENTITY, - CHECK_RELATION_NAME, - ORM_SERVICE, - RUN_IN_TRANSACTION_FUNCTION, - GLOBAL_MODULE_OPTIONS_TOKEN, - CURRENT_DATA_SOURCE_TOKEN, - CURRENT_ENTITY_REPOSITORY, - ENTITY_MAP_PROPS, -} from '../../../constants'; -import { - FindOneRowEntity, - CheckRelationNme, - ZodEntityProps, -} from '../../mixin/types'; -import { - ObjectLiteral, - EntityTarget, - ResultGeneralParam, - RequiredFromPartial, - ConfigParam, - RunInTransaction, - EntityClass, -} from '../../../types'; - -import { TypeOrmService, TypeormUtilsService } from '../service'; -import { getEntityName } from '../../mixin/helper'; -import { TypeOrmJsonApiModule } from '../type-orm-json-api.module'; -import { TypeOrmParam } from '../type'; - -import { - getProps, - getRelation, - getPropsType, - getPropsNullable, - getPrimaryColumnName, - getPrimaryColumnType, - getRelationProperty, -} from '../orm-helper'; - -export function CurrentDataSourceProvider( - connectionName?: string -): FactoryProvider { - return { - provide: CURRENT_DATA_SOURCE_TOKEN, - useFactory: (dataSource: DataSource) => dataSource, - inject: [getDataSourceToken(connectionName)], - }; -} - -export function CurrentEntityManager(): FactoryProvider { - return { - provide: CURRENT_ENTITY_MANAGER_TOKEN, - useFactory: (dataSource: DataSource) => dataSource.manager, - inject: [CURRENT_DATA_SOURCE_TOKEN], - }; -} - -export function CurrentEntityRepository( - entity: E -): FactoryProvider> { - return { - provide: CURRENT_ENTITY_REPOSITORY, - useFactory: (entityManager: EntityManager) => - entityManager.getRepository(entity as unknown as EntityTarget), - inject: [CURRENT_ENTITY_MANAGER_TOKEN], - }; -} - -export function EntityPropsMap( - entities: EntityClass[] -) { - return { - provide: ENTITY_MAP_PROPS, - inject: [CURRENT_ENTITY_MANAGER_TOKEN], - useFactory: (entityManager: EntityManager) => { - const mapProperty = new Map, ZodEntityProps>(); - - for (const item of entities) { - const entityRepo = entityManager.getRepository(item); - - const className = getEntityName(item); - mapProperty.set(item, { - props: getProps(entityRepo), - propsType: getPropsType(entityRepo), - propsNullable: getPropsNullable(entityRepo), - primaryColumnName: getPrimaryColumnName(entityRepo), - primaryColumnType: getPrimaryColumnType(entityRepo), - typeName: camelToKebab(className), - className: className, - relations: getRelation(entityRepo), - relationProperty: getRelationProperty(entityRepo), - }); - } - return mapProperty; - }, - }; -} - -export function FindOneRowEntityFactory< - E extends ObjectLiteral ->(): FactoryProvider> { - return { - provide: FIND_ONE_ROW_ENTITY, - inject: [CURRENT_ENTITY_REPOSITORY, TypeormUtilsService], - useFactory: ( - repository: Repository, - typeormUtilsService: TypeormUtilsService - ) => { - return async (entity, value) => { - const params = 'params'; - return await repository - .createQueryBuilder(typeormUtilsService.currentAlias) - .where( - `${typeormUtilsService.getAliasPath( - typeormUtilsService.currentPrimaryColumn - )} = :${params}` - ) - .setParameters({ - [params]: value, - }) - .getOne(); - }; - }, - }; -} - -export function CheckRelationNameFactory< - E extends ObjectLiteral ->(): FactoryProvider> { - return { - provide: CHECK_RELATION_NAME, - inject: [TypeormUtilsService], - useFactory(typeormUtilsService: TypeormUtilsService) { - return (entity, value) => - !!typeormUtilsService.relationFields.find((i) => i === value); - }, - }; -} - -export function RunInTransactionFactory(): FactoryProvider { - return { - provide: RUN_IN_TRANSACTION_FUNCTION, - inject: [GLOBAL_MODULE_OPTIONS_TOKEN, CURRENT_DATA_SOURCE_TOKEN], - useFactory( - options: ResultGeneralParam & { - type: typeof TypeOrmJsonApiModule; - options: RequiredFromPartial; - }, - dataSource: DataSource - ) { - const { - options: { runInTransaction }, - } = options; - - if (runInTransaction && typeof runInTransaction === 'function') { - return (callback) => - runInTransaction('READ COMMITTED', () => callback()); - } - - return async (callback) => { - const queryRunner = dataSource.createQueryRunner(); - await queryRunner.startTransaction('READ UNCOMMITTED'); - let result: unknown; - try { - result = await callback(); - await queryRunner.commitTransaction(); - } catch (e) { - await queryRunner.rollbackTransaction(); - throw e; - } finally { - await queryRunner.release(); - } - return result; - }; - }, - }; -} - -export function OrmServiceFactory() { - return { - provide: ORM_SERVICE, - useClass: TypeOrmService, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts deleted file mode 100644 index fd6d6101..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './type-orm-json-api.module'; -export * from './type'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts deleted file mode 100644 index 8a06a3df..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.spec.ts +++ /dev/null @@ -1,422 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { - ObjectTyped, - EntityRelation, - TypeOfArray, - EntityProps, -} from '../../../utils/nestjs-shared'; -import { Repository } from 'typeorm'; -import { IMemoryDb } from 'pg-mem'; - -import { - mockDBTestModule, - pullUser, - pullAllData, - providerEntities, - getRepository, - Users, - Addresses, - Notes, - Comments, - Roles, - UserGroups, -} from '../../../mock-utils/typeorm'; - -import { - getField, - getPropsTreeForRepository, - fromRelationTreeToArrayName, - getArrayFields, - getArrayPropsForEntity, - getFieldWithType, - getTypeForAllProps, - getRelationTypeArray, - getTypePrimaryColumn, - getPropsFromDb, - getRelationTypeName, - getRelationTypePrimaryColumn, -} from './'; - -import { PropsArray, ArrayPropsForEntity, TypeField } from '../../mixin/types'; -import { createAndPullSchemaBase } from '../../../mock-utils'; - -describe('type-orm-helper', () => { - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - let db: IMemoryDb; - let user: Users; - let userWithRelation: Users; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [...providerEntities(getDataSourceToken())], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - - user = await pullUser(userRepository); - userWithRelation = await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - }); - - it('getField', async () => { - const { relations, field } = getField(userRepository); - const userFieldProps = Object.getOwnPropertyNames( - user - ) as EntityProps[]; - const hasUserFieldInResultField = userFieldProps.some( - (field) => !field.includes(field) - ); - - const hasResultInUserField = field.some( - (field) => !userFieldProps.includes(field) - ); - - const userRelationProps: EntityRelation[] = ( - Object.getOwnPropertyNames(userWithRelation) as (EntityProps & - EntityRelation)[] - ).filter((props) => !userFieldProps.includes(props)); - - const hasUserRelationInResultField = userRelationProps.some( - (field) => !relations.includes(field) - ); - - const hasResultInUserRelation = relations.some( - (field) => !userRelationProps.includes(field) - ); - - expect(hasUserFieldInResultField).toEqual(false); - expect(hasResultInUserField).toEqual(false); - - expect(hasUserRelationInResultField).toEqual(false); - expect(hasResultInUserRelation).toEqual(false); - }); - - it('getPropsTreeForRepository', () => { - const relationField = getPropsTreeForRepository(userRepository); - const userFieldProps = Object.getOwnPropertyNames( - user - ) as EntityProps[]; - const userRelationProps: EntityRelation[] = ( - Object.getOwnPropertyNames(userWithRelation) as (EntityProps & - EntityRelation)[] - ).filter((props) => !userFieldProps.includes(props)); - - const hasUserRelationInResultField = userRelationProps.some( - (field) => !Object.keys(relationField).includes(field) - ); - const hasResultInUserRelation = ObjectTyped.keys(relationField).some( - (field) => !userRelationProps.includes(field) - ); - expect(hasUserRelationInResultField).toEqual(false); - expect(hasResultInUserRelation).toEqual(false); - - for (const [relationName, fieldsRelation] of ObjectTyped.entries( - relationField - )) { - const check = fieldsRelation.some((field) => { - const targetItem = userWithRelation[relationName]; - const target = Array.isArray(targetItem) ? targetItem[0] : targetItem; - // @ts-ignore - return !ObjectTyped.keys(target).includes(field); - }); - expect(check).toEqual(false); - } - }); - - it('fromRelationTreeToArrayName', () => { - const { relations, field } = getField(userRepository); - - const relationField = getPropsTreeForRepository(userRepository); - const checkArray = fromRelationTreeToArrayName(relationField); - - for (const key of relations) { - const resultKey = - key === 'manager' ? 'Users' : key === 'userGroup' ? 'UserGroups' : key; - - const relationsRepo = - userRepository.metadata.connection.getRepository< - TypeOfArray - >(resultKey); - const { field: relationsFields } = getField(relationsRepo); - const textField = relationsFields.map((r) => `${key}.${r}`); - const check = textField.some((i) => !checkArray.includes(i as any)); - expect(check).toEqual(false); - } - }); - - it('getArrayFields', () => { - const result = getArrayFields(addressesRepository); - expect(result).toEqual({ - arrayField: true, - } as PropsArray); - }); - - it('getArrayPropsForEntity', () => { - const result = getArrayPropsForEntity(userRepository); - const check: ArrayPropsForEntity = { - target: { - testReal: true, - testArrayNull: true, - }, - manager: { - testReal: true, - testArrayNull: true, - }, - comments: {}, - notes: {}, - userGroup: {}, - roles: {}, - addresses: { - arrayField: true, - }, - }; - expect(result).toEqual(check); - }); - - it('getFieldWithType', () => { - const result = getFieldWithType(addressesRepository); - expect(result.arrayField).toBe('array'); - expect(result.state).toBe('string'); - expect(result.id).toBe('number'); - expect(result.createdAt).toBe('date'); - const result2 = getFieldWithType(userRepository); - - expect(result2.isActive).toBe('boolean'); - }); - - it('getRelationType', () => { - const result = getRelationTypeArray(userRepository); - expect(result.roles).toBe(true); - expect(result.comments).toBe(true); - expect(result.manager).toBe(false); - expect(result.addresses).toBe(false); - expect(result.userGroup).toBe(false); - expect(result.notes).toBe(true); - }); - - it('getRelationTypeName', () => { - const result = getRelationTypeName(userRepository); - expect(result.roles).toBe('Roles'); - expect(result.comments).toBe('Comments'); - expect(result.manager).toBe('Users'); - expect(result.addresses).toBe('Addresses'); - expect(result.userGroup).toBe('UserGroups'); - expect(result.notes).toBe('Notes'); - }); - - it('getRelationTypePrimaryColumn', () => { - const result = getRelationTypePrimaryColumn(userRepository); - expect(result.roles).toBe(TypeField.number); - expect(result.comments).toBe(TypeField.number); - expect(result.manager).toBe(TypeField.number); - expect(result.addresses).toBe(TypeField.number); - expect(result.userGroup).toBe(TypeField.number); - expect(result.notes).toBe(TypeField.string); - }); - - it('getTypePrimaryColumn', () => { - expect(getTypePrimaryColumn(userRepository)).toBe(TypeField.number); - expect(getTypePrimaryColumn(notesRepository)).toBe(TypeField.string); - }); - - it('getTypeForAllProps', () => { - const result = getTypeForAllProps(userRepository); - expect(result.manager.id).toBe(TypeField.number); - expect(result.testDate).toBe(TypeField.date); - expect(result.comments.id).toBe(TypeField.number); - expect(result.notes.id).toBe(TypeField.string); - }); - - it('getPropsFromDb', () => { - const result = getPropsFromDb(userRepository); - // testReal has isNullable false but have default should be true - expect(result['testReal']).toEqual({ - type: 'real', - isArray: true, - isNullable: true, - }); - - const result2 = getPropsFromDb(rolesRepository); - expect(result2['key']).toEqual({ - type: 'varchar', - isArray: false, - isNullable: false, - }); - }); -}); - -import { - getProps, - getRelation, - getPropsType, - getPropsNullable, - getPrimaryColumnName, - getPrimaryColumnType, - getRelationProperty, -} from './'; - -describe('typeorm-orm-helper-for-map', () => { - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - let db: IMemoryDb; - let user: Users; - let userWithRelation: Users; - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [...providerEntities(getDataSourceToken())], - }).compile(); - - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - }); - - it('getProps', () => { - const result = getProps(userRepository); - expect(result.includes('id')).toBe(true); - expect(result.includes('lastName')).toBe(true); - expect(result.includes('createdAt')).toBe(true); - expect(result.includes('updatedAt')).toBe(true); - expect(result.includes('isActive')).toBe(true); - expect(result.includes('login')).toBe(true); - expect(result.includes('firstName')).toBe(true); - expect(result.includes('testReal')).toBe(true); - expect(result.includes('testArrayNull')).toBe(true); - expect(result.includes('testDate')).toBe(true); - - expect(result.includes('userGroup' as any)).toBe(false); - expect(result.includes('notes' as any)).toBe(false); - expect(result.includes('comments' as any)).toBe(false); - expect(result.includes('roles' as any)).toBe(false); - expect(result.includes('manager' as any)).toBe(false); - expect(result.includes('addresses' as any)).toBe(false); - }); - - it('getPropsType', () => { - const result = getPropsType(userRepository); - - expect(result).toEqual({ - createdAt: 'date', - firstName: 'string', - id: 'number', - isActive: 'boolean', - lastName: 'string', - login: 'string', - testArrayNull: 'array', - testDate: 'date', - testReal: 'array', - updatedAt: 'date', - }); - }); - - it('getPropsNullable', () => { - const result = getPropsNullable(userRepository); - expect(result).toEqual([ - 'firstName', - 'testReal', - 'testArrayNull', - 'lastName', - 'isActive', - 'testDate', - 'createdAt', - 'updatedAt', - ]); - }); - - it('getPrimaryColumnName', () => { - const result = getPrimaryColumnName(userRepository); - expect(result).toBe('id'); - }); - - it('getPrimaryColumnType', () => { - const result = getPrimaryColumnType(userRepository); - expect(result).toBe(TypeField.number); - }); - - it('getRelation', () => { - const result = getRelation(userRepository); - expect(result.includes('id' as any)).toBe(false); - expect(result.includes('lastName' as any)).toBe(false); - expect(result.includes('createdAt' as any)).toBe(false); - expect(result.includes('updatedAt' as any)).toBe(false); - expect(result.includes('isActive' as any)).toBe(false); - expect(result.includes('login' as any)).toBe(false); - expect(result.includes('firstName' as any)).toBe(false); - expect(result.includes('testReal' as any)).toBe(false); - expect(result.includes('testArrayNull' as any)).toBe(false); - expect(result.includes('testDate' as any)).toBe(false); - - expect(result.includes('userGroup')).toBe(true); - expect(result.includes('notes')).toBe(true); - expect(result.includes('comments')).toBe(true); - expect(result.includes('roles')).toBe(true); - expect(result.includes('manager')).toBe(true); - expect(result.includes('addresses')).toBe(true); - }); - - it('getRelationProperty', () => { - const result = getRelationProperty(userRepository); - expect(result).toEqual({ - addresses: { - entityClass: Addresses, - isArray: false, - nullable: true, - }, - comments: { - entityClass: Comments, - isArray: true, - nullable: false, - }, - manager: { - entityClass: Users, - isArray: false, - nullable: true, - }, - notes: { - entityClass: Notes, - isArray: true, - nullable: false, - }, - roles: { - entityClass: Roles, - isArray: true, - nullable: false, - }, - userGroup: { - entityClass: UserGroups, - isArray: false, - nullable: true, - }, - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts deleted file mode 100644 index 4657b4be..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-helper/index.ts +++ /dev/null @@ -1,417 +0,0 @@ -import { - EntityProps, - EntityRelation, - ObjectTyped, -} from '../../../utils/nestjs-shared'; -import { Repository } from 'typeorm'; - -import { ObjectLiteral, ResultMicroOrmModuleOptions } from '../../../types'; -import { - RelationTree, - ValueOf, - UnionToTuple, - TypeCast, - Concat, - TypeOfArray, - CastProps, - PropsNameResultField, - PropsArray, - RelationType, - ResultGetField, - ArrayPropsForEntity, - AllFieldWithType, - TypeField, - FieldWithType, - RelationPropsArray, - TypeForId, - PropsForField, - ColumnType, - RelationPropsTypeName, - RelationPrimaryColumnType, - TupleOfEntityRelation, - TupleOfEntityProps, - FilterNullableProps, - RelationProperty, -} from '../../mixin/types'; -import { getEntityName } from '../../mixin/helper'; -import { EntityMetadata } from '@mikro-orm/core'; - -export type ConcatFieldWithRelation< - R extends string, - T extends readonly string[] -> = ValueOf<{ - [K in T[number]]: Concat; -}>; - -export type ConcatRelationUnion< - E extends ObjectLiteral, - R = RelationTree -> = ValueOf<{ - [K in keyof R]: ConcatFieldWithRelation< - TypeCast, - TypeCast - >; -}>; - -export type ConcatRelation = TypeCast< - UnionToTuple>, - [string, ...string[]] ->; - -export const getField = ( - repository: Repository -): ResultGetField => { - const relations = repository.metadata.relations.map((i) => { - return i.propertyName; - }); - - const field = repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .map((r) => r.propertyName); - - return { - field, - relations, - } as unknown as ResultGetField; -}; - -export const fromRelationTreeToArrayName = ( - relationTree: RelationTree -): ConcatRelation => { - return ObjectTyped.entries(relationTree).reduce((acum, [name, filed]) => { - acum.push(...filed.map((i) => `${name.toLocaleString()}.${i}`)); - return acum; - }, [] as string[]) as unknown as ConcatRelation; -}; - -export const getPropsTreeForRepository = ( - repository: Repository -): RelationTree => { - const dataSource = repository.metadata.connection; - - const relationType = repository.metadata.relations.reduce((acum, i) => { - acum[i.propertyName] = i.inverseEntityMetadata.target; - return acum; - }, {} as Record) as unknown as RelationType; - - return ObjectTyped.entries(relationType).reduce( - (acum, [key, value]) => ({ - ...acum, - ...{ [key]: getField(dataSource.getRepository(value))['field'] }, - }), - {} as RelationTree - ); -}; - -export type PropertyTarget< - E extends ObjectLiteral, - For extends PropsNameResultField -> = { - [K in ResultGetField[For][number]]: K extends keyof E - ? TypeOfArray - : never; -}; - -export function guardKeyForPropertyTarget< - E extends ObjectLiteral, - For extends PropsNameResultField, - R extends PropertyTarget ->(relationsTargets: R, key: any): asserts key is keyof R { - if (!(key in relationsTargets)) throw new Error('Type guard error'); -} - -export const getArrayPropsForEntity = ( - repository: Repository -): ArrayPropsForEntity => { - const connection = repository.metadata.connection; - - const relationsTargets = repository.metadata.relations.reduce( - (acum, i) => ({ - ...acum, - [i.propertyName]: i.type, - }), - {} as Record - ) as PropertyTarget; - - const { relations } = getField(repository); - const relationsArrayFields = relations.reduce( - (acum, item) => { - guardKeyForPropertyTarget(relationsTargets, item); - const target = relationsTargets[item] as TypeCast< - TypeOfArray>, - ObjectLiteral - >; - - const repository = connection.getRepository( - target as Function - ) as Repository; - - acum[item] = getArrayFields(repository) as PropsArray< - TypeOfArray> - >; - - return acum; - }, - {} as { - [K in ResultGetField['relations'][number]]: PropsArray< - TypeOfArray> - >; - } - ); - - return { - target: getArrayFields(repository), - ...relationsArrayFields, - }; -}; - -export const getArrayFields = ( - repository: Repository -): PropsArray => { - const relations = repository.metadata.relations.map((i) => { - return i.propertyName; - }); - - return repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .reduce((acum, metaData) => { - if (metaData.isArray) { - acum[metaData.propertyName] = true; - } - return acum; - }, {} as Record) as PropsArray; -}; - -export const getTypeForAllProps = ( - repository: Repository -): AllFieldWithType => { - const targetField = getFieldWithType(repository); - - const relationField = repository.metadata.relations.reduce((acum, item) => { - acum[item.propertyName] = getFieldWithType( - repository.manager.getRepository(item.inverseEntityMetadata.target) - ); - return acum; - }, {} as any); - - return { - ...targetField, - ...relationField, - }; -}; - -export const getFieldWithType = ( - repository: Repository -): FieldWithType => { - const { field } = getField(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of field) { - let typeProps: TypeField = TypeField.string; - switch (Reflect.getMetadata('design:type', entity['prototype'], item)) { - case Array: - typeProps = TypeField.array; - break; - case Date: - typeProps = TypeField.date; - break; - case Number: - typeProps = TypeField.number; - break; - case Boolean: - typeProps = TypeField.boolean; - break; - case Object: - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - result[item] = typeProps; - } - - return result; -}; - -export const getRelationTypeArray = ( - repository: Repository -): RelationPropsArray => { - const { relations } = getField(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of relations) { - result[item] = - Reflect.getMetadata('design:type', entity['prototype'], item) === Array; - } - return result; -}; - -export const getTypePrimaryColumn = ( - repository: Repository -): TypeForId => { - const target = repository.target as any; - const primaryColumn = repository.metadata.primaryColumns[0].propertyName; - - return Reflect.getMetadata( - 'design:type', - target['prototype'], - primaryColumn - ) === Number - ? TypeField.number - : TypeField.string; -}; - -export const getPropsFromDb = ( - repository: Repository -): PropsForField => { - return repository.metadata.columns.reduce((acum, i) => { - const tmp = i.propertyName as unknown as EntityProps & EntityRelation; - acum[tmp] = { - type: i.type as ColumnType, - isArray: i.isArray, - isNullable: i.isNullable || i.default !== undefined, - }; - return acum; - }, {} as PropsForField); -}; - -export const getRelationTypeName = ( - repository: Repository -): RelationPropsTypeName => { - return repository.metadata.relations.reduce((acum, i) => { - acum[i.propertyName] = getEntityName(i.inverseEntityMetadata.target); - return acum; - }, {} as Record) as RelationPropsTypeName; -}; - -export const getRelationTypePrimaryColumn = ( - repository: Repository -): RelationPrimaryColumnType => { - return repository.metadata.relations.reduce((acum, i) => { - const target = i.inverseEntityMetadata.target as any; - const primaryColumn = - i.inverseEntityMetadata.primaryColumns[0].propertyName; - acum[i.propertyName] = - Reflect.getMetadata('design:type', target['prototype'], primaryColumn) === - Number - ? TypeField.number - : TypeField.string; - return acum; - }, {} as Record) as RelationPrimaryColumnType; -}; -// ----- - -export const getRelation = ( - repository: Repository -) => - repository.metadata.relations.map((i) => { - return i.propertyName; - }) as TupleOfEntityRelation; - -export const getProps = ( - repository: Repository -): TupleOfEntityProps => { - const relations = getRelation(repository); - - return repository.metadata.columns - .filter((i) => !relations.includes(i.propertyName)) - .map((r) => r.propertyName) as TupleOfEntityProps; -}; - -export const getPropsType = ( - repository: Repository -): FieldWithType => { - const field = getProps(repository); - - const entity = repository.target as any; - const result = {} as any; - for (const item of field) { - let typeProps: TypeField = TypeField.string; - - const fieldMetadata = repository.metadata.columns.find( - (i) => i.propertyName === item - ); - - if (fieldMetadata?.isArray) { - result[item] = TypeField.array; - continue; - } - - switch (Reflect.getMetadata('design:type', entity['prototype'], item)) { - case Array: - typeProps = TypeField.array; - break; - case Date: - typeProps = TypeField.date; - break; - case Number: - typeProps = TypeField.number; - break; - case Boolean: - typeProps = TypeField.boolean; - break; - case Object: - typeProps = TypeField.object; - break; - default: - typeProps = TypeField.string; - } - - result[item] = fieldMetadata?.isArray ? TypeField.array : typeProps; - } - - return result; -}; - -export const getPropsNullable = ( - repository: Repository -): FilterNullableProps> => { - const relation = getRelation(repository); - return repository.metadata.columns - .filter((i) => !relation.includes(i.propertyName)) - .map((i) => - i.isNullable || i.default !== undefined ? i.propertyName : false - ) - .filter((i) => !!i) as FilterNullableProps>; -}; - -export const getPrimaryColumnName = ( - repository: Repository -) => { - const column = repository.metadata.primaryColumns.at(0); - if (!column) throw new Error('Primary column not found'); - - return column.propertyName; -}; - -export const getPrimaryColumnType = ( - repository: Repository -): TypeForId => { - const target = repository.target as any; - const primaryColumn = repository.metadata.primaryColumns[0].propertyName; - - return Reflect.getMetadata( - 'design:type', - target['prototype'], - primaryColumn - ) === Number - ? TypeField.number - : TypeField.string; -}; - -export const getRelationProperty = ( - repository: Repository -): RelationProperty => { - return repository.metadata.relations.reduce((acum, item) => { - // @ts-expect-error its dynamic creater - acum[item.propertyName] = { - entityClass: item.inverseEntityMetadata.target, - nullable: item.isManyToMany || item.isOneToMany ? false : item.isNullable, - isArray: item.isManyToMany || item.isOneToMany, - }; - - return acum; - }, {} as RelationProperty); -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts deleted file mode 100644 index c47d008e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; - -import { - mockDBTestModule, - providerEntities, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - OrmServiceFactory, -} from '../../factory'; -import { CURRENT_ENTITY, DEFAULT_CONNECTION_NAME } from '../../../../constants'; - -import { - getRepository, - pullUser, - Users, - entities, -} from '../../../../mock-utils/typeorm'; - -import { Repository } from 'typeorm'; -import { CONTROL_OPTIONS_TOKEN, ORM_SERVICE } from '../../../../constants'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { EntityPropsMap } from '../../factory'; - -describe('deleteOne', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - - let user: Users; - let userRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ userRepository } = getRepository(module)); - user = await pullUser(userRepository); - typeormService = module.get>(ORM_SERVICE); - }); - - it('Should be ok', async () => { - await typeormService.deleteOne(`${user.id}`); - expect(await userRepository.findOneBy({ id: user.id })).toBe(null); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts deleted file mode 100644 index 1a6871d7..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-one/delete-one.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { FindOptionsWhere } from 'typeorm'; -import { TypeOrmService } from '../../service'; -import { ObjectLiteral } from '../../../../types'; - -export async function deleteOne( - this: TypeOrmService, - id: number | string -): Promise { - const data = await this.repository.findOne({ - where: { - [this.typeormUtilsService.currentPrimaryColumn.toString()]: id, - } as FindOptionsWhere, - }); - if (!data) return void 0; - - this.config.useSoftDelete - ? await this.repository.softRemove(data) - : await this.repository.remove(data); - - return void 0; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts deleted file mode 100644 index 627f0917..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.spec.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; - -describe('deleteRelationship', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - let typeormUtilsService: TypeormUtilsService; - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - typeormUtilsService = - module.get>(TypeormUtilsService); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('Should be ok', async () => { - const checkUser = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - - const roles = await rolesRepository.find(); - const userGroups = await userGroupRepository.find(); - const users = await userRepository.find(); - - if (!checkUser) { - throw new Error('not found mock'); - } - - const userGroupData = { - type: 'user-groups', - id: userGroups - .find((i) => checkUser.userGroup.id === i.id) - ?.id.toString(), - }; - const rolesData = [ - { - type: 'roles', - id: roles - .find((i) => checkUser.roles.find((a) => a.id === i.id)) - ?.id.toString(), - }, - ]; - - const managerData = { - type: 'users', - id: users.find((i) => checkUser.manager.id === i.id)?.id.toString(), - }; - await typeormService.deleteRelationship(1, 'roles', rolesData as any); - await typeormService.deleteRelationship( - 1, - 'userGroup', - userGroupData as any - ); - await typeormService.deleteRelationship(1, 'manager', managerData as any); - - const checkUserAfterPost = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - if (!checkUserAfterPost) { - throw new Error('not found'); - } - expect(checkUserAfterPost.manager).toBe(null); - expect(checkUserAfterPost.roles.map((i) => i.id.toString()).sort()).toEqual( - checkUser.roles - .map((i) => i.id.toString()) - .filter((i) => !rolesData.map((i) => i.id).includes(i)) - .sort() - ); - expect(checkUserAfterPost.userGroup).toBe(null); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts deleted file mode 100644 index 947553b5..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/delete-relationship/delete-relationship.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { EntityRelation } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; - -import { PostRelationshipData } from '../../../mixin/zod'; -import { TypeOrmService } from '../../service'; - -export async function deleteRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: TypeOrmService, - id: number | string, - rel: Rel, - input: PostRelationshipData -): Promise { - const idsResult = await this.typeormUtilsService.validateRelationInputData( - rel, - input - ); - const postBuilder = this.repository - .createQueryBuilder() - .relation(rel.toString()) - .of(id); - - if (Array.isArray(idsResult)) { - await postBuilder.remove(idsResult); - } else { - await postBuilder.set(null); - } - return void 0; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts deleted file mode 100644 index 3dd8ea02..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.spec.ts +++ /dev/null @@ -1,410 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { QueryField } from '../../../../utils/nestjs-shared'; -import { Equal, Repository } from 'typeorm'; -import { IMemoryDb } from 'pg-mem'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { - CONTROL_OPTIONS_TOKEN, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, - DEFAULT_QUERY_PAGE, - DEFAULT_PAGE_SIZE, - CURRENT_ENTITY, -} from '../../../../constants'; -import { ObjectLiteral as Entity } from '../../../../types'; - -import { Query } from '../../../mixin/zod'; - -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -function getDefaultQuery() { - const filter = { - relation: null, - target: null, - }; - const defaultQuery: Query = { - [QueryField.filter]: filter, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: DEFAULT_PAGE_SIZE, - number: DEFAULT_QUERY_PAGE, - }, - }; - - return defaultQuery; -} - -describe('getAll', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('order', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - - const checkData = await userRepository.find({ - relations: { - addresses: true, - comments: true, - }, - order: { - id: 'DESC', - comments: { - id: 'DESC', - }, - }, - }); - - const query = getDefaultQuery(); - query.include = ['addresses', 'comments']; - query.sort = { - target: { - id: 'DESC', - }, - comments: { - id: 'DESC', - }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith(checkData, query); - }); - - it('include', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - - const checkData = await userRepository.findOne({ - where: { - id: 1, - }, - relations: { - addresses: true, - comments: true, - }, - }); - - const query = getDefaultQuery(); - query.include = ['addresses', 'comments']; - query.filter.target = { - id: { - eq: `${checkData?.id}`, - }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - it('select', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - - const checkData = await userRepository.findOne({ - select: { - id: true, - isActive: true, - addresses: { - state: true, - id: true, - }, - comments: { - text: true, - id: true, - }, - }, - where: { - id: 1, - }, - relations: { - addresses: true, - comments: true, - }, - }); - - const query = getDefaultQuery(); - query.fields = { - target: ['id', 'isActive'], - addresses: ['state'], - comments: ['text'], - }; - query.include = ['addresses', 'comments']; - query.filter.target = { - id: { - eq: `${checkData?.id}`, - }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - describe('filter', () => { - let firstRole: Roles; - let secondRole: Roles; - let addresses: Addresses[]; - let comments: Comments[]; - beforeAll(async () => { - firstRole = (await rolesRepository.findOneBy({ - id: 1, - })) as Roles; - secondRole = (await rolesRepository.findOneBy({ - id: 2, - })) as Roles; - - addresses = await addressesRepository.find(); - comments = await commentsRepository.find(); - }); - - it('Target props with null', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - - const query = getDefaultQuery(); - query.filter.target = { - id: { eq: '1' }, - firstName: { eq: null }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toHaveBeenCalledTimes(0); - }); - - it('Target props', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const checkData = await userRepository.findOne({ - where: { - id: 1, - }, - }); - const query = getDefaultQuery(); - query.filter.target = { - id: { eq: `${checkData?.id}` }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - it('Check relation with the same Entity', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const checkData = await userRepository.findOne({ - where: { - id: 1, - comments: { - text: Equal(comments[0].text), - }, - }, - relations: { - comments: true, - }, - }); - const query = getDefaultQuery(); - query.filter.relation = { - comments: { - text: { - eq: comments[0].text, - }, - }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - // it('Target relation is null', async () => { - // const query = getDefaultQuery(); - // query.filter.target = { - // comments: { - // eq: 'null', - // }, - // }; - // await typeormService.getAll(query); - // }); - - it('Relation many-to-one', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const checkData = await userRepository.findOne({ - where: { - id: 1, - }, - relations: { - manager: true, - }, - }); - - const query = getDefaultQuery(); - query.filter.target = { - id: { - eq: '1', - }, - }; - query.filter.relation = { - manager: { - id: { - eq: '2', - }, - }, - }; - query.include = ['manager']; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - it('Relation one-to-many', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const checkData = await userRepository.findOne({ - where: { - id: 1, - addresses: { - state: Equal(addresses[0].state), - }, - }, - relations: { - addresses: true, - }, - }); - const query = getDefaultQuery(); - query.filter.relation = { - addresses: { - state: { - eq: addresses[0].state, - }, - }, - }; - await typeormService.getAll(query); - expect(spyOnTransformData).toBeCalledWith([checkData], query); - }); - - it('Relation many-to-many', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const checkData = await userRepository.find({ - where: { - id: 1, - roles: { - name: Equal(firstRole.name), - }, - }, - relations: { - roles: true, - }, - }); - - const query = getDefaultQuery(); - query.include = ['roles']; - query.filter.relation = { - roles: { - name: { - eq: firstRole.name, - }, - }, - }; - const { data } = await typeormService.getAll(query); - expect(spyOnTransformData).not.toHaveBeenCalled(); - expect(data).toEqual([]); - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts deleted file mode 100644 index e6c9fa3e..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-all/get-all.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { ObjectTyped, ResourceObject } from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { Query } from '../../../mixin/zod'; -import { TypeOrmService } from '../../service'; -import { TupleOfEntityRelation } from '../../../mixin/types'; -import { ASC, DESC } from '../../../../constants'; - -import { - ALIAS_FOR_PAGINATION, - SUB_QUERY_ALIAS_FOR_PAGINATION, -} from '../../constants'; - -type OrderByCondition = Record; - -function getSortObject(params: any, relationName: string) { - return Object.entries(params).reduce((acum, [props, sort]) => { - acum[`${relationName}.${props}`] = `${sort}` === ASC ? ASC : DESC; - return acum; - }, {} as OrderByCondition); -} - -export async function getAll( - this: TypeOrmService, - query: Query -): Promise> { - const { fields, filter, include, sort, page } = query; - - let defaultSortObject: OrderByCondition = { - [`${ - this.typeormUtilsService.currentAlias - }.${this.typeormUtilsService.currentPrimaryColumn.toString()}`]: ASC, - }; - - const includeForCountQuery = new Set(); - const selectFields = new Set(); - const includeRel = new Set(); - - const skip = (page.number - 1) * page.size; - - const expressionArrayForTarget = - this.typeormUtilsService.getFilterExpressionForTarget(query); - const expressionArrayForRelation = - this.typeormUtilsService.getFilterExpressionForRelation(query); - const expressionArray = [ - ...expressionArrayForTarget, - ...expressionArrayForRelation, - ]; - - if (sort) { - const { target, ...relation } = sort; - const targetOrder = getSortObject( - target || {}, - this.typeormUtilsService.currentAlias - ); - - const relOrder = Object.entries(relation || {}).reduce( - (acum, [name, order]) => { - return { - ...acum, - ...getSortObject( - order || {}, - this.typeormUtilsService.getAliasForRelation(name) - ), - }; - }, - {} as OrderByCondition - ); - const resultOrder = { - ...targetOrder, - ...relOrder, - }; - if (Object.keys(resultOrder).length > 0) { - defaultSortObject = resultOrder; - } - for (const item of ObjectTyped.keys(relation)) { - includeForCountQuery.add(item.toString()); - } - } - - const queryBuilderForCount = this.repository - .createQueryBuilder(this.typeormUtilsService.currentAlias) - .select( - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - ), - this.typeormUtilsService.currentPrimaryColumn.toString() - ) - .orderBy(defaultSortObject); - - for (const i in expressionArray) { - const { params, alias, selectInclude, expression } = expressionArray[i]; - const expressionTempArray: string[] = []; - if (alias) { - expressionTempArray.push(alias); - } - expressionTempArray.push(expression); - queryBuilderForCount[i === '0' ? 'where' : 'andWhere']( - expressionTempArray.join(' ') - ); - if (params) { - if (Array.isArray(params)) { - for (const { name, val } of params) { - queryBuilderForCount.setParameters({ [name]: val }); - } - } else { - queryBuilderForCount.setParameters({ [params.name]: params.val }); - } - } - if (selectInclude) includeForCountQuery.add(selectInclude); - } - - for (const rel of [...includeForCountQuery]) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(rel); - queryBuilderForCount.leftJoin( - this.typeormUtilsService.getAliasPath(rel), - currentIncludeAlias - ); - } - - const count = await queryBuilderForCount.getCount(); - const meta = { - pageNumber: page.number, - totalItems: count, - pageSize: page.size, - }; - - if (count === 0) { - return { - meta, - data: [], - }; - } - - const aliasForIdResultPagination = this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn, - ALIAS_FOR_PAGINATION, - '_' - ); - - const resultIds = await this.repository - .createQueryBuilder(ALIAS_FOR_PAGINATION) - .select( - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn, - ALIAS_FOR_PAGINATION - ), - aliasForIdResultPagination - ) - .innerJoin( - `(${queryBuilderForCount.offset(skip).limit(page.size).getQuery()})`, - SUB_QUERY_ALIAS_FOR_PAGINATION, - `${this.typeormUtilsService.getAliasPath( - queryBuilderForCount.escape( - this.typeormUtilsService.currentPrimaryColumn.toString() - ), - queryBuilderForCount.escape(SUB_QUERY_ALIAS_FOR_PAGINATION) - )} = ${this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn, - ALIAS_FOR_PAGINATION - )}` - ) - .setParameters(queryBuilderForCount.getParameters()) - .getRawMany<{ - [K: typeof aliasForIdResultPagination]: number; - }>(); - - const ids = resultIds.map((i) => i[aliasForIdResultPagination]); - if (ids.length === 0) { - return { - meta, - data: [], - }; - } - if (include) { - for (const rel of include) { - includeRel.add(rel); - } - } - - if (fields) { - if (include) { - for (const rel of include) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(rel); - const primaryColumnName = - this.typeormUtilsService.getPrimaryColumnForRel(rel); - selectFields.add(`${currentIncludeAlias}.${primaryColumnName}`); - } - } - - const { target, ...other } = fields; - if (target) { - for (const item of target) { - selectFields.add(`${this.typeormUtilsService.currentAlias}.${item}`); - } - } - - for (const [rel, fields] of ObjectTyped.entries(other)) { - const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( - rel as TupleOfEntityRelation[number] - ); - if (!fields) continue; - for (const field of fields) { - selectFields.add(`${currentIncludeAlias.toString()}.${field}`); - } - } - } - - const resultQuery = this.repository - .createQueryBuilder() - .orderBy(defaultSortObject); - - if (selectFields.size > 0) { - resultQuery.select([...selectFields]); - } - - resultQuery.whereInIds(ids); - for (const expressionItem of expressionArrayForRelation) { - const { selectInclude, alias, paramsForResult, params, expression } = - expressionItem; - if (paramsForResult) { - for (const item of paramsForResult) { - resultQuery.andWhere(item); - } - } else { - resultQuery.andWhere(`${alias} ${expression}`); - } - - if (params) { - if (Array.isArray(params)) { - for (const item of params) { - resultQuery.setParameters({ [item.name]: item.val }); - } - } else { - resultQuery.setParameters({ [params.name]: params.val }); - } - } - if (selectInclude) includeRel.add(selectInclude); - } - - for (const item of [...includeRel]) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(item); - if (!currentIncludeAlias) continue; - resultQuery[selectFields.size > 0 ? 'leftJoin' : 'leftJoinAndSelect']( - this.typeormUtilsService.getAliasPath(item), - currentIncludeAlias - ); - } - const resultData = await resultQuery.getMany(); - const { included, data } = this.transformDataService.transformData( - resultData, - query - ); - return { - meta: { - pageNumber: page.number, - totalItems: count, - pageSize: page.size, - }, - data, - ...(included ? { included } : {}), - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts deleted file mode 100644 index 97fb1f30..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { QueryField } from '../../../../utils/nestjs-shared'; -import { IMemoryDb } from 'pg-mem'; -import { Equal, Repository } from 'typeorm'; - -import { ObjectLiteral as Entity } from '../../../../types'; -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - DEFAULT_PAGE_SIZE, - DEFAULT_QUERY_PAGE, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { Query } from '../../../mixin/zod'; -import { NotFoundException } from '@nestjs/common'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; - -function getDefaultQuery() { - const defaultQuery: Query = { - [QueryField.filter]: { - relation: null, - target: null, - }, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: DEFAULT_PAGE_SIZE, - number: DEFAULT_QUERY_PAGE, - }, - }; - - return defaultQuery; -} - -describe('getOne', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('Get one item', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const query = getDefaultQuery(); - const checkData = await userRepository.findOne({ - where: { - id: Equal(1), - }, - relations: { - addresses: true, - comments: true, - }, - }); - query.include = ['addresses', 'comments']; - await typeormService.getOne('1', query); - expect(spyOnTransformData).toBeCalledWith(checkData, query); - }); - it('Get one item with select', async () => { - const spyOnTransformData = jest.spyOn( - transformDataService, - 'transformData' - ); - const query = getDefaultQuery(); - const checkData = await userRepository.findOne({ - select: { - firstName: true, - id: true, - isActive: true, - comments: { - id: true, - text: true, - }, - addresses: { - id: true, - }, - manager: { - id: true, - login: true, - }, - }, - where: { - id: Equal(1), - }, - relations: { - addresses: true, - comments: true, - manager: true, - }, - }); - query.include = ['addresses', 'comments', 'manager']; - query.fields = { - target: ['firstName', 'isActive'], - comments: ['text'], - manager: ['login'], - }; - await typeormService.getOne('1', query); - expect(spyOnTransformData).toBeCalledWith(checkData, query); - }); - it('Should be error', async () => { - expect.assertions(1); - try { - const query = getDefaultQuery(); - await typeormService.getOne('1000000', query); - } catch (e) { - expect(e).toBeInstanceOf(NotFoundException); - } - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts deleted file mode 100644 index b092393f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-one/get-one.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { NotFoundException } from '@nestjs/common'; -import { ObjectTyped, ResourceObject } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { QueryOne } from '../../../mixin/zod'; -import { TypeOrmService } from '../../service'; - -export async function getOne( - this: TypeOrmService, - id: number | string, - query: QueryOne -): Promise> { - const { include, fields } = query; - const selectFields = new Set(); - const builder = this.repository.createQueryBuilder( - this.typeormUtilsService.currentAlias - ); - - if (fields) { - selectFields.add( - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - ) - ); - - const { target, ...other } = fields; - if (target) { - for (const fieldItem of target) { - selectFields.add(this.typeormUtilsService.getAliasPath(fieldItem)); - } - } - - for (const [rel, fieldRel] of ObjectTyped.entries(other)) { - if (fieldRel) { - for (const itemFieldRel of fieldRel) { - selectFields.add( - this.typeormUtilsService.getAliasPath( - itemFieldRel, - this.typeormUtilsService.getAliasForRelation(rel.toString()) - ) - ); - } - } - } - } - - if (include) { - for (const rel of include) { - const currentIncludeAlias = - this.typeormUtilsService.getAliasForRelation(rel); - - builder[fields ? 'leftJoin' : 'leftJoinAndSelect']( - this.typeormUtilsService.getAliasPath(rel), - currentIncludeAlias - ); - - if (fields) { - selectFields.add( - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.getPrimaryColumnForRel(rel), - currentIncludeAlias - ) - ); - } - } - } - if (selectFields.size > 0) { - builder.select([...selectFields]); - } - const paramsId = 'paramsId'; - const result = await builder - .where( - `${this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - )} = :${paramsId}`, - { - [paramsId]: id, - } - ) - .getOne(); - - if (!result) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, - path: ['fields'], - }; - throw new NotFoundException([error]); - } - const { included, data } = this.transformDataService.transformData( - result, - query - ); - return { - meta: {}, - data, - ...(included ? { included } : {}), - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts deleted file mode 100644 index 979323d1..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.spec.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; - -import { NotFoundException } from '@nestjs/common'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -describe('getRelationship', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('Should be ok', async () => { - const spyOnTransformData = jest.spyOn(transformDataService, 'transformRel'); - const id = 1; - const rel = 'roles'; - const check = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - }, - where: { id }, - relations: { - roles: true, - }, - }); - const result = await typeormService.getRelationship(id, rel); - expect(spyOnTransformData).toBeCalledWith(check, rel); - expect(result).toHaveProperty('data'); - }); - it('Should be error', async () => { - expect.assertions(1); - try { - await typeormService.getRelationship('1000000', 'roles'); - } catch (e) { - expect(e).toBeInstanceOf(NotFoundException); - } - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts deleted file mode 100644 index be447e90..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/get-relationship/get-relationship.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - EntityRelation, - ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; - -import { - InternalServerErrorException, - NotFoundException, -} from '@nestjs/common'; -import { TypeOrmService } from '../../service'; -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; - -export async function getRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: TypeOrmService, - id: number | string, - rel: Rel -): Promise> { - const paramsId = 'paramsId'; - const result = await this.repository - .createQueryBuilder() - .select([ - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - ), - this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.getPrimaryColumnForRel(rel.toString()), - this.typeormUtilsService.getAliasForRelation(rel.toString()) - ), - ]) - .where( - ` - ${this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - )} = :paramsId - ` - ) - .leftJoin( - this.typeormUtilsService.getAliasPath(rel.toString()), - this.typeormUtilsService.getAliasForRelation(rel.toString()) - ) - .setParameters({ - [paramsId]: id, - }) - .getOne(); - - if (!result) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, - path: ['fields'], - }; - throw new NotFoundException([error]); - } - const data = this.transformDataService.transformRel(result, rel); - - return { - meta: {}, - data, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts deleted file mode 100644 index 92f7bb57..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { getAll } from './get-all/get-all'; -export { getOne } from './get-one/get-one'; -export { deleteOne } from './delete-one/delete-one'; -export { postOne } from './post-one/post-one'; -export { patchOne } from './patch-one/patch-one'; -export { getRelationship } from './get-relationship/get-relationship'; -export { postRelationship } from './post-relationship/post-relationship'; -export { deleteRelationship } from './delete-relationship/delete-relationship'; -export { patchRelationship } from './patch-relationship/patch-relationship'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts deleted file mode 100644 index 7e8ca456..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.spec.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IBackup, IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; - -import { PatchData, PostData } from '../../../mixin/zod'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -describe('patchOne', () => { - let db: IMemoryDb; - let backaUp: IBackup; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - const firstName = 'firstName test'; - const isActive = false; - const testDate = new Date(); - const login = 'login test'; - - let inputData: PostData; - let newData: PatchData; - - let notes: Notes[]; - let users: Users[]; - let roles: Roles[]; - let userGroup: UserGroups[]; - let addresses: Addresses[]; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - - notes = await notesRepository.find(); - users = await userRepository.find(); - roles = await rolesRepository.find(); - userGroup = await userGroupRepository.find({ - relations: { - users: true, - }, - }); - addresses = await addressesRepository.find(); - - inputData = { - type: 'users', - attributes: { - firstName, - isActive, - testDate, - login, - }, - relationships: { - addresses: { - data: { - type: 'addresses', - id: addresses[0].id.toString(), - }, - }, - notes: { - data: [ - { - type: 'notes', - id: notes[0].id, - }, - ], - }, - roles: { - data: [ - { - type: 'roles', - id: `${roles[0].id}`, - }, - ], - }, - manager: { - data: { - type: 'users', - id: `${users[0].id}`, - }, - }, - userGroup: { - data: { - type: 'user-group', - id: `${userGroup[0].id}`, - }, - }, - }, - }; - - await typeormService.postOne(inputData); - backaUp = db.backup(); - const changeUser = await userRepository.findOneBy({ - login: inputData.attributes.login as string, - }); - if (!changeUser) { - throw new Error('not found mock data'); - } - newData = { - ...inputData, - id: `${changeUser.id}`, - }; - const newLogin = `${changeUser.login} - newLogin`; - const newIsActive = !changeUser.isActive; - - newData.attributes.login = newLogin; - newData.attributes.isActive = newIsActive; - newData.attributes.testDate = new Date(); - - newData.relationships = { - ...newData.relationships, - manager: { - data: { - type: 'users', - id: users[1].id.toString(), - }, - }, - addresses: { - data: null, - }, - userGroup: { - data: { - type: 'user-group', - id: `${userGroup[1].id}`, - }, - }, - roles: { - data: [ - { - type: 'roles', - id: `${roles[1].id}`, - }, - ], - }, - }; - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - backaUp.restore(); - }); - - it('should be ok without relation', async () => { - const spyOnTransformData = jest - .spyOn(transformDataService, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - })); - - const { relationships, ...withoutRelationships } = newData; - const returnData = await typeormService.patchOne( - withoutRelationships.id as string, - withoutRelationships - ); - - const result = await userRepository.findOneBy({ - id: parseInt(withoutRelationships.id as string, 10), - }); - expect(spyOnTransformData).toBeCalledWith(result, { - fields: null, - include: [], - }); - expect(returnData).not.toHaveProperty('included'); - }); - - it('should be ok with relation', async () => { - const spyOnTransformData = jest - .spyOn(transformDataService, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - included: {} as any, - })); - - const returnData = await typeormService.patchOne( - newData.id as string, - newData - ); - - const result = await userRepository.findOne({ - where: { - id: parseInt(newData.id as string, 10), - }, - relations: { - addresses: true, - notes: true, - userGroup: true, - roles: true, - manager: true, - }, - }); - - expect(spyOnTransformData).toBeCalledWith(result, { - fields: null, - include: ['addresses', 'notes', 'roles', 'manager', 'userGroup'], - }); - expect(returnData).toHaveProperty('included'); - }); - - it('should be ok with relation nulling relation', async () => { - const spyOnTransformData = jest - .spyOn(transformDataService, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - included: {} as any, - })); - - newData.relationships = { - ...newData.relationships, - userGroup: { - data: null, - }, - roles: { - data: [], - }, - }; - - const returnData = await typeormService.patchOne( - newData.id as string, - newData - ); - - const result = await userRepository.findOne({ - where: { - id: parseInt(newData.id as string, 10), - }, - relations: { - addresses: true, - notes: true, - userGroup: true, - roles: true, - manager: true, - }, - }); - - expect(spyOnTransformData).toBeCalledWith(result, { - fields: null, - include: ['addresses', 'notes', 'roles', 'manager', 'userGroup'], - }); - expect(returnData).toHaveProperty('included'); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts deleted file mode 100644 index 5551a31b..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-one/patch-one.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { DeepPartial } from 'typeorm'; -import { - ResourceObject, - ObjectTyped, - QueryField, -} from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral, ValidateQueryError } from '../../../../types'; -import { PatchData, Query } from '../../../mixin/zod'; -import { TypeOrmService } from '../../service'; - -export async function patchOne( - this: TypeOrmService, - id: number | string, - inputData: PatchData -): Promise> { - const { id: idBody, attributes, relationships } = inputData; - - if (`${id}` !== idBody) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Data 'id' must be equal to url param`, - path: ['data', 'id'], - }; - - throw new UnprocessableEntityException([error]); - } - - const paramsId = 'paramsId'; - const result = await this.repository - .createQueryBuilder() - .where( - `${this.typeormUtilsService.getAliasPath( - this.typeormUtilsService.currentPrimaryColumn - )} = :${paramsId}`, - { - [paramsId]: id, - } - ) - .getOne(); - - if (!result) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, - path: ['data', 'id'], - }; - throw new NotFoundException([error]); - } - - if (attributes) { - const entityTarget = this.repository.manager.create( - this.repository.target, - attributes as DeepPartial - ); - for (const [props, val] of ObjectTyped.entries(entityTarget)) { - result[props] = val; - } - } - - const saveData = await this.typeormUtilsService.saveEntityData( - result, - relationships - ); - - const fakeQuery: Query = { - [QueryField.fields]: null, - [QueryField.include]: Object.keys(relationships || {}), - } as any; - - const { data, included } = this.transformDataService.transformData( - saveData, - fakeQuery - ); - const includeData = included ? { included } : {}; - return { - meta: {}, - data, - ...includeData, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts deleted file mode 100644 index 4e3c326a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -describe('patchRelationship', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - let typeormUtilsService: TypeormUtilsService; - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - typeormUtilsService = - module.get>(TypeormUtilsService); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('Should be ok', async () => { - const checkUser = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - - const roles = await rolesRepository.find(); - const userGroups = await userGroupRepository.find(); - const users = await userRepository.find(); - - if (!checkUser) { - throw new Error('not found mock'); - } - - const userGroupData = { - type: 'user-groups', - id: userGroups - .find((i) => checkUser.userGroup.id !== i.id) - ?.id.toString(), - }; - const rolesData = [ - { - type: 'roles', - id: roles - .find((i) => checkUser.roles.find((a) => a.id !== i.id)) - ?.id.toString(), - }, - ]; - - const managerData = { - type: 'users', - id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), - }; - const result = await typeormService.patchRelationship( - 1, - 'roles', - rolesData as any - ); - const result1 = await typeormService.patchRelationship( - 1, - 'userGroup', - userGroupData as any - ); - const result2 = await typeormService.patchRelationship( - 1, - 'manager', - managerData as any - ); - - const checkUserAfterPost = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - if (!checkUserAfterPost) { - throw new Error('not found'); - } - expect(checkUserAfterPost.manager.id.toString()).toBe(managerData.id); - expect(checkUserAfterPost.roles.map((i) => i.id.toString())).toEqual( - rolesData.map((i) => i.id) - ); - expect(checkUserAfterPost.userGroup.id.toString()).toBe(userGroupData.id); - - await typeormService.patchRelationship(1, 'roles', []); - await typeormService.patchRelationship(1, 'manager', null); - const checkUserAfterPatch = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - if (!checkUserAfterPatch) { - throw new Error('not found'); - } - - expect(checkUserAfterPatch.manager).toBe(null); - expect(checkUserAfterPatch.roles).toEqual([]); - expect(result.data.map((i) => i.id)).toEqual( - checkUserAfterPost.roles.map((i) => i.id.toString()) - ); - expect(result2.data?.id).toEqual(checkUserAfterPost.manager.id.toString()); - expect(result1.data?.id).toEqual( - checkUserAfterPost.userGroup.id.toString() - ); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts deleted file mode 100644 index 2ccbb0dd..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/patch-relationship/patch-relationship.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - EntityRelation, - ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; - -import { PatchRelationshipData } from '../../../mixin/zod'; -import { getRelationship } from '../get-relationship/get-relationship'; -import { TypeOrmService } from '../../service'; - -export async function patchRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: TypeOrmService, - id: number | string, - rel: Rel, - input: PatchRelationshipData -): Promise> { - const idsResult = await this.typeormUtilsService.validateRelationInputData( - rel, - input - ); - - const patchBuilder = this.repository - .createQueryBuilder() - .relation(rel.toString()) - .of(id); - - if (Array.isArray(idsResult)) { - const data = await getRelationship.call< - TypeOrmService, - [number | string, Rel], - Promise> - >(this, id, rel); - const idsToDelete = Array.isArray(data.data) - ? data.data.map((i) => i.id) - : []; - - await patchBuilder.addAndRemove(idsResult, idsToDelete); - } else { - await patchBuilder.set(idsResult); - } - - return getRelationship.call< - TypeOrmService, - [number | string, Rel], - Promise> - >(this, id, rel); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts deleted file mode 100644 index e3deab69..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.spec.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { IBackup, IMemoryDb } from 'pg-mem'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - Pods, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; - -import { PostData } from '../../../mixin/zod'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -describe('postOne', () => { - let db: IMemoryDb; - let backaUp: IBackup; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - let podsRepository: Repository; - - let typeormServicePods: TypeOrmService; - let transformDataServicePods: JsonApiTransformerService; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - const firstName = 'firstName test'; - const isActive = false; - const testDate = new Date(); - const login = 'login test'; - - let inputData: PostData; - - let notes: Notes[]; - let users: Users[]; - let roles: Roles[]; - let userGroup: UserGroups[]; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - - const modulePods: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Pods), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - podsRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - backaUp = db.backup(); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - - typeormServicePods = modulePods.get>(ORM_SERVICE); - transformDataServicePods = modulePods.get>( - JsonApiTransformerService - ); - - notes = await notesRepository.find(); - users = await userRepository.find(); - roles = await rolesRepository.find(); - userGroup = await userGroupRepository.find(); - - inputData = { - type: 'users', - attributes: { - firstName, - isActive, - testDate, - login, - }, - relationships: { - notes: { - data: [ - { - type: 'notes', - id: notes[0].id, - }, - ], - }, - roles: { - data: [ - { - type: 'roles', - id: `${roles[0].id}`, - }, - ], - }, - manager: { - data: { - type: 'users', - id: `${users[0].id}`, - }, - }, - userGroup: { - data: { - type: 'user-group', - id: `${userGroup[0].id}`, - }, - }, - }, - }; - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - backaUp.restore(); - }); - - it('should be ok without relation and with id', async () => { - const spyOnTransformData = jest - .spyOn(transformDataServicePods, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - })); - const { relationships, ...other } = inputData; - const id = '5'; - const returnData = await typeormServicePods.postOne({ - id, - type: 'pods', - attributes: { - name: 'test', - }, - }); - const result = await podsRepository.findOneBy({ - id, - }); - - expect(spyOnTransformData).toBeCalledWith( - { - ...result, - id, - }, - { fields: null, include: [] } - ); - expect(returnData).not.toHaveProperty('included'); - }); - - it('should be ok without relation', async () => { - const spyOnTransformData = jest - .spyOn(transformDataService, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - })); - const { relationships, ...other } = inputData; - const returnData = await typeormService.postOne(other); - const result = await userRepository.findOneBy({ - login, - }); - - expect(spyOnTransformData).toBeCalledWith(result, { - fields: null, - include: [], - }); - expect(returnData).not.toHaveProperty('included'); - }); - - it('should be ok with relation', async () => { - const spyOnTransformData = jest - .spyOn(transformDataService, 'transformData') - .mockImplementationOnce(() => ({ - data: {} as any, - included: {} as any, - })); - const returnData = await typeormService.postOne(inputData); - const result = await userRepository.findOne({ - where: { - login, - }, - relations: { - notes: true, - userGroup: true, - roles: true, - manager: true, - }, - }); - - expect(spyOnTransformData).toBeCalledWith(result, { - fields: null, - include: ['notes', 'roles', 'manager', 'userGroup'], - }); - expect(returnData).toHaveProperty('included'); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts deleted file mode 100644 index 08ac0a1a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-one/post-one.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { DeepPartial } from 'typeorm'; -import { QueryField, ResourceObject } from '../../../../utils/nestjs-shared'; -import { ObjectLiteral } from '../../../../types'; -import { PostData, Query } from '../../../mixin/zod'; -import { TypeOrmService } from '../../service'; - -export async function postOne( - this: TypeOrmService, - inputData: PostData -): Promise> { - const { attributes, relationships, id } = inputData; - - const idObject = id - ? { [this.typeormUtilsService.currentPrimaryColumn.toString()]: id } - : {}; - - const attributesObject = { - ...attributes, - ...idObject, - } as DeepPartial; - - const entityTarget = this.repository.manager.create( - this.repository.target, - attributesObject - ); - - const saveData = await this.typeormUtilsService.saveEntityData( - entityTarget, - relationships - ); - const fakeQuery: Query = { - [QueryField.fields]: null, - [QueryField.include]: Object.keys(relationships || {}), - } as any; - - const { data, included } = this.transformDataService.transformData( - saveData, - fakeQuery - ); - const includeData = included ? { included } : {}; - return { - meta: {}, - data, - ...includeData, - }; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts deleted file mode 100644 index 5a936228..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.spec.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { getDataSourceToken } from '@nestjs/typeorm'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IMemoryDb } from 'pg-mem'; -import { Repository } from 'typeorm'; - -import { - Addresses, - Comments, - entities, - getRepository, - mockDBTestModule, - Notes, - providerEntities, - pullAllData, - Roles, - UserGroups, - Users, -} from '../../../../mock-utils/typeorm'; - -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY, - DEFAULT_CONNECTION_NAME, - ORM_SERVICE, -} from '../../../../constants'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, - EntityPropsMap, - OrmServiceFactory, -} from '../../factory'; -import { TypeOrmService, TypeormUtilsService } from '../../service'; -import { createAndPullSchemaBase } from '../../../../mock-utils'; -import { JsonApiTransformerService } from '../../../mixin/service/json-api-transformer.service'; - -describe('postRelationship', () => { - let db: IMemoryDb; - let typeormService: TypeOrmService; - let transformDataService: JsonApiTransformerService; - let typeormUtilsService: TypeormUtilsService; - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - { - provide: CONTROL_OPTIONS_TOKEN, - useValue: { - requiredSelectField: false, - debug: false, - }, - }, - { - provide: CURRENT_ENTITY, - useValue: Users, - }, - EntityPropsMap(entities as any), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - JsonApiTransformerService, - OrmServiceFactory(), - ], - }).compile(); - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - typeormService = module.get>(ORM_SERVICE); - transformDataService = module.get>( - JsonApiTransformerService - ); - typeormUtilsService = - module.get>(TypeormUtilsService); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('Should be ok', async () => { - const checkUser = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - - const roles = await rolesRepository.find(); - const userGroups = await userGroupRepository.find(); - const users = await userRepository.find(); - - if (!checkUser) { - throw new Error('not found mock'); - } - - const userGroupData = { - type: 'user-groups', - id: userGroups - .find((i) => checkUser.userGroup.id !== i.id) - ?.id.toString(), - }; - const rolesData = [ - { - type: 'roles', - id: roles - .find((i) => checkUser.roles.find((a) => a.id !== i.id)) - ?.id.toString(), - }, - ]; - - const managerData = { - type: 'users', - id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), - }; - const result = await typeormService.postRelationship( - 1, - 'roles', - rolesData as any - ); - const result1 = await typeormService.postRelationship( - 1, - 'userGroup', - userGroupData as any - ); - - const result2 = await typeormService.postRelationship( - 1, - 'manager', - managerData as any - ); - - const checkUserAfterPost = await userRepository.findOne({ - select: { - id: true, - roles: { - id: true, - }, - userGroup: { - id: true, - }, - manager: { - id: true, - }, - }, - where: { id: 1 }, - relations: { - roles: true, - manager: true, - userGroup: true, - }, - }); - if (!checkUserAfterPost) { - throw new Error('not found'); - } - - expect(checkUserAfterPost.manager.id.toString()).toBe(managerData.id); - expect(checkUserAfterPost.roles.map((i) => i.id.toString())).toEqual([ - ...checkUser.roles.map((i) => i.id.toString()), - ...rolesData.map((i) => i.id), - ]); - expect(checkUserAfterPost.userGroup.id.toString()).toBe(userGroupData.id); - - expect(result.data.map((i) => i.id)).toEqual( - checkUserAfterPost.roles.map((i) => i.id.toString()) - ); - expect(result2.data?.id).toEqual(checkUserAfterPost.manager.id.toString()); - expect(result1.data?.id).toEqual( - checkUserAfterPost.userGroup.id.toString() - ); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts deleted file mode 100644 index 7719cea0..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/orm-methods/post-relationship/post-relationship.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - EntityRelation, - ResourceObjectRelationships, -} from '../../../../utils/nestjs-shared'; - -import { ObjectLiteral } from '../../../../types'; -import { PostRelationshipData } from '../../../mixin/zod'; -import { getRelationship } from '../get-relationship/get-relationship'; -import { TypeOrmService } from '../../service'; - -export async function postRelationship< - E extends ObjectLiteral, - Rel extends EntityRelation ->( - this: TypeOrmService, - id: number | string, - rel: Rel, - input: PostRelationshipData -): Promise> { - const idsResult = await this.typeormUtilsService.validateRelationInputData( - rel, - input - ); - const postBuilder = this.repository - .createQueryBuilder() - .relation(rel.toString()) - .of(id); - - if (Array.isArray(idsResult)) { - await postBuilder.add(idsResult); - } else { - await postBuilder.set(idsResult); - } - - return getRelationship.call< - TypeOrmService, - [number | string, Rel], - Promise> - >(this, id, rel); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts deleted file mode 100644 index b8e93ec7..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './type-orm.service'; -export * from './typeorm-utils.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts deleted file mode 100644 index 1e040512..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/type-orm.service.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { - ResourceObject, - EntityRelation, - ResourceObjectRelationships, -} from '../../../utils/nestjs-shared'; -import { Inject } from '@nestjs/common'; -import { Repository } from 'typeorm'; - -import { OrmService } from '../../mixin/types'; -import { - PatchData, - PatchRelationshipData, - PostData, - PostRelationshipData, - Query, - QueryOne, -} from '../../mixin/zod'; -import { ConfigParam, ObjectLiteral } from '../../../types'; - -import { - getAll, - getOne, - deleteOne, - postOne, - patchOne, - getRelationship, - postRelationship, - deleteRelationship, - patchRelationship, -} from '../orm-methods'; - -import { TypeormUtilsService } from './typeorm-utils.service'; -import { JsonApiTransformerService } from '../../mixin/service/json-api-transformer.service'; -import { - CONTROL_OPTIONS_TOKEN, - CURRENT_ENTITY_REPOSITORY, -} from '../../../constants'; -import { TypeOrmParam } from '../type'; - -export class TypeOrmService implements OrmService { - @Inject(TypeormUtilsService) - public typeormUtilsService!: TypeormUtilsService; - @Inject(JsonApiTransformerService) - public transformDataService!: JsonApiTransformerService; - @Inject(CONTROL_OPTIONS_TOKEN) public config!: ConfigParam & TypeOrmParam; - @Inject(CURRENT_ENTITY_REPOSITORY) public repository!: Repository; - - getAll(query: Query): Promise> { - return getAll.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, query); - } - - deleteOne(id: number | string): Promise { - return deleteOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id); - } - - deleteRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise { - return deleteRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } - - getOne(id: number | string, query: QueryOne): Promise> { - return getOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, query); - } - - getRelationship>( - id: number | string, - rel: Rel - ): Promise> { - return getRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel); - } - - patchOne( - id: number | string, - inputData: PatchData - ): Promise> { - return patchOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, inputData); - } - - patchRelationship>( - id: number | string, - rel: Rel, - input: PatchRelationshipData - ): Promise> { - return patchRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } - - postOne(inputData: PostData): Promise> { - return postOne.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, inputData); - } - - postRelationship>( - id: number | string, - rel: Rel, - input: PostRelationshipData - ): Promise> { - return postRelationship.call< - TypeOrmService, - Parameters>, - ReturnType> - >(this, id, rel, input); - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts deleted file mode 100644 index c53036c5..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.spec.ts +++ /dev/null @@ -1,769 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { getDataSourceToken } from '@nestjs/typeorm'; -import { QueryField, FilterOperand } from '../../../utils/nestjs-shared'; -import { - BadRequestException, - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { IMemoryDb } from 'pg-mem'; -import { Repository } from 'typeorm'; - -import { - mockDBTestModule, - providerEntities, - UserGroups, - Users, - Comments, - Roles, - Addresses, - Notes, - getRepository, - pullAllData, -} from '../../../mock-utils/typeorm'; -import { - CurrentDataSourceProvider, - CurrentEntityManager, - CurrentEntityRepository, -} from '../factory'; -import { - CURRENT_ENTITY_REPOSITORY, - DEFAULT_CONNECTION_NAME, -} from '../../../constants'; -import { TypeormUtilsService } from './typeorm-utils.service'; -import { PostData, PostRelationshipData, Query } from '../../mixin/zod'; -import { EXPRESSION, OperandsMapExpression } from '../type'; -import { ObjectLiteral as Entity } from '../../../types'; -import { createAndPullSchemaBase } from '../../../mock-utils'; - -function getDefaultQuery() { - const filter = { - relation: null, - target: null, - }; - const defaultQuery: Query = { - [QueryField.filter]: filter, - [QueryField.fields]: null, - [QueryField.include]: null, - [QueryField.sort]: null, - [QueryField.page]: { - size: 1, - number: 1, - }, - }; - - return defaultQuery; -} - -describe('TypeormUtilsService', () => { - let db: IMemoryDb; - let typeormUtilsServiceUserGroups: TypeormUtilsService; - let repositoryUserGroups: Repository; - - let typeormUtilsServiceUser: TypeormUtilsService; - let repositoryUser: Repository; - - let userRepository: Repository; - let addressesRepository: Repository; - let notesRepository: Repository; - let commentsRepository: Repository; - let rolesRepository: Repository; - let userGroupRepository: Repository; - - function getQuery() { - return repositoryUser - .createQueryBuilder() - .subQuery() - .select('Users-Roles.user_id') - .from('users_have_roles', 'Users-Roles') - .leftJoin( - Roles, - 'Users__Roles_roles', - 'Users-Roles.role_id = Users__Roles_roles.id' - ); - } - - beforeAll(async () => { - db = createAndPullSchemaBase(); - const module: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - CurrentEntityManager(), - CurrentEntityRepository(UserGroups), - TypeormUtilsService, - ], - }).compile(); - - typeormUtilsServiceUserGroups = - module.get>(TypeormUtilsService); - repositoryUserGroups = module.get>( - CURRENT_ENTITY_REPOSITORY - ); - - const moduleUsers: TestingModule = await Test.createTestingModule({ - imports: [mockDBTestModule(db)], - providers: [ - ...providerEntities(getDataSourceToken()), - CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), - CurrentEntityManager(), - CurrentEntityRepository(Users), - TypeormUtilsService, - ], - }).compile(); - - ({ - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository, - } = getRepository(module)); - await pullAllData( - userRepository, - addressesRepository, - notesRepository, - commentsRepository, - rolesRepository, - userGroupRepository - ); - - typeormUtilsServiceUser = - moduleUsers.get>(TypeormUtilsService); - repositoryUser = moduleUsers.get>( - CURRENT_ENTITY_REPOSITORY - ); - }); - - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('TypeormUtilsService.currentAlias', () => { - expect(typeormUtilsServiceUserGroups.currentAlias).toBe('UserGroups'); - }); - - it('TypeormUtilsService.getAliasForRelation', () => { - expect(typeormUtilsServiceUserGroups.getAliasForRelation('users')).toBe( - 'UserGroups__Users_users' - ); - }); - - it('TypeormUtilsService.getAliasPath', () => { - expect(typeormUtilsServiceUserGroups.getAliasPath('id')).toBe( - 'UserGroups.id' - ); - expect( - typeormUtilsServiceUserGroups.getAliasPath('Users', 'UserGroups') - ).toBe('UserGroups.Users'); - expect( - typeormUtilsServiceUserGroups.getAliasPath('Users', 'UserGroups', '-') - ).toBe('UserGroups-Users'); - expect( - typeormUtilsServiceUserGroups.getAliasPath('label', 'users', '-') - ).toBe('Users-label'); - }); - - describe('asyncIterateFindRelationships', () => { - it('should be ok', async () => { - const notes = await notesRepository.find(); - const userGroup = await userGroupRepository.find(); - - const data: PostData['relationships'] = { - notes: { - data: [ - { - type: 'notes', - id: notes[0].id, - }, - ], - }, - manager: { - data: { - type: 'users', - id: '1', - }, - }, - userGroup: { - data: { - type: 'users-group', - id: `${userGroup[0].id}`, - }, - }, - }; - - const result = []; - for await (const item of typeormUtilsServiceUser.asyncIterateFindRelationships( - data - )) { - result.push(item); - } - - expect(result[0]).toHaveProperty('notes'); - expect(result[0]['notes']).toEqual([{ id: notes[0].id }]); - - expect(result[1]).toHaveProperty('manager'); - expect(result[1]['manager']).toEqual({ id: 1 }); - - expect(result[2]).toHaveProperty('userGroup'); - expect(result[2]['userGroup']).toEqual({ id: userGroup[0].id }); - }); - - it('should be error props incorrect', async () => { - const data = { - incorrectProps: { - type: 'users', - id: '1', - }, - } as any; - expect.assertions(1); - try { - await typeormUtilsServiceUser - .asyncIterateFindRelationships(data) - .next(); - } catch (e) { - expect(e).toBeInstanceOf(BadRequestException); - } - }); - - it('should be error resource not found', async () => { - const data: PostData['relationships'] = { - manager: { - data: { - id: '1000', - type: 'users', - }, - }, - }; - expect.assertions(1); - try { - await typeormUtilsServiceUser - .asyncIterateFindRelationships(data) - .next(); - } catch (e) { - expect(e).toBeInstanceOf(BadRequestException); - } - }); - }); - - describe('getFilterExpressionForTarget', () => { - it('expression for target field with null', () => { - const nullableField = 'id'; - const notNullableField = 'login'; - const query = getDefaultQuery(); - query.filter.target = { - [nullableField]: { - [FilterOperand.eq]: null, - }, - [notNullableField]: { - [FilterOperand.ne]: null, - }, - }; - - function guardField( - filter: any, - field: any - ): asserts field is keyof R { - if (filter && !(field in filter)) - throw new Error('field not exist in query filter'); - } - - const result = - typeormUtilsServiceUser.getFilterExpressionForTarget(query); - const mainAliasCheck = 'Users'; - - for (const item of result) { - const { params, alias, expression, selectInclude } = item; - expect(selectInclude).toBe(undefined); - if (!alias) { - expect(alias).not.toBe(undefined); - throw new Error('alias in undefined for result'); - } - const [mainAlias, field] = alias.split('.'); - expect(mainAlias).toBe(mainAliasCheck); - guardField(query.filter.target, field); - const filterName: any = query.filter.target[field]; - if (!filterName) { - expect(filterName).not.toBe(undefined); - throw new Error('filterName in undefined from query'); - } - - expect(params).toBe(undefined); - - if (field === nullableField) { - expect(expression).toBe('IS NULL'); - continue; - } - - if (field === notNullableField) { - expect(expression).toBe('IS NOT NULL'); - continue; - } - - throw new Error('filed is incorrect'); - } - }); - it('expression for target field', () => { - const valueTest = (filterOperand: FilterOperand) => - `test for ${filterOperand}`; - const valueTestArray = ( - filterOperand: FilterOperand.nin | FilterOperand.in - ): [string, ...string[]] => [valueTest(filterOperand)]; - - const query = getDefaultQuery(); - query.filter.target = { - id: { - [FilterOperand.eq]: valueTest(FilterOperand.eq), - [FilterOperand.ne]: valueTest(FilterOperand.ne), - }, - isActive: { - [FilterOperand.like]: valueTest(FilterOperand.like), - [FilterOperand.regexp]: valueTest(FilterOperand.regexp), - }, - firstName: { - [FilterOperand.gt]: valueTest(FilterOperand.gt), - [FilterOperand.gte]: valueTest(FilterOperand.gte), - }, - testDate: { - [FilterOperand.lt]: valueTest(FilterOperand.lt), - [FilterOperand.lte]: valueTest(FilterOperand.lt), - }, - createdAt: { - [FilterOperand.in]: valueTestArray(FilterOperand.in), - [FilterOperand.nin]: valueTestArray(FilterOperand.nin), - }, - }; - - function guardField( - filter: any, - field: any - ): asserts field is keyof R { - if (filter && !(field in filter)) - throw new Error('field not exist in query filter'); - } - - const result = - typeormUtilsServiceUser.getFilterExpressionForTarget(query); - const mainAliasCheck = 'Users'; - const paramsNameSet = new Set(); - for (const item of result) { - const { params, alias, expression, selectInclude } = item; - expect(selectInclude).toBe(undefined); - if (!alias) { - expect(alias).not.toBe(undefined); - throw new Error('alias in undefined for result'); - } - const [mainAlias, field] = alias.split('.'); - expect(mainAlias).toBe(mainAliasCheck); - guardField(query.filter.target, field); - const filterName: any = query.filter.target[field]; - if (!filterName) { - expect(filterName).not.toBe(undefined); - throw new Error('filterName in undefined from query'); - } - if (!params) { - expect(params).not.toBe(undefined); - throw new Error('params in undefined for result'); - } - if (Array.isArray(params)) { - expect(params).not.toBeInstanceOf(Array); - throw new Error('params in undefined for result'); - } - const { val, name } = params; - expect(paramsNameSet.has(name)).toBe(false); - paramsNameSet.add(name); - const reg = new RegExp(`params_${alias}_\\d{1,}`); - const regResult = name.match(reg); - - if (regResult === null) { - expect(name.match(reg)).not.toBe(null); - throw new Error(`name is not pattern: params_${alias}_\\d{1,}`); - } - const expressionMap = expression.replace(name, EXPRESSION); - const checkFilterOperand = Object.entries(FilterOperand).find( - ([key, val]) => OperandsMapExpression[val] === expressionMap - ); - if (!checkFilterOperand) { - expect(checkFilterOperand).not.toBe(undefined); - throw new Error(`expression incorrect`); - } - - const operand = checkFilterOperand[0] as any; - guardField(filterName, operand); - if (operand === 'like') { - expect(params.val).toEqual(`%${filterName[operand]}%`); - } else { - expect(params.val).toEqual(filterName[operand]); - } - } - }); - it('expression for target relation field with relation column', () => { - const query = getDefaultQuery(); - query.filter.target = { - addresses: { - [FilterOperand.eq]: 'null', - [FilterOperand.ne]: 'null', - }, - }; - const result = - typeormUtilsServiceUser.getFilterExpressionForTarget(query); - expect(result.length).toBe(2); - const [first, second] = result; - expect(first).not.toHaveProperty('params'); - expect(first).not.toHaveProperty('selectInclude'); - expect(first['alias']).toBe('Users.addresses'); - expect(first['expression']).toBe('IS NULL'); - expect(second).not.toHaveProperty('params'); - expect(second).not.toHaveProperty('selectInclude'); - expect(second['alias']).toBe('Users.addresses'); - expect(second['expression']).toBe('IS NOT NULL'); - }); - it('expression for target relation field with one-to-many', () => { - const query = getDefaultQuery(); - query.filter.target = { - comments: { - [FilterOperand.eq]: 'null', - [FilterOperand.ne]: 'null', - }, - }; - const subQuery = repositoryUser - .createQueryBuilder() - .subQuery() - .select('Comments.createdBy', 'createdBy') - .from(Comments, 'Comments') - .where(`Comments.createdBy = Users.id`) - .getQuery(); - const result = - typeormUtilsServiceUser.getFilterExpressionForTarget(query); - expect(result.length).toBe(2); - const [first, second] = result; - expect(first).not.toHaveProperty('params'); - expect(first).not.toHaveProperty('selectInclude'); - expect(first).not.toHaveProperty('alias'); - expect(first['expression']).toBe(`NOT EXISTS ${subQuery}`); - expect(second).not.toHaveProperty('params'); - expect(second).not.toHaveProperty('selectInclude'); - expect(second).not.toHaveProperty('alias'); - expect(second['expression']).toBe(`EXISTS ${subQuery}`); - }); - it('expression for target relation field with many-to-many', () => { - const query = getDefaultQuery(); - query.filter.target = { - roles: { - [FilterOperand.eq]: 'null', - [FilterOperand.ne]: 'null', - }, - }; - const subQuery = getQuery() - .where(`Users-Roles.user_id = Users.id`) - .getQuery(); - const result = - typeormUtilsServiceUser.getFilterExpressionForTarget(query); - - expect(result.length).toBe(2); - const [first, second] = result; - expect(first).not.toHaveProperty('params'); - expect(first).not.toHaveProperty('selectInclude'); - expect(first).not.toHaveProperty('alias'); - expect(first['expression']).toBe(`NOT EXISTS ${subQuery}`); - expect(second).not.toHaveProperty('params'); - expect(second).not.toHaveProperty('selectInclude'); - expect(second).not.toHaveProperty('alias'); - expect(second['expression']).toBe(`EXISTS ${subQuery}`); - }); - }); - - describe('getFilterExpressionForRelation', () => { - it('expression for relation many-to-many', () => { - const query = getDefaultQuery(); - const conditional = { - name: { - [FilterOperand.eq]: 'null', - [FilterOperand.ne]: 'null', - }, - createdAt: { - [FilterOperand.eq]: 'test1', - [FilterOperand.ne]: 'test2', - [FilterOperand.nin]: ['test3'] as [string, ...string[]], - }, - }; - - query.filter.relation = { - roles: conditional, - }; - - let subQuery = getQuery() - .where(`"Users__Roles_roles"."name" IS NULL`) - .andWhere(`"Users__Roles_roles"."name" IS NOT NULL`) - .andWhere(`"Users__Roles_roles"."created_at" = :param1`) - .andWhere(`"Users__Roles_roles"."created_at" <> :param2`) - .andWhere(`"Users__Roles_roles"."created_at" NOT IN (:...param3)`) - .getQuery(); - - const result = - typeormUtilsServiceUser.getFilterExpressionForRelation(query); - - expect(result.length).toBe(1); - - const [first] = result; - expect(first).not.toHaveProperty('selectInclude'); - if (!first.params && !Array.isArray(first.params)) { - expect(first).toHaveProperty('params'); - expect(first.params).toBeInstanceOf(Array); - } - if (Array.isArray(first.params)) { - expect(first?.params?.length).toBe(3); - const [firstParams, secondParams, thirdParams] = first.params; - expect(firstParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.eq - ); - - const regResult1 = firstParams?.name.match( - new RegExp(`params_Roles.createdAt_\\d{1,}`) - ); - if (regResult1) { - subQuery = subQuery.replace('param1', regResult1[0]); - } - expect(regResult1).not.toBe(null); - - expect(secondParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.ne - ); - - const regResult2 = secondParams?.name.match( - new RegExp(`params_Roles.createdAt_\\d{1,}`) - ); - if (regResult2) { - subQuery = subQuery.replace('param2', regResult2[0]); - } - expect(regResult2).not.toBe(null); - - expect(thirdParams?.val).toBe( - query.filter?.relation?.roles?.createdAt?.nin - ); - const regResult3 = thirdParams?.name.match( - new RegExp(`params_Roles.createdAt_\\d{1,}`) - ); - if (regResult3) { - subQuery = subQuery.replace('param3', regResult3[0]); - } - } - expect(first.alias).toBe(`Users.id`); - expect(first.expression).toBe(`IN ${subQuery}`); - }); - - it('expression for relation other type', () => { - const query = getDefaultQuery(); - query.filter.relation = { - addresses: { - createdAt: { - eq: 'qweqwe', - }, - }, - comments: { - createdAt: { - like: 'sdfsdf', - }, - }, - }; - const firstAlias = 'Addresses.createdAt'; - const secondAlias = 'Comments.createdAt'; - const result = - typeormUtilsServiceUser.getFilterExpressionForRelation(query); - - expect(result.length).toBe(2); - const [first, second] = result; - - const firstResult = first.expression.match( - new RegExp(`params_${firstAlias}_\\d{1,}`) - ); - - if (!firstResult) { - expect(firstResult).not.toBe(null); - throw Error('Should be like pattern'); - } - - expect(first.expression).toBe(`= :${firstResult[0]}`); - expect(first.alias).toBe(`Users__Addresses_addresses.createdAt`); - expect(first.selectInclude).toBe('addresses'); - if (!Array.isArray(first.params)) { - expect(first.params?.name).toBe(`${firstResult[0]}`); - expect(first.params?.val).toBe( - query.filter.relation?.addresses?.createdAt?.eq - ); - } else { - expect(first.params).not.toBeInstanceOf(Array); - } - - const secondResult = second.expression.match( - new RegExp(`params_${secondAlias}_\\d{1,}`) - ); - if (!secondResult) { - expect(secondResult).not.toBe(null); - throw Error('Should be like pattern'); - } - - expect(second.expression).toBe(`ILIKE :${secondResult[0]}`); - expect(second.alias).toBe('Users__Comments_comments.createdAt'); - expect(second.selectInclude).toBe('comments'); - if (!Array.isArray(second.params)) { - expect(second.params?.name).toBe(secondResult[0]); - expect(second.params?.val).toBe( - `%${query.filter.relation?.comments?.createdAt?.like}%` - ); - } else { - expect(second.params).not.toBeInstanceOf(Array); - } - }); - }); - - describe('validateRelationInputData', () => { - let usersData: Users; - beforeEach(async () => { - const result = await userRepository.findOne({ - where: { - id: 1, - }, - relations: { - roles: true, - userGroup: true, - manager: true, - }, - }); - if (!result) { - throw Error('not found mock data'); - } - usersData = result; - }); - it('should be ok', async () => { - const rolesData = usersData.roles.map((i) => ({ - type: 'roles', - id: i.id.toString(), - })); - - const userGroupData = { - type: 'user-groups', - id: usersData.userGroup.id.toString(), - }; - const managerData = { - type: 'users', - id: usersData.manager?.id.toString(), - }; - const emptyRoles: { id: string; type: string }[] = []; - const emptyManager = null; - const result = await typeormUtilsServiceUser.validateRelationInputData( - 'roles', - rolesData - ); - const result1 = await typeormUtilsServiceUser.validateRelationInputData( - 'userGroup', - userGroupData - ); - const result2 = await typeormUtilsServiceUser.validateRelationInputData( - 'manager', - managerData - ); - const result3 = await typeormUtilsServiceUser.validateRelationInputData( - 'manager', - emptyManager - ); - const result4 = await typeormUtilsServiceUser.validateRelationInputData( - 'roles', - emptyRoles - ); - expect(result).toEqual(usersData.roles.map((i) => i.id.toString())); - expect(result1).toEqual(usersData.userGroup.id.toString()); - expect(result2).toEqual(usersData.manager.id.toString()); - expect(result3).toEqual(emptyManager); - expect(result4).toEqual(emptyRoles); - }); - - it('Should be error incorrect type name', async () => { - const rolesData = usersData.roles.map((i, index) => ({ - type: index === 1 ? 'other' : 'roles', - id: i.id.toString(), - })) as PostRelationshipData; - - const userGroupData = { - type: 'userGroups', - id: usersData.userGroup.id.toString(), - }; - const managerData = { - type: 'user', - id: usersData.manager.id.toString(), - }; - expect.assertions(3); - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'roles', - rolesData - ); - } catch (e) { - expect(e).toBeInstanceOf(UnprocessableEntityException); - } - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'userGroup', - userGroupData - ); - } catch (e) { - expect(e).toBeInstanceOf(UnprocessableEntityException); - } - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'manager', - managerData - ); - } catch (e) { - expect(e).toBeInstanceOf(UnprocessableEntityException); - } - }); - - it('Should be error, Incorrect relation type', async () => { - expect.assertions(2); - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'roles', - {} as any - ); - } catch (e) { - expect(e).toBeInstanceOf(UnprocessableEntityException); - } - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'userGroup', - [] as any - ); - } catch (e) { - expect(e).toBeInstanceOf(UnprocessableEntityException); - } - }); - - it('Should be error, Not fond', async () => { - const rolesData = usersData.roles.map((i, index) => ({ - type: 'roles', - id: index === 1 ? '1000' : i.id.toString(), - })) as PostRelationshipData; - expect.assertions(2); - try { - await typeormUtilsServiceUser.validateRelationInputData( - 'roles', - rolesData - ); - } catch (e) { - expect(e).toBeInstanceOf(NotFoundException); - } - try { - await typeormUtilsServiceUser.validateRelationInputData('userGroup', { - type: 'user-groups', - id: '10000', - }); - } catch (e) { - expect(e).toBeInstanceOf(NotFoundException); - } - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts deleted file mode 100644 index ecdd35c9..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/service/typeorm-utils.service.ts +++ /dev/null @@ -1,683 +0,0 @@ -import { - BadRequestException, - Inject, - Injectable, - NotFoundException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { EntityMetadata, Equal, In, Repository } from 'typeorm'; -import { RelationMetadata as TypeOrmRelationMetadata } from 'typeorm/metadata/RelationMetadata'; -import { - camelToKebab, - kebabToCamel, - ObjectTyped, - snakeToCamel, - FilterOperand, -} from '../../../utils/nestjs-shared'; - -import { ObjectLiteral, ValidateQueryError } from '../../../types'; -import { - EXPRESSION, - OperandMapExpressionForNull, - OperandsMapExpression, - OperandsMapExpressionForNullRelation, -} from '../type'; -import { PatchData, PostData, Query } from '../../mixin/zod'; -import { TupleOfEntityRelation, EntityRelation } from '../../mixin/types'; -import { getEntityName } from '../../mixin/helper'; -import { CURRENT_ENTITY_REPOSITORY } from '../../../constants'; - -type RelationAlias = { - [K in TupleOfEntityRelation[number]]: string; -}; -type RelationMetadata = { - [K in TupleOfEntityRelation[number]]: TypeOrmRelationMetadata; -}; - -type ResultQueryExpressionObject = { name: string; val: string }; -type ResultQueryExpressionArray = { name: string; val: string }[]; - -export type RelationshipsResult = { - [K in EntityRelation]: E[K] extends E[K][] ? E[K] : E[K] | null; -}; - -export type ResultQueryExpression = { - alias?: string; - expression: string; - paramsForResult?: string[]; - params?: ResultQueryExpressionObject | ResultQueryExpressionArray; - selectInclude?: string; -}; -export type InputValidateData = { - type: string; - id: string; -}; - -export type ValidateReturn = T extends unknown[] - ? string[] - : T extends null - ? null - : string; - -type Entity = ObjectLiteral; - -function isTargetField( - relationField: TupleOfEntityRelation, - field: any -): field is TupleOfEntityRelation[number] { - return relationField.includes(field); -} - -function isRelationField( - relationField: TupleOfEntityRelation, - field: any -): asserts field is EntityRelation { - if (isTargetField(relationField, field)) return; - const error: ValidateQueryError = { - code: 'unrecognized_keys', - path: ['data', 'relationships'], - message: `Resource for relation '${field.toString()}' does not exist`, - keys: [field], - }; - - throw new BadRequestException([error]); -} - -Injectable(); -export class TypeormUtilsService { - private readonly _currentAlias!: string; - private readonly _relationMetadata = {} as RelationMetadata; - private readonly _relationAlias = {} as RelationAlias; - private readonly _relationFields!: TupleOfEntityRelation; - private readonly _entityMetadata!: EntityMetadata; - private _number = 0; - - constructor( - @Inject(CURRENT_ENTITY_REPOSITORY) private repository: Repository - ) { - this._currentAlias = snakeToCamel(repository.metadata.name); - const relationFields = []; - for (const metadata of repository.metadata.relations) { - const propertyName = - metadata.propertyName as TupleOfEntityRelation[number]; - this._relationMetadata[propertyName] = metadata; - this._relationAlias[propertyName] = snakeToCamel( - metadata.inverseEntityMetadata.name - ); - relationFields.push(propertyName); - } - this._relationFields = relationFields as TupleOfEntityRelation; - this._entityMetadata = repository.metadata; - } - get currentAlias() { - return this._currentAlias; - } - - get relationFields() { - return this._relationFields; - } - - relationName(relName: TupleOfEntityRelation[number]) { - return this._relationAlias[relName]; - } - - get currentPrimaryColumn(): keyof E { - return this._entityMetadata.primaryColumns[0].propertyName as keyof E; - } - - getAliasForRelation(relName: TupleOfEntityRelation[number]) { - return `${this.currentAlias}__${this._relationAlias[relName]}_${relName}`; - } - - getRelMetaDataForRelation(relName: TupleOfEntityRelation[number]) { - return this._relationMetadata[relName]; - } - - getPrimaryColumnForRel(relName: TupleOfEntityRelation[number]) { - return this._relationMetadata[relName].inverseEntityMetadata - .primaryColumns[0].propertyName; - } - - private getFilterObject(query: Query, filterType: 'target' | 'relation') { - const { filter } = query; - if (!filter) return null; - return filter[filterType]; - } - - private get number() { - if (this._number > 1000) { - this._number = 0; - } - this._number++; - return this._number; - } - - private getParamName(fieldName: string) { - return `params_${fieldName}_${this.number}`; - } - - getAliasPath(fieldName: unknown): string; - getAliasPath( - fieldName: unknown, - relname: TupleOfEntityRelation[number], - separator?: string - ): string; - getAliasPath(fieldName: unknown, relname: string, separator?: string): string; - getAliasPath( - fieldName: unknown, - relname?: TupleOfEntityRelation[number] | string, - separator = '.' - ): string { - const alias = relname - ? this._relationAlias[relname] || relname - : this.currentAlias; - return `${alias}${separator}${fieldName}`; - } - - private getSubQueryForManyToMany( - fieldName: TupleOfEntityRelation[number], - expression?: string[] - ): string { - const metadataRelation: TypeOrmRelationMetadata = - this._relationMetadata[fieldName]; - const relationPrimaryColumn = - metadataRelation.inverseEntityMetadata.primaryColumns[0].propertyName; - const { joinTableName, inverseJoinColumns, joinColumns } = - metadataRelation.isManyToManyOwner - ? metadataRelation - : metadataRelation.inverseRelation || metadataRelation; - - const { databaseName: queryJoinPropsName } = - metadataRelation.isManyToManyOwner - ? inverseJoinColumns[0] - : joinColumns[0]; - const { databaseName: selectJoinPropsName } = - metadataRelation.isManyToManyOwner - ? joinColumns[0] - : inverseJoinColumns[0]; - - const alias = this.getAliasPath( - this._relationAlias[fieldName], - this.currentAlias, - '-' - ); - - const selectAlias = this.getAliasPath(selectJoinPropsName, alias); - - const query = this.repository - .createQueryBuilder() - .subQuery() - .select(selectAlias) - .from(joinTableName, alias) - .leftJoin( - this._relationMetadata[fieldName].inverseEntityMetadata.target, - this.getAliasForRelation(fieldName), - `${this.getAliasPath(queryJoinPropsName, alias)} = ${this.getAliasPath( - relationPrimaryColumn, - this.getAliasForRelation(fieldName) - )}` - ); - if (!expression) { - query.where( - `${selectAlias} = ${this.getAliasPath(this.currentPrimaryColumn)}` - ); - } else { - for (const i in expression) { - query[i === '0' ? 'where' : 'andWhere'](expression[i]); - } - } - return query.getQuery(); - } - - getFilterExpressionForTarget(query: Query): ResultQueryExpression[] { - const resultExpression: ResultQueryExpression[] = []; - const filterTarget = this.getFilterObject(query, 'target'); - if (!filterTarget) return resultExpression; - for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { - if (!filter) continue; - for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; - const valueConditional = - operand === FilterOperand.like ? `%${value}%` : value; - const fieldWithAlias = this.getAliasPath(fieldName); - const paramsName = this.getParamName(fieldWithAlias); - - if (!isTargetField(this._relationFields, fieldName)) { - if ( - (operand === FilterOperand.ne || operand === FilterOperand.eq) && - (valueConditional === 'null' || valueConditional === null) - ) { - const expression = OperandMapExpressionForNull[operand].replace( - EXPRESSION, - paramsName - ); - resultExpression.push({ - alias: fieldWithAlias, - expression, - }); - continue; - } - - const expression = OperandsMapExpression[operand].replace( - EXPRESSION, - paramsName - ); - resultExpression.push({ - alias: fieldWithAlias, - expression, - params: { - val: valueConditional, - name: paramsName, - }, - }); - continue; - } - - const metadataRelation: TypeOrmRelationMetadata = - this._relationMetadata[fieldName]; - const relationTarget = metadataRelation.inverseEntityMetadata.target; - const relationAlias = this._relationAlias[fieldName]; - const subQuery = this.repository.createQueryBuilder().subQuery(); - - const resultOperand = - operand === FilterOperand.eq ? operand : FilterOperand.ne; - switch (metadataRelation.relationType) { - case 'many-to-many': { - const subQuerySql = this.getSubQueryForManyToMany(fieldName); - - const resultOperand = - operand === FilterOperand.eq ? operand : FilterOperand.ne; - - const expression = OperandsMapExpressionForNullRelation[ - resultOperand - ].replace(EXPRESSION, subQuerySql); - - resultExpression.push({ - expression, - }); - break; - } - case 'one-to-many': { - const joinColumn = metadataRelation.inverseSidePropertyPath; - - const aliasPath = this.getAliasPath(joinColumn, fieldName); - const subQuerySql = subQuery - .select(aliasPath, joinColumn) - .from(relationTarget, relationAlias) - .where( - `${aliasPath} = ${this.getAliasPath(this.currentPrimaryColumn)}` - ) - .getQuery(); - - const expression = OperandsMapExpressionForNullRelation[ - resultOperand - ].replace(EXPRESSION, subQuerySql); - - resultExpression.push({ - expression, - }); - break; - } - default: { - const expression = OperandMapExpressionForNull[ - resultOperand - ].replace(EXPRESSION, paramsName); - resultExpression.push({ - alias: fieldWithAlias, - expression, - }); - } - } - } - } - - return resultExpression; - } - - getFilterExpressionForRelation(query: Query): ResultQueryExpression[] { - const resultExpression: ResultQueryExpression[] = []; - const filterRelation = this.getFilterObject(query, 'relation'); - if (!filterRelation) return resultExpression; - - for (const [relationField, propsFilter] of ObjectTyped.entries( - filterRelation - )) { - if (!propsFilter) continue; - if (!isTargetField(this._relationFields, relationField)) continue; - const metadataRelation: TypeOrmRelationMetadata = - this._relationMetadata[relationField]; - - const conditionalForManyToMany: { - conditional: string; - params: { name: string; val: string } | undefined; - }[] = []; - - for (const [relationFieldProps, filter] of ObjectTyped.entries( - propsFilter - )) { - if (!filter) continue; - - for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; - const currentValue = - operand === FilterOperand.like ? `%${value}%` : value; - - const paramsName = this.getParamName( - this.getAliasPath(relationFieldProps.toString(), relationField) - ); - let expression: string; - if (value === 'null') { - const currentOperand = - operand === FilterOperand.eq - ? FilterOperand.eq - : FilterOperand.ne; - expression = OperandMapExpressionForNull[currentOperand]; - } else { - expression = OperandsMapExpression[operand].replace( - EXPRESSION, - paramsName - ); - } - - const params = - value === 'null' - ? undefined - : { - val: currentValue, - name: paramsName, - }; - - switch (metadataRelation.relationType) { - case 'many-to-many': { - conditionalForManyToMany.push({ - params, - conditional: `${this.getAliasPath( - relationFieldProps.toString(), - this.getAliasForRelation(relationField) - )} ${expression}`, - }); - - break; - } - default: { - resultExpression.push({ - alias: this.getAliasPath( - relationFieldProps.toString(), - this.getAliasForRelation(relationField) - ), - expression, - selectInclude: relationField, - params, - }); - } - } - } - } - - if (conditionalForManyToMany.length) { - const expression = conditionalForManyToMany.map((i) => i.conditional); - const subQuery = this.getSubQueryForManyToMany( - relationField, - expression - ); - - const mainExpression = `IN ${subQuery}`; - - const params = conditionalForManyToMany - .filter((i) => i.params) - .map((i) => i.params) as { name: string; val: string }[]; - resultExpression.push({ - alias: this.getAliasPath(this.currentPrimaryColumn), - expression: mainExpression, - paramsForResult: expression, - params, - }); - } - } - return resultExpression; - } - - private throwError(message: string, path: string[], key?: string) { - const error: ValidateQueryError = { - code: 'unrecognized_keys', - path, - message, - }; - if (key) { - error.keys = [key]; - } - throw new BadRequestException([error]); - } - - async *asyncIterateFindRelationships( - relationships: NonNullable< - PatchData['relationships'] | PostData['relationships'] - > - ): AsyncGenerator> { - for (const entries of ObjectTyped.entries(relationships)) { - const [props, dataItem] = entries; - - isRelationField(this._relationFields, props); - if (dataItem === undefined) continue; - - const { data } = dataItem; - if (data === undefined) continue; - if (data === null) { - yield { [props]: null } as RelationshipsResult; - continue; - } - const isArray = Array.isArray(data); - if (isArray && data.length === 0) { - yield { [props]: [] } as RelationshipsResult; - continue; - } - - const condition = isArray - ? In((data as any[]).map((i) => i.id)) - : Equal(data['id']); - const relationsTypeName = kebabToCamel( - isArray ? (data as any[])[0]['type'] : data['type'] - ); - const primaryField = this.getPrimaryColumnForRel( - props as TupleOfEntityRelation[number] - ); - const relationsTarget = - this._relationMetadata[props as TupleOfEntityRelation[number]] - .inverseEntityMetadata.target; - const result = await this.repository.manager - .getRepository(relationsTarget) - .find({ - select: { - [primaryField]: true, - }, - where: { - [primaryField]: condition, - }, - }); - - if ( - (isArray && (result.length === 0 || data.length !== result.length)) || - (!isArray && result.length === 0) - ) { - const message = isArray - ? `Resource '${relationsTypeName}' with ids '${(data as any[]) - .map((i) => i.id) - .filter((i) => !result.find((r) => r[primaryField] == i)) - .join(',')}' does not exist` - : `Resource '${relationsTypeName}' with id '${data.id}' does not exist`; - - const error: ValidateQueryError = { - code: 'invalid_arguments', - path: ['data', 'relationships', props.toString()], - message, - }; - - throw new BadRequestException([error]); - } - - yield { [props]: isArray ? result : result[0] } as RelationshipsResult; - } - } - - async saveEntityData( - target: E, - relationships: PatchData['relationships'] | PostData['relationships'] - ): Promise { - if (relationships) { - for await (const item of this.asyncIterateFindRelationships( - relationships - )) { - const [props, type] = ObjectTyped.entries(item)[0]; - if (type !== null) { - target[props] = type as any; - } else { - target[props] = null as any; - } - } - } - const saveData = await this.repository.save(target); - let saveDataWithRelation: E | null = null; - if (relationships) { - const queryBuilder = this.repository - .createQueryBuilder(this.currentAlias) - .where({ - [this.currentPrimaryColumn]: Equal( - saveData[this.currentPrimaryColumn] - ), - }); - - for (const [props] of ObjectTyped.entries(relationships)) { - const currentIncludeAlias = this.getAliasForRelation(props.toString()); - - queryBuilder.leftJoinAndSelect( - this.getAliasPath(props), - currentIncludeAlias - ); - } - - saveDataWithRelation = await queryBuilder.getOne(); - } - - return saveDataWithRelation ? saveDataWithRelation : saveData; - } - - async validateRelationInputData< - Rel extends EntityRelation, - In extends InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends null | InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise>; - async validateRelationInputData< - Rel extends EntityRelation, - In extends null | InputValidateData | InputValidateData[] - >(rel: Rel, inputData: In): Promise> { - const relationMetadata = - this._relationMetadata[rel as TupleOfEntityRelation[number]]; - const isArray = Array.isArray(inputData); - - if ( - ['one-to-many', 'many-to-many'].includes(relationMetadata.relationType) && - !isArray - ) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - path: ['data'], - message: 'Body data should be array', - }; - - throw new UnprocessableEntityException([error]); - } - - if ( - ['one-to-one', 'many-to-one'].includes(relationMetadata.relationType) && - isArray - ) { - const error: ValidateQueryError = { - code: 'invalid_arguments', - path: ['data'], - message: 'Body data should be object', - }; - - throw new UnprocessableEntityException([error]); - } - if (inputData === null) { - const result = null; - return result as ValidateReturn; - } - if (isArray && inputData.length === 0) { - const result: any[] = []; - return result as ValidateReturn; - } - - const prepareData = isArray ? inputData : [inputData]; - - const errors: ValidateQueryError[] = []; - let i = 0; - const typeName = camelToKebab( - getEntityName(relationMetadata.inverseEntityMetadata.target) - ); - - for (const prepareItem of prepareData) { - if (prepareItem.type !== typeName) { - const path = isArray ? ['data', i.toString()] : ['data']; - errors.push({ - code: 'invalid_arguments', - path: path, - message: `Type should be equal to type of relName: "${rel.toString()}". Type of ${rel.toString()} is "${typeName}" but receive - "${ - prepareItem.type - }"`, - }); - } - i++; - } - if (errors.length) { - throw new UnprocessableEntityException(errors); - } - - const checkResult = await this.repository.manager - .getRepository(relationMetadata.inverseEntityMetadata.target) - .find({ - select: { - [this.getPrimaryColumnForRel(rel.toString())]: true, - }, - where: { - [this.getPrimaryColumnForRel(rel.toString())]: In( - prepareData.map((i) => i.id) - ), - }, - }); - - if (checkResult.length === prepareData.length) { - return ( - isArray ? inputData.map((i) => i.id) : inputData.id - ) as ValidateReturn; - } - - const resulDataMap = checkResult.reduce((acum, item) => { - acum[item[this.getPrimaryColumnForRel(rel.toString())]] = true; - return acum; - }, {} as Record); - - i = 0; - for (const item of prepareData) { - if (!resulDataMap[item.id]) { - const path = isArray ? ['data', i.toString(), 'id'] : ['data', 'id']; - errors.push({ - code: 'invalid_arguments', - path: path, - message: `Not exist item "${ - item.id - }" in relation "${rel.toString()}"`, - }); - } - i++; - } - throw new NotFoundException(errors); - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts deleted file mode 100644 index 968e57a1..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type-orm-json-api.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { DynamicModule } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; - -import { NestProvider, ObjectLiteral, ResultModuleOptions } from '../../types'; -import { - CurrentEntityManager, - CurrentDataSourceProvider, - CurrentEntityRepository, - FindOneRowEntityFactory, - CheckRelationNameFactory, - OrmServiceFactory, - RunInTransactionFactory, - EntityPropsMap, -} from './factory'; -import { TypeormUtilsService } from './service'; -import { GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants'; - -export class TypeOrmJsonApiModule { - static module = 'typeOrm' as const; - static forRoot(options: ResultModuleOptions): DynamicModule { - const optionProvider = { - provide: GLOBAL_MODULE_OPTIONS_TOKEN, - useValue: options, - }; - - const typeOrmModule = TypeOrmModule.forFeature( - options.entities as EntityClassOrSchema[], - options.connectionName - ); - - const currentProvider = [ - ...(options.providers || []), - optionProvider, - CurrentDataSourceProvider(options.connectionName), - CurrentEntityManager(), - EntityPropsMap(options.entities), - RunInTransactionFactory(), - ]; - - const currentImport = [typeOrmModule, ...(options.imports || [])]; - - return { - module: TypeOrmJsonApiModule, - imports: currentImport, - providers: currentProvider, - exports: [...currentProvider, ...currentImport], - }; - } - - static getUtilProviders(entity: ObjectLiteral): NestProvider { - return [ - CurrentEntityRepository(entity), - TypeormUtilsService, - OrmServiceFactory(), - FindOneRowEntityFactory(), - CheckRelationNameFactory(), - ]; - } -} diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts deleted file mode 100644 index 9d365343..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/modules/type-orm/type.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IsolationLevel } from 'typeorm/driver/types/IsolationLevel'; -import { FilterOperand } from '../../utils/nestjs-shared'; -export type TypeOrmParam = { - useSoftDelete?: boolean; - runInTransaction?: any>( - isolationLevel: IsolationLevel, - fn: Func - ) => ReturnType; -}; - -export const EXPRESSION = 'EXPRESSION'; -export const OperandsMapExpression = { - [FilterOperand.eq]: `= :${EXPRESSION}`, - [FilterOperand.ne]: `<> :${EXPRESSION}`, - [FilterOperand.regexp]: `~* :${EXPRESSION}`, - [FilterOperand.gt]: `> :${EXPRESSION}`, - [FilterOperand.gte]: `>= :${EXPRESSION}`, - [FilterOperand.in]: `IN (:...${EXPRESSION})`, - [FilterOperand.like]: `ILIKE :${EXPRESSION}`, - [FilterOperand.lt]: `< :${EXPRESSION}`, - [FilterOperand.lte]: `<= :${EXPRESSION}`, - [FilterOperand.nin]: `NOT IN (:...${EXPRESSION})`, - [FilterOperand.some]: `&& :${EXPRESSION}`, -}; - -export const OperandMapExpressionForNull = { - [FilterOperand.ne]: 'IS NOT NULL', - [FilterOperand.eq]: 'IS NULL', -}; - -export const OperandsMapExpressionForNullRelation = { - [FilterOperand.ne]: `EXISTS ${EXPRESSION}`, - [FilterOperand.eq]: `NOT EXISTS ${EXPRESSION}`, -}; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts new file mode 100644 index 00000000..2f6cb5e1 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/common-type.ts @@ -0,0 +1,6 @@ +import { ModuleMetadata, PipeTransform, Type } from '@nestjs/common'; + +export type NestController = NonNullable; +export type NestProvider = NonNullable; +export type NestImport = NonNullable; +export type PipeMixin = Type; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts b/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts deleted file mode 100644 index 4d3c05e5..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/config-param.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - AnyEntity, - EntityName, - NestController, - NestImport, - NestProvider, - PipeMixin, -} from './util-types'; -import { NonEmptyArray } from 'zod-validation-error'; -import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; - -export type ExtractNestType = - ArrayType extends readonly (infer ElementType)[] ? ElementType : never; - -export type ConfigParam = { - requiredSelectField: boolean; - debug: boolean; - pipeForId: PipeMixin; - operationUrl: string; - overrideRoute: string; -}; - -export type GeneralParam = { - connectionName?: string; - entities: NonEmptyArray>; - controllers?: NestController; - providers?: NestProvider; - imports?: NestImport; -}; - -export type ResultGeneralParam = { - connectionName: string; - entities: NonEmptyArray>; - controllers: NestController; - providers: NestProvider; - imports: NestImport; -}; - -export interface BaseModuleOptions { - entity: EntityClassOrSchema; - connectionName: string; - controller?: ExtractNestType; - config: ConfigParam; - imports?: NestImport; -} diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts new file mode 100644 index 00000000..d3fce569 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.test-d.ts @@ -0,0 +1,120 @@ +import { expectType, expectAssignable, expectNotAssignable } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { + Addresses, + Comments, + Roles, + UserGroups, + Users, +} from '../utils/___test___/test-classes.helper'; + +import { + NullableProperty, + RelationProperty, + EntityRelationProps, + ArrayProperty, + ArrayPropertyType, + TypeField, +} from './entity-param.type'; + +type NullableProps = 'testArrayNull' | 'lastName' | 'isActive'; + +type IsEqualsNullableProps = Any.Equals, NullableProps>; +type IsNoEqualsNullableProps = Any.Equals< + NullableProperty, + 'id' | 'login' +>; +expectType(1); +expectType(0); + +const checkRelationProps = { + addresses: { + entityClass: Addresses, + isArray: false, + nullable: false, + }, + comments: { + entityClass: Comments, + nullable: false, + isArray: true, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: false, + }, + roles: { + entityClass: Roles, + nullable: false, + isArray: true, + }, + userGroup: { + entityClass: UserGroups, + nullable: true, + isArray: false, + }, +} satisfies RelationProperty; + +const incorrectRelationProps = { + ...checkRelationProps, + userGroup: { + ...checkRelationProps.userGroup, + nullable: false, + }, +}; + +expectAssignable>(checkRelationProps); +expectNotAssignable>(incorrectRelationProps); + +const checkEntityRelationProps = { + manager: [ + 'id', + 'testArrayNull', + 'lastName', + 'isActive', + 'login', + 'firstName', + 'testReal', + 'testDate', + 'createdAt', + 'updatedAt', + ], + roles: ['id', 'createdAt', 'updatedAt', 'name', 'key', 'isDefault'], + comments: ['id', 'createdAt', 'updatedAt', 'kind'], + addresses: [ + 'id', + 'createdAt', + 'updatedAt', + 'city', + 'state', + 'country', + 'arrayField', + ], + userGroup: ['id', 'label'], +} satisfies EntityRelationProps; + +expectAssignable>(checkEntityRelationProps); +expectNotAssignable>({ + ...incorrectRelationProps, + test: [], +}); + +type ArrayPropertyName = 'testReal' | 'testArrayNull'; + +type IsEqualsArrayProperty = Any.Equals< + ArrayProperty, + ArrayPropertyName +>; +expectType(1); + +type ArrayPropertyTypeName = { + testReal: TypeField.number; + testArrayNull: TypeField.number; +}; + +type IsEqualsArrayPropertyType = Any.Equals< + ArrayPropertyType, + ArrayPropertyTypeName +>; +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts new file mode 100644 index 00000000..db95d330 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts @@ -0,0 +1,115 @@ +import { Union, Object } from 'ts-toolbelt'; +import { + PropertyKeys, + RelationKeys, + IsIterator, +} from '@klerick/json-api-nestjs-shared'; +import { + CastIteratorType, + UnionToTuple, + Constructor, + IsArray, + CastArrayType, +} from './utils-type'; + +export enum TypeField { + array = 'array', + date = 'date', + number = 'number', + boolean = 'boolean', + string = 'string', + object = 'object', + null = 'null', +} +export type TypeForId = Extract; + +type TypeProps = T extends Date + ? TypeField.date + : T extends any[] + ? TypeField.array + : T extends object + ? TypeField.object + : T extends boolean + ? TypeField.boolean + : T extends number + ? TypeField.number + : T extends string + ? TypeField.string + : TypeField.object; + +export type PropertyWithType = { + [K in PropertyKeys]: Exclude extends never + ? TypeField.null + : TypeProps>; +}; + +export type ArrayProperty = { + [K in PropertyKeys]: Exclude extends never + ? never + : IsArray> extends 1 + ? K + : never; +}[PropertyKeys]; + +export type ArrayPropertyType = { + [K in ArrayProperty]: TypeProps>>; +}; + +export type NullableProperty< + E extends object, + IdKey extends string = 'id' +> = Union.Intersect, PropertyKeys>; + +export type RelationProperty = { + [K in RelationKeys]: { + entityClass: Constructor>; + nullable: IsIterator extends 1 + ? false + : [Extract] extends [never] + ? false + : true; + isArray: IsIterator extends 1 ? true : false; + }; +}; + +type PrimaryType< + E extends object, + IdKey extends string = 'id' +> = IdKey extends keyof E + ? TypeProps extends TypeField + ? TypeProps + : TypeField.string + : TypeField.string; + +export type EntityParam = { + props: UnionToTuple>; + propsType: PropertyWithType; + propsArrayType: ArrayPropertyType; + propsNullable: UnionToTuple>; + primaryColumnName: IdKey; + primaryColumnType: PrimaryType; + typeName: string; + className: string; + relations: UnionToTuple>; + relationProperty: RelationProperty; +}; + +type RelationType< + E extends object, + IdKey extends string, + K extends keyof EntityParam['relationProperty'] +> = EntityParam< + E, + IdKey +>['relationProperty'][K]['entityClass'] extends Constructor + ? Exclude + : never; + +export type EntityRelationProps< + E extends object, + IdKey extends string = 'id' +> = { + [K in keyof EntityParam['relationProperty']]: UnionToTuple< + PropertyKeys> + >; +}; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts new file mode 100644 index 00000000..fc563a47 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts @@ -0,0 +1,11 @@ +import { Constructor } from './utils-type'; + +// export interface ObjectLiteral { +// [key: string]: unknown; +// } +export type ObjectLiteral = { + [P in keyof T]: T[P]; +}; + +export type AnyEntity = T; +export type EntityClass = Constructor; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts index ca9e3564..63184a2f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/error.types.ts @@ -14,5 +14,3 @@ export type InnerError = { }; export type ValidateQueryError = ZodIssue | InnerError; - -export type ErrorDescribe = ValidateQueryError; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/types/index.ts index 9d3aaed5..1dd945b6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/index.ts @@ -1,4 +1,6 @@ -export * from './config-param'; -export * from './module-common.types'; -export * from './util-types'; +export * from './entity-type'; +export * from './common-type'; +export * from './module-options.types'; +export * from './utils-type'; +export * from './entity-param.type'; export * from './error.types'; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts deleted file mode 100644 index 731f4131..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/module-common.types.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - MicroOrmJsonApiModule, - TypeOrmJsonApiModule, - TypeOrmParam, - MicroOrmParam, -} from '../modules'; - -import { ConfigParam, GeneralParam, ResultGeneralParam } from './config-param'; -import { RequiredFromPartial } from './util-types'; - -export type TypeOrmConfigParam = ConfigParam & TypeOrmParam; - -export type TypeOrmDefaultOptions = GeneralParam & { - options: Partial; -}; -export type TypeOrmOptions = GeneralParam & { - options: Partial; -}; - -export type MicroOrmConfigParam = ConfigParam & MicroOrmParam; -export type MicroOrmOptions = GeneralParam & { - options: Partial; -}; - -export type ResultTypeOrmModuleOptions = ResultGeneralParam & { - type: typeof TypeOrmJsonApiModule; -} & TypeOrmOptions & { options: RequiredFromPartial }; -export type ResultMicroOrmModuleOptions = ResultGeneralParam & { - type: typeof MicroOrmJsonApiModule; -} & MicroOrmOptions & { options: RequiredFromPartial }; - -export type ResultModuleOptions = - | ResultTypeOrmModuleOptions - | ResultMicroOrmModuleOptions; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts new file mode 100644 index 00000000..459479b5 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/module-options.test-d.ts @@ -0,0 +1,90 @@ +import { DynamicModule } from '@nestjs/common'; +import { expectType, expectError, expectNotType } from 'tsd'; + +import { Params, ParamsModule } from './module-options.types'; + +class Test {} + +const paramsCheck: Params = { + entities: [Test], + options: { + operationUrl: '', + debug: true, + }, + imports: [], + connectionName: 'test', + controllers: [], + providers: [], +}; + +expectType(paramsCheck); +expectNotType({ + ...paramsCheck, + options: { + ...paramsCheck.options, + extraField: true, + }, +}); + +type ExtraOptions = { + extraField: boolean; +}; + +const extraOptions: ExtraOptions = { + extraField: true, +}; + +const extendParamCheck: Params = { + ...paramsCheck, + options: { + ...paramsCheck.options, + ...extraOptions, + }, +}; + +expectType>(extendParamCheck); + +expectNotType>(paramsCheck); +expectNotType>({ + ...extendParamCheck, + options: { + ...extendParamCheck.options, + extraErrorField: true, + }, +}); + +const paramsCheckWithoutOptions: Params = { + entities: [Test], + imports: [], + connectionName: 'test', + controllers: [], + providers: [], +}; + +expectType(paramsCheckWithoutOptions); +expectNotType>(paramsCheckWithoutOptions); + +class ClassModule { + static forRoot(options: Params): DynamicModule { + return {} as any; + } +} +class ClassModuleWithoutExtra { + static forRoot(options: Params>): DynamicModule { + return {} as any; + } +} + +const paramsModule: ParamsModule = { + entities: [Test], + imports: [], + connectionName: 'test', + controllers: [], + providers: [], + options: { + extraField: true, + }, +}; + +expectType>(paramsModule); +expectNotType>(paramsModule); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts new file mode 100644 index 00000000..f3b88d86 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts @@ -0,0 +1,70 @@ +import { DynamicModule } from '@nestjs/common'; +import { NonEmptyArray } from 'zod-validation-error'; +import { AnyEntity, EntityClass } from './entity-type'; +import { + NestController, + NestImport, + NestProvider, + PipeMixin, +} from './common-type'; +import { ExtractNestType, IfEquals } from './utils-type'; + +type ModuleCommonParams = { + entities: NonEmptyArray>; + connectionName?: string; + controllers?: NestController; + providers?: NestProvider; + imports?: NestImport; +}; + +type ModuleCommonOptions = { + requiredSelectField?: boolean; + debug?: boolean; + pipeForId?: PipeMixin; + operationUrl?: string; +}; + +type ModuleOptionsParams> = IfEquals< + OrmParams, + NonNullable, + { + options?: OptionOfConfig; + }, + { + options: OptionOfConfig; + } +>; + +type ExtractOrmParamsOfModule = M extends { + forRoot(options: PrepareParams): DynamicModule; +} + ? U + : never; + +export type ParamsModule = Params>; + +export type Params> = ModuleCommonParams & + ModuleOptionsParams; + +export type PrepareParams> = + Required & { + options: Required> & { + operationUrl: string | undefined; + } & OrmParams; + }; + +export type OptionOfConfig = ModuleCommonOptions & OrmParams; + +export interface OrmModule> { + new (...args: any[]): any; + forRoot(options: Params): DynamicModule; + getUtilProviders(entity: EntityClass): NestProvider; +} + +export type ModuleMixinOptions = { + entity: EntityClass; + controller: ExtractNestType | undefined; + config: PrepareParams; + imports: NestImport; + ormModule: OrmModule; +}; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts b/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts deleted file mode 100644 index 1954c168..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/util-types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ModuleMetadata, PipeTransform, Type } from '@nestjs/common'; -import { EntityTarget as EntityTargetTypeOrm } from 'typeorm/common/EntityTarget'; - -export type AnyEntity = Partial; - -export type EntityClass = Function & { prototype: T }; -export type EntityName = EntityClass; -export type EntityTarget = EntityClass | EntityTargetTypeOrm; -export interface ObjectLiteral { - [key: string]: any; -} - -export type NestController = NonNullable; -export type NestProvider = NonNullable; -export type NestImport = NonNullable; -export type PipeMixin = Type; - -export type RequiredFromPartial = { - [P in keyof T]-?: T[P] extends infer U | undefined ? U | false : T[P]; -}; - -export type RunInTransaction< - F extends (...arg: any[]) => Promise = (...arg: any[]) => Promise -> = (arg: F) => ReturnType; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts new file mode 100644 index 00000000..9d3767e3 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.test-d.ts @@ -0,0 +1,46 @@ +import { Collection } from '@mikro-orm/core'; +import { expectType } from 'tsd'; +import { Any, Object, Tuple, Union } from 'ts-toolbelt'; + +import { HasId, UnionToTuple, CastIteratorType } from './utils-type'; +import { Users } from '../utils/___test___/test-classes.helper'; + +type UnionForTuple = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt' + | 'addresses' + | 'manager' + | 'comments' + | 'userGroup' + | 'roles'; +type TupleCheck = UnionToTuple>; +type IsEqualsFromTupleToUnion = Any.Equals< + Tuple.UnionOf, + UnionForTuple +>; + +expectType(1); +expectType>(1); +expectType>(0); + +type ArrayUsers = Users[]; +type CollectionUsers = Collection; + +type IsEqualsArrayUsers = Any.Equals, Users>; +type IsEqualsCollectionUsers = Any.Equals< + CastIteratorType, + Users +>; +type IsEqualsUsers = Any.Equals, Users>; + +expectType(1); +expectType(1); +expectType(1); diff --git a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts new file mode 100644 index 00000000..0210f614 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts @@ -0,0 +1,34 @@ +import { HasId, CastIteratorType } from '@klerick/json-api-nestjs-shared'; +import { Any, Union, Tuple } from 'ts-toolbelt'; +import { Type } from '@nestjs/common/interfaces'; + +export { HasId, CastIteratorType }; + +export type IfEquals = Any.Equals extends 1 ? A : B; + +export type ExtractNestType = + ArrayType extends readonly (infer ElementType)[] ? ElementType : never; + +export type TypeFromType = T extends Type ? A : never; + +export type UnionToTuple< + T, + L = Union.Last, + N = [T] extends [never] ? true : false +> = true extends N ? [] : Tuple.Append>, L>; + +export type IsArray = T extends unknown[] ? 1 : 0; +export type CastArrayType = T extends (infer U)[] ? U : T; + +export type Constructor = new (...args: any[]) => T; +export type TypeOfConstructor = T extends Constructor ? E : T; + +export type NonEmptyStringTuple = T extends [] + ? never + : T extends readonly [infer First, ...infer Rest] + ? First extends string + ? Rest extends string[] + ? readonly [First, ...Rest] + : never + : never + : never; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts new file mode 100644 index 00000000..46754b8e --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test-classes.helper.ts @@ -0,0 +1,56 @@ +import { Collection } from '@mikro-orm/core'; +type IUsers = Users; +export class Users { + public id!: number; + public login!: string; + public firstName!: string; + public testReal: number[] = []; + public testArrayNull!: number[] | null; + public lastName!: string | null; + public isActive!: null; + public testDate!: Date; + public createdAt: Date = new Date(); + public updatedAt: Date = new Date(); + + public addresses!: IAddresses; + public manager!: IUsers; + public roles = new Collection(this); + public comments!: Comments[]; + public userGroup!: UserGroups | null; +} +type IRoles = Roles; +export class Roles { + public id!: number; + public name!: string; + public key!: string; + public isDefault!: boolean; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IUserGroups = UserGroups; +export class UserGroups { + public id!: number; + public label!: string; +} +type IAddresses = Addresses; +export class Addresses { + public id!: number; + public city!: string; + public state!: string; + public country!: string; + public arrayField!: string[]; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IComments = Comments; +export class Comments { + public id!: number; + public kind!: CommentKind; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts index 79477361..7b6d668e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts @@ -1,211 +1,192 @@ -// @ts-nocheck -import { - AllFieldWithType, - FieldWithType, - PropsForField, - RelationPrimaryColumnType, - RelationPropsArray, - RelationPropsTypeName, - RelationTree, - ResultGetField, - TypeField, -} from '../../modules/mixin/types'; -import { Addresses, Users } from '../../mock-utils/typeorm'; +import { kebabCase } from 'change-case-commonjs'; -export const fieldTypeUsers: FieldWithType = { - id: TypeField.number, - isActive: TypeField.boolean, - firstName: TypeField.string, - createdAt: TypeField.date, - lastName: TypeField.string, - login: TypeField.string, - testDate: TypeField.date, - updatedAt: TypeField.date, - testReal: TypeField.array, - testArrayNull: TypeField.array, -}; -export const propsDb: PropsForField = { - id: { type: Number, isArray: false, isNullable: false }, - login: { type: 'varchar', isArray: false, isNullable: false }, - firstName: { type: 'varchar', isArray: false, isNullable: true }, - testReal: { type: 'real', isArray: true, isNullable: false }, - testArrayNull: { type: 'real', isArray: true, isNullable: true }, - lastName: { type: 'varchar', isArray: false, isNullable: true }, - isActive: { type: 'boolean', isArray: false, isNullable: true }, - createdAt: { type: 'timestamp', isArray: false, isNullable: true }, - testDate: { type: 'timestamp', isArray: false, isNullable: true }, - updatedAt: { type: 'timestamp', isArray: false, isNullable: true }, - notes: { type: 'string', isArray: false, isNullable: true }, - roles: { type: 'number', isArray: true, isNullable: true }, - addresses: { type: 'number', isArray: true, isNullable: true }, - userGroup: { type: 'number', isArray: false, isNullable: true }, - manager: { type: 'number', isArray: false, isNullable: true }, - comments: { type: 'number', isArray: true, isNullable: true }, -}; -export const fieldTypeAddresses: FieldWithType = { - id: TypeField.number, - arrayField: TypeField.array, - state: TypeField.string, - city: TypeField.string, - createdAt: TypeField.date, - updatedAt: TypeField.date, - country: TypeField.string, -}; +import { EntityParamMapService } from '../../modules/mixin/service'; +import { + Addresses, + Comments, + Roles, + UserGroups, + Users, +} from './test-classes.helper'; +import { Constructor, EntityClass, EntityParam, TypeField } from '../../types'; -export const relationArrayProps: RelationPropsArray = { - roles: true, - userGroup: false, - notes: true, - addresses: false, - comments: true, - manager: false, -}; -export const relationPopsName: RelationPropsTypeName = { - roles: 'Roles', - userGroup: 'UserGroups', - notes: 'Notes', - addresses: 'Addresses', - comments: 'Comments', - manager: 'Users', +const entityParamUsers: EntityParam = { + relations: ['addresses', 'manager', 'roles', 'comments', 'userGroup'], + props: [ + 'id', + 'login', + 'firstName', + 'testReal', + 'testArrayNull', + 'lastName', + 'isActive', + 'testDate', + 'createdAt', + 'updatedAt', + ], + className: 'Users', + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + login: TypeField.string, + firstName: TypeField.string, + testReal: TypeField.array, + testArrayNull: TypeField.array, + lastName: TypeField.string, + isActive: TypeField.null, + testDate: TypeField.date, + createdAt: TypeField.date, + updatedAt: TypeField.date, + }, + propsArrayType: { + testReal: TypeField.number, + testArrayNull: TypeField.number, + }, + primaryColumnType: TypeField.number, + propsNullable: ['testArrayNull', 'lastName', 'isActive'], + typeName: 'users', + relationProperty: { + userGroup: { + entityClass: UserGroups, + nullable: true, + isArray: false, + }, + roles: { + entityClass: Roles, + nullable: false, + isArray: true, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: false, + }, + comments: { + entityClass: Comments, + nullable: false, + isArray: true, + }, + addresses: { + entityClass: Addresses, + isArray: false, + nullable: false, + }, + }, }; -export const primaryColumnType: RelationPrimaryColumnType = { - roles: TypeField.number, - userGroup: TypeField.number, - notes: TypeField.string, - addresses: TypeField.number, - comments: TypeField.number, - manager: TypeField.number, +const entityParamRoles: EntityParam = { + relations: [], + props: ['id', 'createdAt', 'updatedAt', 'name', 'key', 'isDefault'] as any, + className: 'Roles', + propsArrayType: {}, + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + name: TypeField.string, + key: TypeField.string, + isDefault: TypeField.boolean, + createdAt: TypeField.date, + updatedAt: TypeField.date, + }, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'roles', + relationProperty: {}, }; -export const userFields: ResultGetField['field'] = [ - 'updatedAt', - 'testDate', - 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', -]; - -export const userRelations: RelationTree = { - addresses: [ - 'arrayField', - 'country', - 'state', - 'city', - 'updatedAt', - 'createdAt', +const entityParamAddresses: EntityParam = { + relations: [], + props: [ 'id', - ], - manager: [ - 'updatedAt', - 'testDate', 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', + 'updatedAt', + 'city', + 'state', + 'country', + 'arrayField', ], - roles: ['isDefault', 'key', 'name', 'updatedAt', 'createdAt', 'id'], - comments: ['kind', 'text', 'updatedAt', 'createdAt', 'id'], - notes: ['text', 'updatedAt', 'createdAt', 'id'], - userGroup: ['label', 'id'], -}; - -export const propsType: AllFieldWithType = { - updatedAt: TypeField.date, - testDate: TypeField.date, - createdAt: TypeField.date, - isActive: TypeField.boolean, - lastName: TypeField.string, - testArrayNull: TypeField.array, - testReal: TypeField.array, - firstName: TypeField.string, - login: TypeField.string, - id: TypeField.number, - addresses: { - arrayField: TypeField.array, + propsArrayType: { + arrayField: TypeField.string, + }, + className: 'Addresses', + primaryColumnName: 'id', + propsType: { + id: TypeField.number, + city: TypeField.string, country: TypeField.string, state: TypeField.string, - city: TypeField.string, - updatedAt: TypeField.date, + arrayField: TypeField.array, createdAt: TypeField.date, - id: TypeField.number, - }, - manager: { updatedAt: TypeField.date, - testDate: TypeField.date, - createdAt: TypeField.date, - isActive: TypeField.boolean, - lastName: TypeField.string, - testArrayNull: TypeField.array, - testReal: TypeField.array, - firstName: TypeField.string, - login: TypeField.string, - id: TypeField.number, }, - roles: { - isDefault: TypeField.boolean, - key: TypeField.string, - name: TypeField.string, - updatedAt: TypeField.date, - createdAt: TypeField.date, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'addresses', + relationProperty: {}, +}; + +const entityParamComments: EntityParam = { + relations: [], + props: ['id', 'createdAt', 'updatedAt', 'kind'], + propsArrayType: {}, + className: 'Comments', + primaryColumnName: 'id', + propsType: { id: TypeField.number, - }, - comments: { kind: TypeField.string, - text: TypeField.string, - updatedAt: TypeField.date, createdAt: TypeField.date, - id: TypeField.number, - }, - notes: { - text: TypeField.string, updatedAt: TypeField.date, - createdAt: TypeField.date, - id: TypeField.string, }, - userGroup: { - label: TypeField.string, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: 'comments', + relationProperty: { + user: { + entityClass: Users, + nullable: false, + isArray: false, + }, + }, +}; + +const entityParamUserGroups: EntityParam = { + relations: [], + props: ['id', 'label'], + propsArrayType: {}, + className: 'UserGroups', + primaryColumnName: 'id', + propsType: { id: TypeField.number, + label: TypeField.string, }, + primaryColumnType: TypeField.number, + propsNullable: [], + typeName: kebabCase('UserGroups'), + relationProperty: {}, }; -export const relationList: ResultGetField['relations'] = [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', -]; +export const mapMock = new Map, EntityParam>([ + [Users, entityParamUsers], + [Roles, entityParamRoles], + [UserGroups, entityParamUserGroups], + [Addresses, entityParamAddresses], + [Comments, entityParamComments], +]); -export const userFieldsStructure: ResultGetField = { - field: [ - 'updatedAt', - 'testDate', - 'createdAt', - 'isActive', - 'lastName', - 'testArrayNull', - 'testReal', - 'firstName', - 'login', - 'id', - ], - relations: [ - 'userGroup', - 'notes', - 'comments', - 'roles', - 'manager', - 'addresses', - ], -}; +export const usersEntityParamMapMockData = { + entityParaMap: entityParamUsers, + getParamMap( + entity: EntityClass + ): EntityParam { + return mapMock.get(entity) as EntityParam; + }, +} as EntityParamMapService; + +export const addressesEntityParamMapMockData = { + entityParaMap: entityParamAddresses, + getParamMap( + entity: EntityClass + ): EntityParam { + return mapMock.get(entity) as EntityParam; + }, +} as EntityParamMapService; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts deleted file mode 100644 index 767f90a8..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/helper.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { DynamicModule, ParseIntPipe } from '@nestjs/common'; - -import { - MicroOrmJsonApiModule, - TypeOrmJsonApiModule, - TypeOrmParam, -} from '../modules'; -import { - ConfigParam, - RequiredFromPartial, - ResultModuleOptions, -} from '../types'; -import { prepareConfig, createMixinModule } from './helper'; -import { - DEFAULT_CONNECTION_NAME, - JSON_API_CONTROLLER_POSTFIX, -} from '../constants'; -import { JsonBaseController } from '../modules/mixin/controller/json-base.controller'; -import { JsonApi } from '../modules/mixin/decorators'; -import { getProviderName } from '../modules/mixin/helper'; - -class A {} -describe('Helper tests', () => { - describe('prepareConfig', () => { - it('should return default config when type is undefined', () => { - const result = prepareConfig( - { - entities: [A], - options: { debug: false, requiredSelectField: false }, - }, - 'typeOrm' - ); - - expect(Array.isArray(result.imports)).toBe(true); - expect(Array.isArray(result.controllers)).toBe(true); - expect(Array.isArray(result.providers)).toBe(true); - expect(result.options.debug).toBe(false); - expect(result.options.requiredSelectField).toBe(false); - expect(result.connectionName).toBe(DEFAULT_CONNECTION_NAME); - }); - - it('should return TypeOrm config when type is TypeOrmModule', () => { - const result = prepareConfig( - { - entities: [A], - options: { - debug: true, - requiredSelectField: true, - useSoftDelete: true, - }, - }, - 'typeOrm' - ); - - expect(result.options.debug).toBe(true); - expect( - (result.options as RequiredFromPartial) - .useSoftDelete - ).toBe(true); - }); - - it('should return MicroOrm config when type is MicroOrmModule', () => { - const result = prepareConfig( - { - entities: [A], - options: { debug: true, requiredSelectField: true }, - }, - 'microOrm' - ); - - expect(result.options.debug).toBe(true); - expect(result.options.requiredSelectField).toBe(true); - - // @ts-expect-error eed check run time - expect((result.options as ConfigParam).useSoftDelete).toBeUndefined(); - }); - - it('should use default values for pipeForId, operationUrl, and overrideRoute when not provided', () => { - const result = prepareConfig( - { - entities: [A], - options: {}, - }, - 'typeOrm' - ); - - expect(result.options.pipeForId).toBe(ParseIntPipe); - expect(result.options.operationUrl).toBe(false); - expect(result.options.overrideRoute).toBe(false); - }); - }); - - describe('createMixinModule', () => { - it('should create a MixinModule with the correct controller matching the entity', () => { - class TestEntity {} - @JsonApi(TestEntity) - class TestController extends JsonBaseController {} - const commonOrmModule = {} as DynamicModule; - const resultOptions = prepareConfig( - { - entities: [TestEntity], - controllers: [TestController], - connectionName: DEFAULT_CONNECTION_NAME, - options: { - debug: true, - requiredSelectField: true, - useSoftDelete: true, - }, - }, - 'typeOrm' - ); - - const result = createMixinModule( - TestEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - - expect(result).toHaveProperty('controllers', [TestController]); - expect(result).toHaveProperty('providers'); - expect(result.imports?.includes(commonOrmModule)).toBe(true); - }); - - it('should use undefined as controller if none match the entity', () => { - class TestEntity {} - const commonOrmModule = {} as DynamicModule; - const resultOptions = prepareConfig( - { - entities: [TestEntity], - controllers: [], - connectionName: 'test_connection', - options: { debug: false }, - imports: [], - }, - 'typeOrm' - ); - - const result = createMixinModule( - TestEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - - const controller = (result.controllers || []).at(0); - expect(controller?.name).toBe( - getProviderName(TestEntity, JSON_API_CONTROLLER_POSTFIX) - ); - }); - - it('should correctly construct the MixinModule using given ResultModuleOptions', () => { - class AnotherEntity {} - class SharedModule {} - const commonOrmModule = {} as DynamicModule; - const importTest = { module: SharedModule }; - - const resultOptions = prepareConfig( - { - entities: [AnotherEntity], - controllers: [], - connectionName: 'default_connection', - options: { debug: true, useSoftDelete: true }, - imports: [importTest], - }, - 'typeOrm' - ); - - const result = createMixinModule( - AnotherEntity, - { - ...resultOptions, - type: TypeOrmJsonApiModule, - } as ResultModuleOptions, - commonOrmModule - ); - expect(result.imports?.at(1)).toEqual(importTest); - }); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts deleted file mode 100644 index 7c7f1bd6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/helper.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { DynamicModule, ParseIntPipe } from '@nestjs/common'; - -import { - AnyEntity, - ConfigParam, - EntityName, - MicroOrmOptions, - RequiredFromPartial, - ResultModuleOptions, - TypeOrmConfigParam, - MicroOrmConfigParam, - TypeOrmOptions, -} from '../types'; -import { - DEFAULT_CONNECTION_NAME, - JSON_API_DECORATOR_ENTITY, -} from '../constants'; -import { TypeOrmParam, AtomicOperationModule, MicroOrmParam } from '../modules'; -import { MixinModule } from '../modules/mixin/mixin.module'; -import { Type } from '@nestjs/common/interfaces'; -import { RouterModule } from '@nestjs/core'; -import { DEFAULT_ARRAY_TYPE } from '../modules/micro-orm/constants'; - -export function prepareConfig( - moduleOptions: TypeOrmOptions | MicroOrmOptions, - type: 'typeOrm' | 'microOrm' -): Omit { - const { options: inputOptions } = moduleOptions; - - let resulOptions: - | RequiredFromPartial - | RequiredFromPartial; - - const configParam: RequiredFromPartial = { - debug: !!inputOptions.debug, - requiredSelectField: !!inputOptions.requiredSelectField, - operationUrl: inputOptions.operationUrl || false, - overrideRoute: inputOptions.overrideRoute || false, - pipeForId: inputOptions.pipeForId || ParseIntPipe, - }; - - if (type === 'typeOrm') { - const { runInTransaction, useSoftDelete } = - moduleOptions.options as Partial; - - resulOptions = { - ...configParam, - useSoftDelete: useSoftDelete ? useSoftDelete : false, - runInTransaction: runInTransaction ? runInTransaction : false, - }; - } else { - const { arrayType } = moduleOptions.options as Partial< - ConfigParam & MicroOrmParam - >; - - resulOptions = { - ...configParam, - arrayType: [...DEFAULT_ARRAY_TYPE, ...(arrayType || [])], - }; - } - - return { - connectionName: - type === 'typeOrm' - ? moduleOptions.connectionName || DEFAULT_CONNECTION_NAME - : (moduleOptions.connectionName as any), - entities: moduleOptions.entities, - imports: moduleOptions.imports || [], - providers: moduleOptions.providers || [], - controllers: moduleOptions.controllers || [], - options: resulOptions as any, - } satisfies Omit; -} - -export function createMixinModule( - entity: EntityName, - resultOption: ResultModuleOptions, - commonOrmModule: DynamicModule -): DynamicModule { - const controller = (resultOption.controllers || []).find( - (item) => - item && Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, item) === entity - ); - - return MixinModule.forRoot({ - entity, - controller, - config: resultOption.options, - imports: [commonOrmModule, ...resultOption.imports], - ormModule: resultOption.type, - }); -} - -export function createAtomicModule( - options: ResultModuleOptions, - entitiesMixinModules: DynamicModule[], - commonOrmModule: DynamicModule -): DynamicModule[] { - const { operationUrl } = options.options; - if (!operationUrl) return []; - - return [ - AtomicOperationModule.forRoot( - { - ...options, - connectionName: options.connectionName, - }, - entitiesMixinModules, - commonOrmModule - ), - RouterModule.register([ - { - module: AtomicOperationModule, - path: operationUrl, - }, - ]), - ]; -} - -export function entityForClass(type: Type): EntityName { - return Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, type); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/index.ts index d6d6f056..e9860347 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/index.ts @@ -1 +1 @@ -export * from './helper'; +export * from './module-helper'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts new file mode 100644 index 00000000..027216f5 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.spec.ts @@ -0,0 +1,202 @@ +import { ParseIntPipe } from '@nestjs/common'; + +import { + DEFAULT_CONNECTION_NAME, + JSON_API_DECORATOR_ENTITY, +} from '../constants'; +import { prepareConfig, getController } from './module-helper'; +import { Params } from '../types'; + +describe('module-helper', () => { + describe('getController', () => { + beforeAll(() => { + Reflect.defineMetadata = jest.fn(); + Reflect.getMetadata = jest.fn((key, target) => { + if (key === JSON_API_DECORATOR_ENTITY && (target as any).entity) { + return (target as any).entity; + } + return undefined; + }); + }); + + it('should return the controller that matches the entity metadata', () => { + const entity = class Entity1 {}; + const controllers = [ + { entity }, + { entity: 'Entity2' }, + { entity: 'Entity3' }, + ] as any; + + const result = getController(entity, controllers); + + expect(result).toEqual(controllers[0]); + }); + + it('should return undefined if no controllers match the entity metadata', () => { + const entity = class UnknownEntity {}; + const controllers = [{ entity: 'Entity1' }, { entity: 'Entity2' }] as any; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + + it('should return undefined if controllers list is empty', () => { + const entity = class Entity1 {}; + const controllers: any[] = []; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + + it('should handle malformed input gracefully', () => { + const entity = class Entity1 {}; + const controllers = [null, undefined, { entity: 'Entity2' }, true] as any; + + const result = getController(entity, controllers); + + expect(result).toBeUndefined(); + }); + }); + + describe('prepareConfig', () => { + it('should return default values when no options are provided', () => { + const moduleParams: Params> = { + options: undefined, + connectionName: undefined, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result).toEqual({ + connectionName: DEFAULT_CONNECTION_NAME, + imports: [], + providers: [], + controllers: [], + entities: [], + options: { + operationUrl: undefined, + requiredSelectField: false, + debug: false, + pipeForId: ParseIntPipe, + }, + }); + }); + + it('should override default connectionName if provided', () => { + const moduleParams = { + connectionName: 'custom_connection', + options: {}, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.connectionName).toBe('custom_connection'); + }); + + it('should merge provided options with defaults', () => { + const moduleParams = { + options: { debug: true, operationUrl: 'http://example.com' }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.options).toEqual({ + operationUrl: 'http://example.com', + requiredSelectField: false, + debug: true, + pipeForId: ParseIntPipe, + }); + }); + + it('should ensure requiredSelectField is cast to boolean', () => { + const moduleParams = { + options: { requiredSelectField: true }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + } as Params; + + const result = prepareConfig(moduleParams); + expect(result.options['requiredSelectField']).toBe(true); + }); + + it('should default pipeForId to ParseIntPipe if not provided in options', () => { + const moduleParams = { + options: {}, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams); + + expect(result.options.pipeForId).toBe(ParseIntPipe); + }); + + it('should use provided pipeForId if specified in options', () => { + class CustomPipe {} + + const moduleParams = { + options: { pipeForId: CustomPipe }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + }; + + const result = prepareConfig(moduleParams as any); + + expect(result.options.pipeForId).toBe(CustomPipe); + }); + + it('should return provided entities if specified', () => { + const entities = ['Entity1', 'Entity2'] as any; + const moduleParams: Params> = { + entities, + imports: undefined, + providers: undefined, + controllers: undefined, + }; + + const result = prepareConfig(moduleParams); + + expect(result.entities).toBe(entities); + expect(result).toHaveProperty('options'); + expect(result.options).toEqual({ + operationUrl: undefined, + requiredSelectField: false, + debug: false, + pipeForId: ParseIntPipe, + }); + }); + + it('should be return module option as is', () => { + const moduleParams = { + options: { customOptions: 'string' }, + imports: undefined, + providers: undefined, + controllers: undefined, + entities: [] as any, + } as Params<{ customOptions: string }>; + + const result = prepareConfig(moduleParams); + expect(result.options['customOptions']).toBe('string'); + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts new file mode 100644 index 00000000..c91e85f2 --- /dev/null +++ b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts @@ -0,0 +1,45 @@ +import { ParseIntPipe } from '@nestjs/common'; + +import { + AnyEntity, + EntityClass, + NestController, + OptionOfConfig, + Params, + PrepareParams, +} from '../types'; +import { + DEFAULT_CONNECTION_NAME, + JSON_API_DECORATOR_ENTITY, +} from '../constants'; + +export function prepareConfig( + moduleParams: Params +): PrepareParams { + const options = moduleParams['options'] || ({} as OptionOfConfig); + + return { + connectionName: moduleParams['connectionName'] || DEFAULT_CONNECTION_NAME, + imports: moduleParams['imports'] || [], + providers: moduleParams['providers'] || [], + controllers: moduleParams['controllers'] || [], + entities: moduleParams['entities'], + options: { + ...options, + operationUrl: options['operationUrl'] || undefined, + requiredSelectField: !!options['requiredSelectField'], + debug: !!options['debug'], + pipeForId: options['pipeForId'] || ParseIntPipe, + }, + }; +} + +export function getController( + entity: EntityClass, + controllers: NestController +) { + return controllers.find( + (item) => + item && Reflect.getMetadata(JSON_API_DECORATOR_ENTITY, item) === entity + ); +} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts deleted file mode 100644 index a0fe9b9f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './lib/utils'; -export * from './lib/types'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts deleted file mode 100644 index 5fbdd04f..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/entity-type.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts deleted file mode 100644 index 33b70ba6..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './utils-string.type'; -export * from './query-type'; -export * from './entity-type'; -export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts deleted file mode 100644 index ddeead7a..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/query-type.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum QueryField { - filter = 'filter', - sort = 'sort', - include = 'include', - page = 'page', - fields = 'fields', -} - -export enum FilterOperand { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', - in = 'in', - nin = 'nin', - some = 'some', -} - -export enum FilterOperandOnlyInNin { - in = 'in', - nin = 'nin', -} -export enum FilterOperandOnlySimple { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts deleted file mode 100644 index 85dbdb49..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/response-body.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; - -export type PageProps = { - totalItems: number; - pageNumber: number; - pageSize: number; -}; - -export type DebugMetaProps = Partial<{ - time: number; -}>; - -export type MainData = { - type: T; - id: string; -}; - -export type Links = { - self: string; - related?: string; -}; - -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; -}; - -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; - -export type Data = { - data?: DataResult; -}; - -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; -}; - -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; -}>; - -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; -}; - -export type MetaProps = R extends null ? T : T & R; - -export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; - -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts deleted file mode 100644 index a7799257..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './string-utils'; -export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts deleted file mode 100644 index 5d4ad26d..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/object-utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { kebabToCamel } from './string-utils'; - -export const ObjectTyped = { - keys: Object.keys as (yourObject: T) => Array, - values: Object.values as (yourObject: U) => Array, - entries: Object.entries as ( - yourObject: O - ) => Array<[keyof O, O[keyof O]]>, - fromEntries: Object.fromEntries as ( - yourObjectEntries: [K, V][] - ) => Record, -}; - -export function isObject(item: unknown): item is object { - return typeof item === 'object' && !Array.isArray(item) && item !== null; -} - -export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); - return Function('return new class ' + entityName + '{}')(); -} diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/utils/nestjs-shared/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs/tsconfig.lib.json b/libs/json-api/json-api-nestjs/tsconfig.lib.json index 0adc2e5a..0d157409 100644 --- a/libs/json-api/json-api-nestjs/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs/tsconfig.lib.json @@ -9,8 +9,8 @@ "noImplicitAny": true, "strictBindCallApply": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, }, "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.test-d.ts", "src/lib/utils/___test___/**/*.ts"] } diff --git a/libs/json-api/json-api-nestjs/tsconfig.spec.json b/libs/json-api/json-api-nestjs/tsconfig.spec.json index ebbb8e0d..2752a539 100644 --- a/libs/json-api/json-api-nestjs/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs/tsconfig.spec.json @@ -4,7 +4,12 @@ "outDir": "../../../dist/out-tsc", "module": "commonjs", "moduleResolution": "node16", - "types": ["jest", "node"] + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ] + } }, "include": [ "jest.config.ts", From f25d31942795c1f48cbaa883468e60c5a9988116 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 06:58:51 +0100 Subject: [PATCH 03/22] feat(json-api-nestjs-typeorm): Adapter for typerorm Move adapter for typeorm as separate package --- .../json-api-nestjs-typeorm/.eslintrc.json | 30 + .../json-api-nestjs-typeorm/README.md | 11 + .../json-api-nestjs-typeorm/jest.config.ts | 10 + .../json-api-nestjs-typeorm/package.json | 10 + .../json-api-nestjs-typeorm/project.json | 36 + .../json-api-nestjs-typeorm/src/index.ts | 1 + .../src/lib/constants/index.ts | 8 + .../src/lib/factory/index.ts | 183 +++++ .../json-api-nestjs-typeorm/src/lib/index.ts | 2 + .../src/lib/mock-utils/entities/addresses.ts | 69 ++ .../src/lib/mock-utils/entities/comments.ts | 57 ++ .../src/lib/mock-utils/entities/index.ts | 25 + .../src/lib/mock-utils/entities/notes.ts | 44 ++ .../src/lib/mock-utils/entities/pods.ts | 39 + .../src/lib/mock-utils/entities/roles.ts | 57 ++ .../lib/mock-utils/entities/user-groups.ts | 20 + .../src/lib/mock-utils/entities/users.ts | 133 ++++ .../src/lib/mock-utils/index.ts | 216 +++++ .../src/lib/mock-utils/pull-data.ts | 122 +++ .../src/lib/orm-helper/index.spec.ts | 162 ++++ .../src/lib/orm-helper/index.ts | 184 +++++ .../orm-methods/delete-one/delete-one.spec.ts | 39 + .../lib/orm-methods/delete-one/delete-one.ts | 20 + .../delete-relationship.spec.ts | 158 ++++ .../delete-relationship.ts | 31 + .../lib/orm-methods/get-all/get-all.spec.ts | 353 +++++++++ .../src/lib/orm-methods/get-all/get-all.ts | 265 +++++++ .../lib/orm-methods/get-one/get-one.spec.ts | 139 ++++ .../src/lib/orm-methods/get-one/get-one.ts | 97 +++ .../get-relationship/get-relationship.spec.ts | 96 +++ .../get-relationship/get-relationship.ts | 60 ++ .../src/lib/orm-methods/index.ts | 9 + .../orm-methods/patch-one/patch-one.spec.ts | 296 +++++++ .../lib/orm-methods/patch-one/patch-one.ts | 84 ++ .../patch-relationship.spec.ts | 207 +++++ .../patch-relationship/patch-relationship.ts | 50 ++ .../lib/orm-methods/post-one/post-one.spec.ts | 239 ++++++ .../src/lib/orm-methods/post-one/post-one.ts | 46 ++ .../post-relationship.spec.ts | 162 ++++ .../post-relationship/post-relationship.ts | 40 + .../src/lib/service/index.ts | 3 + .../type-orm-format.error.service.spec.ts | 103 +++ .../service/type-orm-format.error.service.ts | 168 ++++ .../src/lib/service/type-orm.service.ts | 145 ++++ .../lib/service/typeorm-utils.service.spec.ts | 743 ++++++++++++++++++ .../src/lib/service/typeorm-utils.service.ts | 716 +++++++++++++++++ .../src/lib/type-orm-json-api.module.ts | 71 ++ .../json-api-nestjs-typeorm/src/lib/type.ts | 35 + .../json-api-nestjs-typeorm/tsconfig.json | 22 + .../json-api-nestjs-typeorm/tsconfig.lib.json | 16 + .../tsconfig.spec.json | 23 + 51 files changed, 5855 insertions(+) create mode 100644 libs/json-api/json-api-nestjs-typeorm/.eslintrc.json create mode 100644 libs/json-api/json-api-nestjs-typeorm/README.md create mode 100644 libs/json-api/json-api-nestjs-typeorm/jest.config.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/package.json create mode 100644 libs/json-api/json-api-nestjs-typeorm/project.json create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts create mode 100644 libs/json-api/json-api-nestjs-typeorm/tsconfig.json create mode 100644 libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json create mode 100644 libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json diff --git a/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json b/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json new file mode 100644 index 00000000..0af28030 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] + } + } + ] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/README.md b/libs/json-api/json-api-nestjs-typeorm/README.md new file mode 100644 index 00000000..44b26bc0 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/README.md @@ -0,0 +1,11 @@ +# json-api-nestjs-typeorm + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build json-api-nestjs-typeorm` to build the library. + +## Running unit tests + +Run `nx test json-api-nestjs-typeorm` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/json-api/json-api-nestjs-typeorm/jest.config.ts b/libs/json-api/json-api-nestjs-typeorm/jest.config.ts new file mode 100644 index 00000000..51695ffd --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'json-api-nestjs-typeorm', + preset: '../../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-typeorm', +}; diff --git a/libs/json-api/json-api-nestjs-typeorm/package.json b/libs/json-api/json-api-nestjs-typeorm/package.json new file mode 100644 index 00000000..305ebaec --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/package.json @@ -0,0 +1,10 @@ +{ + "name": "@klerick/json-api-nestjs-typeorm", + "version": "0.0.1", + "dependencies": { + "tslib": "^2.3.0" + }, + "type": "commonjs", + "main": "./src/index.js", + "typings": "./src/index.d.ts" +} diff --git a/libs/json-api/json-api-nestjs-typeorm/project.json b/libs/json-api/json-api-nestjs-typeorm/project.json new file mode 100644 index 00000000..a8973801 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/project.json @@ -0,0 +1,36 @@ +{ + "name": "json-api-nestjs-typeorm", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/json-api/json-api-nestjs-typeorm/src", + "projectType": "library", + "release": { + "version": { + "generatorOptions": { + "packageRoot": "dist/{projectRoot}", + "currentVersionResolver": "git-tag" + } + } + }, + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-typeorm", "type:publish"], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/libs/json-api/json-api-nestjs-typeorm", + "tsConfig": "libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json", + "packageJson": "libs/json-api/json-api-nestjs-typeorm/package.json", + "main": "libs/json-api/json-api-nestjs-typeorm/src/index.ts", + "assets": ["libs/json-api/json-api-nestjs-typeorm/*.md"], + "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + } + }, + "implicitDependencies": ["json-api-nestjs"] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/index.ts new file mode 100644 index 00000000..9d0183f3 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/index.ts @@ -0,0 +1 @@ +export * from './lib/type-orm-json-api.module'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts new file mode 100644 index 00000000..cbe48b77 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/constants/index.ts @@ -0,0 +1,8 @@ +export const SUB_QUERY_ALIAS_FOR_PAGINATION = 'subQueryWithLimitOffset'; +export const ALIAS_FOR_PAGINATION = 'aliasForPagination'; +export const DEFAULT_CONNECTION_NAME = 'default'; +export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); +export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); +export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( + 'CURRENT_ENTITY_MANAGER_TOKEN' +); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts new file mode 100644 index 00000000..8d2e48ff --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/factory/index.ts @@ -0,0 +1,183 @@ +import { FactoryProvider } from '@nestjs/common'; +import { getDataSourceToken } from '@nestjs/typeorm'; +import { + EntityParam, + CheckRelationName, + FindOneRowEntity, + RunInTransaction, + PrepareParams, + FIND_ONE_ROW_ENTITY, + CHECK_RELATION_NAME, + RUN_IN_TRANSACTION_FUNCTION, + ORM_SERVICE, + MODULE_OPTIONS_TOKEN, + ENTITY_PARAM_MAP, +} from '@klerick/json-api-nestjs'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { kebabCase } from 'change-case-commonjs'; +import { DataSource, EntityManager, EntityTarget, Repository } from 'typeorm'; + +import { + CURRENT_DATA_SOURCE_TOKEN, + CURRENT_ENTITY_MANAGER_TOKEN, + CURRENT_ENTITY_REPOSITORY, +} from '../constants'; + +import { TypeOrmService, TypeormUtilsService } from '../service'; + +import { TypeOrmParam } from '../type'; + +import { + getProps, + getRelation, + getPropsType, + getPropsNullable, + getPrimaryColumnName, + getPrimaryColumnType, + getRelationProperty, + getArrayType, +} from '../orm-helper'; +import { EntityClass } from '@mikro-orm/core'; + +export function CurrentDataSourceProvider( + connectionName?: string +): FactoryProvider { + return { + provide: CURRENT_DATA_SOURCE_TOKEN, + useFactory: (dataSource: DataSource) => dataSource, + inject: [getDataSourceToken(connectionName)], + }; +} + +export function CurrentEntityManager(): FactoryProvider { + return { + provide: CURRENT_ENTITY_MANAGER_TOKEN, + useFactory: (dataSource: DataSource) => dataSource.manager, + inject: [CURRENT_DATA_SOURCE_TOKEN], + }; +} + +export function CurrentEntityRepository( + entity: E +): FactoryProvider> { + return { + provide: CURRENT_ENTITY_REPOSITORY, + useFactory: (entityManager: EntityManager) => + entityManager.getRepository(entity as unknown as EntityTarget), + inject: [CURRENT_ENTITY_MANAGER_TOKEN], + }; +} + +export function EntityPropsMap(entities: EntityClass[]) { + return { + provide: ENTITY_PARAM_MAP, + inject: [CURRENT_ENTITY_MANAGER_TOKEN], + useFactory: (entityManager: EntityManager) => { + const mapProperty = new Map, EntityParam>(); + + for (const item of entities) { + const entityRepo = entityManager.getRepository(item); + + const className = getEntityName(item); + mapProperty.set(item, { + props: getProps(entityRepo), + propsType: getPropsType(entityRepo), + propsNullable: getPropsNullable(entityRepo), + primaryColumnName: getPrimaryColumnName(entityRepo), + primaryColumnType: getPrimaryColumnType(entityRepo), + propsArrayType: getArrayType(entityRepo), + typeName: kebabCase(className), + className: className, + relations: getRelation(entityRepo), + relationProperty: getRelationProperty(entityRepo), + }); + } + return mapProperty; + }, + }; +} + +export function FindOneRowEntityFactory(): FactoryProvider< + FindOneRowEntity +> { + return { + provide: FIND_ONE_ROW_ENTITY, + inject: [CURRENT_ENTITY_REPOSITORY, TypeormUtilsService], + useFactory: ( + repository: Repository, + typeormUtilsService: TypeormUtilsService + ) => { + return async (entity, value) => { + const params = 'params'; + return await repository + .createQueryBuilder(typeormUtilsService.currentAlias) + .where( + `${typeormUtilsService.getAliasPath( + typeormUtilsService.currentPrimaryColumn + )} = :${params}` + ) + .setParameters({ + [params]: value, + }) + .getOne(); + }; + }, + }; +} + +export function CheckRelationNameFactory< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { + return { + provide: CHECK_RELATION_NAME, + inject: [TypeormUtilsService], + useFactory(typeormUtilsService: TypeormUtilsService) { + return (entity, value) => + !!(typeormUtilsService.relationFields as any).find( + (i: any) => i === value + ); + }, + }; +} + +export function RunInTransactionFactory(): FactoryProvider { + return { + provide: RUN_IN_TRANSACTION_FUNCTION, + inject: [MODULE_OPTIONS_TOKEN, CURRENT_DATA_SOURCE_TOKEN], + useFactory(options: PrepareParams, dataSource: DataSource) { + const { + options: { runInTransaction }, + } = options; + + if (runInTransaction && typeof runInTransaction === 'function') { + return (callback) => + runInTransaction('READ COMMITTED', () => callback()); + } + + return async (callback) => { + const queryRunner = dataSource.createQueryRunner(); + await queryRunner.startTransaction('READ UNCOMMITTED'); + let result: unknown; + try { + result = await callback(); + await queryRunner.commitTransaction(); + } catch (e) { + await queryRunner.rollbackTransaction(); + throw e; + } finally { + await queryRunner.release(); + } + return result; + }; + }, + }; +} + +export function OrmServiceFactory() { + return { + provide: ORM_SERVICE, + useClass: TypeOrmService, + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts new file mode 100644 index 00000000..fd6d6101 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/index.ts @@ -0,0 +1,2 @@ +export * from './type-orm-json-api.module'; +export * from './type'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts new file mode 100644 index 00000000..0861194f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/addresses.ts @@ -0,0 +1,69 @@ +import { + PrimaryGeneratedColumn, + OneToOne, + Column, + Entity, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from './index'; + +export type IAddresses = Addresses; + +@Entity('addresses') +export class Addresses { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public city!: string; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public state!: string; + + @Column({ + type: 'varchar', + length: 68, + nullable: true, + default: 'NULL', + }) + public country!: string; + + @Column({ + name: 'array_field', + type: 'varchar', + nullable: true, + default: () => 'NULL', + array: true, + }) + public arrayField!: string[]; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; + + @OneToOne(() => Users, (item) => item.addresses) + public user!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts new file mode 100644 index 00000000..c9e03b70 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/comments.ts @@ -0,0 +1,57 @@ +import { + PrimaryGeneratedColumn, + Column, + Entity, + JoinColumn, + ManyToOne, + UpdateDateColumn, +} from 'typeorm'; + +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} + +import { Users, IUsers } from './index'; + +@Entity('comments') +export class Comments { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + type: 'enum', + enum: CommentKind, + nullable: false, + }) + public kind!: CommentKind; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; + + @ManyToOne(() => Users, (item) => item.id) + @JoinColumn({ + name: 'created_by', + }) + public createdBy!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts new file mode 100644 index 00000000..ba4ffd16 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/index.ts @@ -0,0 +1,25 @@ +export * from './users'; +export * from './roles'; +export * from './comments'; +export * from './addresses'; +export * from './user-groups'; +export * from './notes'; +export * from './pods'; + +import { Users } from './users'; +import { Roles } from './roles'; +import { Comments } from './comments'; +import { Addresses } from './addresses'; +import { UserGroups } from './user-groups'; +import { Notes } from './notes'; +import { Pods } from './pods'; + +export const Entities = [ + Users, + Roles, + Comments, + Addresses, + UserGroups, + Notes, + Pods, +]; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts new file mode 100644 index 00000000..ff58e18f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/notes.ts @@ -0,0 +1,44 @@ +import { + PrimaryGeneratedColumn, + Column, + Entity, + JoinColumn, + ManyToOne, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from './index'; + +@Entity('notes') +export class Notes { + @PrimaryGeneratedColumn('uuid') + public id!: string; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; + + @ManyToOne(() => Users, (item) => item.notes) + @JoinColumn({ + name: 'created_by', + }) + public createdBy!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts new file mode 100644 index 00000000..2876065c --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/pods.ts @@ -0,0 +1,39 @@ +import { + Column, + CreateDateColumn, + Entity, + PrimaryColumn, + UpdateDateColumn, +} from 'typeorm'; + +export type IPods = Pods; + +@Entity('pods') +export class Pods { + @PrimaryColumn() + public id!: string; + + @Column({ + type: 'varchar', + length: 50, + nullable: false, + unique: true, + }) + public name!: string; + + @CreateDateColumn({ + name: 'created_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts new file mode 100644 index 00000000..b45112fb --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/roles.ts @@ -0,0 +1,57 @@ +import { + PrimaryGeneratedColumn, + Entity, + Column, + ManyToMany, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from './index'; + +@Entity('roles') +export class Roles { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 128, + nullable: true, + default: 'NULL', + }) + public name!: string; + + @Column({ + type: 'varchar', + length: 128, + nullable: false, + unique: true, + }) + public key!: string; + + @Column({ + name: 'is_default', + type: 'boolean', + default: 'false', + }) + public isDefault!: boolean; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; + + @ManyToMany(() => Users, (item) => item.roles) + public users!: IUsers[]; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts new file mode 100644 index 00000000..a6727416 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/user-groups.ts @@ -0,0 +1,20 @@ +import { PrimaryGeneratedColumn, OneToMany, Entity, Column } from 'typeorm'; + +import { IUsers, Users } from './index'; + +@Entity('user_groups') +export class UserGroups { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 50, + nullable: false, + unique: true, + }) + public label!: string; + + @OneToMany(() => Users, (item) => item.userGroup) + public users!: IUsers[]; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts new file mode 100644 index 00000000..50ae3464 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/entities/users.ts @@ -0,0 +1,133 @@ +import { + PrimaryGeneratedColumn, + ManyToMany, + JoinColumn, + JoinTable, + OneToOne, + OneToMany, + Entity, + Column, + UpdateDateColumn, + ManyToOne, +} from 'typeorm'; + +import { Addresses, Roles, Comments, Notes, UserGroups } from './index'; + +export type IUsers = Users; + +@Entity('users') +export class Users { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 100, + nullable: false, + unique: true, + }) + public login!: string; + + @Column({ + name: 'first_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public firstName!: string; + + @Column({ + name: 'test_real', + type: 'real', + array: true, + default: [], + }) + public testReal!: number[]; + + @Column({ + name: 'test_array_null', + type: 'real', + array: true, + nullable: true, + }) + public testArrayNull!: number[] | null; + + @Column({ + name: 'last_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public lastName!: string; + + @Column({ + name: 'is_active', + type: 'boolean', + width: 1, + nullable: true, + default: false, + }) + public isActive!: boolean; + + @Column({ + name: 'test_date', + type: 'timestamp with time zone', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public testDate!: Date; + + @Column({ + name: 'created_at', + type: 'timestamp with time zone', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp with time zone', + nullable: true, + default: () => 'CURRENT_TIMESTAMP(0)', + }) + public updatedAt!: Date; + + @OneToOne(() => Addresses, (item) => item.id) + @JoinColumn({ + name: 'addresses_id', + }) + public addresses!: Addresses; + + @OneToOne(() => Users, (item) => item.id) + @JoinColumn({ + name: 'manager_id', + }) + public manager!: Users; + + @ManyToMany(() => Roles, (item) => item.users) + @JoinTable({ + name: 'users_have_roles', + inverseJoinColumn: { + referencedColumnName: 'id', + name: 'role_id', + }, + joinColumn: { + referencedColumnName: 'id', + name: 'user_id', + }, + }) + public roles!: Roles[]; + + @OneToMany(() => Comments, (item) => item.createdBy) + public comments!: Comments[]; + + @OneToMany(() => Notes, (item) => item.createdBy) + public notes!: Notes[]; + + @ManyToOne(() => UserGroups, (userGroup) => userGroup.id) + @JoinColumn({ name: 'user_groups_id' }) + public userGroup!: UserGroups | null; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts new file mode 100644 index 00000000..ef80c3df --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/index.ts @@ -0,0 +1,216 @@ +import { + getDataSourceToken, + getRepositoryToken, + TypeOrmModule, +} from '@nestjs/typeorm'; +import { Test, TestingModule } from '@nestjs/testing'; +import { Provider } from '@nestjs/common'; +import { + CONTROLLER_OPTIONS_TOKEN, + MODULE_OPTIONS_TOKEN, + DEFAULT_PAGE_SIZE, + DEFAULT_QUERY_PAGE, + JsonApiTransformerService, + Query, +} from '@klerick/json-api-nestjs'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; + +import { PGliteDriver, getPGliteInstance } from 'typeorm-pglite'; +import { DataSource, Repository } from 'typeorm'; + +import { DEFAULT_CONNECTION_NAME } from '../constants'; +import { + Addresses, + Comments, + Notes, + Roles, + UserGroups, + Users, + Pods, + Entities, +} from './entities'; +import { + CurrentDataSourceProvider, + CurrentEntityManager, + CurrentEntityRepository, + OrmServiceFactory, +} from '../factory'; + +let pGliteDriver: PGliteDriver; + +export { Addresses, Comments, Notes, Roles, UserGroups, Users, Pods, Entities }; + +export { pullAllData } from './pull-data'; + +export async function sharedConnect(): Promise { + if (pGliteDriver) { + return pGliteDriver; + } + // @ts-ignore + pGliteDriver = await import('@electric-sql/pglite/contrib/uuid_ossp').then( + ({ uuid_ossp }) => + new PGliteDriver({ + extensions: { uuid_ossp }, + }) + ); + + return pGliteDriver; +} + +const readOnlyDbName = `readonly_db_${Date.now()}`; + +export function dbRandomName(readOnly = false) { + if (readOnly) { + return readOnlyDbName; + } + return `test_db_${Date.now()}`; +} + +export function mockDbPgLiteTestModule(dbName = `test_db_${Date.now()}`) { + return TypeOrmModule.forRootAsync({ + async useFactory() { + const pgDriver = await sharedConnect(); + const synchronize = await initDb(pgDriver, dbName); + + return { + type: 'postgres', + driver: pgDriver.driver, + logging: false, + synchronize, + entities: Entities, + }; + }, + }); +} + +export async function initDb(pGliteDriver: PGliteDriver, testDbName: string) { + const pgLite = await getPGliteInstance(); + const result = await pgLite.query( + `select 1 from pg_database where datname = '${testDbName}'` + ); + + if ((result['rows'] as []).length === 0) { + await pgLite.query(`create database ${testDbName}`); + } + + return (result['rows'] as []).length === 0; +} + +export function providerEntities(): Provider[] { + return Entities.map((entitiy) => { + return { + provide: getRepositoryToken(entitiy, DEFAULT_CONNECTION_NAME), + useFactory(dataSource: DataSource) { + return dataSource.getRepository(entitiy); + }, + inject: [getDataSourceToken()], + }; + }); +} + +export async function getModuleForPgLite( + entity: E, + dbName = `test_db_${Date.now()}`, + ...providers: Provider[] +): Promise { + const dbModule = await mockDbPgLiteTestModule(dbName); + + return await Test.createTestingModule({ + imports: [dbModule], + providers: [ + ...providerEntities(), + CurrentDataSourceProvider(DEFAULT_CONNECTION_NAME), + CurrentEntityManager(), + CurrentEntityRepository(entity), + OrmServiceFactory(), + { + provide: JsonApiTransformerService, + useValue: { + transformData() { + return { + included: {}, + data: {}, + }; + }, + transformRel() { + return []; + }, + }, + }, + { + provide: CONTROLLER_OPTIONS_TOKEN, + useValue: { + requiredSelectField: false, + debug: false, + }, + }, + { + provide: MODULE_OPTIONS_TOKEN, + useValue: { + requiredSelectField: false, + debug: false, + }, + }, + ...providers, + ], + }).compile(); +} + +export function getRepository(module: TestingModule) { + const userRepository = module.get>( + getRepositoryToken(Users, DEFAULT_CONNECTION_NAME) + ); + + const addressesRepository = module.get>( + getRepositoryToken(Addresses, DEFAULT_CONNECTION_NAME) + ); + + const notesRepository = module.get>( + getRepositoryToken(Notes, DEFAULT_CONNECTION_NAME) + ); + + const commentsRepository = module.get>( + getRepositoryToken(Comments, DEFAULT_CONNECTION_NAME) + ); + const rolesRepository = module.get>( + getRepositoryToken(Roles, DEFAULT_CONNECTION_NAME) + ); + + const userGroupRepository = module.get>( + getRepositoryToken(UserGroups, DEFAULT_CONNECTION_NAME) + ); + + const podsRepository = module.get>( + getRepositoryToken(Pods, DEFAULT_CONNECTION_NAME) + ); + + return { + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + podsRepository, + }; +} + +export function getDefaultQuery< + R extends object, + IdKey extends string = 'id' +>(): Query { + const filter = { + relation: null, + target: null, + }; + return { + [QueryField.filter]: filter, + [QueryField.fields]: null, + [QueryField.include]: null, + [QueryField.sort]: null, + [QueryField.page]: { + size: DEFAULT_PAGE_SIZE, + number: DEFAULT_QUERY_PAGE, + }, + } as Query; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts new file mode 100644 index 00000000..5499bb48 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/mock-utils/pull-data.ts @@ -0,0 +1,122 @@ +import { Repository } from 'typeorm'; +import { faker } from '@faker-js/faker'; +import { + Addresses, + CommentKind, + Comments, + Notes, + Roles, + UserGroups, + Users, +} from './entities'; + +export async function pullAddress(addressRepo: Repository) { + const address = new Addresses(); + address.city = faker.location.city(); + address.country = faker.location.country(); + address.arrayField = [ + faker.string.alphanumeric(5), + faker.string.alphanumeric(5), + ]; + address.state = faker.location.state(); + return addressRepo.save(address); +} + +export async function pullComment(commentRepo: Repository) { + const comment = new Comments(); + comment.text = faker.lorem.paragraph(faker.number.int(5)); + comment.kind = CommentKind.Comment; + return commentRepo.save(comment); +} + +export async function pullNote(noteRepo: Repository) { + const note = new Notes(); + note.text = faker.lorem.paragraph(faker.number.int(5)); + return noteRepo.save(note); +} + +export async function pullRole(roleRepo: Repository) { + const role = new Roles(); + role.key = faker.string.alphanumeric(5); + role.name = faker.string.alphanumeric(5); + return roleRepo.save(role); +} + +export async function pullUser(userPero: Repository) { + const user = new Users(); + user.firstName = faker.person.firstName(); + user.lastName = faker.person.lastName(); + user.isActive = faker.datatype.boolean(); + user.login = faker.internet.userName({ + lastName: user.lastName, + firstName: user.firstName, + }); + user.testReal = [faker.number.float({ fractionDigits: 4 })]; + user.testArrayNull = null; + + user.testDate = faker.date.anytime(); + + return userPero.save(user); +} + +export async function pullUserGroup(userGroupRepo: Repository) { + const userGroup = new UserGroups(); + userGroup.label = faker.string.alphanumeric(5); + return userGroupRepo.save(userGroup); +} + +export async function pullAllData( + userPero: Repository, + addressRepo?: Repository, + noteRepo?: Repository, + commentRepo?: Repository, + roleRepo?: Repository, + userGroupRepo?: Repository +) { + const user = await pullUser(userPero); + if (addressRepo) { + user.addresses = await pullAddress(addressRepo); + } + + if (noteRepo) { + user.notes = [ + await pullNote(noteRepo), + await pullNote(noteRepo), + await pullNote(noteRepo), + ]; + } + + if (commentRepo) { + user.comments = [ + await pullComment(commentRepo), + await pullComment(commentRepo), + await pullComment(commentRepo), + await pullComment(commentRepo), + ]; + } + + if (userGroupRepo) { + await pullUserGroup(userGroupRepo); + await pullUserGroup(userGroupRepo); + await pullUserGroup(userGroupRepo); + user.userGroup = await pullUserGroup(userGroupRepo); + } + + if (roleRepo) { + await pullRole(roleRepo); + await pullRole(roleRepo); + await pullRole(roleRepo); + user.roles = [ + await pullRole(roleRepo), + await pullRole(roleRepo), + await pullRole(roleRepo), + ]; + } + + user.manager = await pullUser(userPero); + await pullUser(userPero); + await pullUser(userPero); + await pullUser(userPero); + await userPero.save(user); + return user; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts new file mode 100644 index 00000000..3afa116f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.spec.ts @@ -0,0 +1,162 @@ +import { Repository } from 'typeorm'; +import { TypeField } from '@klerick/json-api-nestjs'; +import { + getRepository, + Users, + Addresses, + Notes, + Comments, + Roles, + UserGroups, + getModuleForPgLite, + dbRandomName, +} from '../mock-utils'; + +import { + getProps, + getRelation, + getPropsType, + getPropsNullable, + getPrimaryColumnName, + getPrimaryColumnType, + getRelationProperty, + getArrayType, +} from './'; + +import { TypeormUtilsService } from '../service'; + +describe('typeorm-orm-helper-for-map', () => { + const dbName = dbRandomName(); + let userRepository: Repository; + beforeAll(async () => { + const module = await getModuleForPgLite(Users, dbName, TypeormUtilsService); + ({ userRepository } = getRepository(module)); + }); + + it('getProps', () => { + const result = getProps(userRepository); + expect(result.includes('id')).toBe(true); + expect(result.includes('lastName')).toBe(true); + expect(result.includes('createdAt')).toBe(true); + expect(result.includes('updatedAt')).toBe(true); + expect(result.includes('isActive')).toBe(true); + expect(result.includes('login')).toBe(true); + expect(result.includes('firstName')).toBe(true); + expect(result.includes('testReal')).toBe(true); + expect(result.includes('testArrayNull')).toBe(true); + expect(result.includes('testDate')).toBe(true); + + expect(result.includes('userGroup' as any)).toBe(false); + expect(result.includes('notes' as any)).toBe(false); + expect(result.includes('comments' as any)).toBe(false); + expect(result.includes('roles' as any)).toBe(false); + expect(result.includes('manager' as any)).toBe(false); + expect(result.includes('addresses' as any)).toBe(false); + }); + + it('getPropsType', () => { + const result = getPropsType(userRepository); + + expect(result).toEqual({ + createdAt: 'date', + firstName: 'string', + id: 'number', + isActive: 'boolean', + lastName: 'string', + login: 'string', + testArrayNull: 'array', + testDate: 'date', + testReal: 'array', + updatedAt: 'date', + }); + }); + + it('getArrayType', () => { + const result = getArrayType(userRepository); + expect(result).toEqual({ + testReal: TypeField.number, + testArrayNull: TypeField.number, + }); + }); + + it('getPropsNullable', () => { + const result = getPropsNullable(userRepository); + expect(result).toEqual([ + 'firstName', + 'testReal', + 'testArrayNull', + 'lastName', + 'isActive', + 'testDate', + 'createdAt', + 'updatedAt', + ]); + }); + + it('getPrimaryColumnName', () => { + const result = getPrimaryColumnName(userRepository); + expect(result).toBe('id'); + }); + + it('getPrimaryColumnType', () => { + const result = getPrimaryColumnType(userRepository); + expect(result).toBe(TypeField.number); + }); + + it('getRelation', () => { + const result = getRelation(userRepository); + expect(result.includes('id' as any)).toBe(false); + expect(result.includes('lastName' as any)).toBe(false); + expect(result.includes('createdAt' as any)).toBe(false); + expect(result.includes('updatedAt' as any)).toBe(false); + expect(result.includes('isActive' as any)).toBe(false); + expect(result.includes('login' as any)).toBe(false); + expect(result.includes('firstName' as any)).toBe(false); + expect(result.includes('testReal' as any)).toBe(false); + expect(result.includes('testArrayNull' as any)).toBe(false); + expect(result.includes('testDate' as any)).toBe(false); + + expect(result.includes('userGroup')).toBe(true); + expect(result.includes('notes')).toBe(true); + expect(result.includes('comments')).toBe(true); + expect(result.includes('roles')).toBe(true); + expect(result.includes('manager')).toBe(true); + expect(result.includes('addresses')).toBe(true); + }); + + it('getRelationProperty', () => { + const result = getRelationProperty(userRepository); + expect(result).toEqual({ + addresses: { + entityClass: Addresses, + isArray: false, + nullable: true, + }, + comments: { + entityClass: Comments, + isArray: true, + nullable: false, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: true, + }, + notes: { + entityClass: Notes, + isArray: true, + nullable: false, + }, + roles: { + entityClass: Roles, + isArray: true, + nullable: false, + }, + userGroup: { + entityClass: UserGroups, + isArray: false, + nullable: true, + }, + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts new file mode 100644 index 00000000..65506d34 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-helper/index.ts @@ -0,0 +1,184 @@ +import { EntityParam, TypeField } from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +export const getRelation = (repository: Repository) => + repository.metadata.relations.map((i) => { + return i.propertyName; + }) as unknown as EntityParam['relations']; + +export const getProps = ( + repository: Repository +): EntityParam['props'] => { + const relations = getRelation(repository) as any[]; + + return repository.metadata.columns + .filter((i) => !relations.includes(i.propertyName)) + .map((r) => r.propertyName) as unknown as EntityParam['props']; +}; + +export const getPropsType = ( + repository: Repository +): EntityParam['propsType'] => { + const field = getProps(repository); + + const entity = repository.target as any; + const result = {} as any; + for (const item of field) { + let typeProps: TypeField = TypeField.string; + + const fieldMetadata = repository.metadata.columns.find( + (i) => i.propertyName === item + ); + + if (fieldMetadata?.isArray) { + result[item] = TypeField.array; + continue; + } + + switch ( + Reflect.getMetadata('design:type', entity['prototype'], item as any) + ) { + case Array: + typeProps = TypeField.array; + break; + case Date: + typeProps = TypeField.date; + break; + case Number: + typeProps = TypeField.number; + break; + case Boolean: + typeProps = TypeField.boolean; + break; + case Object: + typeProps = TypeField.object; + break; + default: + typeProps = TypeField.string; + } + + result[item] = fieldMetadata?.isArray ? TypeField.array : typeProps; + } + + return result; +}; + +export const getPropsNullable = ( + repository: Repository +): EntityParam['propsNullable'] => { + const relation = getRelation(repository) as any[]; + return repository.metadata.columns + .filter((i) => !relation.includes(i.propertyName)) + .map((i) => + i.isNullable || i.default !== undefined ? i.propertyName : false + ) + .filter((i) => !!i) as unknown as EntityParam['propsNullable']; +}; + +export const getPrimaryColumnName = ( + repository: Repository +) => { + const column = repository.metadata.primaryColumns.at(0); + if (!column) throw new Error('Primary column not found'); + + return column.propertyName as EntityParam['primaryColumnName']; +}; + +export const getPrimaryColumnType = ( + repository: Repository +): EntityParam['primaryColumnType'] => { + const target = repository.target as any; + const primaryColumn = repository.metadata.primaryColumns[0].propertyName; + + return ( + Reflect.getMetadata('design:type', target['prototype'], primaryColumn) === + Number + ? TypeField.number + : TypeField.string + ) as EntityParam['primaryColumnType']; +}; + +export const getRelationProperty = ( + repository: Repository +): EntityParam['relationProperty'] => { + return repository.metadata.relations.reduce((acum, item) => { + // @ts-expect-error its dynamic creater + acum[item.propertyName] = { + entityClass: item.inverseEntityMetadata.target, + nullable: item.isManyToMany || item.isOneToMany ? false : item.isNullable, + isArray: item.isManyToMany || item.isOneToMany, + }; + + return acum; + }, {} as EntityParam['relationProperty']); +}; + +export const getArrayType = ( + repository: Repository +): EntityParam['propsArrayType'] => { + return Object.entries(getPropsType(repository)) + .filter(([name, type]) => type === TypeField.array) + .reduce((acum, [name]) => { + const fieldMetadata = repository.metadata.columns.find( + (i) => i.propertyName === name + ); + if (!fieldMetadata) { + throw new Error('Metadata not found for field ' + name); + } + + switch (fieldMetadata.type) { + case 'number': + case 'bigint': + case 'smallint': + case 'smalldecimal': + case 'decimal': + case 'double': + case 'tinyint': + case 'mediumint': + case 'int': + case 'float': + case 'dec': + case 'fixed': + case 'numeric': + case 'real': + case 'int2': + case 'int4': + case 'int8': + case 'integer': + acum[name] = TypeField.number; + break; + case 'character varying': + case 'varying character': + case 'char varying': + case 'nvarchar': + case 'national varchar': + case 'character': + case 'native character': + case 'varchar': + case 'char': + case 'nchar': + case 'national char': + case 'varchar2': + case 'nvarchar2': + case 'alphanum': + case 'shorttext': + case 'raw': + case 'binary': + case 'varbinary': + case 'string': + acum[name] = TypeField.string; + break; + case 'date': + case 'timetz': + case 'timestamptz': + case 'timestamp with local time zone': + case 'smalldatetime': + acum[name] = TypeField.date; + break; + case 'boolean': + acum[name] = TypeField.boolean; + } + + return acum; + }, {} as any); +}; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts new file mode 100644 index 00000000..574d98fc --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.spec.ts @@ -0,0 +1,39 @@ +import { TestingModule } from '@nestjs/testing'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; + +import { OrmServiceFactory } from '../../factory'; + +import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + getRepository, + Users, +} from '../../mock-utils'; +import { pullUser } from '../../mock-utils/pull-data'; + +describe('deleteOne', () => { + const dbName = dbRandomName(); + let typeormService: TypeOrmService; + + let user: Users; + let userRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + ({ userRepository } = getRepository(module)); + user = await pullUser(userRepository); + typeormService = module.get>(ORM_SERVICE); + }); + + it('Should be ok', async () => { + await typeormService.deleteOne(`${user.id}`); + expect(await userRepository.findOneBy({ id: user.id })).toBe(null); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts new file mode 100644 index 00000000..38c39080 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-one/delete-one.ts @@ -0,0 +1,20 @@ +import { FindOptionsWhere } from 'typeorm'; +import { TypeOrmService } from '../../service'; + +export async function deleteOne( + this: TypeOrmService, + id: number | string +): Promise { + const data = await this.repository.findOne({ + where: { + [this.typeormUtilsService.currentPrimaryColumn.toString()]: id, + } as FindOptionsWhere, + }); + if (!data) return void 0; + + this.config.useSoftDelete + ? await this.repository.softRemove(data) + : await this.repository.remove(data); + + return void 0; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts new file mode 100644 index 00000000..c23c3430 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts @@ -0,0 +1,158 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; + +describe('deleteRelationship', () => { + const dbName = dbRandomName(); + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + let typeormUtilsService: TypeormUtilsService; + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + typeormUtilsService = + module.get>(TypeormUtilsService); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Should be ok', async () => { + const checkUser = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + + const roles = await rolesRepository.find(); + const userGroups = await userGroupRepository.find(); + const users = await userRepository.find(); + + if (!checkUser) { + throw new Error('not found mock'); + } + + const userGroupData = { + type: 'user-groups', + id: userGroups + .find((i) => checkUser.userGroup?.id === i.id) + ?.id.toString(), + }; + const rolesData = [ + { + type: 'roles', + id: roles + .find((i) => checkUser.roles.find((a) => a.id === i.id)) + ?.id.toString(), + }, + ]; + + const managerData = { + type: 'users', + id: users.find((i) => checkUser.manager.id === i.id)?.id.toString(), + }; + await typeormService.deleteRelationship(1, 'roles', rolesData as any); + await typeormService.deleteRelationship( + 1, + 'userGroup', + userGroupData as any + ); + await typeormService.deleteRelationship(1, 'manager', managerData as any); + + const checkUserAfterPost = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + if (!checkUserAfterPost) { + throw new Error('not found'); + } + expect(checkUserAfterPost.manager).toBe(null); + expect(checkUserAfterPost.roles.map((i) => i.id.toString()).sort()).toEqual( + checkUser.roles + .map((i) => i.id.toString()) + .filter((i) => !rolesData.map((i) => i.id).includes(i)) + .sort() + ); + expect(checkUserAfterPost.userGroup).toBe(null); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts new file mode 100644 index 00000000..bff17b7a --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts @@ -0,0 +1,31 @@ +import { PostRelationshipData } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; + +import { TypeOrmService } from '../../service'; + +export async function deleteRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: TypeOrmService, + id: number | string, + rel: Rel, + input: PostRelationshipData +): Promise { + const idsResult = await this.typeormUtilsService.validateRelationInputData( + rel, + input + ); + const postBuilder = this.repository + .createQueryBuilder() + .relation(rel.toString()) + .of(id); + + if (Array.isArray(idsResult)) { + await postBuilder.remove(idsResult); + } else { + await postBuilder.set(null); + } + return void 0; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts new file mode 100644 index 00000000..c736c1e9 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.spec.ts @@ -0,0 +1,353 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; + +import { Equal, Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, + getDefaultQuery, +} from '../../mock-utils'; + +describe('getAll', () => { + const dbName = dbRandomName(); + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('order', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + + const checkData = await userRepository.find({ + relations: { + addresses: true, + comments: true, + }, + order: { + id: 'DESC', + comments: { + id: 'DESC', + }, + }, + }); + + const query = getDefaultQuery(); + query.include = ['addresses', 'comments']; + query.sort = { + target: { + id: 'DESC', + }, + comments: { + id: 'DESC', + }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith(checkData, query); + }); + + it('include', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + + const checkData = await userRepository.findOne({ + where: { + id: 1, + }, + relations: { + addresses: true, + comments: true, + }, + }); + + const query = getDefaultQuery(); + query.include = ['addresses', 'comments']; + query.filter.target = { + id: { + eq: `${checkData?.id}`, + }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + it('select', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + + const checkData = await userRepository.findOne({ + select: { + id: true, + isActive: true, + addresses: { + state: true, + id: true, + }, + comments: { + text: true, + id: true, + }, + }, + where: { + id: 1, + }, + relations: { + addresses: true, + comments: true, + }, + }); + + const query = getDefaultQuery(); + query.fields = { + target: ['id', 'isActive'], + addresses: ['state'], + comments: ['text'], + }; + query.include = ['addresses', 'comments']; + query.filter.target = { + id: { + eq: `${checkData?.id}`, + }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + describe('filter', () => { + let firstRole: Roles; + let secondRole: Roles; + let addresses: Addresses[]; + let comments: Comments[]; + beforeAll(async () => { + firstRole = (await rolesRepository.findOneBy({ + id: 1, + })) as Roles; + secondRole = (await rolesRepository.findOneBy({ + id: 2, + })) as Roles; + + addresses = await addressesRepository.find(); + comments = await commentsRepository.find(); + }); + + it('Target props with null', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + + const query = getDefaultQuery(); + query.filter.target = { + id: { eq: '1' }, + firstName: { eq: null }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toHaveBeenCalledTimes(0); + }); + + it('Target props', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const checkData = await userRepository.findOne({ + where: { + id: 1, + }, + }); + const query = getDefaultQuery(); + query.filter.target = { + id: { eq: `${checkData?.id}` }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + it('Check relation with the same Entity', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const checkData = await userRepository.findOne({ + where: { + id: 1, + comments: { + text: Equal(comments[0].text), + }, + }, + relations: { + comments: true, + }, + }); + const query = getDefaultQuery(); + query.filter.relation = { + comments: { + text: { + eq: comments[0].text, + }, + }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + // it('Target relation is null', async () => { + // const query = getDefaultQuery(); + // query.filter.target = { + // comments: { + // eq: 'null', + // }, + // }; + // await typeormService.getAll(query); + // }); + + it('Relation many-to-one', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const checkData = await userRepository.findOne({ + where: { + id: 1, + }, + relations: { + manager: true, + }, + }); + + const query = getDefaultQuery(); + query.filter.target = { + id: { + eq: '1', + }, + }; + query.filter.relation = { + manager: { + id: { + eq: '2', + }, + }, + }; + query.include = ['manager']; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + it('Relation one-to-many', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const checkData = await userRepository.findOne({ + where: { + id: 1, + addresses: { + state: Equal(addresses[0].state), + }, + }, + relations: { + addresses: true, + }, + }); + const query = getDefaultQuery(); + query.filter.relation = { + addresses: { + state: { + eq: addresses[0].state, + }, + }, + }; + await typeormService.getAll(query); + expect(spyOnTransformData).toBeCalledWith([checkData], query); + }); + + it('Relation many-to-many', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const checkData = await userRepository.find({ + where: { + id: 1, + roles: { + name: Equal(firstRole.name), + }, + }, + relations: { + roles: true, + }, + }); + + const query = getDefaultQuery(); + query.include = ['roles']; + query.filter.relation = { + roles: { + name: { + eq: firstRole.name, + }, + }, + }; + const { data } = await typeormService.getAll(query); + expect(spyOnTransformData).not.toHaveBeenCalled(); + expect(data).toEqual([]); + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts new file mode 100644 index 00000000..a010259f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-all/get-all.ts @@ -0,0 +1,265 @@ +import { Query, ASC, DESC } from '@klerick/json-api-nestjs'; +import { ObjectTyped, ResourceObject } from '@klerick/json-api-nestjs-shared'; + +import { TypeOrmService } from '../../service'; + +import { + ALIAS_FOR_PAGINATION, + SUB_QUERY_ALIAS_FOR_PAGINATION, +} from '../../constants'; + +type OrderByCondition = Record; + +function getSortObject(params: any, relationName: string) { + return Object.entries(params).reduce((acum, [props, sort]) => { + acum[`${relationName}.${props}`] = `${sort}` === ASC ? ASC : DESC; + return acum; + }, {} as OrderByCondition); +} + +export async function getAll( + this: TypeOrmService, + query: Query +): Promise> { + const { fields, include, sort, page } = query; + + let defaultSortObject: OrderByCondition = { + [`${ + this.typeormUtilsService.currentAlias + }.${this.typeormUtilsService.currentPrimaryColumn.toString()}`]: ASC, + }; + + const includeForCountQuery = new Set(); + const selectFields = new Set(); + const includeRel = new Set(); + + const skip = (page.number - 1) * page.size; + + const expressionArrayForTarget = + this.typeormUtilsService.getFilterExpressionForTarget(query); + const expressionArrayForRelation = + this.typeormUtilsService.getFilterExpressionForRelation(query); + const expressionArray = [ + ...expressionArrayForTarget, + ...expressionArrayForRelation, + ]; + const sortCast = sort as Query, IdKey>['sort']; + if (sortCast) { + const { target, ...relation } = sortCast; + const targetOrder = getSortObject( + target || {}, + this.typeormUtilsService.currentAlias + ); + + const relOrder = Object.entries(relation || {}).reduce( + (acum, [name, order]) => { + return { + ...acum, + ...getSortObject( + order || {}, + this.typeormUtilsService.getAliasForRelation(name as any) + ), + }; + }, + {} as OrderByCondition + ); + const resultOrder = { + ...targetOrder, + ...relOrder, + }; + if (Object.keys(resultOrder).length > 0) { + defaultSortObject = resultOrder; + } + for (const item of ObjectTyped.keys(relation)) { + includeForCountQuery.add(item); + } + } + + const queryBuilderForCount = this.repository + .createQueryBuilder(this.typeormUtilsService.currentAlias) + .select( + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + ), + this.typeormUtilsService.currentPrimaryColumn.toString() + ) + .orderBy(defaultSortObject); + + for (const i in expressionArray) { + const { params, alias, selectInclude, expression } = expressionArray[i]; + const expressionTempArray: string[] = []; + if (alias) { + expressionTempArray.push(alias); + } + expressionTempArray.push(expression); + queryBuilderForCount[i === '0' ? 'where' : 'andWhere']( + expressionTempArray.join(' ') + ); + if (params) { + if (Array.isArray(params)) { + for (const { name, val } of params) { + queryBuilderForCount.setParameters({ [name]: val }); + } + } else { + queryBuilderForCount.setParameters({ [params.name]: params.val }); + } + } + if (selectInclude) includeForCountQuery.add(selectInclude); + } + + for (const rel of [...includeForCountQuery]) { + const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( + rel as any + ); + queryBuilderForCount.leftJoin( + this.typeormUtilsService.getAliasPath(rel), + currentIncludeAlias + ); + } + + const count = await queryBuilderForCount.getCount(); + const meta = { + pageNumber: page.number, + totalItems: count, + pageSize: page.size, + }; + + if (count === 0) { + return { + meta, + data: [], + }; + } + + const aliasForIdResultPagination = this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn, + ALIAS_FOR_PAGINATION, + '_' + ); + + const resultIds = await this.repository + .createQueryBuilder(ALIAS_FOR_PAGINATION) + .select( + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn, + ALIAS_FOR_PAGINATION + ), + aliasForIdResultPagination + ) + .innerJoin( + `(${queryBuilderForCount.offset(skip).limit(page.size).getQuery()})`, + SUB_QUERY_ALIAS_FOR_PAGINATION, + `${this.typeormUtilsService.getAliasPath( + queryBuilderForCount.escape( + this.typeormUtilsService.currentPrimaryColumn.toString() + ), + queryBuilderForCount.escape(SUB_QUERY_ALIAS_FOR_PAGINATION) + )} = ${this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn, + ALIAS_FOR_PAGINATION + )}` + ) + .setParameters(queryBuilderForCount.getParameters()) + .getRawMany<{ + [K: typeof aliasForIdResultPagination]: number; + }>(); + + const ids = resultIds.map((i) => i[aliasForIdResultPagination]); + if (ids.length === 0) { + return { + meta, + data: [], + }; + } + if (include) { + for (const rel of include) { + includeRel.add(rel); + } + } + const fieldsCast = fields as Query, IdKey>['fields']; + if (fieldsCast) { + if (include) { + for (const rel of include) { + const currentIncludeAlias = + this.typeormUtilsService.getAliasForRelation(rel); + const primaryColumnName = + this.typeormUtilsService.getPrimaryColumnForRel(rel); + selectFields.add(`${currentIncludeAlias}.${primaryColumnName}`); + } + } + + const { target, ...other } = fieldsCast; + if (target) { + for (const item of target) { + selectFields.add(`${this.typeormUtilsService.currentAlias}.${item}`); + } + } + + for (const [rel, fields] of ObjectTyped.entries(other)) { + const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( + rel as any + ); + if (!fields) continue; + for (const field of fields as []) { + selectFields.add(`${currentIncludeAlias.toString()}.${field}`); + } + } + } + + const resultQuery = this.repository + .createQueryBuilder() + .orderBy(defaultSortObject); + + if (selectFields.size > 0) { + resultQuery.select([...selectFields]); + } + + resultQuery.whereInIds(ids); + for (const expressionItem of expressionArrayForRelation) { + const { selectInclude, alias, paramsForResult, params, expression } = + expressionItem; + if (paramsForResult) { + for (const item of paramsForResult) { + resultQuery.andWhere(item); + } + } else { + resultQuery.andWhere(`${alias} ${expression}`); + } + + if (params) { + if (Array.isArray(params)) { + for (const item of params) { + resultQuery.setParameters({ [item.name]: item.val }); + } + } else { + resultQuery.setParameters({ [params.name]: params.val }); + } + } + if (selectInclude) includeRel.add(selectInclude); + } + + for (const item of [...includeRel]) { + const currentIncludeAlias = this.typeormUtilsService.getAliasForRelation( + item as any + ); + if (!currentIncludeAlias) continue; + resultQuery[selectFields.size > 0 ? 'leftJoin' : 'leftJoinAndSelect']( + this.typeormUtilsService.getAliasPath(item), + currentIncludeAlias + ); + } + const resultData = await resultQuery.getMany(); + const { included, data } = this.transformDataService.transformData( + resultData, + query + ); + return { + meta: { + pageNumber: page.number, + totalItems: count, + pageSize: page.size, + }, + data, + ...(included ? { included } : {}), + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts new file mode 100644 index 00000000..a6b296e1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.spec.ts @@ -0,0 +1,139 @@ +import { TestingModule } from '@nestjs/testing'; +import { NotFoundException } from '@nestjs/common'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; + +import { Equal, Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + getDefaultQuery, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; + +describe('getOne', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Get one item', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const query = getDefaultQuery(); + const checkData = await userRepository.findOne({ + where: { + id: Equal(1), + }, + relations: { + addresses: true, + comments: true, + }, + }); + query.include = ['addresses', 'comments']; + await typeormService.getOne('1', query); + expect(spyOnTransformData).toBeCalledWith(checkData, query); + }); + it('Get one item with select', async () => { + const spyOnTransformData = jest.spyOn( + transformDataService, + 'transformData' + ); + const query = getDefaultQuery(); + const checkData = await userRepository.findOne({ + select: { + firstName: true, + id: true, + isActive: true, + comments: { + id: true, + text: true, + }, + addresses: { + id: true, + }, + manager: { + id: true, + login: true, + }, + }, + where: { + id: Equal(1), + }, + relations: { + addresses: true, + comments: true, + manager: true, + }, + }); + query.include = ['addresses', 'comments', 'manager']; + query.fields = { + target: ['firstName', 'isActive'], + comments: ['text'], + manager: ['login'], + }; + await typeormService.getOne('1', query); + expect(spyOnTransformData).toBeCalledWith(checkData, query); + }); + it('Should be error', async () => { + expect.assertions(1); + try { + const query = getDefaultQuery(); + await typeormService.getOne('1000000', query); + } catch (e) { + expect(e).toBeInstanceOf(NotFoundException); + } + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts new file mode 100644 index 00000000..b39eccc0 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-one/get-one.ts @@ -0,0 +1,97 @@ +import { NotFoundException } from '@nestjs/common'; +import { ValidateQueryError, QueryOne } from '@klerick/json-api-nestjs'; +import { ObjectTyped, ResourceObject } from '@klerick/json-api-nestjs-shared'; +import { TypeOrmService } from '../../service'; + +export async function getOne( + this: TypeOrmService, + id: number | string, + query: QueryOne +): Promise> { + const { include, fields } = query; + const selectFields = new Set(); + const builder = this.repository.createQueryBuilder( + this.typeormUtilsService.currentAlias + ); + + if (fields) { + selectFields.add( + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + ) + ); + + const { target, ...other } = fields as any; + if (target) { + for (const fieldItem of target) { + selectFields.add(this.typeormUtilsService.getAliasPath(fieldItem)); + } + } + + for (const [rel, fieldRel] of ObjectTyped.entries(other)) { + if (fieldRel) { + for (const itemFieldRel of fieldRel) { + selectFields.add( + this.typeormUtilsService.getAliasPath( + itemFieldRel, + this.typeormUtilsService.getAliasForRelation(rel as any) + ) + ); + } + } + } + } + + if (include) { + for (const rel of include) { + const currentIncludeAlias = + this.typeormUtilsService.getAliasForRelation(rel); + + builder[fields ? 'leftJoin' : 'leftJoinAndSelect']( + this.typeormUtilsService.getAliasPath(rel), + currentIncludeAlias + ); + + if (fields) { + selectFields.add( + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.getPrimaryColumnForRel(rel), + currentIncludeAlias + ) + ); + } + } + } + if (selectFields.size > 0) { + builder.select([...selectFields]); + } + const paramsId = 'paramsId'; + const result = await builder + .where( + `${this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + )} = :${paramsId}`, + { + [paramsId]: id, + } + ) + .getOne(); + + if (!result) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, + path: ['fields'], + }; + throw new NotFoundException([error]); + } + const { included, data } = this.transformDataService.transformData( + result, + query + ); + return { + meta: {}, + data, + ...(included ? { included } : {}), + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts new file mode 100644 index 00000000..2d6bac98 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts @@ -0,0 +1,96 @@ +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; +import { TestingModule } from '@nestjs/testing'; +import { NotFoundException } from '@nestjs/common'; + +import { Repository } from 'typeorm'; +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; + +describe('getRelationship', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Should be ok', async () => { + const spyOnTransformData = jest.spyOn(transformDataService, 'transformRel'); + const id = 1; + const rel = 'roles'; + const check = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + }, + where: { id }, + relations: { + roles: true, + }, + }); + const result = await typeormService.getRelationship(id, rel); + expect(spyOnTransformData).toBeCalledWith(check, rel); + expect(result).toHaveProperty('data'); + }); + it('Should be error', async () => { + expect.assertions(1); + try { + await typeormService.getRelationship('1000000', 'roles'); + } catch (e) { + expect(e).toBeInstanceOf(NotFoundException); + } + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts new file mode 100644 index 00000000..76ace4cd --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/get-relationship/get-relationship.ts @@ -0,0 +1,60 @@ +import { NotFoundException } from '@nestjs/common'; +import { + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; +import { ValidateQueryError } from '@klerick/json-api-nestjs'; +import { TypeOrmService } from '../../service'; + +export async function getRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: TypeOrmService, + id: number | string, + rel: Rel +): Promise> { + const paramsId = 'paramsId'; + const result = (await this.repository + .createQueryBuilder() + .select([ + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + ), + this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.getPrimaryColumnForRel(rel as any), + this.typeormUtilsService.getAliasForRelation(rel as any) + ), + ]) + .where( + ` + ${this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + )} = :paramsId + ` + ) + .leftJoin( + this.typeormUtilsService.getAliasPath(rel.toString()), + this.typeormUtilsService.getAliasForRelation(rel as any) + ) + .setParameters({ + [paramsId]: id, + }) + .getOne()) as E | null; + + if (!result) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, + path: ['fields'], + }; + throw new NotFoundException([error]); + } + const data = this.transformDataService.transformRel(result, rel); + + return { + meta: {}, + data, + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts new file mode 100644 index 00000000..92f7bb57 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/index.ts @@ -0,0 +1,9 @@ +export { getAll } from './get-all/get-all'; +export { getOne } from './get-one/get-one'; +export { deleteOne } from './delete-one/delete-one'; +export { postOne } from './post-one/post-one'; +export { patchOne } from './patch-one/patch-one'; +export { getRelationship } from './get-relationship/get-relationship'; +export { postRelationship } from './post-relationship/post-relationship'; +export { deleteRelationship } from './delete-relationship/delete-relationship'; +export { patchRelationship } from './patch-relationship/patch-relationship'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts new file mode 100644 index 00000000..94e7183e --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.spec.ts @@ -0,0 +1,296 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, + PatchData, + PostData, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; +import { faker } from '@faker-js/faker'; +import { pullAddress, pullUser } from '../../mock-utils/pull-data'; + +describe('patchOne', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + let firstName: string; + let isActive: boolean; + let testDate: Date; + let login: string; + + let inputData: PostData; + let newData: PatchData; + + let notes: Notes[]; + let users: Users[]; + let roles: Roles[]; + let userGroup: UserGroups[]; + let addresses: Addresses[]; + + beforeEach(async () => { + firstName = faker.person.firstName(); + isActive = false; + login = faker.internet.userName({ + lastName: firstName, + firstName: faker.person.lastName(), + }); + testDate = new Date(); + + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); + + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + + notes = await notesRepository.find(); + users = await userRepository.find(); + roles = await rolesRepository.find(); + userGroup = await userGroupRepository.find({ + relations: { + users: true, + }, + }); + addresses = [await pullAddress(addressesRepository)]; + const manager = await pullUser(userRepository); + inputData = { + type: 'users', + attributes: { + firstName, + isActive, + testDate, + login, + }, + relationships: { + addresses: { + data: { + type: 'addresses', + id: addresses[0].id.toString(), + }, + }, + notes: { + data: [ + { + type: 'notes', + id: notes[0].id, + }, + ], + }, + roles: { + data: [ + { + type: 'roles', + id: `${roles[0].id}`, + }, + ], + }, + manager: { + data: { + type: 'users', + id: `${manager.id}`, + }, + }, + userGroup: { + data: { + type: 'user-group', + id: `${userGroup[0].id}`, + }, + }, + }, + } as any; + + await typeormService.postOne(inputData); + + const changeUser = await userRepository.findOneBy({ + login: inputData.attributes.login as string, + }); + if (!changeUser) { + throw new Error('not found mock data'); + } + const newLogin = `${changeUser.login} - newLogin`; + const newIsActive = !changeUser.isActive; + newData = { + ...inputData, + id: `${changeUser.id}`, + attributes: { + ...(inputData.attributes || {}), + ...{ + login: newLogin, + isActive: newIsActive, + testDate: new Date(), + }, + }, + }; + + newData.relationships = { + ...newData.relationships, + manager: { + data: { + type: 'users', + id: users[1].id.toString(), + }, + }, + addresses: { + data: null, + }, + userGroup: { + data: { + type: 'user-group', + id: `${userGroup[1].id}`, + }, + }, + roles: { + data: [ + { + type: 'roles', + id: `${roles[1].id}`, + }, + ], + }, + } as any; + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('should be ok without relation', async () => { + const spyOnTransformData = jest + .spyOn(transformDataService, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + })); + + const { relationships, ...withoutRelationships } = newData; + const returnData = await typeormService.patchOne( + withoutRelationships.id as string, + withoutRelationships + ); + + const result = await userRepository.findOneBy({ + id: parseInt(withoutRelationships.id as string, 10), + }); + + expect(spyOnTransformData).toBeCalledWith(result, { + fields: null, + include: [], + }); + expect(returnData).not.toHaveProperty('included'); + }); + + it('should be ok with relation', async () => { + const spyOnTransformData = jest + .spyOn(transformDataService, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + included: {} as any, + })); + + const returnData = await typeormService.patchOne( + newData.id as string, + newData + ); + + const result = await userRepository.findOne({ + where: { + id: parseInt(newData.id as string, 10), + }, + relations: { + addresses: true, + notes: true, + userGroup: true, + roles: true, + manager: true, + }, + }); + + expect(spyOnTransformData).toBeCalledWith(result, { + fields: null, + include: ['addresses', 'notes', 'roles', 'manager', 'userGroup'], + }); + expect(returnData).toHaveProperty('included'); + }); + + it('should be ok with relation nulling relation', async () => { + const spyOnTransformData = jest + .spyOn(transformDataService, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + included: {} as any, + })); + + newData.relationships = { + userGroup: { + data: null, + }, + roles: { + data: [], + }, + } as any; + + const returnData = await typeormService.patchOne( + newData.id as string, + newData + ); + + const result = await userRepository.findOne({ + where: { + id: parseInt(newData.id as string, 10), + }, + relations: { + userGroup: true, + roles: true, + }, + }); + + expect(spyOnTransformData).toBeCalledWith(result, { + fields: null, + include: ['userGroup', 'roles'], + }); + expect(returnData).toHaveProperty('included'); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts new file mode 100644 index 00000000..aec5e470 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-one/patch-one.ts @@ -0,0 +1,84 @@ +import { + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; +import { + ResourceObject, + ObjectTyped, + QueryField, +} from '@klerick/json-api-nestjs-shared'; +import { PatchData, Query, ValidateQueryError } from '@klerick/json-api-nestjs'; +import { DeepPartial } from 'typeorm'; + +import { TypeOrmService } from '../../service'; + +export async function patchOne( + this: TypeOrmService, + id: number | string, + inputData: PatchData +): Promise> { + const { id: idBody, attributes, relationships } = inputData; + + if (`${id}` !== idBody) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Data 'id' must be equal to url param`, + path: ['data', 'id'], + }; + + throw new UnprocessableEntityException([error]); + } + + const paramsId = 'paramsId'; + const result = (await this.repository + .createQueryBuilder() + .where( + `${this.typeormUtilsService.getAliasPath( + this.typeormUtilsService.currentPrimaryColumn + )} = :${paramsId}`, + { + [paramsId]: id, + } + ) + .getOne()) as E | null; + + if (!result) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.typeormUtilsService.currentAlias}' with id '${id}' does not exist`, + path: ['data', 'id'], + }; + throw new NotFoundException([error]); + } + + if (attributes) { + const entityTarget = this.repository.manager.create( + this.repository.target, + attributes as DeepPartial + ); + for (const [props, val] of ObjectTyped.entries(entityTarget)) { + result[props] = val; + } + } + + const saveData = (await this.typeormUtilsService.saveEntityData( + result, + relationships + )) as E; + + const fakeQuery: Query = { + [QueryField.fields]: null, + [QueryField.include]: Object.keys(relationships || {}), + } as any; + + const { data, included } = this.transformDataService.transformData( + saveData, + fakeQuery + ); + const includeData = included ? { included } : {}; + return { + meta: {}, + data, + ...includeData, + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts new file mode 100644 index 00000000..27256569 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts @@ -0,0 +1,207 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; + +describe('patchRelationship', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + let typeormUtilsService: TypeormUtilsService; + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + typeormUtilsService = + module.get>(TypeormUtilsService); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Should be ok', async () => { + jest + .spyOn(transformDataService, 'transformRel') + // @ts-ignore + .mockImplementation((item, rel) => { + if (Array.isArray(item[rel])) { + return item[rel].map((i) => ({ id: i['id'] })); + } else { + return { + id: item[rel] ? item[rel]['id'] : null, + }; + } + }); + + const checkUser = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + + const roles = await rolesRepository.find(); + const userGroups = await userGroupRepository.find(); + const users = await userRepository.find(); + + if (!checkUser) { + throw new Error('not found mock'); + } + + const userGroupData = { + type: 'user-groups', + id: userGroups + .find((i) => checkUser.userGroup?.id !== i.id) + ?.id.toString(), + }; + const rolesData = [ + { + type: 'roles', + id: roles + .find((i) => checkUser.roles.find((a) => a.id !== i.id)) + ?.id.toString(), + }, + ]; + + const managerData = { + type: 'users', + id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), + }; + await typeormService.patchRelationship(1, 'roles', rolesData as any); + await typeormService.patchRelationship( + 1, + 'userGroup', + userGroupData as any + ); + await typeormService.patchRelationship(1, 'manager', managerData as any); + + const checkUserAfterPost = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + if (!checkUserAfterPost) { + throw new Error('not found'); + } + + expect(checkUserAfterPost.manager.id.toString()).toBe(managerData.id); + + const rolesPatchId = rolesData.map((i) => i.id); + + checkUserAfterPost.roles.find((i) => + rolesPatchId.includes(i.id.toString()) + ); + + expect( + checkUserAfterPost.roles + .filter((i) => rolesPatchId.includes(i.id.toString())) + .map((i) => i.id.toString()) + ).toEqual(rolesData.map((i) => i.id)); + expect(checkUserAfterPost.userGroup?.id.toString()).toBe(userGroupData.id); + + await typeormService.patchRelationship(1, 'roles', []); + await typeormService.patchRelationship(1, 'manager', null); + const checkUserAfterPatch = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + if (!checkUserAfterPatch) { + throw new Error('not found'); + } + + expect(checkUserAfterPatch.manager).toBe(null); + expect(checkUserAfterPatch.roles).toEqual([]); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts new file mode 100644 index 00000000..4061d5d0 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts @@ -0,0 +1,50 @@ +import { PatchRelationshipData } from '@klerick/json-api-nestjs'; +import { + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; + +import { getRelationship } from '../get-relationship/get-relationship'; +import { TypeOrmService } from '../../service'; + +export async function patchRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: TypeOrmService, + id: number | string, + rel: Rel, + input: PatchRelationshipData +): Promise> { + const idsResult = await this.typeormUtilsService.validateRelationInputData( + rel, + input + ); + + const patchBuilder = this.repository + .createQueryBuilder() + .relation(rel.toString()) + .of(id); + + if (Array.isArray(idsResult)) { + const data = await getRelationship.call< + TypeOrmService, + [number | string, Rel], + Promise> + >(this, id, rel); + const idsToDelete = Array.isArray(data.data) + ? data.data.map((i) => i.id) + : []; + + await patchBuilder.addAndRemove(idsResult, idsToDelete); + } else { + await patchBuilder.set(idsResult); + } + + return getRelationship.call< + TypeOrmService, + [number | string, Rel], + Promise> + >(this, id, rel); +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts new file mode 100644 index 00000000..d5b4a27d --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.spec.ts @@ -0,0 +1,239 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, + PostData, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Comments, + getRepository, + Notes, + Pods, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; +import { faker } from '@faker-js/faker'; +import { pullUser } from '../../mock-utils/pull-data'; + +describe('postOne', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + let podsRepository: Repository; + // + let typeormServicePods: TypeOrmService; + let transformDataServicePods: JsonApiTransformerService; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + let firstName: string; + let isActive: boolean; + let testDate: Date; + let login: string; + + let inputData: PostData; + + let notes: Notes[]; + let users: Users[]; + let roles: Roles[]; + let userGroup: UserGroups[]; + + beforeEach(async () => { + const dbName = dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + firstName = faker.person.firstName(); + isActive = false; + login = faker.internet.userName({ + lastName: firstName, + firstName: faker.person.lastName(), + }); + testDate = new Date(); + + const modulePods: TestingModule = await getModuleForPgLite( + Pods, + dbName, + TypeormUtilsService + ); + + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + podsRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + + typeormServicePods = modulePods.get>(ORM_SERVICE); + transformDataServicePods = modulePods.get>( + JsonApiTransformerService + ); + + notes = await notesRepository.find(); + users = await userRepository.find(); + roles = await rolesRepository.find(); + userGroup = await userGroupRepository.find(); + + inputData = { + type: 'users', + attributes: { + firstName, + isActive, + testDate, + login, + }, + relationships: { + notes: { + data: [ + { + type: 'notes', + id: notes[0].id, + }, + ], + }, + roles: { + data: [ + { + type: 'roles', + id: `${roles[0].id}`, + }, + ], + }, + manager: { + data: { + type: 'users', + id: `${users[0].id}`, + }, + }, + userGroup: { + data: { + type: 'user-group', + id: `${userGroup[0].id}`, + }, + }, + }, + } as any; + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('should be ok without relation and with id', async () => { + const spyOnTransformData = jest + .spyOn(transformDataServicePods, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + })); + const { relationships, ...other } = inputData; + const id = '5'; + const returnData = await typeormServicePods.postOne({ + id, + type: 'pods', + attributes: { + name: 'test', + }, + } as any); + const result = await podsRepository.findOneBy({ + id, + }); + + expect(spyOnTransformData).toBeCalledWith( + { + ...result, + id, + }, + { fields: null, include: [] } + ); + expect(returnData).not.toHaveProperty('included'); + }); + + it('should be ok without relation', async () => { + const spyOnTransformData = jest + .spyOn(transformDataService, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + })); + const { relationships, ...other } = inputData; + const returnData = await typeormService.postOne(other); + const result = await userRepository.findOneBy({ + login, + }); + + expect(spyOnTransformData).toBeCalledWith(result, { + fields: null, + include: [], + }); + expect(returnData).not.toHaveProperty('included'); + }); + + it('should be ok with relation', async () => { + const spyOnTransformData = jest + .spyOn(transformDataService, 'transformData') + .mockImplementationOnce(() => ({ + data: {} as any, + included: {} as any, + })); + const users = await pullUser(userRepository); + const returnData = await typeormService.postOne({ + ...inputData, + relationships: { + ...inputData.relationships, + manager: { + data: { + type: 'users', + id: `${users.id}`, + }, + }, + } as any, + }); + const result = await userRepository.findOne({ + where: { + login, + }, + relations: { + notes: true, + userGroup: true, + roles: true, + manager: true, + }, + }); + + expect(spyOnTransformData).toBeCalledWith(result, { + fields: null, + include: ['notes', 'roles', 'manager', 'userGroup'], + }); + expect(returnData).toHaveProperty('included'); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts new file mode 100644 index 00000000..41ed1634 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-one/post-one.ts @@ -0,0 +1,46 @@ +import { PostData, Query } from '@klerick/json-api-nestjs'; +import { QueryField, ResourceObject } from '@klerick/json-api-nestjs-shared'; +import { DeepPartial } from 'typeorm'; + +import { TypeOrmService } from '../../service'; + +export async function postOne( + this: TypeOrmService, + inputData: PostData +): Promise> { + const { attributes, relationships, id } = inputData; + + const idObject = id + ? { [this.typeormUtilsService.currentPrimaryColumn.toString()]: id } + : {}; + + const attributesObject = { + ...attributes, + ...idObject, + } as DeepPartial; + + const entityTarget = this.repository.manager.create( + this.repository.target, + attributesObject + ); + + const saveData = await this.typeormUtilsService.saveEntityData( + entityTarget, + relationships + ); + const fakeQuery: Query = { + [QueryField.fields]: null, + [QueryField.include]: Object.keys(relationships || {}), + } as any; + + const { data, included } = this.transformDataService.transformData( + saveData, + fakeQuery + ); + const includeData = included ? { included } : {}; + return { + meta: {}, + data, + ...includeData, + }; +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts new file mode 100644 index 00000000..980b99fb --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts @@ -0,0 +1,162 @@ +import { TestingModule } from '@nestjs/testing'; +import { + JsonApiTransformerService, + ORM_SERVICE, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService, TypeormUtilsService } from '../../service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; + +describe('postRelationship', () => { + let typeormService: TypeOrmService; + let transformDataService: JsonApiTransformerService; + let typeormUtilsService: TypeormUtilsService; + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + beforeAll(async () => { + const dbName = dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + transformDataService = module.get>( + JsonApiTransformerService + ); + typeormUtilsService = + module.get>(TypeormUtilsService); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Should be ok', async () => { + const checkUser = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + + const roles = await rolesRepository.find(); + const userGroups = await userGroupRepository.find(); + const users = await userRepository.find(); + + if (!checkUser) { + throw new Error('not found mock'); + } + + const userGroupData = { + type: 'user-groups', + id: userGroups + .find((i) => checkUser.userGroup?.id !== i.id) + ?.id.toString(), + }; + const rolesData = [ + { + type: 'roles', + id: roles + .find((i) => checkUser.roles.find((a) => a.id !== i.id)) + ?.id.toString(), + }, + ]; + + const managerData = { + type: 'users', + id: users.find((i) => checkUser.manager.id !== i.id)?.id.toString(), + }; + + await typeormService.postRelationship(1, 'roles', rolesData as any); + await typeormService.postRelationship(1, 'userGroup', userGroupData as any); + + await typeormService.postRelationship(1, 'manager', managerData as any); + + const checkUserAfterPost = await userRepository.findOne({ + select: { + id: true, + roles: { + id: true, + }, + userGroup: { + id: true, + }, + manager: { + id: true, + }, + }, + where: { id: 1 }, + relations: { + roles: true, + manager: true, + userGroup: true, + }, + }); + if (!checkUserAfterPost) { + throw new Error('not found'); + } + + expect(checkUserAfterPost.manager.id.toString()).toBe(managerData.id); + expect(checkUserAfterPost.roles.map((i) => i.id.toString())).toEqual([ + ...checkUser.roles.map((i) => i.id.toString()), + ...rolesData.map((i) => i.id), + ]); + expect(checkUserAfterPost.userGroup?.id.toString()).toBe(userGroupData.id); + + await typeormService.postRelationship(1, 'roles', [] as any); + expect(checkUserAfterPost?.roles.map((i) => i.id.toString())).toEqual([ + ...checkUser.roles.map((i) => i.id.toString()), + ...rolesData.map((i) => i.id), + ]); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts new file mode 100644 index 00000000..93bbcce5 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/orm-methods/post-relationship/post-relationship.ts @@ -0,0 +1,40 @@ +import { + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; +import { PostRelationshipData } from '@klerick/json-api-nestjs'; + +import { getRelationship } from '../get-relationship/get-relationship'; +import { TypeOrmService } from '../../service'; + +export async function postRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: TypeOrmService, + id: number | string, + rel: Rel, + input: PostRelationshipData +): Promise> { + const idsResult = await this.typeormUtilsService.validateRelationInputData( + rel, + input + ); + const postBuilder = this.repository + .createQueryBuilder() + .relation(rel.toString()) + .of(id); + + if (Array.isArray(idsResult)) { + await postBuilder.add(idsResult); + } else { + await postBuilder.set(idsResult); + } + + return getRelationship.call< + TypeOrmService, + [number | string, Rel], + Promise> + >(this, id, rel); +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts new file mode 100644 index 00000000..e474ef06 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/index.ts @@ -0,0 +1,3 @@ +export * from './type-orm.service'; +export * from './typeorm-utils.service'; +export * from './type-orm-format.error.service'; diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts new file mode 100644 index 00000000..834bc14c --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.spec.ts @@ -0,0 +1,103 @@ +import { TestingModule } from '@nestjs/testing'; +import { + ORM_SERVICE, + PostData, + ENTITY_PARAM_MAP, +} from '@klerick/json-api-nestjs'; +import { Repository } from 'typeorm'; + +import { TypeOrmService } from './type-orm.service'; +import { TypeormUtilsService } from './typeorm-utils.service'; +import { TypeOrmFormatErrorService } from './type-orm-format.error.service'; + +import { + dbRandomName, + getModuleForPgLite, + Addresses, + Comments, + getRepository, + Notes, + pullAllData, + Roles, + UserGroups, + Users, +} from '../mock-utils'; +import { ConflictException } from '@nestjs/common'; + +describe('getOne', () => { + let typeormService: TypeOrmService; + let typeOrmFormatErrorService: TypeOrmFormatErrorService; + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + let users: Users[]; + let firstUsers: Users; + + beforeAll(async () => { + const module: TestingModule = await getModuleForPgLite( + Users, + dbRandomName(), + TypeormUtilsService, + { + provide: TypeOrmFormatErrorService, + useClass: TypeOrmFormatErrorService, + }, + { + provide: ENTITY_PARAM_MAP, + useValue: { + keys() { + return [Users]; + }, + }, + } + ); + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + typeormService = module.get>(ORM_SERVICE); + typeOrmFormatErrorService = module.get( + TypeOrmFormatErrorService + ); + users = await userRepository.find(); + const tmpFirstUser = users.at(0); + if (!tmpFirstUser) throw new Error('No first user'); + firstUsers = tmpFirstUser; + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('Format error duplicate error', async () => { + const { id, userGroup, manager, roles, addresses, ...other } = firstUsers; + + const userPost: PostData = { + type: 'users', + attributes: other, + }; + try { + await typeormService.postOne(userPost); + } catch (error) { + expect(typeOrmFormatErrorService.formatError(error)).toBeInstanceOf( + ConflictException + ); + } + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts new file mode 100644 index 00000000..0f51bae1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts @@ -0,0 +1,168 @@ +import { + ErrorFormatService, + EntityParam, + ValidateQueryError, + ENTITY_PARAM_MAP, + EntityControllerParam, + MODULE_OPTIONS_TOKEN, +} from '@klerick/json-api-nestjs'; +import { + BadRequestException, + ConflictException, + HttpException, + Inject, + NotAcceptableException, +} from '@nestjs/common'; +import { + EntityMetadata, + QueryFailedError, + EntityTarget, + EntityManager, +} from 'typeorm'; +import { Driver } from 'typeorm/driver/Driver'; +import { DriverUtils } from 'typeorm/driver/DriverUtils'; +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../constants'; + +export const formErrorString = ( + entityMetadata: EntityMetadata, + errorText: string +) => { + for (const column of entityMetadata.columns) { + const result = new RegExp(column.databaseName).test(errorText); + if (!result) continue; + + errorText = errorText.replace(column.databaseName, column.propertyName); + } + return errorText.replace(entityMetadata.tableName, entityMetadata.name); +}; + +const fieldNotNullOrDefault = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: formErrorString(entityMetadata, errorText), + path: ['data', 'attributes'], + }; + + return new BadRequestException([error]); +}; + +const duplicateItems = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + errorText = 'Duplicate value'; + if (detail) { + const matches = detail.match(/(?<=\().+?(?=\))/gm); + if (matches) { + errorText = `Duplicate value in the "${matches[0]}"`; + } + } + + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: detail ? formErrorString(entityMetadata, errorText) : errorText, + path: ['data', 'attributes'], + }; + + return new ConflictException([error]); +}; + +const invalidInputSyntax = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: errorText, + path: [], + }; + return new BadRequestException([error]); +}; + +const entityHasRelation = ( + entityMetadata: EntityMetadata, + errorText: string, + detail?: string +) => { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: detail || errorText, + path: ['data', 'attributes'], + }; + return new NotAcceptableException([error]); +}; + +export const PostgresError = { + [23502]: fieldNotNullOrDefault, + [23505]: duplicateItems, + ['22P02']: invalidInputSyntax, + [22007]: invalidInputSyntax, + [22003]: invalidInputSyntax, + [23503]: entityHasRelation, +}; + +export class TypeOrmFormatErrorService extends ErrorFormatService { + @Inject(MODULE_OPTIONS_TOKEN) private moduleOptions!: EntityControllerParam; + @Inject(CURRENT_ENTITY_MANAGER_TOKEN) private entityManager!: EntityManager; + @Inject(ENTITY_PARAM_MAP) private readonly mapProperty!: Map< + EntityTarget, + EntityParam + >; + private _dbDriver: Driver | undefined = undefined; + + get dbDriver(): Driver { + if (!this._dbDriver) { + const firstEntity = [...this.mapProperty.keys()].at(0); + + if (!firstEntity) { + throw new Error('No entity found in map'); + } + + this._dbDriver = + this.entityManager.getRepository(firstEntity).manager.connection.driver; + } + + return this._dbDriver; + } + + override formatError(error: unknown): HttpException { + if (!(error instanceof QueryFailedError)) { + return super.formatError(error); + } + try { + return this.prepareDataBaseError(error); + } catch (error) { + return super.formatError(error); + } + } + + private prepareDataBaseError(error: QueryFailedError): HttpException { + if (DriverUtils.isPostgresFamily(this.dbDriver)) { + const { errorCode, errorMsg, detail, table } = { + errorCode: (error.driverError as any) + .code as keyof typeof PostgresError, + errorMsg: error.driverError.message, + detail: (error.driverError as any).detail, + table: (error.driverError as any).table, + }; + + const metadata = this.entityManager.connection.entityMetadatas.find( + (i) => i.tableName === table + ); + if (!metadata) { + return super.formatError(error); + } + if (PostgresError[errorCode]) { + return PostgresError[errorCode](metadata, errorMsg, detail); + } + } + + return super.formatError(error); + } +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts new file mode 100644 index 00000000..529b0859 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm.service.ts @@ -0,0 +1,145 @@ +import { Inject } from '@nestjs/common'; +import { + OrmService, + PatchData, + PatchRelationshipData, + PostData, + PostRelationshipData, + Query, + QueryOne, + EntityControllerParam, + JsonApiTransformerService, + CONTROLLER_OPTIONS_TOKEN, +} from '@klerick/json-api-nestjs'; +import { + ResourceObject, + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; + +import { Repository } from 'typeorm'; + +import { + getAll, + getOne, + deleteOne, + postOne, + patchOne, + getRelationship, + postRelationship, + deleteRelationship, + patchRelationship, +} from '../orm-methods'; + +import { TypeormUtilsService } from './typeorm-utils.service'; +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; +import { TypeOrmParam } from '../type'; + +export class TypeOrmService + implements OrmService +{ + @Inject(TypeormUtilsService) + public typeormUtilsService!: TypeormUtilsService; + @Inject(JsonApiTransformerService) + public transformDataService!: JsonApiTransformerService; + @Inject(CONTROLLER_OPTIONS_TOKEN) + public config!: EntityControllerParam; + @Inject(CURRENT_ENTITY_REPOSITORY) public repository!: Repository; + + getAll( + query: Query + ): Promise> { + return getAll.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, query); + } + + deleteOne(id: number | string): Promise { + return deleteOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id); + } + + deleteRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise { + return deleteRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } + + getOne( + id: number | string, + query: QueryOne + ): Promise> { + return getOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, query); + } + + getRelationship>( + id: number | string, + rel: Rel + ): Promise> { + return getRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel); + } + + patchOne( + id: number | string, + inputData: PatchData + ): Promise> { + return patchOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, inputData); + } + + patchRelationship>( + id: number | string, + rel: Rel, + input: PatchRelationshipData + ): Promise> { + return patchRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } + + postOne( + inputData: PostData + ): Promise> { + return postOne.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, inputData); + } + + postRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise> { + return postRelationship.call< + TypeOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts new file mode 100644 index 00000000..2ad30600 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts @@ -0,0 +1,743 @@ +import { TestingModule } from '@nestjs/testing'; +import { PostRelationshipData, Query } from '@klerick/json-api-nestjs'; +import { QueryField, FilterOperand } from '@klerick/json-api-nestjs-shared'; +import { + BadRequestException, + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; + +import { Repository } from 'typeorm'; + +import { + UserGroups, + Users, + Comments, + Roles, + Addresses, + Notes, + dbRandomName, + getModuleForPgLite, + getRepository, + pullAllData, +} from '../mock-utils'; + +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; +import { TypeormUtilsService } from './typeorm-utils.service'; +import { EXPRESSION, OperandsMapExpression } from '../type'; + +function getDefaultQuery() { + const filter = { + relation: null, + target: null, + }; + const defaultQuery = { + [QueryField.filter]: filter, + [QueryField.fields]: null, + [QueryField.include]: null, + [QueryField.sort]: null, + [QueryField.page]: { + size: 1, + number: 1, + }, + } as Query; + + return defaultQuery; +} + +describe('TypeormUtilsService', () => { + const dbName = dbRandomName(); + let typeormUtilsServiceUserGroups: TypeormUtilsService; + let repositoryUserGroups: Repository; + + let typeormUtilsServiceUser: TypeormUtilsService; + let repositoryUser: Repository; + + let userRepository: Repository; + let addressesRepository: Repository; + let notesRepository: Repository; + let commentsRepository: Repository; + let rolesRepository: Repository; + let userGroupRepository: Repository; + + function getQuery() { + return repositoryUser + .createQueryBuilder() + .subQuery() + .select('Users-Roles.user_id') + .from('users_have_roles', 'Users-Roles') + .leftJoin( + Roles, + 'Users__Roles_roles', + 'Users-Roles.role_id = Users__Roles_roles.id' + ); + } + + beforeAll(async () => { + dbRandomName(); + const module: TestingModule = await getModuleForPgLite( + UserGroups, + dbName, + TypeormUtilsService + ); + + typeormUtilsServiceUserGroups = + module.get>(TypeormUtilsService); + repositoryUserGroups = module.get>( + CURRENT_ENTITY_REPOSITORY + ); + + const moduleUsers: TestingModule = await getModuleForPgLite( + Users, + dbName, + TypeormUtilsService + ); + + ({ + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + } = getRepository(module)); + await pullAllData( + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository + ); + + typeormUtilsServiceUser = + moduleUsers.get>(TypeormUtilsService); + repositoryUser = moduleUsers.get>( + CURRENT_ENTITY_REPOSITORY + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('TypeormUtilsService.currentAlias', () => { + expect(typeormUtilsServiceUserGroups.currentAlias).toBe('UserGroups'); + }); + + it('TypeormUtilsService.getAliasForRelation', () => { + expect(typeormUtilsServiceUserGroups.getAliasForRelation('users')).toBe( + 'UserGroups__Users_users' + ); + }); + + it('TypeormUtilsService.getAliasPath', () => { + expect(typeormUtilsServiceUserGroups.getAliasPath('id')).toBe( + 'UserGroups.id' + ); + expect( + typeormUtilsServiceUserGroups.getAliasPath('Users', 'UserGroups') + ).toBe('UserGroups.Users'); + expect( + typeormUtilsServiceUserGroups.getAliasPath('Users', 'UserGroups', '-') + ).toBe('UserGroups-Users'); + expect( + typeormUtilsServiceUserGroups.getAliasPath('label', 'users', '-') + ).toBe('Users-label'); + }); + + describe('asyncIterateFindRelationships', () => { + it('should be ok', async () => { + const notes = await notesRepository.find(); + const userGroup = await userGroupRepository.find(); + + const data = { + notes: { + data: [ + { + type: 'notes', + id: notes[0].id, + }, + ], + }, + manager: { + data: { + type: 'users', + id: '1', + }, + }, + userGroup: { + data: { + type: 'users-group', + id: `${userGroup[0].id}`, + }, + }, + } as any; + + const result = []; + for await (const item of typeormUtilsServiceUser.asyncIterateFindRelationships( + data + )) { + result.push(item); + } + + expect(result[0]).toHaveProperty('notes'); + expect(result[0]['notes']).toEqual([{ id: notes[0].id }]); + + expect(result[1]).toHaveProperty('manager'); + expect(result[1]['manager']).toEqual({ id: 1 }); + + expect(result[2]).toHaveProperty('userGroup'); + expect(result[2]['userGroup']).toEqual({ id: userGroup[0].id }); + }); + + it('should be error props incorrect', async () => { + const data = { + incorrectProps: { + type: 'users', + id: '1', + }, + } as any; + expect.assertions(1); + try { + await typeormUtilsServiceUser + .asyncIterateFindRelationships(data) + .next(); + } catch (e) { + expect(e).toBeInstanceOf(BadRequestException); + } + }); + + it('should be error resource not found', async () => { + const data = { + manager: { + data: { + id: '1000', + type: 'users', + }, + }, + } as any; + expect.assertions(1); + try { + await typeormUtilsServiceUser + .asyncIterateFindRelationships(data) + .next(); + } catch (e) { + expect(e).toBeInstanceOf(BadRequestException); + } + }); + }); + + describe('getFilterExpressionForTarget', () => { + it('expression for target field with null', () => { + const nullableField = 'id'; + const notNullableField = 'login'; + const query = getDefaultQuery(); + query.filter.target = { + [nullableField]: { + [FilterOperand.eq]: null, + }, + [notNullableField]: { + [FilterOperand.ne]: null, + }, + }; + + function guardField( + filter: any, + field: any + ): asserts field is keyof R { + if (filter && !(field in filter)) + throw new Error('field not exist in query filter'); + } + + const result = + typeormUtilsServiceUser.getFilterExpressionForTarget(query); + const mainAliasCheck = 'Users'; + + for (const item of result) { + const { params, alias, expression, selectInclude } = item; + expect(selectInclude).toBe(undefined); + if (!alias) { + expect(alias).not.toBe(undefined); + throw new Error('alias in undefined for result'); + } + const [mainAlias, field] = alias.split('.'); + expect(mainAlias).toBe(mainAliasCheck); + guardField(query.filter.target, field); + const filterName: any = query.filter.target[field]; + if (!filterName) { + expect(filterName).not.toBe(undefined); + throw new Error('filterName in undefined from query'); + } + + expect(params).toBe(undefined); + + if (field === nullableField) { + expect(expression).toBe('IS NULL'); + continue; + } + + if (field === notNullableField) { + expect(expression).toBe('IS NOT NULL'); + continue; + } + + throw new Error('filed is incorrect'); + } + }); + it('expression for target field', () => { + const valueTest = (filterOperand: FilterOperand) => + `test for ${filterOperand}`; + const valueTestArray = ( + filterOperand: FilterOperand.nin | FilterOperand.in + ): [string, ...string[]] => [valueTest(filterOperand)]; + + const query = getDefaultQuery(); + query.filter.target = { + id: { + [FilterOperand.eq]: valueTest(FilterOperand.eq), + [FilterOperand.ne]: valueTest(FilterOperand.ne), + }, + isActive: { + [FilterOperand.like]: valueTest(FilterOperand.like), + [FilterOperand.regexp]: valueTest(FilterOperand.regexp), + }, + firstName: { + [FilterOperand.gt]: valueTest(FilterOperand.gt), + [FilterOperand.gte]: valueTest(FilterOperand.gte), + }, + testDate: { + [FilterOperand.lt]: valueTest(FilterOperand.lt), + [FilterOperand.lte]: valueTest(FilterOperand.lt), + }, + createdAt: { + [FilterOperand.in]: valueTestArray(FilterOperand.in), + [FilterOperand.nin]: valueTestArray(FilterOperand.nin), + }, + }; + + function guardField( + filter: any, + field: any + ): asserts field is keyof R { + if (filter && !(field in filter)) + throw new Error('field not exist in query filter'); + } + + const result = + typeormUtilsServiceUser.getFilterExpressionForTarget(query); + const mainAliasCheck = 'Users'; + const paramsNameSet = new Set(); + for (const item of result) { + const { params, alias, expression, selectInclude } = item; + expect(selectInclude).toBe(undefined); + if (!alias) { + expect(alias).not.toBe(undefined); + throw new Error('alias in undefined for result'); + } + const [mainAlias, field] = alias.split('.'); + expect(mainAlias).toBe(mainAliasCheck); + guardField(query.filter.target, field); + const filterName: any = query.filter.target[field]; + if (!filterName) { + expect(filterName).not.toBe(undefined); + throw new Error('filterName in undefined from query'); + } + if (!params) { + expect(params).not.toBe(undefined); + throw new Error('params in undefined for result'); + } + if (Array.isArray(params)) { + expect(params).not.toBeInstanceOf(Array); + throw new Error('params in undefined for result'); + } + const { val, name } = params; + expect(paramsNameSet.has(name)).toBe(false); + paramsNameSet.add(name); + const reg = new RegExp(`params_${alias}_\\d{1,}`); + const regResult = name.match(reg); + + if (regResult === null) { + expect(name.match(reg)).not.toBe(null); + throw new Error(`name is not pattern: params_${alias}_\\d{1,}`); + } + const expressionMap = expression.replace(name, EXPRESSION); + const checkFilterOperand = Object.entries(FilterOperand).find( + ([key, val]) => OperandsMapExpression[val] === expressionMap + ); + if (!checkFilterOperand) { + expect(checkFilterOperand).not.toBe(undefined); + throw new Error(`expression incorrect`); + } + + const operand = checkFilterOperand[0] as any; + guardField(filterName, operand); + if (operand === 'like') { + expect(params.val).toEqual(`%${filterName[operand]}%`); + } else { + expect(params.val).toEqual(filterName[operand]); + } + } + }); + it('expression for target relation field with relation column', () => { + const query = getDefaultQuery(); + query.filter.target = { + addresses: { + [FilterOperand.eq]: 'null', + [FilterOperand.ne]: 'null', + }, + }; + const result = + typeormUtilsServiceUser.getFilterExpressionForTarget(query); + expect(result.length).toBe(2); + const [first, second] = result; + expect(first).not.toHaveProperty('params'); + expect(first).not.toHaveProperty('selectInclude'); + expect(first['alias']).toBe('Users.addresses'); + expect(first['expression']).toBe('IS NULL'); + expect(second).not.toHaveProperty('params'); + expect(second).not.toHaveProperty('selectInclude'); + expect(second['alias']).toBe('Users.addresses'); + expect(second['expression']).toBe('IS NOT NULL'); + }); + it('expression for target relation field with one-to-many', () => { + const query = getDefaultQuery(); + query.filter.target = { + comments: { + [FilterOperand.eq]: 'null', + [FilterOperand.ne]: 'null', + }, + }; + const subQuery = repositoryUser + .createQueryBuilder() + .subQuery() + .select('Comments.createdBy', 'createdBy') + .from(Comments, 'Comments') + .where(`Comments.createdBy = Users.id`) + .getQuery(); + const result = + typeormUtilsServiceUser.getFilterExpressionForTarget(query); + expect(result.length).toBe(2); + const [first, second] = result; + expect(first).not.toHaveProperty('params'); + expect(first).not.toHaveProperty('selectInclude'); + expect(first).not.toHaveProperty('alias'); + expect(first['expression']).toBe(`NOT EXISTS ${subQuery}`); + expect(second).not.toHaveProperty('params'); + expect(second).not.toHaveProperty('selectInclude'); + expect(second).not.toHaveProperty('alias'); + expect(second['expression']).toBe(`EXISTS ${subQuery}`); + }); + it('expression for target relation field with many-to-many', () => { + const query = getDefaultQuery(); + query.filter.target = { + roles: { + [FilterOperand.eq]: 'null', + [FilterOperand.ne]: 'null', + }, + }; + const subQuery = getQuery() + .where(`Users-Roles.user_id = Users.id`) + .getQuery(); + const result = + typeormUtilsServiceUser.getFilterExpressionForTarget(query); + + expect(result.length).toBe(2); + const [first, second] = result; + expect(first).not.toHaveProperty('params'); + expect(first).not.toHaveProperty('selectInclude'); + expect(first).not.toHaveProperty('alias'); + expect(first['expression']).toBe(`NOT EXISTS ${subQuery}`); + expect(second).not.toHaveProperty('params'); + expect(second).not.toHaveProperty('selectInclude'); + expect(second).not.toHaveProperty('alias'); + expect(second['expression']).toBe(`EXISTS ${subQuery}`); + }); + }); + + describe('getFilterExpressionForRelation', () => { + it('expression for relation many-to-many', () => { + const query = getDefaultQuery(); + const conditional = { + name: { + [FilterOperand.eq]: 'null', + [FilterOperand.ne]: 'null', + }, + createdAt: { + [FilterOperand.eq]: 'test1', + [FilterOperand.ne]: 'test2', + [FilterOperand.nin]: ['test3'] as [string, ...string[]], + }, + }; + + query.filter.relation = { + roles: conditional, + }; + + let subQuery = getQuery() + .where(`"Users__Roles_roles"."name" IS NULL`) + .andWhere(`"Users__Roles_roles"."name" IS NOT NULL`) + .andWhere(`"Users__Roles_roles"."created_at" = :param1`) + .andWhere(`"Users__Roles_roles"."created_at" <> :param2`) + .andWhere(`"Users__Roles_roles"."created_at" NOT IN (:...param3)`) + .getQuery(); + + const result = + typeormUtilsServiceUser.getFilterExpressionForRelation(query); + + expect(result.length).toBe(1); + + const [first] = result; + expect(first).not.toHaveProperty('selectInclude'); + if (!first.params && !Array.isArray(first.params)) { + expect(first).toHaveProperty('params'); + expect(first.params).toBeInstanceOf(Array); + } + if (Array.isArray(first.params)) { + expect(first?.params?.length).toBe(3); + const [firstParams, secondParams, thirdParams] = first.params; + expect(firstParams?.val).toBe(conditional.createdAt.eq); + + const regResult1 = firstParams?.name.match( + new RegExp(`params_Roles.createdAt_\\d{1,}`) + ); + if (regResult1) { + subQuery = subQuery.replace('param1', regResult1[0]); + } + expect(regResult1).not.toBe(null); + + expect(secondParams?.val).toBe(conditional.createdAt.ne); + + const regResult2 = secondParams?.name.match( + new RegExp(`params_Roles.createdAt_\\d{1,}`) + ); + if (regResult2) { + subQuery = subQuery.replace('param2', regResult2[0]); + } + expect(regResult2).not.toBe(null); + + expect(thirdParams?.val).toBe(conditional.createdAt.nin); + const regResult3 = thirdParams?.name.match( + new RegExp(`params_Roles.createdAt_\\d{1,}`) + ); + if (regResult3) { + subQuery = subQuery.replace('param3', regResult3[0]); + } + } + expect(first.alias).toBe(`Users.id`); + expect(first.expression).toBe(`IN ${subQuery}`); + }); + + it('expression for relation other type', () => { + const query = getDefaultQuery(); + query.filter.relation = { + addresses: { + createdAt: { + eq: 'qweqwe', + }, + }, + comments: { + createdAt: { + like: 'sdfsdf', + }, + }, + }; + const firstAlias = 'Addresses.createdAt'; + const secondAlias = 'Comments.createdAt'; + const result = + typeormUtilsServiceUser.getFilterExpressionForRelation(query); + + expect(result.length).toBe(2); + const [first, second] = result; + + const firstResult = first.expression.match( + new RegExp(`params_${firstAlias}_\\d{1,}`) + ); + + if (!firstResult) { + expect(firstResult).not.toBe(null); + throw Error('Should be like pattern'); + } + + expect(first.expression).toBe(`= :${firstResult[0]}`); + expect(first.alias).toBe(`Users__Addresses_addresses.createdAt`); + expect(first.selectInclude).toBe('addresses'); + if (!Array.isArray(first.params)) { + expect(first.params?.name).toBe(`${firstResult[0]}`); + expect(first.params?.val).toBe( + query.filter.relation?.addresses?.createdAt?.eq + ); + } else { + expect(first.params).not.toBeInstanceOf(Array); + } + + const secondResult = second.expression.match( + new RegExp(`params_${secondAlias}_\\d{1,}`) + ); + if (!secondResult) { + expect(secondResult).not.toBe(null); + throw Error('Should be like pattern'); + } + + expect(second.expression).toBe(`ILIKE :${secondResult[0]}`); + expect(second.alias).toBe('Users__Comments_comments.createdAt'); + expect(second.selectInclude).toBe('comments'); + if (!Array.isArray(second.params)) { + expect(second.params?.name).toBe(secondResult[0]); + expect(second.params?.val).toBe( + `%${query.filter.relation?.comments?.createdAt?.like}%` + ); + } else { + expect(second.params).not.toBeInstanceOf(Array); + } + }); + }); + + describe('validateRelationInputData', () => { + let usersData: Users; + beforeEach(async () => { + const result = await userRepository.findOne({ + where: { + id: 1, + }, + relations: { + roles: true, + userGroup: true, + manager: true, + }, + }); + if (!result) { + throw Error('not found mock data'); + } + usersData = result; + }); + it('should be ok', async () => { + const rolesData = usersData.roles.map((i) => ({ + type: 'roles', + id: i.id.toString(), + })); + + const userGroupData = { + type: 'user-groups', + id: usersData.userGroup?.id.toString(), + }; + const managerData = { + type: 'users', + id: usersData.manager?.id.toString(), + }; + const emptyRoles: { id: string; type: string }[] = []; + const emptyManager = null; + const result = await typeormUtilsServiceUser.validateRelationInputData( + 'roles', + rolesData + ); + const result1 = await typeormUtilsServiceUser.validateRelationInputData( + 'userGroup', + userGroupData as any + ); + const result2 = await typeormUtilsServiceUser.validateRelationInputData( + 'manager', + managerData + ); + const result3 = await typeormUtilsServiceUser.validateRelationInputData( + 'manager', + emptyManager + ); + const result4 = await typeormUtilsServiceUser.validateRelationInputData( + 'roles', + emptyRoles + ); + expect(result).toEqual(usersData.roles.map((i) => i.id.toString())); + expect(result1).toEqual(usersData.userGroup?.id.toString()); + expect(result2).toEqual(usersData.manager.id.toString()); + expect(result3).toEqual(emptyManager); + expect(result4).toEqual(emptyRoles); + }); + + it('Should be error incorrect type name', async () => { + const rolesData = usersData.roles.map((i, index) => ({ + type: index === 1 ? 'other' : 'roles', + id: i.id.toString(), + })) as PostRelationshipData; + + const userGroupData = { + type: 'userGroups', + id: usersData.userGroup?.id.toString(), + }; + const managerData = { + type: 'user', + id: usersData.manager.id.toString(), + }; + expect.assertions(3); + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'roles', + rolesData + ); + } catch (e) { + expect(e).toBeInstanceOf(UnprocessableEntityException); + } + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'userGroup', + userGroupData as any + ); + } catch (e) { + expect(e).toBeInstanceOf(UnprocessableEntityException); + } + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'manager', + managerData + ); + } catch (e) { + expect(e).toBeInstanceOf(UnprocessableEntityException); + } + }); + + it('Should be error, Incorrect relation type', async () => { + expect.assertions(2); + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'roles', + {} as any + ); + } catch (e) { + expect(e).toBeInstanceOf(UnprocessableEntityException); + } + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'userGroup', + [] as any + ); + } catch (e) { + expect(e).toBeInstanceOf(UnprocessableEntityException); + } + }); + + it('Should be error, Not fond', async () => { + const rolesData = usersData.roles.map((i, index) => ({ + type: 'roles', + id: index === 1 ? '1000' : i.id.toString(), + })) as PostRelationshipData; + expect.assertions(2); + try { + await typeormUtilsServiceUser.validateRelationInputData( + 'roles', + rolesData + ); + } catch (e) { + expect(e).toBeInstanceOf(NotFoundException); + } + try { + await typeormUtilsServiceUser.validateRelationInputData('userGroup', { + type: 'user-groups', + id: '10000', + }); + } catch (e) { + expect(e).toBeInstanceOf(NotFoundException); + } + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts new file mode 100644 index 00000000..a936f76f --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts @@ -0,0 +1,716 @@ +import { + BadRequestException, + Inject, + Injectable, + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; +import { EntityMetadata, Equal, In, Repository } from 'typeorm'; +import { RelationMetadata as TypeOrmRelationMetadata } from 'typeorm/metadata/RelationMetadata'; +import { + ObjectTyped, + FilterOperand, + getEntityName, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; + +import { + ValidateQueryError, + PatchData, + PostData, + Query, + UnionToTuple, +} from '@klerick/json-api-nestjs'; +import { kebabCase, camelCase, pascalCase } from 'change-case-commonjs'; +import { titleCase } from 'typeorm/util/StringUtils'; +import { + EXPRESSION, + OperandMapExpressionForNull, + OperandsMapExpression, + OperandsMapExpressionForNullRelation, +} from '../type'; + +import { CURRENT_ENTITY_REPOSITORY } from '../constants'; + +type RelationAlias = { + [K in UnionToTuple>[number] & PropertyKey]: string; +}; +type RelationMetadata = { + [K in UnionToTuple>[number] & + PropertyKey]: TypeOrmRelationMetadata; +}; + +type ResultQueryExpressionObject = { name: string; val: string }; +type ResultQueryExpressionArray = { name: string; val: string }[]; + +export type RelationshipsResult = { + [K in RelationKeys]: E[K] extends E[K][] ? E[K] : E[K] | null; +}; + +export type ResultQueryExpression = { + alias?: string; + expression: string; + paramsForResult?: string[]; + params?: ResultQueryExpressionObject | ResultQueryExpressionArray; + selectInclude?: string; +}; +export type InputValidateData = { + type: string; + id: string; +}; + +export type ValidateReturn = T extends unknown[] + ? string[] + : T extends null + ? null + : string; + +function isTargetField( + relationField: UnionToTuple>, + field: any +): field is UnionToTuple>[number] { + return (relationField as any[]).includes(field); +} + +function isRelationField( + relationField: UnionToTuple>, + field: any +): asserts field is RelationKeys { + if (isTargetField(relationField, field)) return; + const error: ValidateQueryError = { + code: 'unrecognized_keys', + path: ['data', 'relationships'], + message: `Resource for relation '${field.toString()}' does not exist`, + keys: [field], + }; + + throw new BadRequestException([error]); +} + +Injectable(); +export class TypeormUtilsService< + E extends object, + IdKey extends string = 'id' +> { + private readonly _currentAlias!: string; + private readonly _relationMetadata = {} as RelationMetadata; + private readonly _relationAlias = {} as RelationAlias; + private readonly _relationFields!: UnionToTuple>; + private readonly _entityMetadata!: EntityMetadata; + private _number = 0; + + constructor( + @Inject(CURRENT_ENTITY_REPOSITORY) private repository: Repository + ) { + this._currentAlias = pascalCase(repository.metadata.name); + const relationFields = []; + for (const metadata of repository.metadata.relations) { + const propertyName = metadata.propertyName as UnionToTuple< + RelationKeys + >[number]; + + Reflect.set(this._relationMetadata, propertyName as any, metadata); + Reflect.set( + this._relationAlias, + propertyName as any, + titleCase(metadata.inverseEntityMetadata.name) + ); + + relationFields.push(propertyName); + } + this._relationFields = relationFields as UnionToTuple>; + this._entityMetadata = repository.metadata; + } + get currentAlias() { + return this._currentAlias; + } + + get relationFields(): UnionToTuple> { + return this._relationFields; + } + + relationName(relName: keyof RelationAlias) { + return this._relationAlias[relName]; + } + + get currentPrimaryColumn(): keyof E { + return this._entityMetadata.primaryColumns[0].propertyName as keyof E; + } + + getAliasForRelation(relName: keyof RelationAlias) { + return `${this.currentAlias}__${this._relationAlias[relName]}_${String( + relName + )}`; + } + + getRelMetaDataForRelation(relName: keyof RelationAlias) { + return this._relationMetadata[relName]; + } + + getPrimaryColumnForRel(relName: keyof RelationAlias) { + return this._relationMetadata[relName].inverseEntityMetadata + .primaryColumns[0].propertyName; + } + + private getFilterObject( + query: Query, + filterType: 'target' | 'relation' + ) { + const { filter } = query as any; + if (!filter) return null; + return filter[filterType]; + } + + private get number() { + if (this._number > 1000) { + this._number = 0; + } + this._number++; + return this._number; + } + + private getParamName(fieldName: string) { + return `params_${fieldName}_${this.number}`; + } + + getAliasPath(fieldName: unknown): string; + getAliasPath( + fieldName: unknown, + relname: keyof RelationAlias, + separator?: string + ): string; + getAliasPath(fieldName: unknown, relname: string, separator?: string): string; + getAliasPath( + fieldName: unknown, + relname?: keyof RelationAlias | string, + separator = '.' + ): string { + const alias = relname + ? Reflect.get(this._relationAlias, relname) || relname + : this.currentAlias; + return `${String(alias)}${separator}${fieldName}`; + } + + private getSubQueryForManyToMany( + fieldName: keyof RelationMetadata | keyof RelationAlias, + expression?: string[] + ): string { + const metadataRelation: TypeOrmRelationMetadata = + this._relationMetadata[fieldName]; + const relationPrimaryColumn = + metadataRelation.inverseEntityMetadata.primaryColumns[0].propertyName; + const { joinTableName, inverseJoinColumns, joinColumns } = + metadataRelation.isManyToManyOwner + ? metadataRelation + : metadataRelation.inverseRelation || metadataRelation; + + const { databaseName: queryJoinPropsName } = + metadataRelation.isManyToManyOwner + ? inverseJoinColumns[0] + : joinColumns[0]; + const { databaseName: selectJoinPropsName } = + metadataRelation.isManyToManyOwner + ? joinColumns[0] + : inverseJoinColumns[0]; + + const alias = this.getAliasPath( + this._relationAlias[fieldName], + this.currentAlias, + '-' + ); + + const selectAlias = this.getAliasPath(selectJoinPropsName, alias); + + const query = this.repository + .createQueryBuilder() + .subQuery() + .select(selectAlias) + .from(joinTableName, alias) + .leftJoin( + this._relationMetadata[fieldName].inverseEntityMetadata.target, + this.getAliasForRelation(fieldName), + `${this.getAliasPath(queryJoinPropsName, alias)} = ${this.getAliasPath( + relationPrimaryColumn, + this.getAliasForRelation(fieldName) + )}` + ); + if (!expression) { + query.where( + `${selectAlias} = ${this.getAliasPath(this.currentPrimaryColumn)}` + ); + } else { + for (const i in expression) { + query[i === '0' ? 'where' : 'andWhere'](expression[i]); + } + } + return query.getQuery(); + } + + getFilterExpressionForTarget( + query: Query + ): ResultQueryExpression[] { + const resultExpression: ResultQueryExpression[] = []; + const filterTarget = this.getFilterObject(query, 'target'); + if (!filterTarget) return resultExpression; + for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { + if (!filter) continue; + for (const entries of ObjectTyped.entries(filter)) { + const [operand, value] = entries as [FilterOperand, string]; + const valueConditional = + operand === FilterOperand.like ? `%${value}%` : value; + const fieldWithAlias = this.getAliasPath(fieldName); + const paramsName = this.getParamName(fieldWithAlias); + + if (!isTargetField(this._relationFields, fieldName)) { + if ( + (operand === FilterOperand.ne || operand === FilterOperand.eq) && + (valueConditional === 'null' || valueConditional === null) + ) { + const expression = OperandMapExpressionForNull[operand].replace( + EXPRESSION, + paramsName + ); + resultExpression.push({ + alias: fieldWithAlias, + expression, + }); + continue; + } + + const expression = OperandsMapExpression[operand].replace( + EXPRESSION, + paramsName + ); + resultExpression.push({ + alias: fieldWithAlias, + expression, + params: { + val: valueConditional, + name: paramsName, + }, + }); + continue; + } + + const metadataRelation: TypeOrmRelationMetadata = + this._relationMetadata[fieldName]; + const relationTarget = metadataRelation.inverseEntityMetadata.target; + const relationAlias = this._relationAlias[fieldName]; + const subQuery = this.repository.createQueryBuilder().subQuery(); + + const resultOperand = + operand === FilterOperand.eq ? operand : FilterOperand.ne; + switch (metadataRelation.relationType) { + case 'many-to-many': { + const subQuerySql = this.getSubQueryForManyToMany(fieldName); + + const resultOperand = + operand === FilterOperand.eq ? operand : FilterOperand.ne; + + const expression = OperandsMapExpressionForNullRelation[ + resultOperand + ].replace(EXPRESSION, subQuerySql); + + resultExpression.push({ + expression, + }); + break; + } + case 'one-to-many': { + const joinColumn = metadataRelation.inverseSidePropertyPath; + + const aliasPath = this.getAliasPath(joinColumn, fieldName); + const subQuerySql = subQuery + .select(aliasPath, joinColumn) + .from(relationTarget, relationAlias) + .where( + `${aliasPath} = ${this.getAliasPath(this.currentPrimaryColumn)}` + ) + .getQuery(); + + const expression = OperandsMapExpressionForNullRelation[ + resultOperand + ].replace(EXPRESSION, subQuerySql); + + resultExpression.push({ + expression, + }); + break; + } + default: { + const expression = OperandMapExpressionForNull[ + resultOperand + ].replace(EXPRESSION, paramsName); + resultExpression.push({ + alias: fieldWithAlias, + expression, + }); + } + } + } + } + + return resultExpression; + } + + getFilterExpressionForRelation( + query: Query + ): ResultQueryExpression[] { + const resultExpression: ResultQueryExpression[] = []; + const filterRelation = this.getFilterObject(query, 'relation'); + if (!filterRelation) return resultExpression; + + for (const [relationField, propsFilter] of ObjectTyped.entries( + filterRelation + )) { + if (!propsFilter) continue; + if (!isTargetField(this._relationFields, relationField)) continue; + const metadataRelation: TypeOrmRelationMetadata = + this._relationMetadata[relationField]; + + const conditionalForManyToMany: { + conditional: string; + params: { name: string; val: string } | undefined; + }[] = []; + + for (const [relationFieldProps, filter] of ObjectTyped.entries( + propsFilter + )) { + if (!filter) continue; + + for (const entries of ObjectTyped.entries(filter)) { + const [operand, value] = entries as [FilterOperand, string]; + const currentValue = + operand === FilterOperand.like ? `%${value}%` : value; + + const paramsName = this.getParamName( + this.getAliasPath(relationFieldProps.toString(), relationField) + ); + let expression: string; + if (value === 'null') { + const currentOperand = + operand === FilterOperand.eq + ? FilterOperand.eq + : FilterOperand.ne; + expression = OperandMapExpressionForNull[currentOperand]; + } else { + expression = OperandsMapExpression[operand].replace( + EXPRESSION, + paramsName + ); + } + + const params = + value === 'null' + ? undefined + : { + val: currentValue, + name: paramsName, + }; + + switch (metadataRelation.relationType) { + case 'many-to-many': { + conditionalForManyToMany.push({ + params, + conditional: `${this.getAliasPath( + relationFieldProps.toString(), + this.getAliasForRelation(relationField) + )} ${expression}`, + }); + + break; + } + default: { + resultExpression.push({ + alias: this.getAliasPath( + relationFieldProps.toString(), + this.getAliasForRelation(relationField) + ), + expression, + selectInclude: relationField.toString(), + params, + }); + } + } + } + } + + if (conditionalForManyToMany.length) { + const expression = conditionalForManyToMany.map((i) => i.conditional); + const subQuery = this.getSubQueryForManyToMany( + relationField, + expression + ); + + const mainExpression = `IN ${subQuery}`; + + const params = conditionalForManyToMany + .filter((i) => i.params) + .map((i) => i.params) as { name: string; val: string }[]; + resultExpression.push({ + alias: this.getAliasPath(this.currentPrimaryColumn), + expression: mainExpression, + paramsForResult: expression, + params, + }); + } + } + return resultExpression; + } + + private throwError(message: string, path: string[], key?: string) { + const error: ValidateQueryError = { + code: 'unrecognized_keys', + path, + message, + }; + if (key) { + error.keys = [key]; + } + throw new BadRequestException([error]); + } + + async *asyncIterateFindRelationships( + relationships: NonNullable< + PatchData['relationships'] | PostData['relationships'] + > + ): AsyncGenerator> { + for (const entries of ObjectTyped.entries(relationships)) { + const [props, dataItem] = entries; + + isRelationField(this._relationFields, props); + if (dataItem === null || dataItem === undefined) continue; + + const { data } = dataItem as any; + if (data === undefined) continue; + if (data === null) { + yield { [props]: null } as RelationshipsResult; + continue; + } + const isArray = Array.isArray(data); + if (isArray && data.length === 0) { + yield { [props]: [] } as RelationshipsResult; + continue; + } + + const condition = isArray + ? In((data as any[]).map((i) => i.id)) + : Equal(data['id']); + const relationsTypeName = camelCase( + isArray ? (data as any[])[0]['type'] : data['type'] + ); + const primaryField = this.getPrimaryColumnForRel( + props as unknown as keyof RelationAlias + ); + const relationsTarget = Reflect.get(this._relationMetadata, props) + .inverseEntityMetadata.target; + const result = await this.repository.manager + .getRepository(relationsTarget) + .find({ + select: { + [primaryField]: true, + }, + where: { + [primaryField]: condition, + }, + }); + + if ( + (isArray && (result.length === 0 || data.length !== result.length)) || + (!isArray && result.length === 0) + ) { + const message = isArray + ? `Resource '${relationsTypeName}' with ids '${(data as any[]) + .map((i) => i.id) + .filter((i) => !result.find((r) => r[primaryField] == i)) + .join(',')}' does not exist` + : `Resource '${relationsTypeName}' with id '${data.id}' does not exist`; + + const error: ValidateQueryError = { + code: 'invalid_arguments', + path: ['data', 'relationships', String(props)], + message, + }; + + throw new BadRequestException([error]); + } + + yield { [props]: isArray ? result : result[0] } as RelationshipsResult< + E, + IdKey + >; + } + } + + async saveEntityData( + target: E, + relationships: + | PatchData['relationships'] + | PostData['relationships'] + ): Promise { + if (relationships) { + for await (const item of this.asyncIterateFindRelationships( + relationships + )) { + const [props, type] = ObjectTyped.entries(item)[0]; + if (type !== null) { + target[props] = type as any; + } else { + target[props] = null as any; + } + } + } + + const saveData = await this.repository.save(target); + let saveDataWithRelation: E | null = null; + if (relationships) { + const queryBuilder = this.repository + .createQueryBuilder(this.currentAlias) + .where({ + [this.currentPrimaryColumn]: Equal( + saveData[this.currentPrimaryColumn] + ), + }); + + for (const [props] of ObjectTyped.entries(relationships)) { + const currentIncludeAlias = this.getAliasForRelation( + props as unknown as keyof RelationAlias + ); + + queryBuilder.leftJoinAndSelect( + this.getAliasPath(props), + currentIncludeAlias + ); + } + + saveDataWithRelation = await queryBuilder.getOne(); + } + + return saveDataWithRelation ? saveDataWithRelation : saveData; + } + + async validateRelationInputData< + Rel extends RelationKeys, + In extends InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends null | InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends null | InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise> { + const relationMetadata = Reflect.get(this._relationMetadata, rel); + const isArray = Array.isArray(inputData); + + if ( + ['one-to-many', 'many-to-many'].includes(relationMetadata.relationType) && + !isArray + ) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + path: ['data'], + message: 'Body data should be array', + }; + + throw new UnprocessableEntityException([error]); + } + + if ( + ['one-to-one', 'many-to-one'].includes(relationMetadata.relationType) && + isArray + ) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + path: ['data'], + message: 'Body data should be object', + }; + + throw new UnprocessableEntityException([error]); + } + if (inputData === null) { + const result = null; + return result as ValidateReturn; + } + if (isArray && inputData.length === 0) { + const result: any[] = []; + return result as ValidateReturn; + } + + const prepareData = isArray ? inputData : [inputData]; + + const errors: ValidateQueryError[] = []; + let i = 0; + const typeName = kebabCase( + getEntityName(relationMetadata.inverseEntityMetadata.target) + ); + + for (const prepareItem of prepareData) { + if (prepareItem.type !== typeName) { + const path = isArray ? ['data', i.toString()] : ['data']; + errors.push({ + code: 'invalid_arguments', + path: path, + message: `Type should be equal to type of relName: "${rel.toString()}". Type of ${rel.toString()} is "${typeName}" but receive - "${ + prepareItem.type + }"`, + }); + } + i++; + } + if (errors.length) { + throw new UnprocessableEntityException(errors); + } + + const checkResult = await this.repository.manager + .getRepository(relationMetadata.inverseEntityMetadata.target) + .find({ + select: { + [this.getPrimaryColumnForRel( + rel as unknown as keyof RelationAlias + )]: true, + }, + where: { + [this.getPrimaryColumnForRel( + rel as unknown as keyof RelationAlias + )]: In(prepareData.map((i) => i.id)), + }, + }); + + if (checkResult.length === prepareData.length) { + return ( + isArray ? inputData.map((i) => i.id) : inputData.id + ) as ValidateReturn; + } + + const resulDataMap = checkResult.reduce((acum, item) => { + acum[ + item[ + this.getPrimaryColumnForRel(rel as unknown as keyof RelationAlias) + ] + ] = true; + return acum; + }, {} as Record); + + i = 0; + for (const item of prepareData) { + if (!resulDataMap[item.id]) { + const path = isArray ? ['data', i.toString(), 'id'] : ['data', 'id']; + errors.push({ + code: 'invalid_arguments', + path: path, + message: `Not exist item "${ + item.id + }" in relation "${rel.toString()}"`, + }); + } + i++; + } + throw new NotFoundException(errors); + } +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts new file mode 100644 index 00000000..495829cf --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/type-orm-json-api.module.ts @@ -0,0 +1,71 @@ +import { DynamicModule, Provider } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type'; +import { + PrepareParams, + NestProvider, + MODULE_OPTIONS_TOKEN, + ErrorFormatService, +} from '@klerick/json-api-nestjs'; + +import { + CurrentEntityManager, + CurrentDataSourceProvider, + CurrentEntityRepository, + FindOneRowEntityFactory, + CheckRelationNameFactory, + OrmServiceFactory, + RunInTransactionFactory, + EntityPropsMap, +} from './factory'; +import { TypeOrmFormatErrorService, TypeormUtilsService } from './service'; + +import { TypeOrmParam } from './type'; + +export class TypeOrmJsonApiModule { + static forRoot(options: PrepareParams): DynamicModule { + const optionProvider = { + provide: MODULE_OPTIONS_TOKEN, + useValue: options, + }; + + const typeOrmModule = TypeOrmModule.forFeature( + options.entities as EntityClassOrSchema[], + options.connectionName + ); + + const currentProvider: Provider[] = [ + ...(options.providers || []), + optionProvider, + CurrentDataSourceProvider(options.connectionName), + CurrentEntityManager(), + EntityPropsMap(options.entities), + RunInTransactionFactory(), + { + provide: ErrorFormatService, + useClass: TypeOrmFormatErrorService, + }, + ]; + const currentImport: DynamicModule[] = [ + typeOrmModule, + ...((options.imports || []) as DynamicModule[]), + ]; + + return { + module: TypeOrmJsonApiModule, + imports: currentImport, + providers: currentProvider, + exports: [...currentProvider, ...currentImport], + }; + } + + static getUtilProviders(entity: object): NestProvider { + return [ + CurrentEntityRepository(entity), + TypeormUtilsService, + OrmServiceFactory(), + FindOneRowEntityFactory(), + CheckRelationNameFactory(), + ]; + } +} diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts new file mode 100644 index 00000000..74d93ef8 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts @@ -0,0 +1,35 @@ +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; +import { IsolationLevel } from 'typeorm/driver/types/IsolationLevel'; + +export type TypeOrmParam = { + useSoftDelete?: boolean; + runInTransaction?: any>( + isolationLevel: IsolationLevel, + fn: Func + ) => ReturnType; +}; + +export const EXPRESSION = 'EXPRESSION'; +export const OperandsMapExpression = { + [FilterOperand.eq]: `= :${EXPRESSION}`, + [FilterOperand.ne]: `<> :${EXPRESSION}`, + [FilterOperand.regexp]: `~* :${EXPRESSION}`, + [FilterOperand.gt]: `> :${EXPRESSION}`, + [FilterOperand.gte]: `>= :${EXPRESSION}`, + [FilterOperand.in]: `IN (:...${EXPRESSION})`, + [FilterOperand.like]: `ILIKE :${EXPRESSION}`, + [FilterOperand.lt]: `< :${EXPRESSION}`, + [FilterOperand.lte]: `<= :${EXPRESSION}`, + [FilterOperand.nin]: `NOT IN (:...${EXPRESSION})`, + [FilterOperand.some]: `&& :${EXPRESSION}`, +}; + +export const OperandMapExpressionForNull = { + [FilterOperand.ne]: 'IS NOT NULL', + [FilterOperand.eq]: 'IS NULL', +}; + +export const OperandsMapExpressionForNullRelation = { + [FilterOperand.ne]: `EXISTS ${EXPRESSION}`, + [FilterOperand.eq]: `NOT EXISTS ${EXPRESSION}`, +}; diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.json new file mode 100644 index 00000000..0dc79caa --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json new file mode 100644 index 00000000..08408448 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"], + "target": "es2023", + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/lib/mock-utils/**/*.ts"] +} diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json new file mode 100644 index 00000000..0934ad96 --- /dev/null +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ], + "@klerick/json-api-nestjs": [ + "libs/json-api/json-api-nestjs/src/index.ts" + ] + } + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} From cd56636e937a57cc6b71642fc6c7338a7769b70c Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 06:59:33 +0100 Subject: [PATCH 04/22] feat(json-api-nestjs-microorm): Adapter for microorm Move adapter for microorm as separate package --- .../json-api-nestjs-microorm/.eslintrc.json | 30 + .../json-api-nestjs-microorm/README.md | 11 + .../json-api-nestjs-microorm/jest.config.ts | 10 + .../json-api-nestjs-microorm/package.json | 10 + .../json-api-nestjs-microorm/project.json | 42 + .../json-api-nestjs-microorm/src/index.ts | 1 + .../src/lib/constants/index.ts | 7 + .../src/lib/factory/index.ts | 166 +++ .../json-api-nestjs-microorm/src/lib/index.ts | 2 + .../src/lib/micro-orm-json-api.module.ts | 68 ++ .../src/lib/mock-utils/entities/addresses.ts | 72 ++ .../src/lib/mock-utils/entities/comments.ts | 55 + .../src/lib/mock-utils/entities/index.ts | 15 + .../src/lib/mock-utils/entities/notes.ts | 44 + .../src/lib/mock-utils/entities/roles.ts | 67 ++ .../lib/mock-utils/entities/user-groups.ts | 30 + .../src/lib/mock-utils/entities/users.ts | 146 +++ .../src/lib/mock-utils/index.ts | 126 +++ .../src/lib/mock-utils/utils/index.ts | 3 + .../src/lib/mock-utils/utils/init-db.ts | 81 ++ .../lib/mock-utils/utils/provider-entities.ts | 30 + .../src/lib/mock-utils/utils/pull-data.ts | 135 +++ .../src/lib/orm-helper/index.spec.ts | 186 ++++ .../src/lib/orm-helper/index.ts | 185 ++++ .../orm-methods/delete-one/delete-one.spec.ts | 58 ++ .../lib/orm-methods/delete-one/delete-one.ts | 19 + .../delete-relationship.spec.ts | 205 ++++ .../delete-relationship.ts | 62 ++ .../lib/orm-methods/get-all/get-all.spec.ts | 954 ++++++++++++++++++ .../src/lib/orm-methods/get-all/get-all.ts | 90 ++ .../get-all/get-query-for-count.spec.ts | 240 +++++ .../get-all/get-query-for-count.ts | 59 ++ .../lib/orm-methods/get-one/get-one.spec.ts | 99 ++ .../src/lib/orm-methods/get-one/get-one.ts | 29 + .../get-relationship/get-relationship.spec.ts | 149 +++ .../get-relationship/get-relationship.ts | 36 + .../src/lib/orm-methods/index.ts | 9 + .../orm-methods/patch-one/patch-one.spec.ts | 235 +++++ .../lib/orm-methods/patch-one/patch-one.ts | 51 + .../patch-relationship.spec.ts | 139 +++ .../patch-relationship/patch-relationship.ts | 50 + .../lib/orm-methods/post-one/post-one.spec.ts | 341 +++++++ .../src/lib/orm-methods/post-one/post-one.ts | 22 + .../post-relationship.spec.ts | 151 +++ .../post-relationship/post-relationship.ts | 49 + .../src/lib/service/index.ts | 1 + .../service/micro-orm-util.service.spec.ts | 571 +++++++++++ .../src/lib/service/micro-orm-util.service.ts | 778 ++++++++++++++ .../src/lib/service/microorm-service.ts | 229 +++++ .../json-api-nestjs-microorm/src/lib/type.ts | 3 + .../json-api-nestjs-microorm/tsconfig.json | 23 + .../tsconfig.lib.json | 16 + .../tsconfig.spec.json | 26 + 53 files changed, 6216 insertions(+) create mode 100644 libs/json-api/json-api-nestjs-microorm/.eslintrc.json create mode 100644 libs/json-api/json-api-nestjs-microorm/README.md create mode 100644 libs/json-api/json-api-nestjs-microorm/jest.config.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/package.json create mode 100644 libs/json-api/json-api-nestjs-microorm/project.json create mode 100644 libs/json-api/json-api-nestjs-microorm/src/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/src/lib/type.ts create mode 100644 libs/json-api/json-api-nestjs-microorm/tsconfig.json create mode 100644 libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json create mode 100644 libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json diff --git a/libs/json-api/json-api-nestjs-microorm/.eslintrc.json b/libs/json-api/json-api-nestjs-microorm/.eslintrc.json new file mode 100644 index 00000000..0af28030 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] + } + } + ] +} diff --git a/libs/json-api/json-api-nestjs-microorm/README.md b/libs/json-api/json-api-nestjs-microorm/README.md new file mode 100644 index 00000000..03a6499f --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/README.md @@ -0,0 +1,11 @@ +# json-api-nestjs-microorm + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build json-api-nestjs-microorm` to build the library. + +## Running unit tests + +Run `nx test json-api-nestjs-microorm` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/json-api/json-api-nestjs-microorm/jest.config.ts b/libs/json-api/json-api-nestjs-microorm/jest.config.ts new file mode 100644 index 00000000..840ada7c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'json-api-nestjs-microorm', + preset: '../../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-microorm', +}; diff --git a/libs/json-api/json-api-nestjs-microorm/package.json b/libs/json-api/json-api-nestjs-microorm/package.json new file mode 100644 index 00000000..aaf52996 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/package.json @@ -0,0 +1,10 @@ +{ + "name": "@klerick/json-api-nestjs-microorm", + "version": "0.0.1", + "type": "commonjs", + "main": "./src/index.js", + "types": "./src/index.d.ts", + "dependencies": { + "tslib": "^2.3.0" + } +} diff --git a/libs/json-api/json-api-nestjs-microorm/project.json b/libs/json-api/json-api-nestjs-microorm/project.json new file mode 100644 index 00000000..f9e0f0ae --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/project.json @@ -0,0 +1,42 @@ +{ + "name": "json-api-nestjs-microorm", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/json-api/json-api-nestjs-microorm/src", + "projectType": "library", + "release": { + "version": { + "generatorOptions": { + "packageRoot": "dist/{projectRoot}", + "currentVersionResolver": "git-tag", + "fallbackCurrentVersionResolver": "disk" + } + } + }, + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-microorm", "type:publish"], + "targets": { + "build": { + "dependsOn": [ + { + "projects": ["json-api-nestjs"], + "target": "build", + "params": "ignore" + } + ], + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/libs/json-api/json-api-nestjs-microorm", + "tsConfig": "libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json", + "packageJson": "libs/json-api/json-api-nestjs-microorm/package.json", + "main": "libs/json-api/json-api-nestjs-microorm/src/index.ts", + "assets": ["libs/json-api/json-api-nestjs-microorm/*.md"] + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + } + }, + "implicitDependencies": ["json-api-nestjs"] +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/index.ts b/libs/json-api/json-api-nestjs-microorm/src/index.ts new file mode 100644 index 00000000..ce0685bf --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/index.ts @@ -0,0 +1 @@ +export * from './lib/micro-orm-json-api.module'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts new file mode 100644 index 00000000..9c5a0f01 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/constants/index.ts @@ -0,0 +1,7 @@ +export const ENTITY_METADATA_TOKEN = Symbol('ENTITY_METADATA_TOKEN'); +export const DEFAULT_ARRAY_TYPE = ['ArrayType', 'EnumArrayType']; +export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN'); +export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY'); +export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol( + 'CURRENT_ENTITY_MANAGER_TOKEN' +); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts new file mode 100644 index 00000000..c3f100cc --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/factory/index.ts @@ -0,0 +1,166 @@ +import { FactoryProvider } from '@nestjs/common'; +import { + EntityManager, + MikroORM, + EntityRepository, + MetadataStorage, + EntityClass, +} from '@mikro-orm/core'; +import { kebabCase } from 'change-case-commonjs'; +import { getMikroORMToken } from '@mikro-orm/nestjs'; + +import { + CheckRelationName, + CHECK_RELATION_NAME, + EntityParam, + RunInTransaction, + PrepareParams, + RUN_IN_TRANSACTION_FUNCTION, + ORM_SERVICE, + MODULE_OPTIONS_TOKEN, + ENTITY_PARAM_MAP, + FIND_ONE_ROW_ENTITY, + FindOneRowEntity, +} from '@klerick/json-api-nestjs'; +import { getEntityName } from '@klerick/json-api-nestjs-shared'; + +import { + getProps, + getRelation, + getPropsType, + getPropsNullable, + getPrimaryColumnName, + getPrimaryColumnType, + getRelationProperty, + getArrayType, +} from '../orm-helper'; + +import { + ENTITY_METADATA_TOKEN, + CURRENT_DATA_SOURCE_TOKEN, + CURRENT_ENTITY_MANAGER_TOKEN, + CURRENT_ENTITY_REPOSITORY, +} from '../constants'; +import { MicroOrmService } from '../service'; +import { MicroOrmParam } from '../type'; +import { MicroOrmUtilService } from '../service/micro-orm-util.service'; + +export function CurrentMicroOrmProvider( + connectionName?: string +): FactoryProvider { + return { + provide: CURRENT_DATA_SOURCE_TOKEN, + useFactory: (mikroORM: MikroORM) => { + return mikroORM; + }, + inject: [connectionName ? getMikroORMToken(connectionName) : MikroORM], + }; +} + +export function CurrentEntityManager(): FactoryProvider { + return { + provide: CURRENT_ENTITY_MANAGER_TOKEN, + useFactory: (mikroORM: MikroORM) => mikroORM.em, + inject: [CURRENT_DATA_SOURCE_TOKEN], + }; +} + +export function CurrentEntityRepository( + entity: E +): FactoryProvider> { + return { + provide: CURRENT_ENTITY_REPOSITORY, + useFactory: (entityManager: EntityManager) => + entityManager.getRepository(entity as unknown as EntityClass), + inject: [CURRENT_ENTITY_MANAGER_TOKEN], + }; +} + +export function CurrentEntityMetadata(): FactoryProvider { + return { + provide: ENTITY_METADATA_TOKEN, + useFactory: (mikroORM: MikroORM) => mikroORM.getMetadata(), + inject: [CURRENT_DATA_SOURCE_TOKEN], + }; +} + +export function CheckRelationNameFactory< + E extends object, + IdKey extends string = 'id' +>(): FactoryProvider> { + return { + provide: CHECK_RELATION_NAME, + inject: [MicroOrmUtilService], + useFactory(microOrmUtilService: MicroOrmUtilService) { + return (entity, value) => + !!microOrmUtilService.relationsName.find((i: any) => i === value); + }, + }; +} + +export function EntityPropsMap(entities: EntityClass[]) { + return { + provide: ENTITY_PARAM_MAP, + inject: [ENTITY_METADATA_TOKEN, MODULE_OPTIONS_TOKEN], + useFactory: ( + metadataStorage: MetadataStorage, + config: PrepareParams + ) => { + const mapProperty = new Map, EntityParam>(); + const arrayConfig = config.options.arrayType; + for (const item of entities) { + const metadata = metadataStorage.get(item); + const className = getEntityName(item); + mapProperty.set(item, { + props: getProps(metadata), + propsType: getPropsType(metadata, arrayConfig), + propsNullable: getPropsNullable(metadata), + primaryColumnName: getPrimaryColumnName(metadata), + primaryColumnType: getPrimaryColumnType(metadata), + propsArrayType: getArrayType(metadata), + typeName: kebabCase(className), + className: className, + relations: getRelation(metadata), + relationProperty: getRelationProperty(metadata), + }); + } + return mapProperty; + }, + }; +} + +export function RunInTransactionFactory(): FactoryProvider { + return { + provide: RUN_IN_TRANSACTION_FUNCTION, + inject: [], + useFactory() { + return async (callback) => callback(); + }, + }; +} + +export function OrmServiceFactory() { + return { + provide: ORM_SERVICE, + useClass: MicroOrmService, + }; +} +export function FindOneRowEntityFactory< + E extends object, + IdKey extends string +>(): FactoryProvider> { + return { + provide: FIND_ONE_ROW_ENTITY, + inject: [MicroOrmUtilService], + useFactory(microOrmUtilService: MicroOrmUtilService) { + return async (entity, value) => { + return microOrmUtilService + .queryBuilder(entity) + .where({ + [microOrmUtilService.currentPrimaryColumn]: value, + }) + .getSingleResult(); + }; + }, + }; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/index.ts new file mode 100644 index 00000000..a5d7b76f --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/index.ts @@ -0,0 +1,2 @@ +export * from './micro-orm-json-api.module'; +export * from './type'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts new file mode 100644 index 00000000..41b41f07 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts @@ -0,0 +1,68 @@ +import { DynamicModule } from '@nestjs/common'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { + PrepareParams, + MODULE_OPTIONS_TOKEN, + NestProvider, +} from '@klerick/json-api-nestjs'; +import { MicroOrmParam } from './type'; + +import { + CurrentEntityManager, + CurrentEntityMetadata, + CurrentEntityRepository, + CurrentMicroOrmProvider, + OrmServiceFactory, + RunInTransactionFactory, + EntityPropsMap, + CheckRelationNameFactory, + FindOneRowEntityFactory, +} from './factory'; +import { MicroOrmUtilService } from './service/micro-orm-util.service'; + +export class MicroOrmJsonApiModule { + static module = 'microOrm' as const; + static forRoot(options: PrepareParams): DynamicModule { + const optionProvider = { + provide: MODULE_OPTIONS_TOKEN, + useValue: options, + }; + + const microOrmModule = MikroOrmModule.forFeature( + options.entities, + options.connectionName + ); + + const currentProvider = [ + ...(options.providers || []), + optionProvider, + CurrentMicroOrmProvider(options.connectionName), + CurrentEntityManager(), + CurrentEntityMetadata(), + RunInTransactionFactory(), + EntityPropsMap(options.entities), + ]; + + const currentImport = [ + microOrmModule, + ...((options.imports || []) as DynamicModule[]), + ]; + + return { + module: MicroOrmJsonApiModule, + imports: currentImport, + providers: currentProvider, + exports: [...currentProvider, ...currentImport], + }; + } + + static getUtilProviders(entity: object): NestProvider { + return [ + CurrentEntityRepository(entity), + CheckRelationNameFactory(), + OrmServiceFactory(), + MicroOrmUtilService, + FindOneRowEntityFactory(), + ]; + } +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts new file mode 100644 index 00000000..8f8710ec --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/addresses.ts @@ -0,0 +1,72 @@ +import { + Entity, + PrimaryKey, + Property, + OneToOne, + ArrayType, +} from '@mikro-orm/core'; + +import { Users, IUsers } from './index'; + +export type IAddresses = Addresses; + +@Entity({ + tableName: 'addresses', +}) +export class Addresses { + @PrimaryKey({ + autoincrement: true, + }) + public id!: number; + + @Property({ + columnType: 'varchar', + length: 70, + nullable: true, + }) + public city!: string; + + @Property({ + columnType: 'varchar', + length: 70, + nullable: true, + }) + public state!: string; + + @Property({ + columnType: 'varchar', + length: 68, + nullable: true, + }) + public country!: string; + + @Property({ + name: 'array_field', + type: ArrayType, + columnType: 'varchar[]', + nullable: true, + }) + public arrayField!: string[]; + + @Property({ + length: 0, + name: 'created_at', + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + }) + createdAt: Date = new Date(); + + @Property({ + length: 0, + onUpdate: () => new Date(), + name: 'updated_at', + nullable: true, + columnType: 'timestamp(0) without time zone', + defaultRaw: 'CURRENT_TIMESTAMP(0)', + }) + updatedAt: Date = new Date(); + + @OneToOne(() => Users, (item) => item.addresses) + public user!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts new file mode 100644 index 00000000..285f33a3 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/comments.ts @@ -0,0 +1,55 @@ +import { Entity, PrimaryKey, Property, Enum, ManyToOne } from '@mikro-orm/core'; + +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} + +import { Users, IUsers } from './index'; + +export type IComments = Comments; + +@Entity({ + tableName: 'comments', +}) +export class Comments { + @PrimaryKey({ + autoincrement: true, + }) + public id!: number; + + @Property({ + columnType: 'text', + }) + public text!: string; + + @Enum({ items: () => CommentKind, nativeEnumName: 'comment_kind_enum' }) + public kind!: CommentKind; + + @Property({ + length: 0, + name: 'created_at', + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + }) + createdAt: Date = new Date(); + + @Property({ + length: 0, + onUpdate: () => new Date(), + name: 'updated_at', + nullable: true, + columnType: 'timestamp(0) without time zone', + defaultRaw: 'CURRENT_TIMESTAMP(0)', + }) + updatedAt: Date = new Date(); + + @ManyToOne(() => Users, { + // #TODO need add chaeck for nullable relation to zod + nullable: true, + fieldName: 'created_by', + }) + createdBy!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts new file mode 100644 index 00000000..451e1a81 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/index.ts @@ -0,0 +1,15 @@ +export * from './users'; +export * from './roles'; +export * from './comments'; +export * from './addresses'; +export * from './user-groups'; +export * from './notes'; + +import { Users } from './users'; +import { Roles } from './roles'; +import { Comments } from './comments'; +import { Addresses } from './addresses'; +import { UserGroups } from './user-groups'; +import { Notes } from './notes'; + +export const Entities = [Users, Roles, Comments, Addresses, UserGroups, Notes]; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts new file mode 100644 index 00000000..b3ff70ce --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/notes.ts @@ -0,0 +1,44 @@ +import { PrimaryKey, Property, Entity, ManyToOne } from '@mikro-orm/core'; + +import { Users, IUsers } from './index'; + +@Entity({ + tableName: 'notes', +}) +export class Notes { + @PrimaryKey({ + type: 'uuid', + defaultRaw: 'gen_random_uuid()', + }) + public id!: string; + + @Property({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Property({ + length: 0, + name: 'created_at', + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + }) + createdAt: Date = new Date(); + + @Property({ + length: 0, + onUpdate: () => new Date(), + name: 'updated_at', + nullable: true, + columnType: 'timestamp(0) without time zone', + defaultRaw: 'CURRENT_TIMESTAMP(0)', + }) + updatedAt: Date = new Date(); + + @ManyToOne(() => Users, { + fieldName: 'created_by', + }) + public createdBy!: IUsers; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts new file mode 100644 index 00000000..2420d19c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/roles.ts @@ -0,0 +1,67 @@ +import { + Entity, + PrimaryKey, + Property, + ManyToMany, + Collection, +} from '@mikro-orm/core'; + +import { Users, IUsers } from './index'; + +export type IRoles = Roles; + +@Entity({ + tableName: 'roles', +}) +export class Roles { + @PrimaryKey({ + autoincrement: true, + }) + public id!: number; + + @Property({ + type: 'varchar', + length: 128, + nullable: true, + default: 'NULL', + }) + public name!: string; + + @Property({ + type: 'varchar', + length: 128, + nullable: false, + unique: true, + }) + public key!: string; + + @Property({ + name: 'is_default', + type: 'boolean', + default: false, + }) + public isDefault!: boolean; + + @Property({ + length: 0, + name: 'created_at', + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + type: 'timestamp', + }) + createdAt: Date = new Date(); + + @Property({ + length: 0, + onUpdate: () => new Date(), + name: 'updated_at', + nullable: true, + columnType: 'timestamp(0) without time zone', + defaultRaw: 'CURRENT_TIMESTAMP(0)', + }) + updatedAt: Date = new Date(); + + @ManyToMany(() => Users, (item) => item.roles) + public users = new Collection(this); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts new file mode 100644 index 00000000..b62ac057 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/user-groups.ts @@ -0,0 +1,30 @@ +import { + PrimaryKey, + OneToMany, + Entity, + Property, + Collection, +} from '@mikro-orm/core'; + +import { Users } from './index'; + +@Entity({ + tableName: 'user_groups', +}) +export class UserGroups { + @PrimaryKey({ + autoincrement: true, + }) + public id!: number; + + @Property({ + type: 'string', + length: 50, + unique: true, + columnType: 'varchar', + }) + public label!: string; + + @OneToMany(() => Users, (item) => item.userGroup) + public users = new Collection(this); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts new file mode 100644 index 00000000..17ba911f --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/entities/users.ts @@ -0,0 +1,146 @@ +import { + Entity, + PrimaryKey, + Property, + OneToOne, + Collection, + ManyToMany, + OneToMany, + ManyToOne, + ArrayType, + Type, +} from '@mikro-orm/core'; + +import { + Addresses, + Roles, + Comments, + Notes, + UserGroups, + IAddresses, +} from './index'; + +export type IUsers = Users; + +export class MyDateType extends Type {} + +@Entity({ + tableName: 'users', +}) +export class Users { + @PrimaryKey({ + autoincrement: true, + }) + public id!: number; + + @Property({ + type: 'string', + length: 100, + unique: true, + }) + public login!: string; + + @Property({ + name: 'first_name', + type: 'varchar', + length: 100, + nullable: true, + }) + public firstName!: string; + + @Property({ + name: 'test_real', + type: new ArrayType((i) => parseFloat(i)), + columnType: 'real[]', + defaultRaw: `ARRAY[]::real[]`, + default: [], + }) + public testReal: number[] = []; + + @Property({ + name: 'test_array_null', + type: new ArrayType((i) => parseFloat(i)), + columnType: 'real[]', + nullable: true, + }) + public testArrayNull!: number[] | null; + + @Property({ + name: 'last_name', + type: 'string', + columnType: 'varchar', + length: 100, + nullable: true, + }) + public lastName!: string; + + @Property({ + name: 'is_active', + type: 'boolean', + nullable: true, + default: false, + }) + public isActive!: boolean; + + @Property({ + name: 'test_date', + type: Date, + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + }) + public testDate!: Date; + + @Property({ + length: 0, + name: 'created_at', + nullable: true, + defaultRaw: 'CURRENT_TIMESTAMP(0)', + columnType: 'timestamp(0) without time zone', + }) + createdAt: Date = new Date(); + + @Property({ + length: 0, + onUpdate: () => new Date(), + name: 'updated_at', + nullable: true, + columnType: 'timestamp(0) without time zone', + defaultRaw: 'CURRENT_TIMESTAMP(0)', + }) + updatedAt: Date = new Date(); + + @OneToOne(() => Addresses, { + owner: true, + fieldName: 'addresses_id', + nullable: true, + }) + public addresses!: IAddresses; + + @OneToOne(() => Users, { + owner: true, + nullable: true, + fieldName: 'manager_id', + }) + public manager!: IUsers; + + @ManyToMany(() => Roles, (role) => role.users, { + owner: true, + pivotTable: 'users_have_roles', + inverseJoinColumn: 'role_id', + joinColumn: 'user_id', + }) + public roles = new Collection(this); + + @OneToMany(() => Comments, (comment) => comment.createdBy) + public comments = new Collection(this); + + @OneToMany(() => Notes, (item) => item.createdBy) + public notes = new Collection(this); + + @ManyToOne(() => UserGroups, { + fieldName: 'user_groups_id', + nullable: true, + }) + public userGroup!: UserGroups | null; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts new file mode 100644 index 00000000..80dc335d --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/index.ts @@ -0,0 +1,126 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { QueryField } from '@klerick/json-api-nestjs-shared'; +import { + Query, + CURRENT_ENTITY, + MODULE_OPTIONS_TOKEN, + JsonApiTransformerService, +} from '@klerick/json-api-nestjs'; + +import { + Addresses, + Comments, + Notes, + Roles, + UserGroups, + Users, +} from './entities'; + +import { + CurrentEntityManager, + CurrentEntityMetadata, + CurrentEntityRepository, + CurrentMicroOrmProvider, + OrmServiceFactory, + EntityPropsMap, +} from '../factory'; +import { MicroOrmUtilService } from '../service/micro-orm-util.service'; + +export * from './entities'; +export * from './utils'; + +import { sharedConnect, initMikroOrm, pullAllData } from './utils'; +import { DEFAULT_ARRAY_TYPE } from '../constants'; + +export const entities = [Users, UserGroups, Roles, Comments, Addresses, Notes]; + +export function mockDbPgLiteTestModule(dbName = `test_db_${Date.now()}`) { + const mikroORM = { + provide: MikroORM, + useFactory: async () => { + const knexInst = await sharedConnect(); + return initMikroOrm(knexInst, dbName); + }, + }; + return { + module: MikroOrmModule, + providers: [mikroORM], + exports: [mikroORM], + }; +} + +const readOnlyDbName = `readonly_db_${Date.now()}`; + +export function dbRandomName(readOnly = false) { + if (readOnly) { + return readOnlyDbName; + } + return `test_db_${Date.now()}`; +} + +export async function pullData(em: EntityManager, count = 1) { + for (let i = 0; i < count; i++) { + await pullAllData(em); + } +} + +export function getModuleForPgLite( + entity: E, + dbName = `test_db_${Date.now()}` +): Promise { + return Test.createTestingModule({ + imports: [mockDbPgLiteTestModule(dbName)], + providers: [ + CurrentMicroOrmProvider(), + CurrentEntityManager(), + CurrentEntityMetadata(), + CurrentEntityRepository(entity), + MicroOrmUtilService, + { + provide: JsonApiTransformerService, + useValue: { + transformData() { + return { + included: {}, + data: {}, + }; + }, + transformRel() { + return []; + }, + }, + }, + { + provide: CURRENT_ENTITY, + useValue: entity, + }, + OrmServiceFactory(), + EntityPropsMap(entities as any), + { + provide: MODULE_OPTIONS_TOKEN, + useValue: { options: { arrayType: DEFAULT_ARRAY_TYPE } }, + }, + ], + }).compile(); +} + +export function getDefaultQuery< + R extends object, + IdKey extends string = 'id' +>(): Query { + return { + [QueryField.filter]: { + relation: null, + target: null, + }, + [QueryField.fields]: null, + [QueryField.include]: null, + [QueryField.sort]: null, + [QueryField.page]: { + size: 1, + number: 1, + }, + } as Query; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts new file mode 100644 index 00000000..fa93c59d --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/index.ts @@ -0,0 +1,3 @@ +export * from './provider-entities'; +export * from './pull-data'; +export * from './init-db'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts new file mode 100644 index 00000000..a213e21c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/init-db.ts @@ -0,0 +1,81 @@ +import { Knex as TypeKnex } from '@mikro-orm/knex'; +import { MikroORM } from '@mikro-orm/core'; +import { PostgreSqlDriver } from '@mikro-orm/postgresql'; +import { SqlHighlighter } from '@mikro-orm/sql-highlighter'; + +import Knex from 'knex'; +import * as ClientPgLite from 'knex-pglite'; + +import { + Addresses, + Comments, + Notes, + Roles, + UserGroups, + Users, +} from '../entities'; + +let knexInst: TypeKnex; + +export async function sharedConnect(): Promise { + // @ts-ignore + // return globalThis.pgLite; + + if (knexInst) { + return knexInst; + } + + const pgLite = await Promise.all([ + import('@electric-sql/pglite'), + // @ts-ignore + import('@electric-sql/pglite/contrib/uuid_ossp'), + ]).then( + ([{ PGlite }, { uuid_ossp }]) => + new PGlite({ + extensions: { uuid_ossp }, + }) + ); + + knexInst = Knex({ + // @ts-ignore + client: ClientPgLite, + dialect: 'postgres', + // @ts-ignore + connection: { pglite: pgLite }, + }); + + return knexInst; +} + +export async function initMikroOrm(knex: TypeKnex, testDbName: string) { + const result = await knex.raw( + `select 1 from pg_database where datname = '${testDbName}'` + ); + + if ((result['rows'] as []).length === 0) { + await knex.raw(`create database ??`, [testDbName]); + } + + const orm = await MikroORM.init({ + highlighter: new SqlHighlighter(), + driver: PostgreSqlDriver, + dbName: testDbName, + driverOptions: knexInst, + entities: [Users, UserGroups, Roles, Comments, Addresses, Notes], + allowGlobalContext: true, + schema: 'public', + debug: + process.env['DB_LOGGING'] !== '0' ? ['query', 'query-params'] : false, + }); + + if ((result['rows'] as []).length === 0) { + const sql = await orm.getSchemaGenerator().getCreateSchemaSQL(); + const statements = sql.split(';').filter((s) => s.trim().length > 0); // Разбиваем на отдельные команды + + for (const statement of statements) { + await orm.em.execute(statement); + } + } + + return orm; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts new file mode 100644 index 00000000..44087e7a --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/provider-entities.ts @@ -0,0 +1,30 @@ +import { TestingModule } from '@nestjs/testing'; +import { EntityManager } from '@mikro-orm/core'; +import { + Users, + Addresses, + Comments, + Roles, + UserGroups, + Notes, +} from '../entities'; + +export function getRepository(module: TestingModule, emToken: symbol) { + const em = module.get(emToken); + + const userRepository = em.getRepository(Users); + const addressesRepository = em.getRepository(Addresses); + const notesRepository = em.getRepository(Notes); + const commentsRepository = em.getRepository(Comments); + const rolesRepository = em.getRepository(Roles); + const userGroupRepository = em.getRepository(UserGroups); + + return { + userRepository, + addressesRepository, + notesRepository, + commentsRepository, + rolesRepository, + userGroupRepository, + }; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts new file mode 100644 index 00000000..5ea47448 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/mock-utils/utils/pull-data.ts @@ -0,0 +1,135 @@ +import { EntityManager } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { + Addresses, + CommentKind, + Comments, + Notes, + Roles, + UserGroups, + Users, +} from '../entities'; + +export async function pullAddress() { + const address = new Addresses(); + address.city = faker.location.city(); + address.country = faker.location.country(); + address.arrayField = [ + faker.string.alphanumeric(5), + faker.string.alphanumeric(5), + ]; + address.state = faker.location.state(); + return address; +} + +export async function pullComment() { + const comment = new Comments(); + comment.text = faker.lorem.paragraph(faker.number.int(5)); + comment.kind = CommentKind.Comment; + return comment; +} + +export async function pullNote() { + const note = new Notes(); + note.text = faker.lorem.paragraph(faker.number.int(5)); + return note; +} + +export async function pullRole() { + const role = new Roles(); + role.key = faker.string.alphanumeric(5); + role.name = faker.word.words(); + return role; +} + +export async function pullUser() { + const user = new Users(); + user.firstName = faker.person.firstName(); + user.lastName = faker.person.lastName(); + user.isActive = faker.datatype.boolean(); + user.login = faker.internet.userName({ + lastName: user.lastName, + firstName: user.firstName, + }); + user.testReal = [faker.number.float({ fractionDigits: 4 })]; + user.testArrayNull = null; + + user.testDate = faker.date.anytime(); + + return user; +} + +export async function pullUserGroup() { + const userGroup = new UserGroups(); + userGroup.label = faker.string.alphanumeric(5); + return userGroup; +} + +export async function pullAllData(em: EntityManager) { + const user = await pullUser(); + + const address1 = await pullAddress(); + const address2 = await pullAddress(); + + const note1 = await pullNote(); + const note2 = await pullNote(); + const note3 = await pullNote(); + + const comment1 = await pullComment(); + const comment2 = await pullComment(); + const comment3 = await pullComment(); + const comment4 = await pullComment(); + + const userGroup1 = await pullUserGroup(); + const userGroup2 = await pullUserGroup(); + const userGroup3 = await pullUserGroup(); + + const role1 = await pullRole(); + const role2 = await pullRole(); + const role3 = await pullRole(); + + const roleX1 = await pullRole(); + const roleX2 = await pullRole(); + const roleX3 = await pullRole(); + + const managerUser = await pullUser(); + + user.addresses = address1; + address1.user = user; + user.notes.add(note1, note2, note3); + user.comments.add(comment1, comment2, comment3, comment4); + user.userGroup = userGroup1; + user.roles.add(roleX1, roleX2, roleX3); + user.manager = managerUser; + + managerUser.addresses = address2; + managerUser.userGroup = userGroup3; + managerUser.roles.add(role1, role2); + + await em.persistAndFlush([ + user, + address1, + address2, + note1, + note2, + note3, + comment1, + comment2, + comment3, + comment4, + userGroup1, + userGroup2, + userGroup3, + role1, + role2, + role3, + roleX1, + roleX2, + roleX3, + managerUser, + ]); + + await em.flush(); + + return user; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts new file mode 100644 index 00000000..c47befd4 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.spec.ts @@ -0,0 +1,186 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MetadataStorage, MikroORM } from '@mikro-orm/core'; + +import { + Users, + Addresses, + Notes, + Roles, + dbRandomName, + mockDbPgLiteTestModule, + Comments, + UserGroups, +} from '../mock-utils'; +import { + CurrentMicroOrmProvider, + CurrentEntityManager, + CurrentEntityMetadata, +} from '../factory'; + +import { DEFAULT_ARRAY_TYPE, ENTITY_METADATA_TOKEN } from '../constants'; + +import { TypeField } from '@klerick/json-api-nestjs'; + +import { + getProps, + getPropsType, + getPropsNullable, + getPrimaryColumnName, + getPrimaryColumnType, + getRelation, + getRelationProperty, + getArrayType, +} from './index'; + +describe('microorm-orm-helper-for-map', () => { + let entityMetadataToken: MetadataStorage; + let mikroORM: MikroORM; + let dbName: string; + const config = DEFAULT_ARRAY_TYPE; + beforeAll(async () => { + dbName = dbRandomName(true); + const module: TestingModule = await Test.createTestingModule({ + imports: [mockDbPgLiteTestModule(dbName)], + providers: [ + CurrentMicroOrmProvider(), + CurrentEntityManager(), + CurrentEntityMetadata(), + ], + }).compile(); + + entityMetadataToken = module.get(ENTITY_METADATA_TOKEN); + + mikroORM = module.get(MikroORM); + }); + + afterAll(() => { + mikroORM.close(true); + }); + + it('getProps', () => { + const result = getProps(entityMetadataToken.get(Users)); + expect(result.includes('id')).toBe(true); + expect(result.includes('lastName')).toBe(true); + expect(result.includes('createdAt')).toBe(true); + expect(result.includes('updatedAt')).toBe(true); + expect(result.includes('isActive')).toBe(true); + expect(result.includes('login')).toBe(true); + expect(result.includes('firstName')).toBe(true); + expect(result.includes('testReal')).toBe(true); + expect(result.includes('testArrayNull')).toBe(true); + expect(result.includes('testDate')).toBe(true); + + expect(result.includes('userGroup' as any)).toBe(false); + expect(result.includes('notes' as any)).toBe(false); + expect(result.includes('comments' as any)).toBe(false); + expect(result.includes('roles' as any)).toBe(false); + expect(result.includes('manager' as any)).toBe(false); + expect(result.includes('addresses' as any)).toBe(false); + }); + + it('getPropsType', () => { + const result = getPropsType(entityMetadataToken.get(Users), config); + + expect(result).toEqual({ + createdAt: 'date', + firstName: 'string', + id: 'number', + isActive: 'boolean', + lastName: 'string', + login: 'string', + testArrayNull: 'array', + testDate: 'date', + testReal: 'array', + updatedAt: 'date', + }); + }); + + it('getPropsNullable', () => { + const result = getPropsNullable(entityMetadataToken.get(Users)); + expect(result).toEqual([ + 'firstName', + 'testReal', + 'testArrayNull', + 'lastName', + 'isActive', + 'testDate', + 'createdAt', + 'updatedAt', + ]); + }); + + it('getPrimaryColumnName', () => { + const result = getPrimaryColumnName(entityMetadataToken.get(Users)); + expect(result).toBe('id'); + }); + + it('getPrimaryColumnType', () => { + const result = getPrimaryColumnType(entityMetadataToken.get(Users)); + expect(result).toBe(TypeField.number); + }); + + it('getArrayType', () => { + const result = getArrayType(entityMetadataToken.get(Users)); + expect(result).toEqual({ + testReal: TypeField.number, + testArrayNull: TypeField.number, + }); + }); + + it('getRelation', () => { + const result = getRelation(entityMetadataToken.get(Users)); + expect(result.includes('id' as any)).toBe(false); + expect(result.includes('lastName' as any)).toBe(false); + expect(result.includes('createdAt' as any)).toBe(false); + expect(result.includes('updatedAt' as any)).toBe(false); + expect(result.includes('isActive' as any)).toBe(false); + expect(result.includes('login' as any)).toBe(false); + expect(result.includes('firstName' as any)).toBe(false); + expect(result.includes('testReal' as any)).toBe(false); + expect(result.includes('testArrayNull' as any)).toBe(false); + expect(result.includes('testDate' as any)).toBe(false); + + expect(result.includes('userGroup')).toBe(true); + expect(result.includes('notes')).toBe(true); + expect(result.includes('comments')).toBe(true); + expect(result.includes('roles')).toBe(true); + expect(result.includes('manager')).toBe(true); + expect(result.includes('addresses')).toBe(true); + }); + + it('getRelationProperty', () => { + const result = getRelationProperty(entityMetadataToken.get(Users)); + expect(result).toEqual({ + addresses: { + entityClass: Addresses, + isArray: false, + nullable: true, + }, + comments: { + entityClass: Comments, + isArray: true, + nullable: false, + }, + manager: { + entityClass: Users, + isArray: false, + nullable: true, + }, + notes: { + entityClass: Notes, + isArray: true, + nullable: false, + }, + roles: { + entityClass: Roles, + isArray: true, + nullable: false, + }, + userGroup: { + entityClass: UserGroups, + isArray: false, + nullable: true, + }, + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts new file mode 100644 index 00000000..a90f35a1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-helper/index.ts @@ -0,0 +1,185 @@ +import { EntityKey, EntityMetadata } from '@mikro-orm/core'; +import { + EntityParam, + TypeField, + PrepareParams, +} from '@klerick/json-api-nestjs'; +import { MicroOrmParam } from '../type'; +import { DEFAULT_ARRAY_TYPE } from '../constants'; + +export const getRelation = ( + entityMetadata: EntityMetadata +) => + entityMetadata.relations.map( + (i) => i.name + ) as unknown as EntityParam['relations']; + +export const getProps = ( + entityMetadata: EntityMetadata +): EntityParam['props'] => { + const relations = getRelation(entityMetadata) as any; + + return entityMetadata.props + .map((i) => i.name) + .filter( + (i) => !relations.includes(i) + ) as unknown as EntityParam['props']; +}; + +export const getPropsType = ( + entityMetadata: EntityMetadata, + config: PrepareParams['options']['arrayType'] = DEFAULT_ARRAY_TYPE +): EntityParam['propsType'] => { + const field = getProps(entityMetadata); + + const result = {} as any; + for (const item of field) { + const props = + entityMetadata.properties[item as unknown as EntityKey]; + + let typeProps: TypeField = TypeField.string; + if (config.includes(props['type'])) { + result[item] = TypeField.array; + continue; + } + + switch (props.runtimeType) { + case 'Date': + typeProps = TypeField.date; + break; + case 'number': + typeProps = TypeField.number; + break; + case 'boolean': + typeProps = TypeField.boolean; + break; + case 'object': + typeProps = TypeField.object; + break; + default: + typeProps = TypeField.string; + } + result[item] = typeProps; + } + + return result; +}; + +export const getPropsNullable = ( + entityMetadata: EntityMetadata +): EntityParam['propsNullable'] => { + return getProps(entityMetadata) + .map((i) => { + // @ts-ignore + const props = entityMetadata.properties[i]; + return props.nullable || props.default !== undefined ? i : false; + }) + .filter((i) => !!i) as unknown as EntityParam['propsNullable']; +}; + +export const getPrimaryColumnName = ( + entityMetadata: EntityMetadata +) => + entityMetadata + .getPrimaryProp() + .name.toString() as EntityParam['primaryColumnName']; + +export const getPrimaryColumnType = ( + entityMetadata: EntityMetadata +): EntityParam['primaryColumnType'] => { + return ( + entityMetadata.getPrimaryProp().runtimeType === 'number' + ? TypeField.number + : TypeField.string + ) as EntityParam['primaryColumnType']; +}; + +export const getRelationProperty = ( + entityMetadata: EntityMetadata +): EntityParam['relationProperty'] => { + return entityMetadata.relations.reduce((acum, item) => { + // @ts-expect-error its dynamic creater + acum[item.name] = { + entityClass: item.entity() as any, + nullable: + item.kind === 'm:n' || item.kind === '1:m' + ? false + : (!!item.nullable as any), + isArray: item.kind === 'm:n' || item.kind === ('1:m' as any), + }; + + return acum; + }, {} as EntityParam['relationProperty']); +}; + +export const getArrayType = ( + repository: EntityMetadata, + config: PrepareParams['options']['arrayType'] = DEFAULT_ARRAY_TYPE +): EntityParam['propsArrayType'] => { + return Object.entries(getPropsType(repository, config)) + .filter(([name, type]) => type === TypeField.array) + .reduce((acum, [name]) => { + const fieldType = Reflect.get(repository.properties, name) + .columnTypes.at(0) + ?.replace('[]', ''); + + if (!fieldType) { + throw new Error('Metadata not found for field ' + name); + } + + switch (fieldType) { + case 'number': + case 'bigint': + case 'smallint': + case 'smalldecimal': + case 'decimal': + case 'double': + case 'tinyint': + case 'mediumint': + case 'int': + case 'float': + case 'dec': + case 'fixed': + case 'numeric': + case 'real': + case 'int2': + case 'int4': + case 'int8': + case 'integer': + acum[name] = TypeField.number; + break; + case 'character varying': + case 'varying character': + case 'char varying': + case 'nvarchar': + case 'national varchar': + case 'character': + case 'native character': + case 'varchar': + case 'char': + case 'nchar': + case 'national char': + case 'varchar2': + case 'nvarchar2': + case 'alphanum': + case 'shorttext': + case 'raw': + case 'binary': + case 'varbinary': + case 'string': + acum[name] = TypeField.string; + break; + case 'date': + case 'timetz': + case 'timestamptz': + case 'timestamp with local time zone': + case 'smalldatetime': + acum[name] = TypeField.date; + break; + case 'boolean': + acum[name] = TypeField.boolean; + } + + return acum; + }, {} as any); +}; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts new file mode 100644 index 00000000..46b6676d --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.spec.ts @@ -0,0 +1,58 @@ +import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { + dbRandomName, + getModuleForPgLite, + pullData, + Users, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; +import { deleteOne } from './delete-one'; + +describe('delete-one', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('Delete one item', async () => { + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .limit(1) + .execute('get', true); + + await deleteOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, checkData.id); + + const result = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: checkData.id, + }) + .execute('get', true); + + expect(result).toBe(null); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts new file mode 100644 index 00000000..950f56cc --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-one/delete-one.ts @@ -0,0 +1,19 @@ +import { MicroOrmService } from '../../service'; + +export async function deleteOne( + this: MicroOrmService, + id: number | string +): Promise { + const data = await this.microOrmUtilService + .queryBuilder() + .where({ + [this.microOrmUtilService.currentPrimaryColumn]: id, + }) + .getSingleResult(); + + if (!data) return void 0; + + await this.microOrmUtilService.entityManager.removeAndFlush(data); + + return void 0; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts new file mode 100644 index 00000000..fb8bd829 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.spec.ts @@ -0,0 +1,205 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { deleteRelationship } from './delete-relationship'; + +describe('delete-relationship', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addressForTest: Addresses; + let addresses: Addresses; + let userGroup: UserGroups | null; + let notes: Collection; + let roles: Collection; + let comments: Collection; + let tmpUserObject: Users | undefined = undefined; + let userObject: Users; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + const data = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) + .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + roles: { + $exists: true, + }, + userGroup: { + $exists: true, + }, + }) + .limit(1) + .getSingleResult(); + + if (!data) throw new Error(); + + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = + data); + userObject = tmpUserObject as any; + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('should be ok', async () => { + const saveCount = roles.length; + const [roles1, roles2] = roles; + await deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'roles', [ + { type: 'roles', id: roles1.id.toString() }, + ]); + + await deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'userGroup', { + type: 'user-groups', + id: userGroup?.id.toString(), + } as any); + + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + id: userObject.id, + }) + .getSingleResult(); + + expect(checkData?.roles.length).toBe(saveCount - 1); + expect(checkData?.roles.map((i) => i.id)).not.toContain(roles1.id); + expect(checkData?.userGroup).toBe(null); + }); + + it('should be error', async () => { + await expect( + deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'roles', { + type: 'roles', + id: '1000', + }) + ).rejects.toThrow(); + + await expect( + deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'roles', [ + { + type: 'roles', + id: '1000', + }, + ]) + ).rejects.toThrow(); + + await expect( + deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'userGroup', [ + { + type: 'user-groups', + id: '10000', + }, + ]) + ).rejects.toThrow(); + await expect( + deleteRelationship.call< + MicroOrmService, + Parameters< + typeof deleteRelationship> + >, + ReturnType< + typeof deleteRelationship> + > + >(microOrmServiceUser, userObject.id, 'userGroup', { + type: 'user-groups', + id: '10000', + }) + ).rejects.toThrow(); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts new file mode 100644 index 00000000..a61f54c4 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/delete-relationship/delete-relationship.ts @@ -0,0 +1,62 @@ +import { NotFoundException } from '@nestjs/common'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + ValidateQueryError, + PostRelationshipData, +} from '@klerick/json-api-nestjs'; + +import { MicroOrmService } from '../../service'; + +export async function deleteRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: MicroOrmService, + id: number | string, + rel: Rel, + input: PostRelationshipData +): Promise { + const idsResult = await this.microOrmUtilService.validateRelationInputData( + rel as any, + input + ); + const currentEntityRef = await this.microOrmUtilService + .queryBuilder() + .where({ + [this.microOrmUtilService.currentPrimaryColumn]: id, + }) + .getSingleResult(); + + if (!currentEntityRef) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, + path: ['fields'], + }; + throw new NotFoundException([error]); + } + + await this.microOrmUtilService.entityManager.populate(currentEntityRef, [ + rel as any, + ]); + + if (Array.isArray(idsResult)) { + const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); + const relRef = idsResult.map((i) => + this.microOrmUtilService.entityManager.getReference(relEntity, i as any) + ); + (currentEntityRef[rel] as any).remove(...relRef); + } else { + if ( + // @ts-ignore + currentEntityRef[rel][this.microOrmUtilService.getPrimaryNameFor(rel)] == + idsResult + ) { + // @ts-ignore + currentEntityRef[rel] = null; + } + } + + await this.microOrmUtilService.entityManager.flush(); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts new file mode 100644 index 00000000..0ef0c9bc --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts @@ -0,0 +1,954 @@ +import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { + Addresses, + dbRandomName, + getDefaultQuery, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { getAll } from './get-all'; + +describe('get-all', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + describe('page', () => { + it('default', async () => { + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + + const checkData = await queryBuilder.clone().limit(1).getResult(); + + const count = await queryBuilder.clone().count(); + const query = getDefaultQuery(); + + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('not default page', async () => { + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + + const checkData = await queryBuilder.clone().limit(5, 5).getResult(); + const count = await queryBuilder.clone().count(); + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 2, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + }); + + describe('order', () => { + it('sort target', async () => { + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + const checkData = await queryBuilder + .clone() + .orderBy({ + lastName: 'DESC', + }) + .limit(5, 5) + .getResult(); + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.sort = { + target: { + lastName: 'DESC', + }, + }; + query.page = { + size: 5, + number: 2, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('sort relation 1:1', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder() + .select(['id', 'login', 'firstName', 'lastName']) + .leftJoinAndSelect('Users.addresses', 'Addresses__addresses', {}, [ + 'state', + ]); + + const checkData = await queryBuilder + .clone() + .orderBy({ + addresses: { + state: 'ASC', + id: 'ASC', + }, + }) + .limit(5, 5) + .getResult(); + + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.fields = { + target: ['login', 'firstName', 'lastName'], + addresses: ['state'], + }; + + query.sort = { + addresses: { + state: 'ASC', + id: 'ASC', + }, + }; + query.page = { + size: 5, + number: 2, + }; + + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('sort relation m:m', async () => { + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + const checkData = await queryBuilder + .clone() + .orderBy({ + roles: { + name: 'DESC', + }, + id: 'ASC', + }) + .limit(5, 5) + .getResult(); + + const count = await queryBuilder + .clone() + .leftJoin('Users.roles', 'Roles__roles') + .distinct() + .count(); + + const query = getDefaultQuery(); + query.sort = { + roles: { + name: 'DESC', + }, + }; + query.page = { + size: 5, + number: 2, + }; + + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + }); + + describe('select', () => { + it('default', async () => { + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + const checkData = await queryBuilder.clone().limit(5).getResult(); + const count = await queryBuilder.clone().count(); + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('target select field', async () => { + const select: ['login', 'firstName', 'lastName'] = [ + 'login', + 'firstName', + 'lastName', + ]; + const queryBuilder = + microOrmServiceUser.microOrmUtilService.queryBuilder(); + const checkData = await queryBuilder + .clone() + .select(['id', ...select]) + .limit(5) + .getResult(); + const count = await queryBuilder.clone().count(); + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.fields = { + target: select, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('relation select field', async () => { + const select: ['login', 'firstName', 'lastName'] = [ + 'login', + 'firstName', + 'lastName', + ]; + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .select(['id', ...select]) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, [ + 'city', + 'state', + ]) + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['name', 'key']); + const checkData = await queryBuilder.clone().limit(5).getResult(); + const count = await queryBuilder.clone().count().distinct(); + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.fields = { + target: select, + addresses: ['city', 'state'], + roles: ['name', 'key'], + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + }); + + describe('include', () => { + it('default', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .leftJoinAndSelect('Users.roles', 'Roles__roles'); + + const checkData = await queryBuilder.clone().limit(5).getResult(); + const count = await queryBuilder.clone().count().distinct(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.include = ['roles']; + + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('include with select', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.addresses', 'Addresses__addresses', {}, [ + 'city', + 'state', + ]); + + const checkData = await queryBuilder.clone().limit(5).getResult(); + const count = await queryBuilder.clone().count().distinct(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.include = ['roles']; + query.fields = { + addresses: ['city', 'state'], + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + }); + + describe('filter', () => { + let rolesData: Roles[]; + let addresses: Addresses[]; + let userGroups: UserGroups[]; + let users: Users[]; + let notes: Notes[]; + beforeAll(async () => { + rolesData = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Roles) + .getResult(); + addresses = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Addresses) + .getResult(); + + userGroups = await microOrmServiceUser.microOrmUtilService + .queryBuilder(UserGroups) + .getResult(); + users = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .getResult(); + notes = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Notes) + .getResult(); + }); + + describe('target', () => { + it('simple filter on target', async () => { + const randUsers = faker.helpers.arrayElements(users); + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + login: { + $in: randUsers.map((i) => i.login), + }, + }); + + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + login: 'DESC', + }) + .getResult(); + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + target: { + login: { + in: randUsers.map((i) => i.login) as [string, ...string[]], + }, + }, + }; + query.sort = { + target: { + login: 'DESC', + }, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('Target relation is null 1:1', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + manager: { + $exists: false, + }, + }); + + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + manager: { + login: 'DESC', + }, + }) + .getResult(); + const count = await queryBuilder.clone().count(); + + const queryBuilder2 = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + addresses: { + $exists: true, + }, + }); + + const checkData2 = await queryBuilder2 + .clone() + .limit(5) + .orderBy({ + addresses: { + city: 'DESC', + }, + }) + .getResult(); + const count2 = await queryBuilder2.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + target: { + manager: { + eq: 'null', + }, + }, + }; + query.sort = { + manager: { + login: 'DESC', + }, + }; + + const query2 = getDefaultQuery(); + query2.page = { + size: 5, + number: 1, + }; + query2.filter = { + target: { + addresses: { + ne: 'null', + }, + }, + }; + query2.sort = { + addresses: { + city: 'DESC', + }, + }; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + + const { totalItems: totalItems2, items: items2 } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query2); + + expect(totalItems2).toBe(count2); + expect(JSON.stringify(items2)).toBe(JSON.stringify(checkData2)); + }); + + it('Target relation is null m:1 & 1:m', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + userGroup: { + $exists: false, + }, + }); + + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + login: 'DESC', + }) + .getResult(); + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + target: { + userGroup: { + eq: 'null', + }, + }, + }; + query.sort = { + target: { + login: 'DESC', + }, + }; + + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + + const checkData2 = await queryBuilder + .clone() + .limit(5) + .orderBy({ + userGroup: { + label: 'DESC', + }, + }) + .getResult(); + + const count2 = await queryBuilder.clone().count(); + + const query2 = getDefaultQuery(); + query2.page = { + size: 5, + number: 1, + }; + query2.filter = { + target: { + userGroup: { + eq: 'null', + }, + }, + }; + query2.sort = { + userGroup: { + label: 'DESC', + }, + }; + + const { totalItems: totalItems2, items: items2 } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query2); + + expect(totalItems2).toBe(count2); + expect(JSON.stringify(items2)).toBe(JSON.stringify(checkData2)); + + const queryBuilder2 = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + notes: { + $exists: true, + }, + }); + const checkData3 = await queryBuilder2 + .clone() + .limit(5) + .orderBy({ + notes: { + id: 'DESC', + }, + }) + .getResult(); + + const count3 = await queryBuilder2.clone().count().distinct(); + + const query3 = getDefaultQuery(); + query3.page = { + size: 5, + number: 1, + }; + query3.filter = { + target: { + notes: { + ne: 'null', + }, + }, + }; + query3.sort = { + notes: { + id: 'DESC', + }, + }; + + const { totalItems: totalItems3, items: items3 } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query3); + expect(totalItems3).toBe(count3); + expect(JSON.stringify(items3)).toBe(JSON.stringify(checkData3)); + + const checkData4 = await queryBuilder2 + .clone() + .limit(5) + .orderBy({ id: 'DESC' }) + .getResult(); + const count4 = await queryBuilder2.clone().count().distinct(); + + const query4 = getDefaultQuery(); + query4.page = { + size: 5, + number: 1, + }; + query4.filter = { + target: { + notes: { + ne: 'null', + }, + }, + }; + query4.sort = { + target: { + id: 'DESC', + }, + }; + + const { totalItems: totalItems4, items: items4 } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query4); + expect(totalItems4).toBe(count4); + expect(JSON.stringify(items4)).toBe(JSON.stringify(checkData4)); + }); + + it('Target relation is null m:m', async () => { + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + roles: { + $exists: false, + }, + }); + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + manager: { + login: 'DESC', + }, + }) + .getResult(); + + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + target: { + roles: { + eq: 'null', + }, + }, + }; + query.sort = { + manager: { + login: 'DESC', + }, + }; + const { totalItems: totalItems, items: items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + + const queryBuilder1 = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + roles: { + $exists: true, + }, + }); + + const checkData1 = await queryBuilder1 + .clone() + .limit(5) + .orderBy({ + roles: { + key: 'DESC', + }, + }) + .getResult(); + + const count1 = await queryBuilder1.clone().count().distinct(); + + const query1 = getDefaultQuery(); + query1.page = { + size: 5, + number: 1, + }; + query1.filter = { + target: { + roles: { + ne: 'null', + }, + }, + }; + query1.sort = { + roles: { + key: 'DESC', + }, + }; + const { totalItems: totalItems1, items: items1 } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query1); + + expect(totalItems1).toBe(count1); + expect(JSON.stringify(items1)).toBe(JSON.stringify(checkData1)); + }); + }); + + describe('relation', () => { + it('relation 1:1', async () => { + const randAddresses = faker.helpers.arrayElements(addresses); + + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .where({ + addresses: { + id: { + $in: randAddresses.map((i) => i.id), + }, + }, + }) + .joinAndSelect('Users.addresses', 'Addresses'); + + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + addresses: { + city: 'DESC', + }, + }) + .getResult(); + + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + relation: { + addresses: { + id: { + in: randAddresses.map((i) => `${i.id}`) as [ + string, + ...string[] + ], + }, + }, + }, + }; + query.sort = { + addresses: { + city: 'DESC', + }, + }; + query.include = ['addresses']; + const { totalItems: totalItems, items: items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('relation 1:m', async () => { + const randNotes = faker.helpers.arrayElements(notes, 3); + + const quweryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .leftJoinAndSelect('Users.notes', 'Notes', { + id: { $in: randNotes.map((i) => i.id) }, + }) + .where({ + notes: { + id: { + $in: randNotes.map((i) => i.id), + }, + }, + }); + const checkData = await quweryBuilder + .clone() + .limit(5) + .orderBy({ + addresses: { + city: 'DESC', + }, + }) + .getResult(); + const count = await quweryBuilder.clone().count(); + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + relation: { + notes: { + id: { + in: randNotes.map((i) => `${i.id}`) as [string, ...string[]], + }, + }, + }, + }; + query.sort = { + addresses: { + city: 'DESC', + }, + }; + query.include = ['notes']; + const { totalItems: totalItems, items: items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + + it('relation m:m', async () => { + const randRoles = faker.helpers.arrayElements(rolesData, 3); + + const queryBuilder = microOrmServiceUser.microOrmUtilService + .queryBuilder('Users') + .leftJoinAndSelect('Users.roles', 'Roles__roles', { + key: randRoles[0].key, + }) + .where({ + roles: { + key: { + $eq: randRoles[0].key, + }, + }, + }); + const checkData = await queryBuilder + .clone() + .limit(5) + .orderBy({ + addresses: { + city: 'DESC', + }, + }) + .getResult(); + + const count = await queryBuilder.clone().count(); + + const query = getDefaultQuery(); + query.page = { + size: 5, + number: 1, + }; + query.filter = { + relation: { + roles: { + key: { + eq: `${randRoles[0].key}`, + }, + }, + }, + }; + query.sort = { + addresses: { + city: 'DESC', + }, + }; + + query.include = ['roles']; + + const { totalItems: totalItems, items: items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, query); + + expect(totalItems).toBe(count); + expect(JSON.stringify(items)).toBe(JSON.stringify(checkData)); + }); + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts new file mode 100644 index 00000000..4eda6378 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.ts @@ -0,0 +1,90 @@ +import { QueryFlag, wrap } from '@mikro-orm/core'; +import { Query } from '@klerick/json-api-nestjs'; +import { MicroOrmService } from '../../service'; + +import { getQueryForCount, getSortObject } from './get-query-for-count'; + +export async function getAll( + this: MicroOrmService, + query: Query +): Promise<{ + totalItems: number; + items: E[]; +}> { + const { page } = query; + const countSubQuery = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, ...[query]); + + const skip = (page.number - 1) * page.size; + const paginationQuery = countSubQuery + .clone() + .select(this.microOrmUtilService.currentPrimaryColumn) + .limit(page.size, skip); + + const collectIdsAlias = 'CollectIds'; + + const queryIdsQuery = this.microOrmUtilService + .queryBuilder(collectIdsAlias) + .select(this.microOrmUtilService.currentPrimaryColumn) + .join(paginationQuery, this.microOrmUtilService.currentAlias, { + [`${collectIdsAlias}.${this.microOrmUtilService.currentPrimaryColumn}`]: + this.microOrmUtilService + .getKnex() + .ref( + `${this.microOrmUtilService.currentAlias}.${this.microOrmUtilService.currentPrimaryColumn}` + ), + }); + + const queryCount = this.microOrmUtilService + .queryBuilder() + .from( + countSubQuery + .clone() + .select(this.microOrmUtilService.currentPrimaryColumn) + ) + .count(this.microOrmUtilService.currentPrimaryColumn, true); + + const resCount = await queryCount.execute('get'); + const count = resCount ? +resCount.count : 0; + + if (count === 0) { + return { + totalItems: count, + items: [], + }; + } + + const resIds = await queryIdsQuery + .distinct() + .setFlag(QueryFlag.DISABLE_PAGINATE) + .execute('all'); + + const idsArray = resIds.map( + (r) => r[this.microOrmUtilService.currentPrimaryColumn] + ); + const resultQueryBuilder = this.microOrmUtilService.queryBuilder().where({ + [this.microOrmUtilService.currentPrimaryColumn]: { + $in: idsArray, + }, + }); + + const sortObject = getSortObject(query); + const resultList = await this.microOrmUtilService + .prePareQueryBuilder(resultQueryBuilder, query as any) + .orderBy( + Object.keys(sortObject).length > 0 + ? sortObject + : { + [this.microOrmUtilService.currentPrimaryColumn]: 'ASC', + } + ) + .getResult(); + + return { + totalItems: count, + items: resultList.map((i) => wrap(i).toJSON() as E), + }; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts new file mode 100644 index 00000000..5fd1e311 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.spec.ts @@ -0,0 +1,240 @@ +import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { + UserGroups, + Users, + pullAllData, + getDefaultQuery, + dbRandomName, + getModuleForPgLite, +} from '../../mock-utils'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { getQueryForCount } from './get-query-for-count'; +import { MicroOrmService } from '../../service'; + +describe('get-query-for-count', () => { + let mikroORMUserGroup: MikroORM; + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + beforeAll(async () => { + dbName = dbRandomName(true); + const moduleUserGroup = await getModuleForPgLite(UserGroups, dbName); + + mikroORMUserGroup = moduleUserGroup.get(MikroORM); + + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUserGroup.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullAllData(em); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUserGroup.close(true); + mikroORMUsers.close(true); + }); + + it('has only sort data', () => { + const query = getDefaultQuery(); + query.sort = { + target: { + id: 'ASC', + lastName: 'DESC', + }, + userGroup: { + id: 'ASC', + }, + roles: { + name: 'DESC', + }, + }; + + const result = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query]); + + expect(result.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" left join "public"."users_have_roles" as "u2" on "Users"."id" = "u2"."user_id" left join "public"."roles" as "u1" on "u2"."role_id" = "u1"."id" order by "Users"."id" asc, "Users"."last_name" desc, "Users"."user_groups_id" asc, "u1"."name" desc` + ); + }); + + it('has only filter data', () => { + const query = getDefaultQuery(); + query.filter = { + target: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + testReal: { + [FilterOperand.some]: ['test'], + }, + }, + } as any; + + const query1 = getDefaultQuery(); + query1.filter = { + target: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + }, + relation: { + comments: { + kind: { + [FilterOperand.eq]: 'COMMENT', + }, + }, + userGroup: { + label: { + [FilterOperand.eq]: 'test', + }, + }, + }, + } as any; + + const query2 = getDefaultQuery(); + query2.filter = { + target: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + }, + relation: { + manager: { + login: { + [FilterOperand.eq]: 'test', + }, + }, + addresses: { + city: { + [FilterOperand.eq]: 'test', + }, + }, + }, + } as any; + + const query3 = getDefaultQuery(); + query3.filter = { + target: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + }, + relation: { + roles: { + key: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isDefault: { + [FilterOperand.eq]: 'false', + }, + }, + }, + }; + + const result = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query]); + + expect(result.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and "Users"."test_real" && '{test}' order by "Users"."id" asc` + ); + + const result1 = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query1]); + + expect(result1.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and (exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id" and "Comments"."kind" = 'COMMENT')) and (exists (select 1 from "public"."user_groups" as "UserGroups" where "UserGroups"."id" = "Users"."user_groups_id" and "UserGroups"."label" = 'test')) order by "Users"."id" asc` + ); + + const result2 = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query2]); + expect(result2.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" left join "public"."users" as "u1" on "Users"."manager_id" = "u1"."id" left join "public"."addresses" as "a2" on "Users"."addresses_id" = "a2"."id" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and "u1"."login" = 'test' and "a2"."city" = 'test' order by "Users"."id" asc` + ); + + const result3 = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query3]); + expect(result3.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" where "Users"."login" = 'test' and "Users"."login" != 'test2' and "Users"."is_active" = 'false' and (exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."roles" as "r1" on "users_have_roles"."role_id" = "r1"."id" where "users_have_roles"."user_id" = "Users"."id" and "r1"."key" = 'test' and "r1"."key" != 'test2' and "r1"."is_default" = 'false')) order by "Users"."id" asc` + ); + }); + + it('has only filter data with sort', () => { + const query1 = getDefaultQuery(); + query1.filter = { + relation: { + roles: { + key: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isDefault: { + [FilterOperand.eq]: 'false', + }, + }, + }, + }; + query1.sort = { + target: { + id: 'ASC', + lastName: 'DESC', + }, + userGroup: { + id: 'ASC', + }, + roles: { + name: 'DESC', + }, + }; + + const result1 = getQueryForCount.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, ...[query1]); + expect(result1.getFormattedQuery()).toBe( + `select "Users".* from "public"."users" as "Users" left join "public"."users_have_roles" as "u2" on "Users"."id" = "u2"."user_id" left join "public"."roles" as "u1" on "u2"."role_id" = "u1"."id" where "u1"."key" = 'test' and "u1"."key" != 'test2' and "u1"."is_default" = 'false' order by "Users"."id" asc, "Users"."last_name" desc, "Users"."user_groups_id" asc, "u1"."name" desc` + ); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts new file mode 100644 index 00000000..fca707a5 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-query-for-count.ts @@ -0,0 +1,59 @@ +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { Query } from '@klerick/json-api-nestjs'; +import type { QBQueryOrderMap, EntityKey } from '@mikro-orm/core'; + +import { MicroOrmService } from '../../service'; + +export function getSortObject( + query: Query +): QBQueryOrderMap { + const { sort } = query; + const sortObject: QBQueryOrderMap = {}; + if (!sort) return sortObject; + + const { target = {}, ...relation } = sort as any; + for (const [filed, sortType] of ObjectTyped.entries(target)) { + Reflect.set(sortObject, filed, sortType); + } + + for (const [relationName, orderConfig = {}] of ObjectTyped.entries( + relation + )) { + const name = relationName as unknown as EntityKey; + sortObject[name] = {}; + for (const [field, sortType] of ObjectTyped.entries(orderConfig)) { + sortObject[name][field] = sortType; + } + } + return sortObject; +} + +export function getQueryForCount( + this: MicroOrmService, + query: Query +) { + const querySelect = this.microOrmUtilService.queryBuilder(); + const sortObject = getSortObject(query); + querySelect.orderBy( + Object.keys(sortObject).length > 0 + ? sortObject + : { + [this.microOrmUtilService.currentPrimaryColumn]: 'ASC', + } + ); + + const expressionArrayForTarget = + this.microOrmUtilService.getFilterExpressionForTarget(query as any); + const expressionArrayForRelation = + this.microOrmUtilService.getFilterExpressionForRelation(query as any); + + const resultExpression = [ + ...expressionArrayForTarget, + ...expressionArrayForRelation, + ]; + for (const expression of resultExpression) { + querySelect.andWhere(expression); + } + + return querySelect; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts new file mode 100644 index 00000000..7aa063b9 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.spec.ts @@ -0,0 +1,99 @@ +import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { + dbRandomName, + getDefaultQuery, + getModuleForPgLite, + pullData, + Users, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { getOne } from './get-one'; +import { NotFoundException } from '@nestjs/common'; + +describe('get-one', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('Get one item', async () => { + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .limit(1) + .getSingleResult(); + const query = getDefaultQuery(); + if (!checkData) throw new Error('Result is null'); + const result = await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, checkData.id, query); + + expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); + }); + + it('Get one item with select', async () => { + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .select(['id', 'firstName', 'isActive']) + .leftJoinAndSelect('Users.addresses', 'Addresses__addresses') + .leftJoinAndSelect('Users.comments', 'Comments__comments', {}, ['text']) + .leftJoinAndSelect('Users.manager', 'Users__manager', {}, ['login']) + .where({ + comments: { + $exists: true, + }, + }) + .limit(1) + .getSingleResult(); + if (!checkData) throw new Error('Result is null'); + const query = getDefaultQuery(); + query.include = ['addresses', 'comments', 'manager']; + query.fields = { + target: ['firstName', 'isActive'], + comments: ['text'], + manager: ['login'], + }; + const result = await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, checkData.id, query); + + expect(JSON.stringify(result)).toBe(JSON.stringify(checkData)); + }); + it('Should be error', async () => { + expect.assertions(1); + const query = getDefaultQuery(); + try { + await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, 1000, query); + } catch (e) { + expect(e).toBeInstanceOf(NotFoundException); + } + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts new file mode 100644 index 00000000..f2c1e00c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-one/get-one.ts @@ -0,0 +1,29 @@ +import { NotFoundException } from '@nestjs/common'; +import { QueryOne, ValidateQueryError } from '@klerick/json-api-nestjs'; +import { wrap } from '@mikro-orm/core'; +import { MicroOrmService } from '../../service'; + +export async function getOne( + this: MicroOrmService, + id: number | string, + query: QueryOne +): Promise { + const queryBuilder = this.microOrmUtilService.queryBuilder().where({ + [this.microOrmUtilService.currentPrimaryColumn]: id, + }); + + const resultItem = await this.microOrmUtilService + .prePareQueryBuilder(queryBuilder, query as any) + .getSingleResult(); + + if (!resultItem) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, + path: ['fields'], + }; + throw new NotFoundException([error]); + } + + return wrap(resultItem).toJSON() as E; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts new file mode 100644 index 00000000..8cfb373f --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.spec.ts @@ -0,0 +1,149 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { NotFoundException } from '@nestjs/common'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; + +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { getRelationship } from './get-relationship'; + +describe('get-relationship', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addressForTest: Addresses; + let addresses: Addresses; + let userGroup: UserGroups | null; + let notes: Collection; + let roles: Collection; + let comments: Collection; + let userObject: Users; + let tmpUserObject: Users | undefined = undefined; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + const data = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) + .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + addresses: { + $exists: true, + }, + roles: { + $exists: true, + }, + userGroup: { + $exists: true, + }, + }) + .getSingleResult(); + + if (!data) throw new Error(); + + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = + data); + userObject = tmpUserObject as any; + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('should be ger result', async () => { + const { addresses: addressesResult } = await getRelationship.call< + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> + >(microOrmServiceUser, userObject.id, 'addresses'); + + expect(addressesResult.id).toBe(addresses.id); + + const { userGroup: userGroupResult } = await getRelationship.call< + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> + >(microOrmServiceUser, userObject.id, 'userGroup'); + + expect(userGroupResult?.id).toBe(userGroup?.id); + + const { roles: rolesResult } = await getRelationship.call< + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType>> + >(microOrmServiceUser, userObject.id, 'roles'); + for (const i of roles.map((i) => i.id)) { + expect(rolesResult.map((i) => i.id)).toContain(i); + } + }); + + it('should be error', async () => { + await expect( + getRelationship.call< + MicroOrmService, + Parameters< + typeof getRelationship> + >, + ReturnType< + typeof getRelationship> + > + >(microOrmServiceUser, '20000', 'roles') + ).rejects.toThrow(NotFoundException); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts new file mode 100644 index 00000000..3f965b70 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-relationship/get-relationship.ts @@ -0,0 +1,36 @@ +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { NotFoundException } from '@nestjs/common'; +import { ValidateQueryError } from '@klerick/json-api-nestjs'; +import { serialize } from '@mikro-orm/core'; + +import { MicroOrmService } from '../../service'; + +export async function getRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>(this: MicroOrmService, id: number | string, rel: Rel): Promise { + const result = await this.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect( + `${this.microOrmUtilService.currentAlias}.${rel.toString()}`, + rel.toString(), + {}, + [this.microOrmUtilService.getPrimaryNameFor(rel as any)] + ) + .where({ + [this.microOrmUtilService.currentPrimaryColumn]: id, + }) + .getSingleResult(); + + if (!result) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, + path: ['fields'], + }; + throw new NotFoundException([error]); + } + + return serialize(result, { forceObject: true }) as unknown as E; +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts new file mode 100644 index 00000000..9c1365d1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/index.ts @@ -0,0 +1,9 @@ +export * from './get-all/get-all'; +export * from './get-one/get-one'; +export * from './delete-one/delete-one'; +export * from './post-one/post-one'; +export * from './patch-one/patch-one'; +export * from './get-relationship/get-relationship'; +export * from './delete-relationship/delete-relationship'; +export * from './post-relationship/post-relationship'; +export * from './patch-relationship/patch-relationship'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts new file mode 100644 index 00000000..539545d6 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.spec.ts @@ -0,0 +1,235 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { ORM_SERVICE, PatchData } from '@klerick/json-api-nestjs'; + +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { patchOne } from './patch-one'; + +import { + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; + +describe('patch-one', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addresses: Addresses; + let addressForTest: Addresses; + let userGroup: UserGroups | null; + let notes: Collection; + let roles: Collection; + let comments: Collection; + let userObject: Users; + let tmpUserObject: Users | undefined = undefined; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + const data = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) + .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + addresses: { + $exists: true, + }, + roles: { + $exists: true, + }, + notes: { + $exists: true, + }, + userGroup: { + $exists: true, + }, + comments: { + $exists: true, + }, + }) + .limit(1) + .execute('get', true); + + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = + data); + userObject = tmpUserObject as any; + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('should be update attr', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + const result = await patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, userObject.id, { + id: userObject.id.toString(), + attributes: otherAttr, + type: 'users', + }); + + const fromDb = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: userObject.id, + }) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') + .leftJoinAndSelect('Users.comments', 'Comments_comments') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.notes', 'Notes__notes') + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') + .limit(1) + .getSingleResult(); + + expect(result).toEqual(fromDb); + }); + + it('should be update relation', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + const setRoles = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Roles) + .limit(2, 5) + .getResult(); + + const patchData = { + id: userObject.id.toString(), + attributes: otherAttr, + type: 'users', + relationships: { + addresses: { + data: { + id: addressForTest.id.toString(), + type: 'addresses', + }, + }, + comments: { + data: [], + }, + userGroup: { + data: null, + }, + roles: { + data: setRoles.map((i) => ({ id: i.id.toString(), type: 'roles' })), + }, + }, + } satisfies PatchData; + + const result = await patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, userObject.id, patchData as any); + + const fromDb = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: userObject.id, + }) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') + .leftJoinAndSelect('Users.comments', 'Comments_comments') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.notes', 'Notes__notes') + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') + .limit(1) + .getSingleResult(); + + expect(result).toEqual(fromDb); + }); + + it('should be error', async () => { + await expect( + patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, 1, { + attributes: {}, + type: 'users', + } as any) + ).rejects.toThrow(UnprocessableEntityException); + + await expect( + patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, 10000, { + id: '10000', + attributes: {} as any, + type: 'users', + }) + ).rejects.toThrow(NotFoundException); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts new file mode 100644 index 00000000..ec92a9a3 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-one/patch-one.ts @@ -0,0 +1,51 @@ +import { + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; +import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { PatchData, ValidateQueryError } from '@klerick/json-api-nestjs'; +import { MicroOrmService } from '../../service'; + +export async function patchOne( + this: MicroOrmService, + id: number | string, + inputData: PatchData +): Promise { + const { id: idBody, attributes, relationships } = inputData; + + if (`${id}` !== idBody) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Data 'id' must be equal to url param`, + path: ['data', 'id'], + }; + + throw new UnprocessableEntityException([error]); + } + + const existEntity = await this.microOrmUtilService + .queryBuilder() + .where({ + [this.microOrmUtilService.currentPrimaryColumn]: id, + }) + .getSingleResult(); + + if (!existEntity) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + message: `Resource '${this.microOrmUtilService.currentAlias}' with id '${id}' does not exist`, + path: ['data', 'id'], + }; + throw new NotFoundException([error]); + } + + if (attributes) { + const attrTarget = this.microOrmUtilService.createEntity(attributes as any); + + for (const [props, val] of ObjectTyped.entries(attrTarget)) { + if (!(props in attributes)) continue; + Reflect.set(existEntity, props, val); + } + } + return this.microOrmUtilService.saveEntity(existEntity, relationships as any); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts new file mode 100644 index 00000000..32caa80c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.spec.ts @@ -0,0 +1,139 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { patchRelationship } from './patch-relationship'; + +describe('patch-relationship', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addressForTest: Addresses; + let addresses: Addresses; + let userGroup: UserGroups[]; + let notes: Collection; + let roles: Roles[]; + let comments: Collection; + let userObject: Users; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + userObject = (await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .limit(1) + .getSingleResult()) as Users; + + roles = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Roles) + .getResult(); + + userGroup = await microOrmServiceUser.microOrmUtilService + .queryBuilder(UserGroups) + .getResult(); + + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('should be ok', async () => { + const roles1 = faker.helpers.arrayElement(roles); + const roles2 = faker.helpers.arrayElement(roles); + const roles3 = faker.helpers.arrayElement(roles); + const userGroup1 = faker.helpers.arrayElement(userGroup); + const saveIdUserGroup = userGroup1.id; + await patchRelationship.call< + MicroOrmService, + Parameters< + typeof patchRelationship> + >, + ReturnType< + typeof patchRelationship> + > + >(microOrmServiceUser, userObject.id, 'roles', [ + { type: 'roles', id: roles1.id.toString() }, + { type: 'roles', id: roles2.id.toString() }, + { type: 'roles', id: roles3.id.toString() }, + ]); + + await patchRelationship.call< + MicroOrmService, + Parameters< + typeof patchRelationship> + >, + ReturnType< + typeof patchRelationship> + > + >(microOrmServiceUser, userObject.id, 'userGroup', { + type: 'user-groups', + id: saveIdUserGroup.toString(), + }); + + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + id: userObject.id, + }) + .getSingleResult(); + + expect(checkData?.roles.map((i) => i.id)).toEqual( + expect.arrayContaining([roles1.id, roles2.id, roles3.id]) + ); + + expect(checkData?.roles.map((i) => i.id)).toHaveLength( + [roles1.id, roles2.id, roles3.id].length + ); + expect(checkData?.userGroup?.id).toBe(saveIdUserGroup); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts new file mode 100644 index 00000000..b207350c --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/patch-relationship/patch-relationship.ts @@ -0,0 +1,50 @@ +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { PatchRelationshipData } from '@klerick/json-api-nestjs'; +import { getRelationship } from '../get-relationship/get-relationship'; +import { MicroOrmService } from '../../service'; + +export async function patchRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: MicroOrmService, + id: number | string, + rel: Rel, + input: PatchRelationshipData +): Promise { + const idsResult = await this.microOrmUtilService.validateRelationInputData( + rel as any, + input + ); + const currentEntityRef = this.microOrmUtilService.entityManager.getReference( + this.microOrmUtilService.entity, + id as any + ); + + const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); + + if (Array.isArray(idsResult)) { + const relRef = idsResult.map((i) => + this.microOrmUtilService.entityManager.getReference(relEntity, i as any) + ); + // @ts-ignore + currentEntityRef[rel].removeAll(); + // @ts-ignore + currentEntityRef[rel].add(...relRef); + } else { + // @ts-ignore + currentEntityRef[rel] = this.microOrmUtilService.entityManager.getReference( + relEntity, + idsResult as any + ); + } + + await this.microOrmUtilService.entityManager.flush(); + + return getRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts new file mode 100644 index 00000000..77c158c1 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.spec.ts @@ -0,0 +1,341 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { BadRequestException } from '@nestjs/common'; +import { ORM_SERVICE, PostData } from '@klerick/json-api-nestjs'; + +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { postOne } from './post-one'; + +describe('post-one', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addressForTest: Addresses; + let addresses: Addresses; + let userGroup: UserGroups | null; + let notes: Collection; + let roles: Collection; + let comments: Collection; + let userObject: Users; + let tmpUserObject: Users | undefined = undefined; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + const data = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses', {}, ['id']) + .leftJoinAndSelect('Users.comments', 'Comments_comments', {}, ['id']) + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.notes', 'Notes__notes', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + addresses: { + $exists: true, + }, + roles: { + $exists: true, + }, + notes: { + $exists: true, + }, + userGroup: { + $exists: true, + }, + comments: { + $exists: true, + }, + }) + .limit(1) + .execute('get', true); + + ({ roles, notes, userGroup, addresses, comments, ...tmpUserObject as any } = + data); + userObject = tmpUserObject as any; + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('simple create', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + const result = await postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, { + attributes: otherAttr, + type: 'users', + }); + + const { id: newId } = result; + + const fromDb = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: newId, + }) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') + .leftJoinAndSelect('Users.comments', 'Comments_comments') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.notes', 'Notes__notes') + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') + .limit(1) + .getSingleResult(); + + expect(result).toEqual(fromDb); + }); + + it('simple create withId', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + const result = await postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, { + id: id.toString(), + attributes: otherAttr, + type: 'users', + }); + + const { id: newId } = result; + + const fromDb = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: newId, + }) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') + .leftJoinAndSelect('Users.comments', 'Comments_comments') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.notes', 'Notes__notes') + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') + .limit(1) + .getSingleResult(); + + expect(newId).toBe(id.toString()); + expect(result).toEqual(fromDb); + }); + + it('create with relation', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + const postData = { + attributes: otherAttr, + type: 'users', + relationships: { + addresses: { + data: { + id: addressForTest.id.toString(), + type: 'addresses', + }, + }, + comments: { + data: comments.map((i) => ({ + id: i.id.toString(), + type: 'comments', + })), + }, + roles: { + data: roles.map((i) => ({ + id: i.id.toString(), + type: 'roles', + })), + }, + notes: { + data: notes.map((i) => ({ + id: i.id.toString(), + type: 'notes', + })), + }, + userGroup: { + data: userGroup + ? { + id: userGroup.id.toString(), + type: 'user-groups', + } + : null, + }, + manager: { + data: { + id: userObject.id.toString(), + type: 'users', + }, + }, + }, + } satisfies PostData; + + const result = await postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, postData as any); + + const { id: newId } = result; + + const fromDb = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .where({ + id: newId, + }) + .leftJoinAndSelect('Users.addresses', 'Addresses_addresses') + .leftJoinAndSelect('Users.comments', 'Comments_comments') + .leftJoinAndSelect('Users.roles', 'Roles__roles') + .leftJoinAndSelect('Users.notes', 'Notes__notes') + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup') + .limit(1) + .getSingleResult(); + + expect(result).toEqual(fromDb); + }); + + it('should be error', async () => { + const { + id, + manager: mewManager, + userGroup: newUserGroup, + addresses: newAddresses, + comments: newComments, + notes: newNotes, + roles: newRoles, + ...otherAttr + } = newUser; + + await expect( + postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, { + attributes: otherAttr, + type: 'users', + relationships: { + addresses: { + data: { + id: '999999', + type: 'addresses', + }, + }, + } as any, + }) + ).rejects.toThrow(BadRequestException); + + await expect( + postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, { + attributes: otherAttr, + type: 'users', + relationships: { + roles: { + data: [ + { + id: '999999', + type: 'addresses', + }, + ], + }, + }, + } as any) + ).rejects.toThrow(BadRequestException); + + await expect( + postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(microOrmServiceUser, { + attributes: otherAttr, + type: 'users', + relationships: { + incorrectRel: { + data: [ + { + id: '999999', + type: 'addresses', + }, + ], + }, + }, + } as any) + ).rejects.toThrow(BadRequestException); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts new file mode 100644 index 00000000..8f593510 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-one/post-one.ts @@ -0,0 +1,22 @@ +import { PostData } from '@klerick/json-api-nestjs'; +import { MicroOrmService } from '../../service'; + +export async function postOne( + this: MicroOrmService, + inputData: PostData +): Promise { + const { attributes, relationships, id } = inputData; + + const idObject = id + ? { [this.microOrmUtilService.currentPrimaryColumn.toString()]: id } + : {}; + + const attributesObject = { + ...attributes, + ...idObject, + }; + + const entityIns = this.microOrmUtilService.createEntity(attributesObject); + + return this.microOrmUtilService.saveEntity(entityIns, relationships); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts new file mode 100644 index 00000000..8192ba6a --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts @@ -0,0 +1,151 @@ +import { Collection, EntityManager, MikroORM } from '@mikro-orm/core'; +import { faker } from '@faker-js/faker'; +import { ORM_SERVICE } from '@klerick/json-api-nestjs'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + Addresses, + dbRandomName, + getModuleForPgLite, + Notes, + pullData, + Roles, + UserGroups, + Users, + Comments, + pullAddress, +} from '../../mock-utils'; +import { MicroOrmService } from '../../service'; + +import { CURRENT_ENTITY_MANAGER_TOKEN } from '../../constants'; + +import { postRelationship } from './post-relationship'; + +describe('post-relationshipa', () => { + let mikroORMUsers: MikroORM; + let microOrmServiceUser: MicroOrmService; + let em: EntityManager; + let dbName: string; + let addressForTest: Addresses; + let addresses: Addresses; + let userGroup: UserGroups[]; + let notes: Collection; + let roles: Roles[]; + let comments: Collection; + let userObject: Users; + let newUser: Users; + beforeAll(async () => { + dbName = dbRandomName(); + const moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmServiceUser = moduleUsers.get>(ORM_SERVICE); + mikroORMUsers = moduleUsers.get(MikroORM); + em = moduleUsers.get(CURRENT_ENTITY_MANAGER_TOKEN); + await pullData(em, 10); + }); + + beforeEach(async () => { + userObject = (await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .limit(1) + .getSingleResult()) as Users; + + roles = await microOrmServiceUser.microOrmUtilService + .queryBuilder(Roles) + .getResult(); + + userGroup = await microOrmServiceUser.microOrmUtilService + .queryBuilder(UserGroups) + .getResult(); + + const firstName = faker.person.firstName(); + const lastName = faker.person.lastName(); + newUser = { + id: faker.number.int({ min: 0, max: 999999 }), + firstName: firstName, + lastName: lastName, + isActive: faker.datatype.boolean(), + login: faker.internet.userName({ + lastName: firstName, + firstName: lastName, + }), + testReal: [faker.number.float({ fractionDigits: 4 })], + testArrayNull: null, + testDate: faker.date.anytime(), + } as Users; + + addressForTest = await pullAddress(); + await em.persistAndFlush(addressForTest); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + mikroORMUsers.close(true); + }); + + it('should be ok', async () => { + const roles1 = faker.helpers.arrayElement(roles); + const roles2 = faker.helpers.arrayElement(roles); + const roles3 = faker.helpers.arrayElement(roles); + const userGroup1 = faker.helpers.arrayElement(userGroup); + const saveIdUserGroup = userGroup1.id; + + const checkDataBefore = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + id: userObject.id, + }) + .getSingleResult(); + + const saveRolesIds = checkDataBefore?.roles.map((i) => i.id) || []; + + await postRelationship.call< + MicroOrmService, + Parameters< + typeof postRelationship> + >, + ReturnType< + typeof postRelationship> + > + >(microOrmServiceUser, userObject.id, 'roles', [ + { type: 'roles', id: roles1.id.toString() }, + { type: 'roles', id: roles2.id.toString() }, + { type: 'roles', id: roles3.id.toString() }, + ]); + + await postRelationship.call< + MicroOrmService, + Parameters< + typeof postRelationship> + >, + ReturnType< + typeof postRelationship> + > + >(microOrmServiceUser, userObject.id, 'userGroup', { + type: 'user-groups', + id: saveIdUserGroup.toString(), + }); + + const checkData = await microOrmServiceUser.microOrmUtilService + .queryBuilder() + .leftJoinAndSelect('Users.roles', 'Roles__roles', {}, ['id']) + .leftJoinAndSelect('Users.userGroup', 'UserGroups__userGroup', {}, ['id']) + .where({ + id: userObject.id, + }) + .getSingleResult(); + + expect(checkData?.roles.map((i) => i.id)).toEqual( + expect.arrayContaining([roles1.id, roles2.id, roles3.id]) + ); + + expect(checkData?.roles.map((i) => i.id)).toHaveLength( + [roles1.id, roles2.id, roles3.id].length + saveRolesIds.length + ); + expect(checkData?.userGroup?.id).toBe(saveIdUserGroup); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts new file mode 100644 index 00000000..6bc62197 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.ts @@ -0,0 +1,49 @@ +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { PostRelationshipData } from '@klerick/json-api-nestjs'; +import { getRelationship } from '../get-relationship/get-relationship'; +import { MicroOrmService } from '../../service'; + +export async function postRelationship< + E extends object, + IdKey extends string, + Rel extends RelationKeys +>( + this: MicroOrmService, + id: number | string, + rel: Rel, + input: PostRelationshipData +): Promise { + const idsResult = await this.microOrmUtilService.validateRelationInputData( + rel as any, + input + ); + + const currentEntityRef = this.microOrmUtilService.entityManager.getReference( + this.microOrmUtilService.entity, + id as any + ); + + const relEntity = this.microOrmUtilService.getRelation(rel as any).entity(); + + if (Array.isArray(idsResult)) { + const relRef = idsResult.map((i) => + this.microOrmUtilService.entityManager.getReference(relEntity, i as any) + ); + // @ts-ignore + currentEntityRef[rel].add(...relRef); + } else { + // @ts-ignore + currentEntityRef[rel] = this.microOrmUtilService.entityManager.getReference( + relEntity, + idsResult as any + ); + } + + await this.microOrmUtilService.entityManager.flush(); + + return getRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel); +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts new file mode 100644 index 00000000..7fab7d49 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/index.ts @@ -0,0 +1 @@ +export * from './microorm-service'; diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts new file mode 100644 index 00000000..ca329ee9 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts @@ -0,0 +1,571 @@ +import { MikroORM, RawQueryFragment } from '@mikro-orm/core'; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; +import { TestingModule } from '@nestjs/testing/testing-module'; + +import { MicroOrmUtilService } from './micro-orm-util.service'; + +import { + dbRandomName, + getDefaultQuery, + getModuleForPgLite, + Roles, + UserGroups, + Users, +} from '../mock-utils'; + +describe('MicroOrmUtilService', () => { + let mikroORMUserGroup: MikroORM; + let mikroORMUsers: MikroORM; + let mikroORMRoles: MikroORM; + let microOrmUtilsServiceUserGroups: MicroOrmUtilService; + let microOrmUtilsServiceUsers: MicroOrmUtilService; + let microOrmUtilsServiceRoles: MicroOrmUtilService; + let moduleRoles: TestingModule; + let moduleUsers: TestingModule; + let moduleUserGroup: TestingModule; + + let dbName: string; + + beforeAll(async () => { + dbName = dbRandomName(true); + moduleUserGroup = await getModuleForPgLite(UserGroups, dbName); + + microOrmUtilsServiceUserGroups = + moduleUserGroup.get>(MicroOrmUtilService); + mikroORMUserGroup = moduleUserGroup.get(MikroORM); + + moduleUsers = await getModuleForPgLite(Users, dbName); + microOrmUtilsServiceUsers = + moduleUsers.get>(MicroOrmUtilService); + + mikroORMUsers = moduleUsers.get(MikroORM); + + moduleRoles = await getModuleForPgLite(Roles, dbName); + microOrmUtilsServiceRoles = + moduleRoles.get>(MicroOrmUtilService); + mikroORMRoles = moduleRoles.get(MikroORM); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(async () => { + await mikroORMUserGroup.close(true); + await mikroORMUsers.close(true); + await mikroORMRoles.close(true); + }); + + it('currentAlias', () => { + expect(microOrmUtilsServiceUserGroups.currentAlias).toBe('UserGroups'); + }); + + it('currentPrimaryColumn', () => { + expect(microOrmUtilsServiceUserGroups.currentPrimaryColumn).toBe('id'); + }); + + it('getAliasForEntity relation', () => { + expect(() => + microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'login') + ).toThrowError( + expect.objectContaining({ + message: expect.stringContaining('relation not found'), + }) + ); + + expect(() => + microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'notes') + ).toThrowError( + expect.objectContaining({ + message: expect.stringContaining('Many to many relation expected'), + }) + ); + + expect( + microOrmUtilsServiceUsers.getAliasForPivotTable(Users, 'roles') + ).toBe('users_have_roles'); + }); + + it('queryBuilder', () => { + const resultUserGroups = microOrmUtilsServiceUserGroups.queryBuilder(); + expect(resultUserGroups.mainAlias.aliasName).toBe('UserGroups'); + expect(resultUserGroups.mainAlias.entityName).toBe('UserGroups'); + + const resultUsers = microOrmUtilsServiceUserGroups.queryBuilder(Users); + expect(resultUsers.mainAlias.aliasName).toBe('Users'); + expect(resultUsers.mainAlias.entityName).toBe('Users'); + + const resultTestUsersAlias = microOrmUtilsServiceUserGroups.queryBuilder( + Users, + 'TestUsers' + ); + expect(resultTestUsersAlias.mainAlias.entityName).toBe('Users'); + expect(resultTestUsersAlias.mainAlias.aliasName).toBe('TestUsers'); + + const resultTestUsersOnlyAlias = + microOrmUtilsServiceUserGroups.queryBuilder('TestUserGroups'); + expect(resultTestUsersOnlyAlias.mainAlias.entityName).toBe('UserGroups'); + expect(resultTestUsersOnlyAlias.mainAlias.aliasName).toBe('TestUserGroups'); + }); + + it('defaultOrder', () => { + expect(microOrmUtilsServiceUserGroups.defaultOrder).toEqual({ id: 'ASC' }); + }); + describe('getFilterExpressionForTarget', () => { + it('expression for target field, target is null, should be null expression array', () => { + const query = getDefaultQuery(); + const result = + microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); + + expect(result).toEqual([]); + }); + it('expression for target field with target field', async () => { + const nullableField = 'id'; + const nullableFieldValue = null; + const notNullableField = 'login'; + const notNullableFieldValue = null; + const regexpField = 'firstName'; + const regexpFieldValue = 'firstName'; + + const otherFiled = 'lastName'; + const otherFiledValue1: [string, string, string] = ['1', '3', '4']; + const otherFiledValue2 = 'test'; + const otherFiledValue3 = 'test2'; + + const arrayField = 'testReal'; + const query = getDefaultQuery(); + query.filter.target = { + [nullableField]: { + [FilterOperand.eq]: nullableFieldValue, + }, + [notNullableField]: { + [FilterOperand.ne]: notNullableFieldValue, + }, + [regexpField]: { + [FilterOperand.regexp]: regexpFieldValue, + }, + [otherFiled]: { + [FilterOperand.in]: otherFiledValue1, + [FilterOperand.nin]: otherFiledValue1, + [FilterOperand.like]: otherFiledValue2, + [FilterOperand.gt]: otherFiledValue3, + }, + [arrayField]: { + [FilterOperand.some]: otherFiledValue1, + }, + } as any; + + const [ + id, + login, + regexpFieldConditional, + otherFiledConditional, + arrayFieldConditional, + ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); + + expect(id).toEqual({ + [nullableField]: { + ['$' + FilterOperand.eq]: nullableFieldValue, + }, + }); + + expect(login).toEqual({ + [notNullableField]: { + ['$' + FilterOperand.ne]: notNullableFieldValue, + }, + }); + + expect(regexpFieldConditional).toEqual({ + [regexpField]: { + ['$re']: regexpFieldValue, + }, + }); + expect(otherFiledConditional).toEqual({ + [otherFiled]: { + ['$' + FilterOperand.in]: otherFiledValue1, + ['$' + FilterOperand.nin]: otherFiledValue1, + ['$' + FilterOperand.like]: otherFiledValue2, + ['$' + FilterOperand.gt]: otherFiledValue3, + }, + }); + expect(arrayFieldConditional).toEqual({ + [arrayField]: { + ['$overlap']: otherFiledValue1, + }, + }); + }); + + it('expression for target field with relation field not exist', async () => { + const oneToOneToMyself = 'manager'; + const oneToOneToOther = 'addresses'; + const manyToMany = 'roles'; + const oneToMany = 'comments'; + const manyToOne = 'userGroup'; + + const query = getDefaultQuery(); + query.filter.target = { + [oneToOneToMyself]: { + [FilterOperand.eq]: 'null', + }, + [oneToOneToOther]: { + [FilterOperand.eq]: 'null', + }, + [manyToMany]: { + [FilterOperand.eq]: 'null', + }, + [oneToMany]: { + [FilterOperand.eq]: 'null', + }, + [manyToOne]: { + [FilterOperand.eq]: 'null', + }, + }; + + const [ + oneToOneToMyselfEq, + oneToOneToOtherEq, + manyToManyEq, + oneToManyEq, + manyToOneEq, + ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); + + expect(oneToOneToMyselfEq).toEqual({ + [oneToOneToMyself]: { $exists: false }, + }); + expect(oneToOneToOtherEq).toEqual({ + [oneToOneToOther]: { $exists: false }, + }); + expect(manyToOneEq).toEqual({ [manyToOne]: { $exists: false } }); + expect(manyToManyEq).toBeInstanceOf(RawQueryFragment); + expect(oneToManyEq).toBeInstanceOf(RawQueryFragment); + if (!(oneToManyEq instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + if (!(manyToManyEq instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + + expect(manyToManyEq.sql).toBe( + 'not exists (select 1 from "public"."users_have_roles" as "users_have_roles" where "users_have_roles"."user_id" = "Users"."id")' + ); + expect(oneToManyEq.sql).toBe( + 'not exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id")' + ); + }); + it('expression for target field with relation field exist', async () => { + const oneToOneToMyself = 'manager'; + const oneToOneToOther = 'addresses'; + const manyToMany = 'roles'; + const oneToMany = 'comments'; + const manyToOne = 'userGroup'; + + const query = getDefaultQuery(); + query.filter.target = { + [oneToOneToMyself]: { + [FilterOperand.ne]: 'null', + }, + [oneToOneToOther]: { + [FilterOperand.ne]: 'null', + }, + [manyToMany]: { + [FilterOperand.ne]: 'null', + }, + [oneToMany]: { + [FilterOperand.ne]: 'null', + }, + [manyToOne]: { + [FilterOperand.ne]: 'null', + }, + }; + + const [ + oneToOneToMyselfNe, + oneToOneToOtherNe, + manyToManyNe, + oneToManyNe, + manyToOneNe, + ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); + + expect(oneToOneToMyselfNe).toEqual({ + [oneToOneToMyself]: { $exists: true }, + }); + expect(oneToOneToOtherNe).toEqual({ + [oneToOneToOther]: { $exists: true }, + }); + expect(manyToOneNe).toEqual({ [manyToOne]: { $exists: true } }); + expect(manyToManyNe).toBeInstanceOf(RawQueryFragment); + expect(oneToManyNe).toBeInstanceOf(RawQueryFragment); + if (!(oneToManyNe instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + if (!(manyToManyNe instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + + expect(manyToManyNe.sql).toBe( + 'exists (select 1 from "public"."users_have_roles" as "users_have_roles" where "users_have_roles"."user_id" = "Users"."id")' + ); + expect(oneToManyNe.sql).toBe( + 'exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id")' + ); + }); + + it('expression for target field with relation field exist with sort and include', async () => { + const oneToOneToMyself = 'manager'; + const oneToOneToOther = 'addresses'; + const manyToMany = 'roles'; + const oneToMany = 'comments'; + const manyToOne = 'userGroup'; + + const query = getDefaultQuery(); + query.filter.target = { + [oneToOneToMyself]: { + [FilterOperand.ne]: 'null', + }, + [oneToOneToOther]: { + [FilterOperand.ne]: 'null', + }, + [manyToMany]: { + [FilterOperand.ne]: 'null', + }, + [oneToMany]: { + [FilterOperand.ne]: 'null', + }, + [manyToOne]: { + [FilterOperand.ne]: 'null', + }, + }; + + query.sort = { + [manyToMany]: { key: 'ASC' }, + }; + query.include = [oneToMany]; + + const [ + oneToOneToMyselfNe, + oneToOneToOtherNe, + manyToManyNe, + oneToManyNe, + manyToOneNe, + ] = microOrmUtilsServiceUsers.getFilterExpressionForTarget(query); + + expect(oneToOneToMyselfNe).toEqual({ + [oneToOneToMyself]: { $exists: true }, + }); + expect(oneToOneToOtherNe).toEqual({ + [oneToOneToOther]: { $exists: true }, + }); + expect(manyToOneNe).toEqual({ [manyToOne]: { $exists: true } }); + expect(manyToManyNe).toEqual({ roles: { $exists: true } }); + expect(oneToManyNe).toEqual({ comments: { $exists: true } }); + }); + }); + + describe('getFilterExpressionForRelation', () => { + it('expression for relation field OneToMany and ManyToOne', async () => { + const query = getDefaultQuery(); + + query.filter.relation = { + comments: { + kind: { + [FilterOperand.eq]: 'test', + }, + }, + userGroup: { + label: { + [FilterOperand.eq]: 'test', + }, + }, + } as any; + + const [comments, userGroup] = + microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); + + if (!(userGroup instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + + expect(userGroup.sql).toBe( + `exists (select 1 from "public"."user_groups" as "UserGroups" where "UserGroups"."id" = "Users"."user_groups_id" and "UserGroups"."label" = 'test')` + ); + + if (!(comments instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + + expect(comments.sql).toBe( + `exists (select 1 from "public"."comments" as "Comments" where "Comments"."created_by" = "Users"."id" and "Comments"."kind" = 'test')` + ); + }); + + it('expression for relation field OneToMany and ManyToOne with sort', async () => { + const query = getDefaultQuery(); + query.sort = { + userGroup: { + label: 'ASC', + }, + comments: { + kind: 'ASC', + }, + }; + query.filter.relation = { + comments: { + kind: { + [FilterOperand.eq]: 'test', + }, + }, + userGroup: { + label: { + [FilterOperand.eq]: 'test', + }, + }, + } as any; + + const [comments, userGroup] = + microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); + + expect(userGroup).toEqual({ userGroup: { label: { $eq: 'test' } } }); + + expect(comments).toEqual({ comments: { kind: { $eq: 'test' } } }); + }); + + it('expression for relation field OneToOne', async () => { + const query = getDefaultQuery(); + + query.filter.relation = { + manager: { + login: { + [FilterOperand.eq]: 'test', + }, + }, + addresses: { + city: { + [FilterOperand.eq]: 'test', + }, + }, + }; + const [manager, addresses] = + microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); + expect(manager).toEqual({ manager: { login: { $eq: 'test' } } }); + expect(addresses).toEqual({ addresses: { city: { $eq: 'test' } } }); + }); + + it('expression for relation field ManyToMany', async () => { + const query = getDefaultQuery(); + const queryRoles = getDefaultQuery(); + + query.filter.relation = { + roles: { + key: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isDefault: { + [FilterOperand.eq]: 'false', + }, + }, + }; + + queryRoles.filter.relation = { + users: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + }, + }; + + const [roles] = + microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); + + if (!(roles instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + + expect(roles.sql).toBe( + `exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."roles" as "r1" on "users_have_roles"."role_id" = "r1"."id" where "users_have_roles"."user_id" = "Users"."id" and "r1"."key" = 'test' and "r1"."key" != 'test2' and "r1"."is_default" = 'false')` + ); + + const [users] = + microOrmUtilsServiceRoles.getFilterExpressionForRelation(queryRoles); + + if (!(users instanceof RawQueryFragment)) + throw new Error('Is not RawQueryFragment'); + expect(users.sql).toBe( + `exists (select 1 from "public"."users_have_roles" as "users_have_roles" left join "public"."users" as "u1" on "users_have_roles"."user_id" = "u1"."id" where "users_have_roles"."role_id" = "Roles"."id" and "u1"."login" = 'test' and "u1"."login" != 'test2' and "u1"."is_active" = 'false')` + ); + }); + + it('expression for relation field ManyToMany with sort', async () => { + const query = getDefaultQuery(); + const queryRoles = getDefaultQuery(); + + query.filter.relation = { + roles: { + key: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isDefault: { + [FilterOperand.eq]: 'false', + }, + }, + }; + query.sort = { + roles: { key: 'ASC' }, + }; + + queryRoles.filter.relation = { + users: { + login: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + isActive: { + [FilterOperand.eq]: 'false', + }, + }, + }; + + queryRoles.sort = { + users: { login: 'ASC' }, + }; + + const [roles] = + microOrmUtilsServiceUsers.getFilterExpressionForRelation(query); + + expect(roles).toEqual({ + roles: { + isDefault: { $eq: 'false' }, + key: { $eq: 'test', $ne: 'test2' }, + }, + }); + + const [users] = + microOrmUtilsServiceRoles.getFilterExpressionForRelation(queryRoles); + + expect(users).toEqual({ + users: { + isActive: { $eq: 'false' }, + login: { $eq: 'test', $ne: 'test2' }, + }, + }); + }); + + it('getConditionalForJoin', () => { + const query = getDefaultQuery(); + query.filter.relation = { + roles: { + key: { + [FilterOperand.eq]: 'test', + [FilterOperand.ne]: 'test2', + }, + }, + }; + const result = microOrmUtilsServiceRoles.getConditionalForJoin( + query, + 'roles' + ); + expect(result).toEqual({ + key: { $eq: 'test', $ne: 'test2' }, + }); + }); + }); +}); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts new file mode 100644 index 00000000..f0cab820 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts @@ -0,0 +1,778 @@ +import { + BadRequestException, + Inject, + Injectable, + NotFoundException, + UnprocessableEntityException, +} from '@nestjs/common'; +import { + EntityClass, + EntityKey, + EntityProperty, + EntityRepository, + type QBFilterQuery, + QBQueryOrderMap, + raw, + ReferenceKind, + EntityData, + Collection, +} from '@mikro-orm/core'; +import { + Knex, + SqlEntityManager, + QueryBuilder, + type Field, +} from '@mikro-orm/knex'; +import { + ASC, + CURRENT_ENTITY, + ValidateQueryError, + Query, + QueryOne, + Relationships, +} from '@klerick/json-api-nestjs'; +import { + RelationKeys, + FilterOperand, + ObjectTyped, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; +import { + CURRENT_ENTITY_MANAGER_TOKEN, + CURRENT_ENTITY_REPOSITORY, +} from '../constants'; + +export type InputValidateData = { + type: string; + id: string; +}; + +export type ValidateReturn = T extends unknown[] + ? string[] + : T extends null + ? null + : string; + +type RelationshipsResult = { + [K in RelationKeys]: E[K] extends object + ? E[K] extends Collection + ? E[K] + : E[K] | null + : never; +}; + +function isRelationField( + relationField: string[], + field: any +): asserts field is EntityKey { + if (relationField.includes(field)) return; + const error: ValidateQueryError = { + code: 'unrecognized_keys', + path: ['data', 'relationships'], + message: `Resource for relation '${field.toString()}' does not exist`, + keys: [field], + }; + + throw new BadRequestException([error]); +} + +function isCollectionField( + targetInstance: any +): targetInstance is Collection { + return targetInstance instanceof Collection; +} + +const getErrorObject = ( + props: string, + message: string +): ValidateQueryError => ({ + code: 'invalid_arguments', + path: ['data', 'relationships'], + message, +}); + +Injectable(); +export class MicroOrmUtilService< + E extends object, + IdKey extends string = 'id' +> { + @Inject(CURRENT_ENTITY_MANAGER_TOKEN) + public readonly entityManager!: SqlEntityManager; + @Inject(CURRENT_ENTITY_REPOSITORY) + private entityRepository!: EntityRepository; + @Inject(CURRENT_ENTITY) public readonly entity!: EntityClass; + + private _relationsName!: EntityKey[]; + private _relationMap = new Map, EntityProperty>(); + private _relationPropsMap = new Map, EntityKey[]>(); + get relationsName() { + if (!this._relationsName) { + this._relationsName = this.metadata.relations.map((r) => r.name); + } + + return this._relationsName; + } + + getRelationProps(entity: EntityClass) { + const props = this._relationPropsMap.get(entity); + if (props) { + return props; + } + const relMetaData = this.entityManager.getMetadata(entity); + const relation = relMetaData.relations.map((i) => i.name); + const newProps = relMetaData.props + .filter((r) => !relation.includes(r.name)) + .map((r) => r.name); + this._relationPropsMap.set(entity, newProps); + + return newProps; + } + + getRelation(name: EntityKey) { + let relation = this._relationMap.get(name); + if (!relation) { + relation = this.metadata.relations.find((r) => r.name === name); + if (!relation) { + throw new Error(`Relation ${name} not found in ${this.metadata.name}`); + } + this._relationMap.set(name, relation); + } + + return relation; + } + + get currentAlias() { + return this.entityRepository.getEntityName(); + } + + get metadata() { + return this.entityManager.getMetadata().get(this.entity); + } + + get currentPrimaryColumn() { + return this.metadata.getPrimaryProp().name; + } + + get defaultOrder(): QBQueryOrderMap { + return { + [this.currentPrimaryColumn]: ASC, + }; + } + + getAliasForEntity(entity: EntityClass) { + return this.entityManager.getRepository(entity).getEntityName(); + } + + getAliasForPivotTable(relName: keyof T): string; + getAliasForPivotTable( + entity: EntityClass, + relName: keyof T + ): string; + getAliasForPivotTable( + entity: EntityClass | keyof T, + relName?: keyof T + ): string { + if (!relName) { + relName = entity as keyof T; + entity = this.entity; + } else { + entity = entity as EntityClass; + } + + const propsRelation = this.entityManager + .getMetadata() + .get(entity) + .relations.find((r) => r.name.toString() === relName.toString()); + if (!propsRelation) + throw new Error(`${relName.toString()} relation not found`); + if (propsRelation.kind !== ReferenceKind.MANY_TO_MANY) + throw new Error('Many to many relation expected'); + + return this.entityManager + .getRepository(propsRelation.pivotEntity) + .getEntityName(); + } + + queryBuilder( + entity: EntityClass, + alias: string + ): QueryBuilder; + queryBuilder( + entity: EntityClass + ): QueryBuilder; + queryBuilder( + alias: string + ): QueryBuilder; + queryBuilder(): QueryBuilder; + queryBuilder( + ...arg: + | [entity: EntityClass, alias: string] + | [entity: EntityClass] + | [alias: string] + | [undefined, undefined] + ): QueryBuilder { + let [entity, alias] = arg; + + if (entity && !alias) { + if (typeof entity === 'string') { + alias = entity; + entity = this.entity; + } else { + alias = this.getAliasForEntity(entity); + } + } + if (!entity) { + alias = this.currentAlias; + entity = this.entity; + } + + if (!entity || !alias) { + throw new Error('entity or alias not found'); + } + + return this.entityManager.createQueryBuilder( + entity, + alias + ); + } + + getFilterExpressionForTarget( + query: Query + ): QBFilterQuery[] { + const result: QBFilterQuery[] = []; + const filterTarget = this.getFilterObject(query, 'target'); + const { sort, include } = query; + if (!filterTarget) return result; + + for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { + const tmpField = fieldName as unknown as EntityKey; + + if (filter === undefined) continue; + const filterObject: QBFilterQuery = { + [tmpField]: {}, + }; + let subQueryExpression: QBFilterQuery | undefined; + for (const entries of ObjectTyped.entries(filter as any)) { + const [operand, value] = entries as [FilterOperand, string]; + + if (!this.relationsName.includes(tmpField)) { + const operandForMiroOrmResult = this.extractedResultOperand(operand); + filterObject[tmpField.toString()][operandForMiroOrmResult] = value; + continue; + } + + const relation = this.getRelation(tmpField); + switch (relation.kind) { + case ReferenceKind.MANY_TO_MANY: + case ReferenceKind.ONE_TO_MANY: { + if (sort && tmpField in sort) { + filterObject[tmpField.toString()]['$exists'] = + operand === FilterOperand.ne; + break; + } + + if (include && include.includes(tmpField as any)) { + filterObject[tmpField.toString()]['$exists'] = + operand === FilterOperand.ne; + break; + } + + const subQuery = + this.getSubQueryForRelation(tmpField).getFormattedQuery(); + const type = operand === FilterOperand.ne ? 'exists' : 'not exists'; + const resultQuery = `${type} (${subQuery})`; + subQueryExpression = raw(resultQuery); + break; + } + default: + filterObject[tmpField.toString()]['$exists'] = + operand === FilterOperand.ne; + } + } + + result.push(subQueryExpression ? subQueryExpression : filterObject); + } + + return result; + } + + getConditionalForJoin( + query: Query, + key: string + ): QBFilterQuery { + const filterRelation = this.getFilterObject(query, 'relation'); + + if (!filterRelation) return {}; + if (!(key in (filterRelation as object))) return {}; + + for (const [key, reletionConditional] of ObjectTyped.entries( + filterRelation + )) { + if (key !== key) continue; + if (!reletionConditional) continue; + + for (const [field, conditional] of ObjectTyped.entries( + reletionConditional + )) { + if (!conditional) continue; + return Object.entries(conditional).reduce((acum, [operand, value]) => { + acum[field.toString()] = { + ...(acum[field.toString()] || {}), + [this.extractedResultOperand(operand as FilterOperand)]: value, + }; + return acum; + }, {} as QBFilterQuery); + } + } + + return {}; + } + + private extractedResultOperand(operand: FilterOperand) { + return operand === 'regexp' + ? '$re' + : operand === 'some' + ? '$overlap' + : (('$' + operand) as `$${FilterOperand}`); + } + + getFilterExpressionForRelation( + query: Query + ): QBFilterQuery[] { + const result: QBFilterQuery[] = []; + const filterRelation = this.getFilterObject(query, 'relation'); + const sort = query.sort; + if (!filterRelation) return result; + + for (const [relationField, propsFilter] of ObjectTyped.entries( + filterRelation + )) { + const fieldName = relationField as unknown as EntityKey; + const relationProps = this.getRelation(fieldName); + if (!propsFilter) continue; + if (!this.relationsName.includes(fieldName)) continue; + const filterObject: QBFilterQuery = { + [relationField]: {}, + }; + let subQueryExpression: + | ReturnType + | undefined; + for (const [relationFieldProps, filter] of ObjectTyped.entries( + propsFilter + )) { + const fieldProps = relationFieldProps as unknown as EntityKey; + if (!filter) continue; + for (const entries of ObjectTyped.entries(filter)) { + const [operand, value] = entries as [FilterOperand, string]; + switch (relationProps.kind) { + case ReferenceKind.MANY_TO_MANY: + case ReferenceKind.ONE_TO_MANY: + case ReferenceKind.MANY_TO_ONE: + { + if (sort && relationField in sort) { + filterObject[fieldName][fieldProps] = filterObject[fieldName][ + fieldProps + ] = filterObject[fieldName][fieldProps] || {}; + filterObject[fieldName][fieldProps][ + this.extractedResultOperand(operand) + ] = value; + } else { + if (!subQueryExpression) { + subQueryExpression = this.getSubQueryForRelation(fieldName); + } + const expression = + relationProps.kind === ReferenceKind.MANY_TO_MANY + ? { + [this.getInverseFieldForManyToMany(fieldName)]: { + [fieldProps]: { + [this.extractedResultOperand(operand)]: value, + }, + }, + } + : { + [fieldProps]: { + [this.extractedResultOperand(operand)]: value, + }, + }; + subQueryExpression.where(expression, '$and'); + } + } + break; + default: + filterObject[fieldName][fieldProps] = + filterObject[fieldName][fieldProps] || {}; + filterObject[fieldName][fieldProps][ + this.extractedResultOperand(operand) + ] = value; + } + } + } + if (subQueryExpression) { + const resultQuery = `exists (${subQueryExpression.getFormattedQuery()})`; + result.push(raw(resultQuery)); + subQueryExpression = undefined; + } else { + result.push(filterObject); + } + } + + return result; + } + + getKnex(): Knex { + return this.entityManager.getKnex(); + } + + prePareQueryBuilder( + queryBuilder: QueryBuilder, + query: Query | QueryOne + ): QueryBuilder { + const { fields, include } = query; + const relationFields: Record = {}; + + if (fields) { + const { target, ...relations } = fields as any; + Object.assign(relationFields, relations); + if (target) { + if (!target.includes(this.currentPrimaryColumn)) { + target.unshift(this.currentPrimaryColumn); + } + queryBuilder.select(target as unknown as Field); + } + } + + const resultInclude = new Set([ + ...[...(include || []), ...ObjectTyped.keys(relationFields)], + ]); + + for (const item of resultInclude) { + const relationProps = this.getRelation( + item as unknown as EntityKey + ); + const relationEntity = relationProps.entity() as EntityClass; + const relationAlias = this.getAliasForEntity(relationEntity); + const mainAlias = this.currentAlias; + + const condition: QBFilterQuery = this.getConditionalForJoin( + query as Query, + item + ); + + let selectJoin: string[] = this.getRelationProps(relationEntity); + if (item in relationFields) { + const tmpSet = new Set([ + ...relationFields[item], + this.getPrimaryNameFor(item as any), + ]); + + selectJoin = [...tmpSet]; + } + + queryBuilder.leftJoinAndSelect( + `${mainAlias}.${item}`, + `${relationAlias}__${item}`, + condition, + selectJoin + ); + } + return queryBuilder; + } + + getPrimaryNameFor(rel: RelationKeys) { + const relationEntity = this.getRelation( + rel as unknown as EntityKey + ).entity() as EntityClass; + return this.entityManager.getMetadata().get(relationEntity).getPrimaryProp() + .name; + } + + private getFilterObject( + query: Query, + filterType: 'target' | 'relation' + ) { + const { filter } = query; + if (!filter) return null; + return Reflect.get(filter, filterType); + } + + private getSubQueryForRelation(propsName: EntityKey) { + const relation = this.getRelation(propsName); + + let pivotTableName; + let filedCheck: string | undefined; + let expressionColumnName: string | undefined = this.currentPrimaryColumn; + if (relation.kind === ReferenceKind.MANY_TO_MANY) { + pivotTableName = this.getAliasForPivotTable(propsName); + filedCheck = relation.joinColumns.at(0); + } else if (relation.kind === ReferenceKind.ONE_TO_MANY) { + pivotTableName = this.getAliasForEntity(relation.entity() as any); + filedCheck = relation.mappedBy; + } else { + expressionColumnName = relation.joinColumns.at(0); + pivotTableName = this.getAliasForEntity(relation.entity() as any); + filedCheck = relation.referencedColumnNames.at(0); + } + + if (!filedCheck) throw new Error('filedCheck not found'); + if (!expressionColumnName) + throw new Error('expressionColumnName not found'); + + return this.entityManager + .createQueryBuilder(pivotTableName, pivotTableName) + .select(raw('1')) + .from(pivotTableName) + .where({ + [filedCheck]: this.entityManager + .getKnex() + .ref(`${this.currentAlias}.${expressionColumnName}`), + }); + } + + private getInverseFieldForManyToMany(propsName: EntityKey) { + const relation = this.getRelation(propsName); + const pivotTableName = this.getAliasForPivotTable(propsName); + + const pivotMetaData = this.entityManager.getMetadata().get(pivotTableName); + + const props = pivotMetaData.props.find( + (prop) => + prop.targetMeta && + prop.targetMeta.properties[propsName] && + prop.targetMeta.properties[propsName].entity() === relation.entity() + ); + + if (!props) + throw new Error( + `ManyToMany relation ${propsName} not found in ${pivotTableName}` + ); + + return props.inversedBy || props.mappedBy; + } + + createEntity(params: EntityData) { + return this.entityManager.create(this.entity, params, { + partial: true, + persist: false, + }); + } + + private async *asyncIterateFindRelationships( + relationships: NonNullable> + ): AsyncGenerator> { + for (const entries of ObjectTyped.entries(relationships)) { + const [props, dataItem] = entries; + isRelationField(this.relationsName, props); + const propsKey = props as unknown as EntityKey; + if (dataItem === undefined) continue; + + const data = Reflect.get(dataItem as object, 'data'); + if (data === undefined) continue; + if (data === null) { + yield { [props]: null } as RelationshipsResult; + continue; + } + const isArray = Array.isArray(data); + if (isArray && data.length === 0) { + yield { [props]: [] } as RelationshipsResult; + continue; + } + + const condition = isArray + ? { + $in: data.map((i) => (i || {}).id), + } + : { + $eq: data['id'], + }; + + const relationProps = this.metadata.properties[propsKey]; + const relationEntity = relationProps.entity() as EntityClass; + const metadata = this.entityManager.getMetadata().get(relationEntity); + const primaryName = metadata.getPrimaryProp().name; + + const queryBuilder = this.queryBuilder( + relationEntity, + this.getAliasForEntity(relationEntity) + ) + .select([primaryName]) + .where({ + [primaryName]: condition, + }); + let result: typeof relationEntity | (typeof relationEntity)[]; + let error: BadRequestException | undefined = undefined; + if (isArray) { + const tmpResult = await queryBuilder.getResult(); + + if (tmpResult.length === 0 || data.length !== tmpResult.length) { + const msg = `Resource '${metadata.className}' with ids '${data + .map((i) => (i || {})['id']) + .filter((i) => !tmpResult.find((r) => r[primaryName] == i)) + .join(',')}' does not exist`; + error = new BadRequestException([getErrorObject(props, msg)]); + } + result = tmpResult; + } else { + const tmpResult = await queryBuilder.getSingleResult(); + if (!tmpResult) + error = new BadRequestException([ + getErrorObject( + props, + `Resource '${metadata.className}' with id '${data.id}' does not exist` + ), + ]); + result = tmpResult; + } + if (error) throw error; + yield { [props]: result } as RelationshipsResult; + } + } + + async saveEntity( + targetInstance: E, + relationships?: Relationships + ): Promise { + if (relationships) { + for await (const item of this.asyncIterateFindRelationships( + relationships + )) { + const itemProps = ObjectTyped.entries(item).at(0); + if (!itemProps) continue; + const [nameProps, data] = itemProps; + + if (isCollectionField(targetInstance[nameProps])) { + targetInstance[nameProps].removeAll(); + targetInstance[nameProps].add(data as []); + } else { + Object.assign(targetInstance, item); + } + } + } + + await this.entityManager.persistAndFlush(targetInstance); + + return targetInstance; + } + + async validateRelationInputData< + Rel extends RelationKeys, + In extends InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends null | InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise>; + async validateRelationInputData< + Rel extends RelationKeys, + In extends null | InputValidateData | InputValidateData[] + >(rel: Rel, inputData: In): Promise> { + const property = Reflect.get(this.metadata.properties, rel); + const isArray = Array.isArray(inputData); + + if ( + [ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes( + property.kind + ) && + !isArray + ) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + path: ['data'], + message: 'Body data should be array', + }; + + throw new UnprocessableEntityException([error]); + } + + if ( + [ReferenceKind.ONE_TO_ONE, ReferenceKind.MANY_TO_ONE].includes( + property.kind + ) && + isArray + ) { + const error: ValidateQueryError = { + code: 'invalid_arguments', + path: ['data'], + message: 'Body data should be object', + }; + + throw new UnprocessableEntityException([error]); + } + + if (inputData === null) { + const result = null; + return result as ValidateReturn; + } + if (isArray && inputData.length === 0) { + const result: any[] = []; + return result as ValidateReturn; + } + + const prepareData = ( + isArray ? inputData : [inputData] + ) as InputValidateData[]; + + const errors: ValidateQueryError[] = []; + let i = 0; + const relationEntity = this.getRelation(rel as any).entity(); + const typeName = kebabCase( + this.entityManager.getMetadata().get(relationEntity).className + ); + + for (const prepareItem of prepareData) { + if (prepareItem.type !== typeName) { + const path = isArray ? ['data', i.toString()] : ['data']; + errors.push({ + code: 'invalid_arguments', + path: path, + message: `Type should be equal to type of relName: "${rel.toString()}". Type of ${rel.toString()} is "${typeName}" but receive - "${ + prepareItem.type + }"`, + }); + } + i++; + } + if (errors.length) { + throw new UnprocessableEntityException(errors); + } + + const checkResult = await this.queryBuilder(relationEntity as any) + .where({ + [this.getPrimaryNameFor(rel)]: { + $in: prepareData.map((i) => i.id), + }, + }) + .getResult(); + + if (checkResult.length === prepareData.length) { + return ( + isArray ? inputData.map((i) => i.id) : inputData.id + ) as ValidateReturn; + } + + const resulDataMap = checkResult.reduce((acum, item) => { + const idValue = (item[this.getPrimaryNameFor(rel)] || 'empty').toString(); + acum[idValue] = true; + return acum; + }, {} as Record); + + i = 0; + for (const item of prepareData) { + if (!resulDataMap[item.id]) { + const path = isArray ? ['data', i.toString(), 'id'] : ['data', 'id']; + errors.push({ + code: 'invalid_arguments', + path: path, + message: `Not exist item "${ + item.id + }" in relation "${rel.toString()}"`, + }); + } + i++; + } + throw new NotFoundException(errors); + } +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts new file mode 100644 index 00000000..37e1ee96 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/microorm-service.ts @@ -0,0 +1,229 @@ +import { Inject } from '@nestjs/common'; +import { + QueryField, + ResourceObject, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; +import { + JsonApiTransformerService, + OrmService, + PatchData, + PatchRelationshipData, + PostData, + PostRelationshipData, + Query, + QueryOne, +} from '@klerick/json-api-nestjs'; + +import { + getAll, + getOne, + deleteOne, + postOne, + patchOne, + getRelationship, + deleteRelationship, + patchRelationship, + postRelationship, +} from '../orm-methods'; +import { MicroOrmUtilService } from './micro-orm-util.service'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; + +export class MicroOrmService + implements OrmService +{ + @Inject(MicroOrmUtilService) microOrmUtilService!: MicroOrmUtilService< + E, + IdKey + >; + @Inject(JsonApiTransformerService) + jsonApiTransformerService!: JsonApiTransformerService; + + async getAll( + query: Query + ): Promise> { + const { page } = query; + const { totalItems, items } = await getAll.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, query); + + const { data, included } = this.jsonApiTransformerService.transformData( + items, + query + ); + + const meta = { + totalItems: totalItems, + pageNumber: page.number, + pageSize: page.size, + }; + + return { + meta, + data, + ...(included ? { included } : {}), + }; + } + + async getOne( + id: number | string, + query: QueryOne + ): Promise> { + const result = await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, query); + const { data, included } = this.jsonApiTransformerService.transformData( + result, + query + ); + return { + meta: {}, + data, + ...(included ? { included } : {}), + }; + } + + async deleteOne(id: number | string): Promise { + await deleteOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id); + } + + async postOne( + inputData: PostData + ): Promise> { + const result = await postOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, inputData); + + const { relationships } = inputData; + const fakeQuery: Query = { + [QueryField.fields]: null, + [QueryField.include]: Object.keys(relationships || {}), + } as any; + + const resultForResponse = await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >( + this, + result[this.microOrmUtilService.currentPrimaryColumn] as any, + fakeQuery + ); + + const { data, included } = this.jsonApiTransformerService.transformData( + resultForResponse, + fakeQuery + ); + + return { + meta: {}, + data, + ...(included ? { included } : {}), + }; + } + async patchOne( + id: number | string, + inputData: PatchData + ): Promise> { + await patchOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, inputData); + + const { relationships } = inputData; + const fakeQuery: Query = { + [QueryField.fields]: null, + [QueryField.include]: Object.keys(relationships || {}), + } as any; + + const resultForResponse = await getOne.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, fakeQuery); + + const { data, included } = this.jsonApiTransformerService.transformData( + resultForResponse, + fakeQuery + ); + + return { + meta: {}, + data, + ...(included ? { included } : {}), + }; + } + + async getRelationship>( + id: number | string, + rel: Rel + ): Promise> { + const result = await getRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel); + + return { + meta: {}, + data: this.jsonApiTransformerService.transformRel(result, rel), + }; + } + + async deleteRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise { + await deleteRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + } + + async postRelationship>( + id: number | string, + rel: Rel, + input: PostRelationshipData + ): Promise> { + const result = await postRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + + return { + meta: {}, + data: this.jsonApiTransformerService.transformRel(result, rel), + }; + } + + async patchRelationship>( + id: number | string, + rel: Rel, + input: PatchRelationshipData + ): Promise> { + const result = await patchRelationship.call< + MicroOrmService, + Parameters>, + ReturnType> + >(this, id, rel, input); + + return { + meta: {}, + data: this.jsonApiTransformerService.transformRel(result, rel), + }; + } +} diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/type.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/type.ts new file mode 100644 index 00000000..8e1d71b9 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/type.ts @@ -0,0 +1,3 @@ +export type MicroOrmParam = { + arrayType?: string[]; +}; diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.json new file mode 100644 index 00000000..86622aca --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "importHelpers": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json new file mode 100644 index 00000000..dbf54fd7 --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"], + "target": "es2021", + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json new file mode 100644 index 00000000..7b4aa57b --- /dev/null +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json @@ -0,0 +1,26 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": [ + "jest", + "node" + ], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ], + "@klerick/json-api-nestjs": [ + "libs/json-api/json-api-nestjs/src/index.ts" + ] + } + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} From 1a1c859672b44554529898b67012aab55cf57c25 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 07:00:23 +0100 Subject: [PATCH 05/22] feat(json-api-nestjs-shared): Use shared type from separate package --- .../json-api-nestjs-shared/package.json | 3 +- .../json-api-nestjs-shared/project.json | 10 ++ .../src/lib/types/entity-type.test-d.ts | 68 +++++++ .../src/lib/types/entity-type.ts | 57 ++++-- .../src/lib/types/index.ts | 1 - .../src/lib/types/response-body.test-d.ts | 167 ++++++++++++++++++ .../src/lib/types/response-body.ts | 146 ++++++++++----- .../src/lib/types/utils-string.type.ts | 26 --- .../utils/___test___/test-classes.helper.ts | 56 ++++++ .../src/lib/utils/index.ts | 1 - .../src/lib/utils/object-utils.spec.ts | 11 ++ .../src/lib/utils/object-utils.ts | 38 +++- .../src/lib/utils/string-utils.spec.ts | 42 ----- .../src/lib/utils/string-utils.ts | 38 ---- .../json-api-nestjs-shared/tsconfig.spec.json | 3 +- 15 files changed, 492 insertions(+), 175 deletions(-) create mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts create mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts delete mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts create mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts create mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts delete mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts delete mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts diff --git a/libs/json-api/json-api-nestjs-shared/package.json b/libs/json-api/json-api-nestjs-shared/package.json index 25918d9b..f393d9d8 100644 --- a/libs/json-api/json-api-nestjs-shared/package.json +++ b/libs/json-api/json-api-nestjs-shared/package.json @@ -5,6 +5,5 @@ "tslib": "^2.3.0" }, "type": "commonjs", - "main": "./src/index.js", - "typings": "./src/index.d.ts" + "main": "./src/index.js" } diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json index cdb32619..5362484c 100644 --- a/libs/json-api/json-api-nestjs-shared/project.json +++ b/libs/json-api/json-api-nestjs-shared/project.json @@ -24,6 +24,16 @@ "assets": ["libs/json-api/json-api-nestjs-shared/*.md"] } }, + "ts-test": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "tsd --files \"src/**/*.test-d.ts\" -t src/lib/types/index.ts" + ], + "cwd": "{workspaceRoot}/{projectRoot}", + "parallel": false + } + }, "nx-release-publish": { "options": { "packageRoot": "dist/{projectRoot}" diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts new file mode 100644 index 00000000..23cd7b5a --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts @@ -0,0 +1,68 @@ +import { expectType } from 'tsd'; +import { Any } from 'ts-toolbelt'; + +import { Users } from '../utils/___test___/test-classes.helper'; + +import { RelationKeys, PropertyKeys, IsIterator } from './entity-type'; +import { Collection } from '@mikro-orm/core'; + +type RelationId = 'addresses' | 'manager' | 'roles' | 'comments' | 'userGroup'; +type RelationName = 'roles'; +type PropertyId = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt'; +type PropertyName = + | 'id' + | 'login' + | 'firstName' + | 'testReal' + | 'testArrayNull' + | 'lastName' + | 'isActive' + | 'testDate' + | 'createdAt' + | 'updatedAt' + | 'addresses' + | 'manager' + | 'comments' + | 'userGroup'; + +type IsEqualsRelationId = Any.Equals, RelationId>; +type IsEqualsRelationName = Any.Equals< + RelationKeys, + RelationName +>; +type IsNoEqualsRelationName = Any.Equals< + RelationKeys, + 'comments' +>; + +type IsEqualsPropertyId = Any.Equals, PropertyId>; +type IsEqualsPropertyName = Any.Equals< + PropertyKeys, + PropertyName +>; +type IsNoEqualsPropertyName = Any.Equals, 'roles'>; + +expectType(1); +expectType(1); +expectType(0); + +expectType(1); +expectType(1); +expectType(0); + +type ArrayUsers = Users[]; +type CollectionUsers = Collection; + +expectType>(1); +expectType>(1); +expectType>(0); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts index 5fbdd04f..561494a9 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts @@ -1,17 +1,40 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; +import { Any } from 'ts-toolbelt'; + +export type HasId = Any.At extends undefined + ? 0 + : 1; + +export type CastIteratorType = T extends { + [Symbol.iterator](): Iterator; +} + ? U + : T; + +type RelationCheck = T extends never + ? 0 + : T extends Promise + ? HasId + : HasId, IdKey>; + +export type RelationKeys = { + [K in keyof E]: Exclude extends never + ? never + : RelationCheck, IdKey> extends 1 + ? K + : never; +}[keyof E]; + +export type PropertyKeys = keyof Omit< + E, + RelationKeys +>; + +export type IsIterator = T extends { + [Symbol.iterator](): Iterator; +} + ? 1 + : 0; + +export type TypeOfArray = T extends (infer U)[] ? U : T; + +export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts index 33b70ba6..e092f90f 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/index.ts @@ -1,4 +1,3 @@ -export * from './utils-string.type'; export * from './query-type'; export * from './entity-type'; export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts new file mode 100644 index 00000000..bf4a3f66 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.test-d.ts @@ -0,0 +1,167 @@ +import { expectAssignable } from 'tsd'; + +import { + Attributes, + ResourceObject, + BaseMeta, + Include, + ResourceObjectRelationships, +} from './response-body'; +import { Users } from '../utils/___test___/test-classes.helper'; + +const CheckBaseMeta = { + meta: { time: 1 }, +} satisfies BaseMeta; + +const CheckBaseMetaExtend = { + meta: { time: 1, someData: '' }, +} satisfies BaseMeta<'object', { someData: string }>; + +const CheckBaseMetaForArray = { + meta: { time: 1, pageSize: 0, pageNumber: 0, totalItems: 0 }, +} satisfies BaseMeta<'array'>; + +expectAssignable(CheckBaseMeta); +expectAssignable>(CheckBaseMetaExtend); +expectAssignable>(CheckBaseMetaForArray); + +const CheckAttributes = { + firstName: '', + lastName: '', + login: '', + isActive: null, + testDate: new Date(), + testArrayNull: null, + testReal: [1], + createdAt: new Date(), + updatedAt: new Date(), +} satisfies Attributes; + +expectAssignable>(CheckAttributes); + +const CheckInclude = { + id: '1', + type: 'users', + attributes: CheckAttributes, + relationships: { + addresses: { + links: { + self: 'selflinks', + }, + }, + manager: { + links: { + self: 'selflinks', + }, + data: { + type: 'users', + id: 'dssd', + }, + }, + comments: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'comments' }], + }, + roles: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'roles' }], + }, + userGroup: { + links: { self: 'selfLinks' }, + data: null, + }, + }, + links: { self: 'selfLinks' }, +} satisfies Include; + +expectAssignable>(CheckInclude); + +const CheckResourceObject = { + meta: CheckBaseMeta.meta, + data: { + id: '1', + type: 'users', + attributes: CheckAttributes, + links: { self: 'selfLinks' }, + }, +} satisfies ResourceObject; + +const CheckResourceObjectArray = { + meta: CheckBaseMetaForArray.meta, + data: [ + { + id: '1', + type: 'users', + attributes: CheckAttributes, + relationships: { + addresses: { + links: { + self: 'selflinks', + }, + }, + manager: { + links: { + self: 'selflinks', + }, + data: { + type: 'users', + id: 'dssd', + }, + }, + comments: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'comments' }], + }, + roles: { + links: { + self: 'selfLinks', + }, + data: [{ id: '1', type: 'roles' }], + }, + userGroup: { + links: { self: 'selfLinks' }, + data: null, + }, + }, + links: { self: 'selfLinks' }, + }, + ], +} satisfies ResourceObject; + +expectAssignable>(CheckResourceObject); +expectAssignable>(CheckResourceObjectArray); + +const CheckResourceObjectRelationships = { + meta: { + time: 1, + }, + data: { + id: '1', + type: 'users-groups', + }, +} satisfies ResourceObjectRelationships; + +const CheckResourceObjectRelationshipsArray = { + meta: { + time: 1, + }, + data: [ + { + id: '1', + type: 'users-groups', + }, + ], +} satisfies ResourceObjectRelationships; + +expectAssignable>( + CheckResourceObjectRelationships +); +expectAssignable>( + CheckResourceObjectRelationshipsArray +); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts index 85dbdb49..315304c8 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/response-body.ts @@ -1,11 +1,14 @@ import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; + PropertyKeys, + RelationKeys, + IsIterator, + CastIteratorType, +} from './entity-type'; +import { ValueOf } from './entity-type'; + +export type DebugMetaProps = Partial<{ + time: number; +}>; export type PageProps = { totalItems: number; @@ -13,64 +16,117 @@ export type PageProps = { pageSize: number; }; -export type DebugMetaProps = Partial<{ - time: number; -}>; - export type MainData = { type: T; id: string; }; +export type BaseMainData< + Entity, + IdKey extends string, + Rel extends RelationKeys +> = { + data: IsIterator extends 1 + ? MainData[] + : [Extract] extends [never] + ? MainData + : MainData | null; +}; + +export type MetaProps = R extends null ? T : T & R; + +export type MetaPropsForArrayResourceObject = MetaProps< + PageProps, + DebugMetaProps +>; export type Links = { self: string; - related?: string; }; -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; +export type BaseLinks = { + links: Links; }; -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; +export type Attributes = { + [P in Exclude, IdKey>]?: Entity[P]; +}; -export type Data = { - data?: DataResult; +export type BaseAttribute< + Entity extends object, + IdKey extends string = 'id' +> = { + attributes?: Attributes; +}; + +export type Relationships< + Entity extends object, + IdKey extends string = 'id' +> = { + [P in RelationKeys]?: + | BaseLinks + | (BaseLinks & BaseMainData); }; -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; +export type BaseRelationships< + Entity extends object, + IdKey extends string = 'id' +> = { relationships?: Relationships }; + +export type Meta< + Type extends 'object' | 'array', + ExtendBase +> = Type extends 'array' + ? MetaProps + : MetaProps; + +export type BaseMeta< + Type extends 'object' | 'array' = 'object', + ExtendBase = null +> = { + meta: Meta; }; -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; +export type BaseResourceData< + Entity extends object, + Type extends 'object' | 'array' = 'object', + IdKey extends string = 'id' +> = { + data: Type extends 'array' + ? ResourceData[] + : ResourceData; +}; + +export type Include = ValueOf<{ + [Rel in RelationKeys]: CastIteratorType< + Entity[Rel] + > extends object + ? ResourceData> + : never; }>; -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; +export type BaseIncluded = { + included?: Include[]; }; -export type MetaProps = R extends null ? T : T & R; +export type ResourceData< + Entity extends object, + IdKey extends string = 'id' +> = MainData & + BaseAttribute & + BaseRelationships & + BaseLinks; export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; + Entity extends object, + Type extends 'object' | 'array' = 'object', + ExtendBase = null, + IdKey extends string = 'id' +> = BaseMeta & + BaseResourceData & + BaseIncluded; -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; +export type ResourceObjectRelationships< + Entity extends object, + IdKey extends string, + Rel extends RelationKeys +> = BaseMeta & BaseMainData; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts new file mode 100644 index 00000000..46754b8e --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts @@ -0,0 +1,56 @@ +import { Collection } from '@mikro-orm/core'; +type IUsers = Users; +export class Users { + public id!: number; + public login!: string; + public firstName!: string; + public testReal: number[] = []; + public testArrayNull!: number[] | null; + public lastName!: string | null; + public isActive!: null; + public testDate!: Date; + public createdAt: Date = new Date(); + public updatedAt: Date = new Date(); + + public addresses!: IAddresses; + public manager!: IUsers; + public roles = new Collection(this); + public comments!: Comments[]; + public userGroup!: UserGroups | null; +} +type IRoles = Roles; +export class Roles { + public id!: number; + public name!: string; + public key!: string; + public isDefault!: boolean; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IUserGroups = UserGroups; +export class UserGroups { + public id!: number; + public label!: string; +} +type IAddresses = Addresses; +export class Addresses { + public id!: number; + public city!: string; + public state!: string; + public country!: string; + public arrayField!: string[]; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IComments = Comments; +export class Comments { + public id!: number; + public kind!: CommentKind; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts index a7799257..53a4561e 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/index.ts @@ -1,2 +1 @@ -export * from './string-utils'; export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts new file mode 100644 index 00000000..dd3134d9 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.spec.ts @@ -0,0 +1,11 @@ +import { getEntityName } from './object-utils'; + +describe('object utils', () => { + it('getEntityName', () => { + expect(getEntityName('Entity')).toBe('Entity'); + expect(getEntityName(class EntityClass {})).toBe('EntityClass'); + class EntityClassInst {} + const tmp = new EntityClassInst(); + expect(getEntityName(tmp as any)).toBe('EntityClassInst'); + }); +}); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts index 5d4ad26d..77133712 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts @@ -1,4 +1,4 @@ -import { kebabToCamel } from './string-utils'; +import { kebabCase } from 'change-case-commonjs'; export const ObjectTyped = { keys: Object.keys as (yourObject: T) => Array, @@ -15,7 +15,41 @@ export function isObject(item: unknown): item is object { return typeof item === 'object' && !Array.isArray(item) && item !== null; } +export function isString(value: T): value is P { + return typeof value === 'string' || value instanceof String; +} + export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); + const entityName = kebabCase(name); return Function('return new class ' + entityName + '{}')(); } + +export const getEntityName = (entity: unknown): string => { + if (entity === null) throw new Error('Entity is null'); + + if (typeof entity === 'string') { + return entity; + } + + if (typeof entity === 'object' && 'name' in entity) { + return `${entity['name']}`; + } + + if ( + typeof entity === 'object' && + 'constructor' in entity && + 'name' in entity.constructor + ) { + return entity['constructor']['name']; + } + + if ( + typeof entity === 'function' && + 'constructor' in entity.prototype && + 'name' in entity.prototype.constructor + ) { + return entity.prototype.constructor.name; + } + + throw new Error('Entity is not object'); +}; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json index ab55b7c7..cfccf319 100644 --- a/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-shared/tsconfig.spec.json @@ -4,7 +4,8 @@ "outDir": "../../../dist/out-tsc", "module": "commonjs", "moduleResolution": "node10", - "types": ["jest", "node"] + "types": ["jest", "node"], + "allowJs": true }, "include": [ "jest.config.ts", From 7054e93d8a8a4d9129d1e4b1a9126292e56334c0 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 07:09:12 +0100 Subject: [PATCH 06/22] feat(json-api-server): Use new signature --- .eslintrc.json | 6 ++++++ apps/json-api-server/project.json | 3 ++- apps/json-api-server/src/app/app.module.ts | 1 - .../extend-book-list.controller.ts | 7 +++++-- .../extend-user/extend-user.controller.ts | 20 ++++++++++--------- .../micro-orm/resources-micro.module.ts | 3 ++- .../micro-orm/service/example.pipe.ts | 9 +++++++-- .../extend-book-list.controller.ts | 7 +++++-- .../extend-user/extend-user.controller.ts | 20 ++++++++++--------- .../type-orm/resources-type.module.ts | 3 ++- .../type-orm/service/example.pipe.ts | 9 +++++++-- apps/json-api-server/src/main.ts | 10 +++++----- apps/json-api-server/tsconfig.app.json | 6 ++++-- tsconfig.base.json | 14 +++++++++---- 14 files changed, 77 insertions(+), 41 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 22c9556b..3e21525e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,12 @@ ] } }, + { + "files": ["*.test-d.ts"], + "rules": { + "@typescript-eslint/ban-ts-comment": "off" + } + }, { "files": ["*.ts", "*.tsx"], "rules": {} diff --git a/apps/json-api-server/project.json b/apps/json-api-server/project.json index 475e60ce..657dc921 100644 --- a/apps/json-api-server/project.json +++ b/apps/json-api-server/project.json @@ -20,5 +20,6 @@ } } }, - "tags": [] + "tags": [], + "implicitDependencies": ["json-api-nestjs-typeorm", "json-api-nestjs-microorm"] } diff --git a/apps/json-api-server/src/app/app.module.ts b/apps/json-api-server/src/app/app.module.ts index 28b47579..6d200c5f 100644 --- a/apps/json-api-server/src/app/app.module.ts +++ b/apps/json-api-server/src/app/app.module.ts @@ -6,7 +6,6 @@ import { MicroOrmDatabaseModule } from '@nestjs-json-api/microorm-database'; import { ResourcesTypeModule } from './resources/type-orm/resources-type.module'; import { ResourcesMicroModule } from './resources/micro-orm/resources-micro.module'; import { RpcModule } from './rpc/rpc.module'; -import * as process from 'process'; const ormModule = process.env['ORM_TYPE'] === 'typeorm' diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts index ab49a56f..de163385 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts @@ -1,10 +1,13 @@ import { ParseUUIDPipe } from '@nestjs/common'; import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs'; - import { BookList } from '@nestjs-json-api/microorm-database'; + @JsonApi(BookList, { pipeForId: ParseUUIDPipe, overrideRoute: 'override-book-list', allowMethod: ['getOne', 'postOne', 'deleteOne'], }) -export class ExtendBookListController extends JsonBaseController {} +export class ExtendBookListController extends JsonBaseController< + BookList, + 'id' +> {} diff --git a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts index c2ba33f5..de2bd612 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts @@ -15,12 +15,14 @@ import { JsonApiService, Query as QueryType, QueryOne, - ResourceObject, - EntityRelation, PatchRelationshipData, - ResourceObjectRelationships, PostData, } from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, + ResourceObject, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { ExamplePipe } from '../../service/example.pipe'; import { ExampleService } from '../../service/example.service'; import { ControllerInterceptor } from '../../service/controller.interceptor'; @@ -38,28 +40,28 @@ import { AtomicInterceptor } from '../../service/atomic.interceptor'; @UseFilters(new HttpExceptionFilter()) @UseInterceptors(ControllerInterceptor) @JsonApi(Users) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; override getOne( id: string | number, - query: QueryOne + query: QueryOne ): Promise> { const t = query.fields?.target; return super.getOne(id, query); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } // @UseInterceptors(AtomicInterceptor) - postOne(inputData: PostData): Promise> { + postOne(inputData: PostData): Promise> { return super.postOne(inputData); } @@ -67,7 +69,7 @@ export class ExtendUserController extends JsonBaseController { @UseFilters(HttpExceptionMethodFilter) @UseInterceptors(MethodInterceptor) getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } diff --git a/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts index 88248808..10b2c045 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; -import { JsonApiModule, MicroOrmJsonApiModule } from '@klerick/json-api-nestjs'; +import { JsonApiModule } from '@klerick/json-api-nestjs'; +import { MicroOrmJsonApiModule } from '@klerick/json-api-nestjs-microorm'; import { Users, Addresses, diff --git a/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts index a7b49347..ca0b2aac 100644 --- a/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts +++ b/apps/json-api-server/src/app/resources/micro-orm/service/example.pipe.ts @@ -7,8 +7,13 @@ import { import { Query } from '@klerick/json-api-nestjs'; import { Users } from '@nestjs-json-api/microorm-database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe + implements PipeTransform, Query> +{ + transform( + value: Query, + metadata: ArgumentMetadata + ): Query { if (value.filter.target?.firstName?.eq === 'testCustomPipe') { const error = { code: 'invalid_arguments', diff --git a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts index 170dab5b..8870dfcc 100644 --- a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts +++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-book-list/extend-book-list.controller.ts @@ -1,10 +1,13 @@ import { ParseUUIDPipe } from '@nestjs/common'; import { JsonApi, JsonBaseController } from '@klerick/json-api-nestjs'; - import { BookList } from '@nestjs-json-api/typeorm-database'; + @JsonApi(BookList, { pipeForId: ParseUUIDPipe, overrideRoute: 'override-book-list', allowMethod: ['getOne', 'postOne', 'deleteOne'], }) -export class ExtendBookListController extends JsonBaseController {} +export class ExtendBookListController extends JsonBaseController< + BookList, + 'id' +> {} diff --git a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts index 87b4f842..faa1ae08 100644 --- a/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts +++ b/apps/json-api-server/src/app/resources/type-orm/controllers/extend-user/extend-user.controller.ts @@ -15,12 +15,14 @@ import { JsonApiService, Query as QueryType, QueryOne, - ResourceObject, - EntityRelation, PatchRelationshipData, - ResourceObjectRelationships, PostData, } from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, + ResourceObject, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { ExamplePipe } from '../../service/example.pipe'; import { ExampleService } from '../../service/example.service'; import { ControllerInterceptor } from '../../service/controller.interceptor'; @@ -38,26 +40,26 @@ import { AtomicInterceptor } from '../../service/atomic.interceptor'; @UseFilters(new HttpExceptionFilter()) @UseInterceptors(ControllerInterceptor) @JsonApi(Users) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; override getOne( id: string | number, - query: QueryOne + query: QueryOne ): Promise> { return super.getOne(id, query); } - patchRelationship>( + patchRelationship>( id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } // @UseInterceptors(AtomicInterceptor) - postOne(inputData: PostData): Promise> { + postOne(inputData: PostData): Promise> { return super.postOne(inputData); } @@ -65,7 +67,7 @@ export class ExtendUserController extends JsonBaseController { @UseFilters(HttpExceptionMethodFilter) @UseInterceptors(MethodInterceptor) getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } diff --git a/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts index 397eb04b..a0852684 100644 --- a/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts +++ b/apps/json-api-server/src/app/resources/type-orm/resources-type.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; -import { JsonApiModule, TypeOrmJsonApiModule } from '@klerick/json-api-nestjs'; +import { JsonApiModule } from '@klerick/json-api-nestjs'; +import { TypeOrmJsonApiModule } from '@klerick/json-api-nestjs-typeorm'; import { Users, Addresses, diff --git a/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts index 9adda16d..3f4350e5 100644 --- a/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts +++ b/apps/json-api-server/src/app/resources/type-orm/service/example.pipe.ts @@ -7,8 +7,13 @@ import { import { Query } from '@klerick/json-api-nestjs'; import { Users } from '@nestjs-json-api/typeorm-database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe + implements PipeTransform, Query> +{ + transform( + value: Query, + metadata: ArgumentMetadata + ): Query { if (value.filter.target?.firstName?.eq === 'testCustomPipe') { const error = { code: 'invalid_arguments', diff --git a/apps/json-api-server/src/main.ts b/apps/json-api-server/src/main.ts index 12740930..cfe15691 100644 --- a/apps/json-api-server/src/main.ts +++ b/apps/json-api-server/src/main.ts @@ -9,26 +9,26 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { WsAdapter } from '@nestjs/platform-ws'; import { AppModule } from './app/app.module'; +import { NestExpressApplication } from '@nestjs/platform-express'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule); app.useWebSocketAdapter(new WsAdapter(app)); const globalPrefix = 'api'; app.setGlobalPrefix(globalPrefix); const config = new DocumentBuilder() + .setOpenAPIVersion('3.1.0') .setTitle('JSON API swagger example') .setDescription('The JSON API list example') .setVersion('1.0') .build(); + app.set('query parser', 'extended'); SwaggerModule.setup( 'swagger', app, - () => ({ - ...SwaggerModule.createDocument(app, config), - openapi: '3.1.0', - }), + () => SwaggerModule.createDocument(app, config), {} ); await app.init(); diff --git a/apps/json-api-server/tsconfig.app.json b/apps/json-api-server/tsconfig.app.json index 4843ccf5..94727a51 100644 --- a/apps/json-api-server/tsconfig.app.json +++ b/apps/json-api-server/tsconfig.app.json @@ -17,9 +17,11 @@ "exclude": [ "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts" + "src/**/*.test.ts", + "**/*.test-d.ts" ], "include": [ - "src/**/*.ts" + "src/**/*.ts", + "*.test-d.ts" ] } diff --git a/tsconfig.base.json b/tsconfig.base.json index b4cd5ce3..691bb87f 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,9 +15,6 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@klerick/json-api-nestjs": [ - "libs/json-api/json-api-nestjs/src/index.ts" - ], "@klerick/json-api-nestjs-sdk": [ "libs/json-api/json-api-nestjs-sdk/src/index.ts" ], @@ -25,7 +22,16 @@ "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" ], "@klerick/json-api-nestjs-shared": [ - "libs/json-api/json-api-nestjs-shared/src/index.ts" + "dist/libs/json-api/json-api-nestjs-shared" + ], + "@klerick/json-api-nestjs-typeorm": [ + "dist/libs/json-api/json-api-nestjs-typeorm" + ], + "@klerick/json-api-nestjs": [ + "dist/libs/json-api/json-api-nestjs" + ], + "@klerick/json-api-nestjs-microorm": [ + "dist/libs/json-api/json-api-nestjs-microorm" ], "@klerick/nestjs-json-rpc": [ "libs/json-rpc/nestjs-json-rpc/src/index.ts" From 95eac72cc853ad5d11a746fa22655f00998b2398 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 27 Feb 2025 07:12:07 +0100 Subject: [PATCH 07/22] test(json-api-server-e2e): Fix change test for new signature --- apps/json-api-server-e2e/jest.config.ts | 10 ++++++++++ apps/json-api-server-e2e/project.json | 10 ++++++++++ .../src/json-api/json-api-sdk/patch-methode.spec.ts | 8 ++------ .../src/json-api/json-api-sdk/post-method.spec.ts | 3 --- .../src/json-api/utils/run-application.ts | 4 +++- apps/json-api-server-e2e/tsconfig.spec.json | 3 ++- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/apps/json-api-server-e2e/jest.config.ts b/apps/json-api-server-e2e/jest.config.ts index f9502b7b..cf120cec 100644 --- a/apps/json-api-server-e2e/jest.config.ts +++ b/apps/json-api-server-e2e/jest.config.ts @@ -17,4 +17,14 @@ export default { }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/json-api-server-e2e', + moduleNameMapper: { + '^@klerick/json-api-nestjs$': + '/../../dist/libs/json-api/json-api-nestjs', + '^@klerick/json-api-nestjs-microorm$': + '/../../dist/libs/json-api/json-api-nestjs-microorm', + '^@klerick/json-api-nestjs-shared$': + '/../../dist/libs/json-api/json-api-nestjs-shared', + '^@klerick/json-api-nestjs-typeorm$': + '/../../dist/libs/json-api/json-api-nestjs-typeorm', + }, }; diff --git a/apps/json-api-server-e2e/project.json b/apps/json-api-server-e2e/project.json index 4c159112..c702eb4b 100644 --- a/apps/json-api-server-e2e/project.json +++ b/apps/json-api-server-e2e/project.json @@ -7,6 +7,11 @@ "projectType": "application", "targets": { "e2e": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], "executor": "@nx/jest:jest", "outputs": [ "{workspaceRoot}/coverage/{e2eProjectRoot}" @@ -18,6 +23,11 @@ } }, "e2e-micro": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], "executor": "@nx/jest:jest", "outputs": [ "{workspaceRoot}/coverage/{e2eProjectRoot}" diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts index 09289a0f..5a2d61d6 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/patch-methode.spec.ts @@ -29,7 +29,7 @@ describe('PATCH method:', () => { let comments: Comments; let commentsAfterSave: Comments; - let newCommentsAfterSave: Comments; + let newCommentsAfterSave: Comments | undefined = undefined; beforeEach(async () => { jsonSdk = creatSdk(); @@ -89,9 +89,7 @@ describe('PATCH method:', () => { newAddress ); - const newCommentsAfterSave = await jsonSdk.jonApiSdkService.postOne( - newComments - ); + newCommentsAfterSave = await jsonSdk.jonApiSdkService.postOne(newComments); userAfterSave.addresses = newAddressAfterSave; userAfterSave.comments = [newCommentsAfterSave]; @@ -104,8 +102,6 @@ describe('PATCH method:', () => { expect(userAfterUpdate.addresses).toEqual(newAddressAfterSave); newCommentsAfterSave.updatedAt = userAfterUpdate.comments[0].updatedAt; expect(userAfterUpdate.comments[0]).toEqual(newCommentsAfterSave); - - await jsonSdk.jonApiSdkService.deleteOne(newCommentsAfterSave); }); it('Should be update empty attributes with relations', async () => { diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts index 226947cf..78fe67f0 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/post-method.spec.ts @@ -26,7 +26,6 @@ describe('POST method:', () => { let addressAfterSave: Addresses; let user: Users; let userAfterSave: Users; - let bookListAfterSave: BookList; let comments: Comments; let commentsAfterSave: Comments; @@ -53,8 +52,6 @@ describe('POST method:', () => { if (commentsAfterSave) await jsonSdk.jonApiSdkService.deleteOne(commentsAfterSave); if (userAfterSave) await jsonSdk.jonApiSdkService.deleteOne(userAfterSave); - if (bookListAfterSave) - await jsonSdk.jonApiSdkService.deleteOne(bookListAfterSave); await jsonSdk.jonApiSdkService.deleteOne(addressAfterSave); }); diff --git a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts index 74698971..ecb15d6d 100644 --- a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts +++ b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts @@ -17,6 +17,7 @@ import { AppModule } from '../../../../json-api-server/src/app/app.module'; import { JsonConfig } from '../../../../../libs/json-api/json-api-nestjs-sdk/src/lib/types'; import { WsAdapter } from '@nestjs/platform-ws'; import { Subject } from 'rxjs'; +import { NestExpressApplication } from '@nestjs/platform-express'; export const axiosAdapter = adapterForAxios(axios); let saveApp: INestApplication; @@ -28,7 +29,7 @@ export const run = async () => { const moduleRef = await Test.createTestingModule({ imports: [AppModule], }).compile(); - const app = moduleRef.createNestApplication({ + const app = moduleRef.createNestApplication({ bufferLogs: true, logger: false, }); @@ -36,6 +37,7 @@ export const run = async () => { // const app = await NestFactory.create(AppModule); app.setGlobalPrefix(globalPrefix); app.useWebSocketAdapter(new WsAdapter(app)); + app.set('query parser', 'extended'); await app.init(); await app.listen(port); diff --git a/apps/json-api-server-e2e/tsconfig.spec.json b/apps/json-api-server-e2e/tsconfig.spec.json index 30dc8a48..98c05597 100644 --- a/apps/json-api-server-e2e/tsconfig.spec.json +++ b/apps/json-api-server-e2e/tsconfig.spec.json @@ -10,7 +10,8 @@ "strictNullChecks": true, "noImplicitAny": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "allowJs": true }, "include": [ "jest.config.ts", From 4359ac75a018b9b9ac9c87d3ec1d9a01b9cf3535 Mon Sep 17 00:00:00 2001 From: Alex H Date: Tue, 4 Mar 2025 18:13:53 +0100 Subject: [PATCH 08/22] feat(json-api-nestjs-shared): Use new structure set two type package in npm package.json --- .nxignore | 2 + .../json-api-nestjs-shared/package.json | 4 +- .../json-api-nestjs-shared/project.json | 70 +- .../json-api-nestjs-shared/src/index.ts | 1 + .../src/lib/constants/index.ts | 2 + .../src/lib/types/entity-type.test-d.ts | 2 +- .../src/lib/types/entity-type.ts | 3 + .../src/lib/types/query-type.ts | 6 + .../utils/___test___/test-classes.helper.ts | 56 - .../src/lib/utils/object-utils.ts | 4 +- .../tsconfig-mjs.lib.json | 21 + .../json-api-nestjs-shared/tsconfig.lib.json | 2 +- package-lock.json | 12190 ++++++---------- 13 files changed, 4582 insertions(+), 7781 deletions(-) create mode 100644 .nxignore create mode 100644 libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts create mode 100644 libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json diff --git a/.nxignore b/.nxignore new file mode 100644 index 00000000..c429e119 --- /dev/null +++ b/.nxignore @@ -0,0 +1,2 @@ +**/*.test-d.ts +**/__test__/**/* diff --git a/libs/json-api/json-api-nestjs-shared/package.json b/libs/json-api/json-api-nestjs-shared/package.json index f393d9d8..f473d100 100644 --- a/libs/json-api/json-api-nestjs-shared/package.json +++ b/libs/json-api/json-api-nestjs-shared/package.json @@ -5,5 +5,7 @@ "tslib": "^2.3.0" }, "type": "commonjs", - "main": "./src/index.js" + "main": "./cjs/src/index.js", + "types": "./cjs/src/index.d.ts", + "module": "./mjs/src/index.js" } diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json index 5362484c..c1b89925 100644 --- a/libs/json-api/json-api-nestjs-shared/project.json +++ b/libs/json-api/json-api-nestjs-shared/project.json @@ -13,15 +13,71 @@ }, "tags": [], "targets": { - "build": { + "build-cjs": { "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}/cjs", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + { + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + } + ], + "updateBuildableProjectDepsInPackageJson": true + } + }, + "build-mjs": { + "executor": "@nx/js:tsc", + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}/mjs", + "tsConfig": "{projectRoot}/tsconfig-mjs.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + { + "glob": "*.md", + "input": "{projectRoot}", + "output": "../" + } + ] + } + }, + "build": { + "executor": "nx:run-commands", + "dependsOn": [ + "build-cjs", + "build-mjs" + ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-shared", - "tsConfig": "libs/json-api/json-api-nestjs-shared/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs-shared/package.json", - "main": "libs/json-api/json-api-nestjs-shared/src/index.ts", - "assets": ["libs/json-api/json-api-nestjs-shared/*.md"] + "commands": [ + { + "command": "[ ! -f dist/{projectRoot}/cjs/package.json ] || mv dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", + "forwardAllArgs": false + }, + { + "command": "rm -rf dist/{projectRoot}/mjs/package.json", + "forwardAllArgs": false + }, + { + "command": "mkdir -p node_modules/@klerick && rm -rf node_modules/@klerick/json-api-nestjs-shared", + "forwardAllArgs": false + }, + { + "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-shared" + } + ], + "cwd": "./", + "parallel": false } }, "ts-test": { diff --git a/libs/json-api/json-api-nestjs-shared/src/index.ts b/libs/json-api/json-api-nestjs-shared/src/index.ts index a0fe9b9f..e54953b8 100644 --- a/libs/json-api/json-api-nestjs-shared/src/index.ts +++ b/libs/json-api/json-api-nestjs-shared/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/utils'; export * from './lib/types'; +export * from './lib/constants'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts new file mode 100644 index 00000000..73cf7764 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/src/lib/constants/index.ts @@ -0,0 +1,2 @@ +export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; +export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts index 23cd7b5a..8114f9df 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.test-d.ts @@ -4,7 +4,7 @@ import { Any } from 'ts-toolbelt'; import { Users } from '../utils/___test___/test-classes.helper'; import { RelationKeys, PropertyKeys, IsIterator } from './entity-type'; -import { Collection } from '@mikro-orm/core'; +import type { Collection } from '@mikro-orm/core'; type RelationId = 'addresses' | 'manager' | 'roles' | 'comments' | 'userGroup'; type RelationName = 'roles'; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts index 561494a9..bc40ceed 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/entity-type.ts @@ -38,3 +38,6 @@ export type IsIterator = T extends { export type TypeOfArray = T extends (infer U)[] ? U : T; export type ValueOf = T[keyof T]; +export type Constructor = new (...args: any[]) => T; +export type AnyEntity = T; +export type EntityClass = Constructor; diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts index ddeead7a..f7dc00c1 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/types/query-type.ts @@ -34,3 +34,9 @@ export enum FilterOperandOnlySimple { ne = 'ne', regexp = 'regexp', } + +export enum Operation { + add = 'add', + update = 'update', + remove = 'remove', +} diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts index 46754b8e..e69de29b 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts @@ -1,56 +0,0 @@ -import { Collection } from '@mikro-orm/core'; -type IUsers = Users; -export class Users { - public id!: number; - public login!: string; - public firstName!: string; - public testReal: number[] = []; - public testArrayNull!: number[] | null; - public lastName!: string | null; - public isActive!: null; - public testDate!: Date; - public createdAt: Date = new Date(); - public updatedAt: Date = new Date(); - - public addresses!: IAddresses; - public manager!: IUsers; - public roles = new Collection(this); - public comments!: Comments[]; - public userGroup!: UserGroups | null; -} -type IRoles = Roles; -export class Roles { - public id!: number; - public name!: string; - public key!: string; - public isDefault!: boolean; - createdAt: Date = new Date(); - updatedAt: Date = new Date(); -} -type IUserGroups = UserGroups; -export class UserGroups { - public id!: number; - public label!: string; -} -type IAddresses = Addresses; -export class Addresses { - public id!: number; - public city!: string; - public state!: string; - public country!: string; - public arrayField!: string[]; - createdAt: Date = new Date(); - updatedAt: Date = new Date(); -} -type IComments = Comments; -export class Comments { - public id!: number; - public kind!: CommentKind; - createdAt: Date = new Date(); - updatedAt: Date = new Date(); -} -export enum CommentKind { - Comment = 'COMMENT', - Message = 'MESSAGE', - Note = 'NOTE', -} diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts index 77133712..3dbec564 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/object-utils.ts @@ -1,4 +1,4 @@ -import { kebabCase } from 'change-case-commonjs'; +import { pascalCase } from 'change-case-commonjs'; export const ObjectTyped = { keys: Object.keys as (yourObject: T) => Array, @@ -20,7 +20,7 @@ export function isString(value: T): value is P { } export function createEntityInstance(name: string): E { - const entityName = kebabCase(name); + const entityName = pascalCase(name); return Function('return new class ' + entityName + '{}')(); } diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json new file mode 100644 index 00000000..4259d741 --- /dev/null +++ b/libs/json-api/json-api-nestjs-shared/tsconfig-mjs.lib.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [ + "node" + ], + "module": "es2015", + "target": "ES2022", + "removeComments": false, + "declaration": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test-d.ts", + "src/**/___test___/**/*.ts" + ] +} diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json index dbf54fd7..1a4d3afb 100644 --- a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json @@ -12,5 +12,5 @@ "noFallthroughCasesInSwitch": true }, "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.test-d.ts", "src/lib/utils/___test___/**/*.ts"] } diff --git a/package-lock.json b/package-lock.json index 3f3ffde2..79333af1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,24 +113,21 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@adobe/css-tools": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -141,8 +138,7 @@ }, "node_modules/@anatine/zod-openapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@anatine/zod-openapi/-/zod-openapi-2.2.7.tgz", - "integrity": "sha512-kv/bGowgSGHNY2d/KIzx941ym0/elc7xoBiPri31qEUqbDPOSIppiMOZ88AedaTtLk5J1K96++h0CEsHkgFFyQ==", + "license": "MIT", "dependencies": { "ts-deepmerge": "^6.0.3" }, @@ -153,9 +149,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1901.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.8.tgz", - "integrity": "sha512-DzvlL1Zg+zOnVmMN3CjE5KzjZAltRZwOwwcso72iWenBPvl/trKzPDlA6ySmpRonm+AR9i9JrdLEUlwczW6/bQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "19.1.8", "rxjs": "7.8.1" @@ -168,9 +163,8 @@ }, "node_modules/@angular-devkit/build-angular": { "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.8.tgz", - "integrity": "sha512-LPKbxjW6ZjyujnL/lbkecxEFVoV1ItKNsrlsHU6kq0LsR4/DsIgstnHVIG9KoyJV++IM144TWB1Cr4/Jaxxu+w==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1901.8", @@ -293,81 +287,12 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@discoveryjs/json-ext": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", @@ -385,483 +310,561 @@ "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/less": { + "version": "4.2.1", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, "engines": { - "node": ">=18" + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { + "version": "12.2.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], + "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { + "version": "2.1.0", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", "dev": true, + "license": "ISC", "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" + "bin": { + "semver": "bin/semver" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], + "node_modules/@angular-devkit/build-angular/node_modules/pify": { + "version": "4.0.1", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "peer": true, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", "dev": true, + "license": "BSD-3-Clause", "optional": true, - "os": [ - "linux" - ], - "peer": true, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "hasInstallScript": true, "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { + "version": "6.0.1", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, "optional": true, - "os": [ - "netbsd" - ], "peer": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">=18" + "node": ">= 14" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1901.8", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1901.8", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=18" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/core": { + "version": "19.1.8", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, "engines": { - "node": ">=18" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.17.1", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/core/node_modules/ajv-formats": { + "version": "3.0.1", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], + "node_modules/@angular-devkit/schematics": { + "version": "19.1.8", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.1.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=18" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.1.0", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "node_modules/@angular-eslint/eslint-plugin": { + "version": "19.1.0", "dev": true, - "engines": { - "node": ">=14.21.3" + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "@angular-eslint/utils": "19.1.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-devkit/build-angular/node_modules/less": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", - "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "19.1.0", "dev": true, + "license": "MIT", "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "@angular-eslint/utils": "19.1.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" + "peerDependencies": { + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "node_modules/@angular-eslint/template-parser": { + "version": "19.1.0", "dev": true, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.1.0", + "eslint-scope": "^8.0.2" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/@angular-eslint/utils": { + "version": "19.1.0", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@angular-eslint/bundled-angular-compiler": "19.1.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-devkit/build-angular/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, + "node_modules/@angular/animations": { + "version": "19.1.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.7" } }, - "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", - "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", + "node_modules/@angular/build": { + "version": "19.1.8", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@babel/core": "7.26.0", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.11", + "watchpack": "2.4.2" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "lmdb": "3.2.2" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.8", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "6.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", @@ -905,91 +908,7 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "dev": true, - "hasInstallScript": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/yaml": { + "node_modules/@angular/build/node_modules/yaml": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", @@ -1003,174 +922,184 @@ "node": ">= 14" } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1901.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.8.tgz", - "integrity": "sha512-SmuGtTqrm43LiJ+ldAuq/QKyLPt2fS1nfnLTo+zTwgt/YAK+ps8cTPG/FqrURfXXWxgtAaeFX5B+samk8TSuvQ==", + "node_modules/@angular/cli": { + "version": "19.1.8", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1901.8", - "rxjs": "7.8.1" + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@inquirer/prompts": "7.2.1", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.1.8", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.1", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/core": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", - "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", + "node_modules/@angular/cli/node_modules/hosted-git-info": { + "version": "8.0.2", "dev": true, + "license": "ISC", "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "lru-cache": "^10.0.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/@angular/cli/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/@angular/cli/node_modules/npm-package-arg": { + "version": "12.0.1", "dev": true, + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@angular/cli/node_modules/proc-log": { + "version": "5.0.0", "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@angular-devkit/schematics": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", - "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.1.0.tgz", - "integrity": "sha512-HUJyukRvnh8Z9lIdxdblBRuBaPYEVv4iAYZMw3d+dn4rrM27Nt5oh3/zkwYrrPkt36tZdeXdDWrOuz9jgjVN5w==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.1.0.tgz", - "integrity": "sha512-TDO0+Ry+oNkxnaLHogKp1k2aey6IkJef5d7hathE4UFT6owjRizltWaRoX6bGw7Qu1yagVLL8L2Se8SddxSPAQ==", + "node_modules/@angular/cli/node_modules/validate-npm-package-name": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@angular/common": { + "version": "19.1.7", + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", - "@angular-eslint/utils": "19.1.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "@angular/core": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.1.0.tgz", - "integrity": "sha512-bIUizkCY40mnU8oAO1tLV7uN2H/cHf1evLlhpqlb9JYwc5dT2moiEhNDo61OtOgkJmDGNuThAeO9Xk9hGQc7nA==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "19.1.7", + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", - "@angular-eslint/utils": "19.1.0", - "aria-query": "5.3.2", - "axobject-query": "4.1.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@typescript-eslint/types": "^7.11.0 || ^8.0.0", - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "@angular/core": "19.1.7" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } } }, - "node_modules/@angular-eslint/template-parser": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.1.0.tgz", - "integrity": "sha512-wbMi7adlC+uYqZo7NHNBShpNhFJRZsXLqihqvFpAUt1Ei6uDX8HR6MyMEDZ9tUnlqtPVW5nmbedPyLVG7HkjAA==", + "node_modules/@angular/compiler-cli": { + "version": "19.1.7", "dev": true, + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", - "eslint-scope": "^8.0.2" + "@babel/core": "7.26.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "@angular/compiler": "19.1.7", + "typescript": ">=5.5 <5.8" } }, - "node_modules/@angular-eslint/utils": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.1.0.tgz", - "integrity": "sha512-mcb7hPMH/u6wwUwvsewrmgb9y9NWN6ZacvpUvKlTOxF/jOtTdsu0XfV4YB43sp2A8NWzYzX0Str4c8K1xSmuBQ==", + "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { + "version": "0.2.2", "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@angular/core": { + "version": "19.1.7", + "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" } }, - "node_modules/@angular/animations": { + "node_modules/@angular/forms": { "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.7.tgz", - "integrity": "sha512-EnyQTCNc1nWnjc5V3HPlClpJIS2R2XAfIEUCyI3lE4FLQxcXyhIsM9NmacAZT3Ai8RL+8JVCttPmBZXMpjP6Ug==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1178,637 +1107,240 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.7" + "@angular/common": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/build": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.8.tgz", - "integrity": "sha512-DAnnmbqPmtlY5JOitqWUgXi/yKj8eAcrP0T7hYZwLmcRsb+HsHYWsAQoFaTDw0p9WC5BKPqDBCMIivcuIV/izQ==", + "node_modules/@angular/language-service": { + "version": "19.1.7", "dev": true, + "license": "MIT", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "19.1.7", + "license": "MIT", "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.8", - "@angular-devkit/core": "19.1.8", - "@babel/core": "7.26.0", - "@babel/helper-annotate-as-pure": "7.25.9", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.1", - "@vitejs/plugin-basic-ssl": "1.2.0", - "beasties": "0.2.0", - "browserslist": "^4.23.0", - "esbuild": "0.24.2", - "fast-glob": "3.3.3", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", - "magic-string": "0.30.17", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.8.0", - "rollup": "4.30.1", - "sass": "1.83.1", - "semver": "7.6.3", - "vite": "6.0.11", - "watchpack": "2.4.2" + "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.2.2" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.8", - "less": "^4.2.0", - "ng-packagr": "^19.0.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.8" + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/core": "19.1.7" }, "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "less": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { + "@angular/animations": { "optional": true } } }, - "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "19.1.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=14.21.3" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "@angular/common": "19.1.7", + "@angular/compiler": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7" } }, - "node_modules/@angular/build/node_modules/vite": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", - "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", - "dev": true, + "node_modules/@angular/router": { + "version": "19.1.7", + "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" - }, - "bin": { - "vite": "bin/vite.js" + "tslib": "^2.3.0" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "@angular/common": "19.1.7", + "@angular/core": "19.1.7", + "@angular/platform-browser": "19.1.7", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/build/node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "node_modules/@babel/code-frame": { + "version": "7.26.2", "dev": true, - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.8.tgz", - "integrity": "sha512-JmdLj8110DNWaxL03K7I06+nLyBfXgiIqYyrQx5QO9AodGkKHK5rE+7VD8MjZhUymua57HToD0oHaQgThJwTJQ==", + "node_modules/@babel/compat-data": { + "version": "7.26.3", "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1901.8", - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@inquirer/prompts": "7.2.1", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.8", - "@yarnpkg/lockfile": "1.1.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.1", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", - "resolve": "1.22.10", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, + "license": "MIT", "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "node_modules/@babel/core": { + "version": "7.26.0", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" }, - "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", - "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli/node_modules/validate-npm-package-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", "dev": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@angular/common": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.7.tgz", - "integrity": "sha512-MXfUGfWeesTQ12HXgeoVIXsS+r1jZxT2FkLQtqS+NRsRD4T1vlyvD7kTI+Ku1NAjdt3mB8TJ0cZHubvmml8I+Q==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/core": "19.1.7", - "rxjs": "^6.5.3 || ^7.4.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@angular/compiler": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.7.tgz", - "integrity": "sha512-Q3eqqIhMEzrnmFJtUO0K+WPpCfP/JTl9lJXZKe0zgNPdRFUufjSUcPHGzd7OjN2gPpiAvS1yBvENvqs+g/MejQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.1.7" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@angular/compiler-cli": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.7.tgz", - "integrity": "sha512-Uu/TxfIcE1lStlCLmOPbghG1Y5o83odES89sr7bYNJz2mcG7TEonatf6GTOMzbJNil9FBJt6qnJkDkSjn4nUKw==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "7.26.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/compiler": "19.1.7", - "typescript": ">=5.5 <5.8" + "@babel/core": "^7.0.0" } }, - "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "node_modules/@angular/core": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.7.tgz", - "integrity": "sha512-P+e4ekJYWMFhWSzJav0R51bFAfUhIOmnqmG9mlI/ZONu2qcTTmyIG9AW5x1qhrMHEH42RaeK60RkKyqgcHaGDg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - } - }, - "node_modules/@angular/forms": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.7.tgz", - "integrity": "sha512-GVOCwqIXTpZt+bE3cqkasqpEs5n/aVq04yXLgM+mvVEbmAMibZYpzfg8NARlXCH3zveqhOSTJgsllfbbb7sdDw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/language-service": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.1.7.tgz", - "integrity": "sha512-V2QSihzZhkFaTxiw79PM+YP6LilQbx4IBFANTILNCmsGJxwnFQwMdmAptX6vWXiF/1o7YZ5IX4x8arRZ83YzFQ==", - "dev": true, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.7.tgz", - "integrity": "sha512-QKakWl+CeVVwn22yjRHBXm6BvDsHoo+9u1pJGGk2smKSYjHW6qAly28+P7FUfVXUQI7rg++M66JwzNOFfYMDQA==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "19.1.7", - "@angular/common": "19.1.7", - "@angular/core": "19.1.7" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.7.tgz", - "integrity": "sha512-rp7IXun1fHeScpIni0l2VRxBW5LzokHYfZ69K4BRhE7FpVA6hP2c9fhCJeo7681c/Q882Kom0tmsedOcF/zwMQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/compiler": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7" - } - }, - "node_modules/@angular/router": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.7.tgz", - "integrity": "sha512-4wqfHxVvMmnpRyRhOClo0qX7li1MnWaQ8U1ZMd8gsZgE3SKkOxXdHg/jO4tcbLMLD4QAZ82uB8MBvHl1vVMhKg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -1822,9 +1354,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1835,9 +1366,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1848,9 +1378,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -1865,9 +1394,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.25.9" }, @@ -1877,18 +1405,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-wrap-function": "^7.25.9", @@ -1903,9 +1429,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", @@ -1920,9 +1445,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -1933,9 +1457,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -1945,36 +1468,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", @@ -1986,9 +1505,8 @@ }, "node_modules/@babel/helpers": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.0" @@ -1999,9 +1517,8 @@ }, "node_modules/@babel/parser": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.26.3" }, @@ -2014,9 +1531,8 @@ }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/traverse": "^7.25.9" @@ -2030,9 +1546,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2045,9 +1560,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2060,9 +1574,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", @@ -2077,9 +1590,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/traverse": "^7.25.9" @@ -2093,9 +1605,8 @@ }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", - "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.23.9", "@babel/helper-plugin-utils": "^7.22.5", @@ -2110,9 +1621,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -2122,9 +1632,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2134,9 +1643,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2146,9 +1654,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2158,9 +1665,8 @@ }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2173,9 +1679,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2188,9 +1693,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2203,9 +1707,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2215,9 +1718,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2227,9 +1729,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2242,9 +1743,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2254,9 +1754,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2266,9 +1765,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2278,9 +1776,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2290,9 +1787,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2302,9 +1798,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2314,9 +1809,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2329,9 +1823,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2344,9 +1837,8 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -2360,9 +1852,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2375,9 +1866,8 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-remap-async-to-generator": "^7.25.9", @@ -2392,9 +1882,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -2409,9 +1898,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2424,9 +1912,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2439,9 +1926,8 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2455,9 +1941,8 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2471,9 +1956,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-compilation-targets": "^7.25.9", @@ -2491,9 +1975,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/template": "^7.25.9" @@ -2507,9 +1990,8 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2522,9 +2004,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2538,9 +2019,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2553,9 +2033,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2569,9 +2048,8 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2584,9 +2062,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2599,9 +2076,8 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2614,9 +2090,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" @@ -2630,9 +2105,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -2647,9 +2121,8 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2662,9 +2135,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2677,9 +2149,8 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2692,9 +2163,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2707,9 +2177,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2723,9 +2192,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.26.0", "@babel/helper-plugin-utils": "^7.25.9" @@ -2739,9 +2207,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -2757,9 +2224,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2773,9 +2239,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2789,9 +2254,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2804,9 +2268,8 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2819,9 +2282,8 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2834,9 +2296,8 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -2851,9 +2312,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-replace-supers": "^7.25.9" @@ -2867,9 +2327,8 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2882,9 +2341,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" @@ -2898,9 +2356,8 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2913,9 +2370,8 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2929,9 +2385,8 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -2946,9 +2401,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -2961,9 +2415,8 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" @@ -2977,9 +2430,8 @@ }, "node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -2993,9 +2445,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3008,9 +2459,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -3028,18 +2478,16 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3052,9 +2500,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" @@ -3068,9 +2515,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3083,9 +2529,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3098,9 +2543,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3113,9 +2557,8 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.23.6", @@ -3131,9 +2574,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3146,9 +2588,8 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -3162,9 +2603,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -3178,9 +2618,8 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -3194,9 +2633,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", @@ -3277,18 +2715,16 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -3300,9 +2736,8 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -3319,9 +2754,8 @@ }, "node_modules/@babel/runtime": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -3331,9 +2765,8 @@ }, "node_modules/@babel/template": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", @@ -3345,9 +2778,8 @@ }, "node_modules/@babel/traverse": { "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.3", @@ -3363,9 +2795,8 @@ }, "node_modules/@babel/types": { "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -3376,15 +2807,13 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -3394,9 +2823,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3404,9 +2832,8 @@ }, "node_modules/@cypress/request": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -3433,9 +2860,8 @@ }, "node_modules/@cypress/request/node_modules/form-data": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -3447,9 +2873,8 @@ }, "node_modules/@cypress/request/node_modules/qs": { "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -3462,33 +2887,29 @@ }, "node_modules/@cypress/request/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/@electric-sql/pglite": { "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.2.16.tgz", - "integrity": "sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@emnapi/core": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", "dev": true, + "license": "MIT", "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" @@ -3496,26 +2917,24 @@ }, "node_modules/@emnapi/runtime": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -3524,14 +2943,15 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -3540,14 +2960,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -3556,14 +2977,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -3572,18 +2994,18 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3593,9 +3015,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -3604,14 +3026,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -3620,14 +3043,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -3636,14 +3060,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -3652,14 +3077,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -3668,14 +3094,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -3684,14 +3111,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -3700,14 +3128,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -3716,14 +3145,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -3732,14 +3162,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -3748,14 +3179,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -3764,14 +3196,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -3780,14 +3213,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", "cpu": [ "arm64" ], @@ -3796,14 +3230,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -3812,14 +3247,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", "cpu": [ "arm64" ], @@ -3828,14 +3264,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -3844,14 +3281,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -3860,14 +3298,15 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -3876,14 +3315,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -3892,14 +3332,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -3908,15 +3349,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -3929,18 +3370,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -3961,9 +3400,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3977,9 +3415,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3987,9 +3424,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4002,15 +3438,13 @@ }, "node_modules/@eslint/eslintrc/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 + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4020,9 +3454,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4032,17 +3465,14 @@ }, "node_modules/@eslint/js": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@faker-js/faker": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, "funding": [ { @@ -4050,6 +3480,7 @@ "url": "https://opencollective.com/fakerjs" } ], + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=6.14.13" @@ -4057,9 +3488,8 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -4071,9 +3501,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4081,9 +3510,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4093,9 +3521,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -4106,15 +3533,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/checkbox": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", - "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -4136,9 +3561,8 @@ }, "node_modules/@inquirer/confirm": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", - "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.2", "@inquirer/type": "^3.0.2" @@ -4152,9 +3576,8 @@ }, "node_modules/@inquirer/core": { "version": "10.1.7", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", - "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", @@ -4179,9 +3602,8 @@ }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -4191,9 +3613,8 @@ }, "node_modules/@inquirer/editor": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", - "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -4213,9 +3634,8 @@ }, "node_modules/@inquirer/expand": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", - "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -4235,18 +3655,16 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", - "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", - "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" @@ -4265,9 +3683,8 @@ }, "node_modules/@inquirer/number": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", - "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" @@ -4286,9 +3703,8 @@ }, "node_modules/@inquirer/password": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", - "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -4308,9 +3724,8 @@ }, "node_modules/@inquirer/prompts": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", - "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/checkbox": "^4.0.4", "@inquirer/confirm": "^5.1.1", @@ -4332,9 +3747,8 @@ }, "node_modules/@inquirer/rawlist": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", - "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -4354,9 +3768,8 @@ }, "node_modules/@inquirer/search": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", - "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -4377,9 +3790,8 @@ }, "node_modules/@inquirer/select": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", - "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -4401,9 +3813,8 @@ }, "node_modules/@inquirer/type": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", - "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4418,8 +3829,7 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -4434,8 +3844,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4445,8 +3854,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4456,13 +3864,11 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -4477,8 +3883,7 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4491,8 +3896,7 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -4507,9 +3911,8 @@ }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -4519,9 +3922,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -4535,18 +3937,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4557,23 +3957,20 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jercle/yargonaut": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@jercle/yargonaut/-/yargonaut-1.1.5.tgz", - "integrity": "sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==", + "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.2", "figlet": "^1.5.2", @@ -4582,8 +3979,7 @@ }, "node_modules/@jercle/yargonaut/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4597,9 +3993,8 @@ }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4614,9 +4009,8 @@ }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4630,9 +4024,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -4677,9 +4070,8 @@ }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4693,9 +4085,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -4708,9 +4099,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -4721,9 +4111,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -4733,9 +4122,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -4750,9 +4138,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -4765,9 +4152,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -4808,9 +4194,8 @@ }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4824,9 +4209,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -4836,9 +4220,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -4850,9 +4233,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -4865,9 +4247,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -4880,9 +4261,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -4906,9 +4286,8 @@ }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4922,15 +4301,13 @@ }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -4945,9 +4322,8 @@ }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4961,9 +4337,8 @@ }, "node_modules/@jorgebodega/typeorm-factory": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-factory/-/typeorm-factory-1.4.0.tgz", - "integrity": "sha512-c02QHz1FcR8w4Tzv2Ibf2SvxF4LYlna0DktNT9kfMFkMajcbP94KBN4EBpP4ECU/0baY1pflzhFhphlGErUamA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "2.4.1" }, @@ -4976,15 +4351,13 @@ }, "node_modules/@jorgebodega/typeorm-factory/node_modules/tslib": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@jorgebodega/typeorm-seeding": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@jorgebodega/typeorm-seeding/-/typeorm-seeding-6.0.1.tgz", - "integrity": "sha512-vmjomtkMvOlwKeJtGSVb68519TCGKfENCSKE6zxMvr9GTZ+4XiLvIcp6tM5Irl10Pji9dNHPrXdh9HfTvm18aw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "4.1.2", "commander": "9.4.1", @@ -5004,9 +4377,8 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5020,18 +4392,16 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/commander": { "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/glob": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5048,9 +4418,8 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5060,15 +4429,13 @@ }, "node_modules/@jorgebodega/typeorm-seeding/node_modules/tslib": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@jridgewell/gen-mapping": { "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, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -5080,27 +4447,24 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "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, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -5108,15 +4472,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5124,9 +4486,8 @@ }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -5140,9 +4501,8 @@ }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.1", "@jsonjoy.com/util": "^1.1.2", @@ -5162,9 +4522,8 @@ }, "node_modules/@jsonjoy.com/util": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -5178,15 +4537,13 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@listr2/prompt-adapter-inquirer": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/type": "^1.5.5" }, @@ -5199,9 +4556,8 @@ }, "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, + "license": "MIT", "dependencies": { "mute-stream": "^1.0.0" }, @@ -5211,108 +4567,38 @@ }, "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { "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, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", - "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", - "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", - "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", - "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", - "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", - "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@microsoft/tsdoc": { "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" + "license": "MIT" }, "node_modules/@mikro-orm/cli": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.3.tgz", - "integrity": "sha512-DWnYNxoyMgU6L90TGBlT0eziTu6yl15ArnnFoq0kyOjp8JEMRjin+8cizSrKyQ3QiQZ5iop5fB0i9Sp+Hbgd8Q==", + "license": "MIT", "dependencies": { "@jercle/yargonaut": "1.1.5", "@mikro-orm/core": "6.4.3", @@ -5331,8 +4617,7 @@ }, "node_modules/@mikro-orm/cli/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5344,8 +4629,7 @@ }, "node_modules/@mikro-orm/core": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.3.tgz", - "integrity": "sha512-UTaqKs1bomYtGmEEZ8sNBOmW2OqT5NcMh+pBV2iJ6WLM5MuiIEuNhDMuvvPE5gNEwUzc1HyRhUV87bRDhDIGRg==", + "license": "MIT", "dependencies": { "dataloader": "2.2.3", "dotenv": "16.4.7", @@ -5364,8 +4648,7 @@ }, "node_modules/@mikro-orm/core/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5377,13 +4660,11 @@ }, "node_modules/@mikro-orm/core/node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + "license": "Apache-2.0" }, "node_modules/@mikro-orm/knex": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.3.tgz", - "integrity": "sha512-gVkRD/cIn6qxk/P9nR+IufZxJwuCCdv0AtcGvShxXXvaoIrQPJYDV7HRxBOHCEyNygr6M3Fqpph1oPoT6aezTQ==", + "license": "MIT", "dependencies": { "fs-extra": "11.2.0", "knex": "3.1.0", @@ -5412,8 +4693,7 @@ }, "node_modules/@mikro-orm/knex/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5425,8 +4705,7 @@ }, "node_modules/@mikro-orm/migrations": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.3.tgz", - "integrity": "sha512-VrsKq95esUBEMhwp9vVX+YUj2+/cNwb8UZ63HfgaqPo+pYj8r1RBSTboFOE9V0Md0n3ol9b5xByfPPa3qHmL0g==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "fs-extra": "11.2.0", @@ -5441,8 +4720,7 @@ }, "node_modules/@mikro-orm/migrations/node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5454,8 +4732,7 @@ }, "node_modules/@mikro-orm/mysql": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.3.tgz", - "integrity": "sha512-ZkrrzOWE9ouifU331q70K9BfAOD9SFRiNLNnECnzVrvDPWnthMV0ahGium9HyHpG4nev0Ybg6vnvq9IQzW1brg==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "mysql2": "3.12.0" @@ -5469,8 +4746,7 @@ }, "node_modules/@mikro-orm/nestjs": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mikro-orm/nestjs/-/nestjs-6.1.1.tgz", - "integrity": "sha512-aluD3eTeuCvIePDk5UBanHIhu1zAJQXqWAg47MZdHJmFkNuXn62DCXbD2c4X5TCpKW/m0zjba22ilyZ/AFG9qg==", + "license": "MIT", "engines": { "node": ">= 18.12.0" }, @@ -5482,8 +4758,7 @@ }, "node_modules/@mikro-orm/postgresql": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/@mikro-orm/postgresql/-/postgresql-6.4.3.tgz", - "integrity": "sha512-3cGi1gW6ME3SyuRRiJmSBtzHFa6Kavy6bK9rsSAAfXz+Pso6UBsqvesATbruKxDF7/CLdQlIY3CZZHXksUIrQg==", + "license": "MIT", "dependencies": { "@mikro-orm/knex": "6.4.3", "pg": "8.13.1", @@ -5500,8 +4775,7 @@ }, "node_modules/@mikro-orm/postgresql/node_modules/pg": { "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "license": "MIT", "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.7.0", @@ -5526,37 +4800,32 @@ }, "node_modules/@mikro-orm/postgresql/node_modules/pg-connection-string": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" + "license": "MIT" }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-array": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-date": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/postgresql/node_modules/postgres-interval": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-4.0.2.tgz", - "integrity": "sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/@mikro-orm/sql-highlighter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mikro-orm/sql-highlighter/-/sql-highlighter-1.0.1.tgz", - "integrity": "sha512-iO+FwRNuqNDVlIo5zfgOu2mMGVicX/FqzP+F/A0xpJLHyqvWyXzVwntgAMimBjQaxiX9Rpmc0u3Jq6/A6V6JQA==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -5566,9 +4835,8 @@ }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.8.12.tgz", - "integrity": "sha512-fiSf9Df4RqdKiL1WtS7eCqAWqDnLNwMZ9qU7ZMjXSAhI3wOLzycFflpVx7PWOxSoTJPtc61hwD5lkEpNoHezkg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.8.12", "@types/semver": "7.5.8", @@ -5592,9 +4860,8 @@ }, "node_modules/@module-federation/dts-plugin": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.8.12.tgz", - "integrity": "sha512-BhRZsG68XtGzKM0N02/3ldiW+PTc+QaHCMNyiZnk3GcxS0qe6USu7fTQwRIPCC2GONIdoHD+GVYPN/NJWjbTFg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.8.12", "@module-federation/managers": "0.8.12", @@ -5625,9 +4892,8 @@ }, "node_modules/@module-federation/enhanced": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.8.12.tgz", - "integrity": "sha512-uJODfWqL3C87LUu1E0ZLPRqE0sUt6QFH97bMFoCWYhkf8JS7J+wMc4KSc31ApaJs7CeQICXR1CYBAZDSdxkrOQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.8.12", "@module-federation/data-prefetch": "0.8.12", @@ -5661,24 +4927,21 @@ }, "node_modules/@module-federation/error-codes": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.12.tgz", - "integrity": "sha512-K+F4iiV62KY+IpjK6ggn3vI5Yt/T/LUb6xuazY78bhAGwLaHe1DYr7BfSutKMpiB+Dcs6U4dYOBogSMnnl0j4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.8.12.tgz", - "integrity": "sha512-/vFW+eiBiqXOKkDYVKl5JXGI0H4Whj10P8JadowxuHcEuR+R7kkXXauYuGYKaxIFqG4zbN3r9su2qxIEEqOsOw==", "dev": true, + "license": "MIT", "peerDependencies": { "@module-federation/runtime-tools": "0.8.12" } }, "node_modules/@module-federation/managers": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.8.12.tgz", - "integrity": "sha512-+BBdBMptHiiT2ZsfPovQuHYkse6R1+dmDS6bAinw3UGpb418W8ERp5I4jHeyhEtr3t3mb/dh4sAsYM14/EWJ9Q==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.8.12", "find-pkg": "2.0.0", @@ -5687,9 +4950,8 @@ }, "node_modules/@module-federation/manifest": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.8.12.tgz", - "integrity": "sha512-UwC6/QK37x7Xr5K+89iKxOy/uQHqFMd49axOhgDmFSrWQOULFQd51EpTOxFXgwZfiq/h0uVBYq/c0GB3Tdu8GA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/dts-plugin": "0.8.12", "@module-federation/managers": "0.8.12", @@ -5700,9 +4962,8 @@ }, "node_modules/@module-federation/node": { "version": "2.6.26", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.26.tgz", - "integrity": "sha512-5hWUv93LOeJOpwSpi2febxD25kIR0Ondmhpt9FCK0ggSpA8T4hxI2U5d4DN8MOYhSzPdM4EoVHfOT0t9r79MeA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/enhanced": "0.9.0", "@module-federation/runtime": "0.9.0", @@ -5731,9 +4992,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.0.tgz", - "integrity": "sha512-EaUMMmNVx5IRXB8o39tPU05uWuDN38noQbUjwE2xi8Y5xTx3CFZ9tkgXX+tvzcWc+bu4RnaziaI0RtyBfHhHKw==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.9.0", "@types/semver": "7.5.8", @@ -5757,9 +5017,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.0.tgz", - "integrity": "sha512-2Uu1sPRT9/uB+pG4vQGkLdpsMVM6FK7howulTdy42u6Dz0c2Ivc//od/noM0KEgWf1p54FAtWzpjkqjO5PyciA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.9.0", "@module-federation/managers": "0.9.0", @@ -5790,9 +5049,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.0.tgz", - "integrity": "sha512-/fiIc+lZvP7pEiVWe0/0v2ueVcEumew2UNewguHFj3bxyyU5/+/5rHPRV5QIKcLzydrVLvTiS4/dB2Mqd7CVAg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.9.0", "@module-federation/data-prefetch": "0.9.0", @@ -5826,24 +5084,21 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.0.tgz", - "integrity": "sha512-dNqIs5cQfE4p+WIdiZ64cTSRJ5KjGaV+epvZkGttrNjXW9XAAtE7zgpo7cMQ8GWA3wCGaKnFw7Dn48XcU5ZMNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.0.tgz", - "integrity": "sha512-gDvYmcJyuXy1qzBZ6c+AndQUm50iOXmc56C2GN+F9ILAOQ/dcWFfD+OxyjXr80Pvej6qawW9CTEEWHNF4m4a+w==", "dev": true, + "license": "MIT", "peerDependencies": { "@module-federation/runtime-tools": "0.9.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.0.tgz", - "integrity": "sha512-km8fVdS/r3TRLbSCV8IytKaQVuMbXbHvdZsgK4HRIWqGyBbA2q+gbXfWSC90OhdxNA9hhPEipmx+4hvuXDwaFg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.9.0", "find-pkg": "2.0.0", @@ -5852,9 +5107,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.0.tgz", - "integrity": "sha512-o6+AyKdznP/Pyd6x/1staafUKNxIuXbmmpZxeL3VDvg8uR+6QM5bd/iXnBUgxaznIGQvUwvW/F1JixdgXwp7ug==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/dts-plugin": "0.9.0", "@module-federation/managers": "0.9.0", @@ -5865,9 +5119,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.0.tgz", - "integrity": "sha512-Cw5/OGknuPwmkWc3jVj+T/uqtQ33cxDVMuaFIA6qGAiy/WfMyElKnOBe0n3JRaigH/A8qkyN/rNvMynYlTczLA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.9.0", "@module-federation/dts-plugin": "0.9.0", @@ -5893,9 +5146,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.0.tgz", - "integrity": "sha512-WByDEbJ/9fEUBOQILQRYX9CpAjCEmiU1MBSRoTg0emRKBcE9Ms5vTBN0XVuO+3gZSeyk08SfmaLtnCaeHK8ABA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.9.0", "@module-federation/runtime-core": "0.6.21", @@ -5904,9 +5156,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { "version": "0.6.21", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.21.tgz", - "integrity": "sha512-CLQiPP3kpcPbgPkiu/A1VURI2v4geFnEdizlB1tq0c6eDZqb5aLzvp87ZCGDVSuwY7DCq6jh1k+CM2WGge/2xA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.9.0", "@module-federation/sdk": "0.9.0" @@ -5914,9 +5165,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.0.tgz", - "integrity": "sha512-ioYVUsUfQjS7tgRBpZ6KFbz8YET2wD/2KmrO4zVaVHZ3RPyJzwVP9sLlDDdyf/Cn/1sQjNLg57FpyBADmY5M1Q==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.9.0", "@module-federation/webpack-bundler-runtime": "0.9.0" @@ -5924,18 +5174,16 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.0.tgz", - "integrity": "sha512-84MklxE6Z79gCAr+6HCyqOpF95pqSah+fGnhLz+g4ePcWf98J73bWfrdOWFO/UfxMRneXKBZBNbpDVvPLgaFeQ==", "dev": true, + "license": "MIT", "dependencies": { "isomorphic-rslog": "0.0.7" } }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.0.tgz", - "integrity": "sha512-gNMiFxSAkyy85KmdcdapKOP0RVqfuhzosdj92T9xXxR9juuILNS0TtgKbgYwNwvDs/WjOhTON5gz2lsX0kFKRg==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -5944,9 +5192,8 @@ }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.0.tgz", - "integrity": "sha512-banXhVcgNYTqH13C6E9KrpwJ+UHaTvHfkvCRPs1y2EVvB9guPO6MnQ9Fd1DCwVMfpq3zMtJpPHobAqF5AmkCHQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.9.0", "@module-federation/sdk": "0.9.0" @@ -5954,9 +5201,8 @@ }, "node_modules/@module-federation/node/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -5970,18 +5216,16 @@ }, "node_modules/@module-federation/node/node_modules/http-errors/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@module-federation/node/node_modules/koa": { "version": "2.15.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", - "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -6013,18 +5257,16 @@ }, "node_modules/@module-federation/node/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@module-federation/rspack": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.8.12.tgz", - "integrity": "sha512-G73Cq7VwKdpFZwMd9hEBsE2HLF7mNQEIvLSiW6HOZG/+iWRRED1opiVkrjOmkcg770rChYSqTBiLvUS7HDT5Ow==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.8.12", "@module-federation/dts-plugin": "0.8.12", @@ -6050,9 +5292,8 @@ }, "node_modules/@module-federation/runtime": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.12.tgz", - "integrity": "sha512-eYohRfambj/qzxz6tEakDn459ROcixWO4zL5gmTEOmwG+jCDnxGR14j1guopyrrpjb6EKFNrPVWtYZTPPfGdQQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.8.12", "@module-federation/runtime-core": "0.6.20", @@ -6061,9 +5302,8 @@ }, "node_modules/@module-federation/runtime-core": { "version": "0.6.20", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.20.tgz", - "integrity": "sha512-rX7sd/i7tpkAbfMD4TtFt/57SWNC/iv7UYS8g+ad7mnCJggWE1YEKsKSFgcvp4zU3thwR+j2y+kOCwd1sQvxEA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.8.12", "@module-federation/sdk": "0.8.12" @@ -6071,9 +5311,8 @@ }, "node_modules/@module-federation/runtime-tools": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.12.tgz", - "integrity": "sha512-H97wR/toSU9+UO9S0VHLmPg/7QgohMI52EZlR0Kh0F4PD6fbiWuO4kBIp7R6g0dMI9D4NVKWTKV8xA9ASU+k7g==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.8.12", "@module-federation/webpack-bundler-runtime": "0.8.12" @@ -6081,18 +5320,16 @@ }, "node_modules/@module-federation/sdk": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.12.tgz", - "integrity": "sha512-zFgXYBHbzwIqlrLfn6ewIRXDZCctDDQT2nFhbsZr29yWQgpmW1fm2kJCxQsG0DENGGN1KpzfDoxjjvSKJS/ZHA==", "dev": true, + "license": "MIT", "dependencies": { "isomorphic-rslog": "0.0.7" } }, "node_modules/@module-federation/third-party-dts-extractor": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.8.12.tgz", - "integrity": "sha512-+ZO5XpBwEhP9v/Tqk51YgswwbAzj4TXKZ54++uVDsLnOh9yydVGJ/b5pQcSrc8B1C55+498tsDEcNsFgZODgMQ==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -6101,9 +5338,8 @@ }, "node_modules/@module-federation/utilities": { "version": "3.1.44", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.44.tgz", - "integrity": "sha512-kbINh8YXg9AGTjTeCHu8w6tSZ64S+x+hfK9l7r3GDEKotmbfHJKJ3R5DhhdzBf0OEEJzjDQkKbIJQbKEI+WoYQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.9.0" }, @@ -6126,18 +5362,16 @@ }, "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.0.tgz", - "integrity": "sha512-84MklxE6Z79gCAr+6HCyqOpF95pqSah+fGnhLz+g4ePcWf98J73bWfrdOWFO/UfxMRneXKBZBNbpDVvPLgaFeQ==", "dev": true, + "license": "MIT", "dependencies": { "isomorphic-rslog": "0.0.7" } }, "node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.12.tgz", - "integrity": "sha512-zd343RO7/R7Xjh5ym5KdnYQ70z4LBmMxWsa44FS0nyNv04sOq6V1eZSCGKbEhbfqqhbS5Wfj8OzJyedeVvV/OQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.8.12", "@module-federation/sdk": "0.8.12" @@ -6145,87 +5379,20 @@ }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@napi-rs/nice": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -6253,277 +5420,34 @@ "@napi-rs/nice-win32-x64-msvc": "1.0.1" } }, - "node_modules/@napi-rs/nice-android-arm-eabi": { + "node_modules/@napi-rs/nice-darwin-arm64": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", "cpu": [ - "arm" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">= 10" } }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", - "cpu": [ - "arm64" - ], + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" } }, "node_modules/@nestjs/common": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.10.tgz", - "integrity": "sha512-pzGXp14KF2Q4CDZGQgPK4l8zEg7i6cNkb+10yc8ZA5K41cLe3ZbWW1YxtY2e/glHauOJwTLSVjH4tiRVtOTizg==", + "license": "MIT", "dependencies": { "iterare": "1.2.1", "tslib": "2.8.1", @@ -6550,9 +5474,8 @@ }, "node_modules/@nestjs/core": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.10.tgz", - "integrity": "sha512-f0qB8ztNWZeAD4E4fUdHConmNYCa/A78U7WJu5mX9OLYfOAs3ESYCDfsH9MRUvkA4Ft4Y1uMmyJo5L4fg4+beg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", @@ -6590,8 +5513,7 @@ }, "node_modules/@nestjs/mapped-types": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", - "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", "peerDependencies": { "@nestjs/common": "^10.0.0 || ^11.0.0", "class-transformer": "^0.4.0 || ^0.5.0", @@ -6609,8 +5531,7 @@ }, "node_modules/@nestjs/platform-express": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.10.tgz", - "integrity": "sha512-UVSf0yaWFBC2Zn2FOWABXxCnyG8XNIXrNnvTFpbUFqaJu1YDdwJ7wQBBqxq9CtJT7ILqSmfhOU7HS0d/0EAxpw==", + "license": "MIT", "dependencies": { "cors": "2.8.5", "express": "5.0.1", @@ -6629,8 +5550,7 @@ }, "node_modules/@nestjs/platform-express/node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -6641,8 +5561,7 @@ }, "node_modules/@nestjs/platform-express/node_modules/content-disposition": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6652,24 +5571,21 @@ }, "node_modules/@nestjs/platform-express/node_modules/cookie": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", "engines": { "node": ">=6.6.0" } }, "node_modules/@nestjs/platform-express/node_modules/debug": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -6684,16 +5600,14 @@ }, "node_modules/@nestjs/platform-express/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nestjs/platform-express/node_modules/express": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", - "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", + "license": "MIT", "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.0.1", @@ -6734,8 +5648,7 @@ }, "node_modules/@nestjs/platform-express/node_modules/finalhandler": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.0.0.tgz", - "integrity": "sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -6751,45 +5664,39 @@ }, "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nestjs/platform-express/node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/@nestjs/platform-express/node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nestjs/platform-express/node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -6799,16 +5706,14 @@ }, "node_modules/@nestjs/platform-express/node_modules/mime-db": { "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nestjs/platform-express/node_modules/mime-types": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", - "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", + "license": "MIT", "dependencies": { "mime-db": "^1.53.0" }, @@ -6818,16 +5723,14 @@ }, "node_modules/@nestjs/platform-express/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nestjs/platform-express/node_modules/qs": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -6840,8 +5743,7 @@ }, "node_modules/@nestjs/platform-express/node_modules/send": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", - "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", + "license": "MIT", "dependencies": { "debug": "^4.3.5", "destroy": "^1.2.0", @@ -6862,24 +5764,21 @@ }, "node_modules/@nestjs/platform-express/node_modules/send/node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nestjs/platform-express/node_modules/send/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6889,13 +5788,11 @@ }, "node_modules/@nestjs/platform-express/node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/@nestjs/platform-express/node_modules/serve-static": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", - "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", + "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -6908,8 +5805,7 @@ }, "node_modules/@nestjs/platform-express/node_modules/type-is": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", - "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "license": "MIT", "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -6921,8 +5817,7 @@ }, "node_modules/@nestjs/platform-socket.io": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-11.0.10.tgz", - "integrity": "sha512-39lAjq0+kZRiMuscDcugoG+onPDciM4jhuf8ZDjVcuSwtib1OGwrFtErSzp/KJsmHPSStgapbNev7eFi32uWQA==", + "license": "MIT", "dependencies": { "socket.io": "4.8.1", "tslib": "2.8.1" @@ -6939,8 +5834,7 @@ }, "node_modules/@nestjs/platform-ws": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/platform-ws/-/platform-ws-11.0.10.tgz", - "integrity": "sha512-tqCf6/+C/lejrbOpznU9/Js7JIthfVZtxipLpZ94GcpM1tO/UMvkbmG6z7HTXqjphrfYHsvMm/gGNy3XvypzcA==", + "license": "MIT", "dependencies": { "tslib": "2.8.1", "ws": "8.18.0" @@ -6957,9 +5851,8 @@ }, "node_modules/@nestjs/schematics": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.1.tgz", - "integrity": "sha512-PHPAUk4sXkfCxiMacD1JFC+vEyzXjZJRCu1KT2MmG2hrTiMDMk5KtMprro148JUefNuWbVyN0uLTJVSmWVzhoA==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "19.1.7", "@angular-devkit/schematics": "19.1.7", @@ -6973,9 +5866,8 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", - "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -7000,9 +5892,8 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", - "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", @@ -7018,9 +5909,8 @@ }, "node_modules/@nestjs/schematics/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -7034,9 +5924,8 @@ }, "node_modules/@nestjs/schematics/node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -7051,8 +5940,7 @@ }, "node_modules/@nestjs/swagger": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.0.4.tgz", - "integrity": "sha512-wrdeQucHirv5hakCgFn34GANmqHG0//X0GF+VumYjEeE3H4AGtztbbgwnw/9XeqVM4mD2HjUFx5WYtJMpJvnWQ==", + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.15.1", "@nestjs/mapped-types": "2.1.0", @@ -7083,9 +5971,8 @@ }, "node_modules/@nestjs/testing": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.0.10.tgz", - "integrity": "sha512-uZcdnvmHXWnvozYOAwZi1elpRRfqIfYqHglCavjhjcj3cH1MVZkwoTqntW3XOPQlT4lf96InjP1exGaW4B9wUg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "2.8.1" }, @@ -7110,8 +5997,7 @@ }, "node_modules/@nestjs/typeorm": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", - "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "license": "MIT", "peerDependencies": { "@nestjs/common": "^10.0.0 || ^11.0.0", "@nestjs/core": "^10.0.0 || ^11.0.0", @@ -7122,8 +6008,7 @@ }, "node_modules/@nestjs/websockets": { "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-11.0.10.tgz", - "integrity": "sha512-GPIEfqJyAkTHrHGK9w2OU8LJaZAZKW8WpWcTplThLxMelRq7mBkYOaGvc6dpr7fE1wWzWkwY0ZjQEnwnVmmxSg==", + "license": "MIT", "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", @@ -7144,17 +6029,15 @@ }, "node_modules/@nestjs/websockets/node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@ngtools/webpack": { "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.8.tgz", - "integrity": "sha512-uaEQMX0qElCO27R55efEQ/5UjID5KPLtgjwF9VXJ9Eoqsnr7gvKbTBQLtI8uui9aDJRxyvs58SC46E4x2EaAhQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -7168,8 +6051,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -7180,16 +6062,14 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -7200,9 +6080,8 @@ }, "node_modules/@npmcli/agent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -7216,9 +6095,8 @@ }, "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -7229,15 +6107,13 @@ }, "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/fs": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -7247,9 +6123,8 @@ }, "node_modules/@npmcli/git": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz", - "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^8.0.0", "ini": "^5.0.0", @@ -7267,33 +6142,29 @@ }, "node_modules/@npmcli/git/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/git/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -7306,9 +6177,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, + "license": "ISC", "dependencies": { "npm-bundled": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" @@ -7322,18 +6192,16 @@ }, "node_modules/@npmcli/node-gyp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", @@ -7349,9 +6217,8 @@ }, "node_modules/@npmcli/package-json/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -7369,9 +6236,8 @@ }, "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -7381,9 +6247,8 @@ }, "node_modules/@npmcli/package-json/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -7396,15 +6261,13 @@ }, "node_modules/@npmcli/package-json/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@npmcli/package-json/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7417,18 +6280,16 @@ }, "node_modules/@npmcli/package-json/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", "dev": true, + "license": "ISC", "dependencies": { "which": "^5.0.0" }, @@ -7438,18 +6299,16 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -7462,18 +6321,16 @@ }, "node_modules/@npmcli/redact": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", - "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.0", @@ -7488,27 +6345,24 @@ }, "node_modules/@npmcli/run-script/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/@npmcli/run-script/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -7521,8 +6375,7 @@ }, "node_modules/@nuxt/opencollective": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", - "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", "dependencies": { "consola": "^3.2.3" }, @@ -7536,9 +6389,8 @@ }, "node_modules/@nx/angular": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.4.6.tgz", - "integrity": "sha512-f2TTSRQMG1PNrj8kdEqqBcHPnqi2WIUUGlhcQ22GDMsG7P7TP10985AvYHVkv4Vbr1NuptYOIuZMzJchNCBWbg==", "dev": true, + "license": "MIT", "dependencies": { "@nx/devkit": "20.4.6", "@nx/eslint": "20.4.6", @@ -7567,9 +6419,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/scope-manager": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0" @@ -7584,9 +6435,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/type-utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.17.0", "@typescript-eslint/utils": "8.17.0", @@ -7611,9 +6461,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/types": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7624,9 +6473,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/typescript-estree": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0", @@ -7652,9 +6500,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7667,9 +6514,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.17.0", @@ -7694,9 +6540,8 @@ }, "node_modules/@nx/angular/node_modules/@typescript-eslint/visitor-keys": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" @@ -7711,9 +6556,8 @@ }, "node_modules/@nx/angular/node_modules/eslint-visitor-keys": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7723,9 +6567,8 @@ }, "node_modules/@nx/devkit": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.4.6.tgz", - "integrity": "sha512-XGnCu4p9HUrs6pDZmfpBF5hmmvXzLvV+oZJP0slFRoi9hVdXiZ31t+Vh0AQc7zSbtPeCxEJDxY4dIJKgdesR0A==", "dev": true, + "license": "MIT", "dependencies": { "ejs": "^3.1.7", "enquirer": "~2.3.6", @@ -7742,9 +6585,8 @@ }, "node_modules/@nx/eslint": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.4.6.tgz", - "integrity": "sha512-lPVvUrRYaQqkwY0kg4hO0B6GJt+zihmp+zNppbHllq/v5uHZRm0+3RrmJhAdmxlubuR7A49jdQe4fHOlFySpAw==", "dev": true, + "license": "MIT", "dependencies": { "@nx/devkit": "20.4.6", "@nx/js": "20.4.6", @@ -7764,9 +6606,8 @@ }, "node_modules/@nx/eslint-plugin": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.4.6.tgz", - "integrity": "sha512-CsR7aiDKIBqhk5v+6m+Qmlob9CipRx7DvvbCa5tPqFvXCQjjD5/wqisxydd9VAuz84DxjlrXcbA4dqlP8ZF5Lw==", "dev": true, + "license": "MIT", "dependencies": { "@nx/devkit": "20.4.6", "@nx/js": "20.4.6", @@ -7791,9 +6632,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0" @@ -7808,9 +6648,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/type-utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.17.0", "@typescript-eslint/utils": "8.17.0", @@ -7835,9 +6674,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7848,9 +6686,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "8.17.0", "@typescript-eslint/visitor-keys": "8.17.0", @@ -7876,9 +6713,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.17.0", @@ -7903,9 +6739,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" @@ -7920,9 +6755,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7936,9 +6770,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7948,9 +6781,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/globals": { "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -7960,9 +6792,8 @@ }, "node_modules/@nx/eslint-plugin/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7975,9 +6806,8 @@ }, "node_modules/@nx/jest": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.4.6.tgz", - "integrity": "sha512-yZOZJOQFtpdY3Fu/WYNoDx81TwvF9yfwvalFpLD19bz+2YGl7B89l0S1ZrtSRXFfKXA/w7gb0gmKwthJtQhx9Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", @@ -7998,9 +6828,8 @@ }, "node_modules/@nx/js": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.4.6.tgz", - "integrity": "sha512-wHO6tXJNVIW0Z9zKLL/g6qee7K92XJNS4D8irpJB9sOg25fqAzKjwgcK0bPtnRhYsIjLkjh0FsTKIcznxTGnkA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", "@babel/plugin-proposal-decorators": "^7.22.7", @@ -8044,9 +6873,8 @@ }, "node_modules/@nx/js/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8060,15 +6888,13 @@ }, "node_modules/@nx/js/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 + "dev": true, + "license": "MIT" }, "node_modules/@nx/js/node_modules/ora": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -8088,18 +6914,16 @@ }, "node_modules/@nx/js/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/@nx/js/node_modules/source-map-support": { "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -8107,9 +6931,8 @@ }, "node_modules/@nx/module-federation": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.4.6.tgz", - "integrity": "sha512-Vs2UpZgzfQZSGtZPZjnFTZncGcOgqW3l94Tia8EqFDDcOg5sl5YRHILowXSs2HVj+wMLqTq1R06JQBazFvpB0Q==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/enhanced": "^0.8.8", "@module-federation/node": "^2.6.21", @@ -8127,9 +6950,8 @@ }, "node_modules/@nx/module-federation/node_modules/body-parser": { "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -8151,36 +6973,32 @@ }, "node_modules/@nx/module-federation/node_modules/cookie": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@nx/module-federation/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/@nx/module-federation/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nx/module-federation/node_modules/express": { "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -8224,9 +7042,8 @@ }, "node_modules/@nx/module-federation/node_modules/finalhandler": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -8242,30 +7059,26 @@ }, "node_modules/@nx/module-federation/node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@nx/module-federation/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nx/module-federation/node_modules/path-to-regexp": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nx/module-federation/node_modules/qs": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -8278,9 +7091,8 @@ }, "node_modules/@nx/module-federation/node_modules/send": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -8302,24 +7114,21 @@ }, "node_modules/@nx/module-federation/node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/@nx/module-federation/node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nx/module-federation/node_modules/serve-static": { "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -8332,9 +7141,8 @@ }, "node_modules/@nx/nest": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.4.6.tgz", - "integrity": "sha512-mFBdjXWChZ6tnfuIg7fM4hiEw8HMa+nEJ3jxve+OhY2BjbwUH8ADMjrhu65Ipk6hol56V+hDi7x7VYFHs/rxTg==", "dev": true, + "license": "MIT", "dependencies": { "@nestjs/schematics": "^9.1.0", "@nx/devkit": "20.4.6", @@ -8346,9 +7154,8 @@ }, "node_modules/@nx/nest/node_modules/@angular-devkit/core": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.1.tgz", - "integrity": "sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -8372,9 +7179,8 @@ }, "node_modules/@nx/nest/node_modules/@angular-devkit/schematics": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.1.tgz", - "integrity": "sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "jsonc-parser": "3.2.0", @@ -8390,9 +7196,8 @@ }, "node_modules/@nx/nest/node_modules/@nestjs/schematics": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.2.0.tgz", - "integrity": "sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", @@ -8431,15 +7236,13 @@ }, "node_modules/@nx/nest/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 + "dev": true, + "license": "MIT" }, "node_modules/@nx/nest/node_modules/magic-string": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" }, @@ -8477,9 +7280,8 @@ }, "node_modules/@nx/node": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.4.6.tgz", - "integrity": "sha512-chA3cwT5YJJekl9nRztNuJa9fYlfHgSl9iWNrF1D+A/ZA5vJzDAe2XyuZD10pbCGIMl8DkepQT+8uP7/S/jCfA==", "dev": true, + "license": "MIT", "dependencies": { "@nx/devkit": "20.4.6", "@nx/eslint": "20.4.6", @@ -8490,12 +7292,11 @@ }, "node_modules/@nx/nx-darwin-arm64": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.4.6.tgz", - "integrity": "sha512-yYBkXCqx9XDS88IKlbXQUMKAmNE6OA7AwmreDabL0zKCeB5x9qit5iaGwQOYCA7PSdjFQTYvPdKK+S3ytKCJ2w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8504,155 +7305,10 @@ "node": ">= 10" } }, - "node_modules/@nx/nx-darwin-x64": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.4.6.tgz", - "integrity": "sha512-YeGCTQPmZmWYSJ3Km8rsx3YhohbQNp8grclyEp4KA7GXrPY+AKA9hcy0e5KwF4hPP41EEYkju2Xpl0XdmOfdBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.4.6.tgz", - "integrity": "sha512-49Ad0ysTWrNARmZxc02bmWfrGT5XKEnb5+Nms+RGzQVs+5WI6yqKx2iuLGrx2CDY0FEY11Z0zFpwvrZPGnnLXw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.4.6.tgz", - "integrity": "sha512-+SMu0xYf2Qim2AC4eYn2SKLXd94UwudMIdPiwbHQUtqRnX88T8rGQKxtINdEAEmIt/KkHyceyJ7lpHGRKmFfbw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.4.6.tgz", - "integrity": "sha512-1u+qawDO4R8w6op2mqIECzJ8YEViPhpqyq3RiRyAchPodUgrd1rnYnYj+xgQeED4d+L+djeZfhN6000WDhZ5oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.4.6.tgz", - "integrity": "sha512-8sFM3Z8k2iojXpL1E/ynlp+BPD8YWCs12cc+qk/4Ke5uOILcpDQ7XZSmzYoNIxp/0fcbZ1bosE+o7Lx4sbpfjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.4.6.tgz", - "integrity": "sha512-9t8jPREQN8a2j09O9q9aQI4cP6UXn7tOD+UVYhlQ9EO+EsHKCcaTzszeLoatySVxzeG0RB3vutMgaa8AiS4qcA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.4.6.tgz", - "integrity": "sha512-4EO71ND0OJcvinYNc+enB3ouFeKWjCcb73xG2RdjF5s8A9/RFFK6Z3zasYTmGWR06nSLm3mi6xiyiNXWvIdZMA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.4.6.tgz", - "integrity": "sha512-o8Vurr2c9SMP+a2jrBD3VUkQqmHXqi1yC+NJHMzO7GiVPaCFoJR1IizAECXIiKUXv5dB+WFQow7yzVkQQAjk6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.4.6.tgz", - "integrity": "sha512-PtBlsTJHsHeAEawt2HrWkSEsHbwu7MlqFIrw8cS+tg7ZblpesUWva1L3Ylx0hEcQrY7UjMGDR0RVo2DKAUvKZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nx/web": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.4.6.tgz", - "integrity": "sha512-MKV4f8MHoAwo6G0ambu9DqRRjcp0xiMtv1Ijj6GWkD7Xru4IEsHWrDUjTSdl3yKg8zKqMY2Bw+UArxa1Xborkg==", "dev": true, + "license": "MIT", "dependencies": { "@nx/devkit": "20.4.6", "@nx/js": "20.4.6", @@ -8664,9 +7320,8 @@ }, "node_modules/@nx/webpack": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.4.6.tgz", - "integrity": "sha512-PEiWKZ8bMcWlPzlRUdI76eyV+hQewFaPCL7ttv8YKFYmVWJbfSihiExQ1LRSWIKR2qw0FvzPY8X2bKQzDv603Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", "@nx/devkit": "20.4.6", @@ -8709,9 +7364,8 @@ }, "node_modules/@nx/webpack/node_modules/array-union": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8721,9 +7375,8 @@ }, "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", @@ -8745,9 +7398,8 @@ }, "node_modules/@nx/webpack/node_modules/css-loader": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -8780,9 +7432,8 @@ }, "node_modules/@nx/webpack/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -8792,9 +7443,8 @@ }, "node_modules/@nx/webpack/node_modules/globby": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^3.0.1", "dir-glob": "^3.0.1", @@ -8812,9 +7462,8 @@ }, "node_modules/@nx/webpack/node_modules/less": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -8838,9 +7487,8 @@ }, "node_modules/@nx/webpack/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -8852,9 +7500,8 @@ }, "node_modules/@nx/webpack/node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -8866,9 +7513,8 @@ }, "node_modules/@nx/webpack/node_modules/make-dir/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -8876,9 +7522,8 @@ }, "node_modules/@nx/webpack/node_modules/mini-css-extract-plugin": { "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", - "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -8895,9 +7540,8 @@ }, "node_modules/@nx/webpack/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -8905,9 +7549,8 @@ }, "node_modules/@nx/webpack/node_modules/postcss-loader": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -8923,894 +7566,297 @@ "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" - } - }, - "node_modules/@nx/webpack/node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/@nx/webpack/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@nx/workspace": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.4.6.tgz", - "integrity": "sha512-1rRRN4MJjghDvZSfCNpTn0IDkNJrU6W3VLn8cGjmJXJj8OXxbi3bYc1Ykk+zC99UmSRQ/8+SLorkX+FgTC1ODQ==", - "dev": true, - "dependencies": { - "@nx/devkit": "20.4.6", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "20.4.6", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/workspace/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "optional": true - }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", - "dev": true, - "dependencies": { - "esquery": "^1.4.0" - }, - "peerDependencies": { - "typescript": "^3 || ^4 || ^5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", - "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", - "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", - "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", - "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", - "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", - "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", - "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", - "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", - "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", - "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", - "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", - "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", - "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", - "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", - "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", - "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", - "cpu": [ - "x64" - ], + } + }, + "node_modules/@nx/webpack/node_modules/sass-loader": { + "version": "12.6.0", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", - "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/webpack/node_modules/slash": { + "version": "4.0.0", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", - "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", - "cpu": [ - "ia32" - ], + "node_modules/@nx/webpack/node_modules/source-map": { + "version": "0.6.1", "dev": true, + "license": "BSD-3-Clause", "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", - "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", - "cpu": [ - "x64" - ], + "node_modules/@nx/workspace": { + "version": "20.4.6", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "@nx/devkit": "20.4.6", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.4.6", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } }, - "node_modules/@rollup/wasm-node": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.28.1.tgz", - "integrity": "sha512-t4ckEC09V3wbe0r6T4fGjq85lEbvGcGxn7QYYgjHyKNzZaQU5kFqr4FsavXYHRiVNYq8m+dRhdGjpfcC9UzzPg==", + "node_modules/@nx/workspace/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">=10" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@rspack/binding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", - "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "node_modules/@parcel/watcher": { + "version": "2.5.0", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.1.5", - "@rspack/binding-darwin-x64": "1.1.5", - "@rspack/binding-linux-arm64-gnu": "1.1.5", - "@rspack/binding-linux-arm64-musl": "1.1.5", - "@rspack/binding-linux-x64-gnu": "1.1.5", - "@rspack/binding-linux-x64-musl": "1.1.5", - "@rspack/binding-win32-arm64-msvc": "1.1.5", - "@rspack/binding-win32-ia32-msvc": "1.1.5", - "@rspack/binding-win32-x64-msvc": "1.1.5" + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" } }, - "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rspack/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", - "cpu": [ - "x64" ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", "dev": true, + "license": "Apache-2.0", "optional": true, - "os": [ - "darwin" - ] + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } }, - "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", - "cpu": [ - "arm64" - ], + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "optional": true }, - "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", - "cpu": [ - "arm64" - ], + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=14" + } }, - "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, - "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, - "node_modules/@rspack/binding-win32-ia32-msvc": { + "node_modules/@rollup/wasm-node": { + "version": "4.28.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@rspack/binding": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", - "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", - "cpu": [ - "ia32" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.5", + "@rspack/binding-darwin-x64": "1.1.5", + "@rspack/binding-linux-arm64-gnu": "1.1.5", + "@rspack/binding-linux-arm64-musl": "1.1.5", + "@rspack/binding-linux-x64-gnu": "1.1.5", + "@rspack/binding-linux-x64-musl": "1.1.5", + "@rspack/binding-win32-arm64-msvc": "1.1.5", + "@rspack/binding-win32-ia32-msvc": "1.1.5", + "@rspack/binding-win32-x64-msvc": "1.1.5" + } }, - "node_modules/@rspack/binding-win32-x64-msvc": { + "node_modules/@rspack/binding-darwin-arm64": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, "node_modules/@rspack/core": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", - "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime-tools": "0.5.1", "@rspack/binding": "1.1.5", @@ -9831,18 +7877,16 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", - "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.5.1" } }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", - "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.5.1", "@module-federation/webpack-bundler-runtime": "0.5.1" @@ -9850,15 +7894,13 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/sdk": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", - "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", - "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.5.1", "@module-federation/sdk": "0.5.1" @@ -9866,17 +7908,15 @@ }, "node_modules/@rspack/lite-tapable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=16.0.0" } }, "node_modules/@rushstack/node-core-library": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz", - "integrity": "sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==", + "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", @@ -9898,8 +7938,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/ajv": { "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -9913,8 +7952,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -9929,8 +7967,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -9942,16 +7979,14 @@ }, "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9961,8 +7996,7 @@ }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9975,21 +8009,18 @@ }, "node_modules/@rushstack/node-core-library/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@rushstack/node-core-library/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/@rushstack/terminal": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.5.tgz", - "integrity": "sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw==", + "license": "MIT", "dependencies": { "@rushstack/node-core-library": "5.10.2", "supports-color": "~8.1.1" @@ -10005,8 +8036,7 @@ }, "node_modules/@rushstack/terminal/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10019,8 +8049,7 @@ }, "node_modules/@rushstack/ts-command-line": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.3.tgz", - "integrity": "sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA==", + "license": "MIT", "dependencies": { "@rushstack/terminal": "0.14.5", "@types/argparse": "1.0.38", @@ -10030,28 +8059,24 @@ }, "node_modules/@rushstack/ts-command-line/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "license": "BSD-3-Clause" }, "node_modules/@scarf/scarf": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "hasInstallScript": true + "hasInstallScript": true, + "license": "Apache-2.0" }, "node_modules/@schematics/angular": { "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.8.tgz", - "integrity": "sha512-ytgClbMPn+i+w1S3QukR/Vdge+sfU9aX49ao+XRwoWdOssHUjmVjQcCEdzu0ucSrNPZnhm34bdDPzADLhln60w==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "19.1.8", "@angular-devkit/schematics": "19.1.8", @@ -10065,9 +8090,8 @@ }, "node_modules/@sigstore/bundle": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -10077,27 +8101,24 @@ }, "node_modules/@sigstore/core": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/protobuf-specs": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -10112,18 +8133,16 @@ }, "node_modules/@sigstore/sign/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/tuf": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^3.0.1" @@ -10134,9 +8153,8 @@ }, "node_modules/@sigstore/verify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -10148,15 +8166,13 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -10166,37 +8182,32 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "license": "MIT" }, "node_modules/@sqltools/formatter": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + "license": "MIT" }, "node_modules/@swc-node/core": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.1.tgz", - "integrity": "sha512-emB5l2nZsXjUEAuusqjYvWnQMLWZp6K039Mv8aq5SX1rsNM/N7DNhw1i4/DX7AyzNZ0tT+ASWyTvqEURldp5HA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" }, @@ -10211,9 +8222,8 @@ }, "node_modules/@swc-node/register": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", - "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", "dev": true, + "license": "MIT", "dependencies": { "@swc-node/core": "^1.13.1", "@swc-node/sourcemap-support": "^0.5.0", @@ -10233,9 +8243,8 @@ }, "node_modules/@swc-node/sourcemap-support": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.0.tgz", - "integrity": "sha512-fbhjL5G0YvFoWwNhWleuBUfotiX+USiA9oJqu9STFw+Hb0Cgnddn+HVS/K5fI45mn92e8V+cHD2jgFjk4w2T9Q==", "dev": true, + "license": "MIT", "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.6.2" @@ -10243,10 +8252,9 @@ }, "node_modules/@swc/core": { "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", - "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.2", "@swc/types": "0.1.7" @@ -10281,12 +8289,11 @@ }, "node_modules/@swc/core-darwin-arm64": { "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz", - "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -10295,239 +8302,83 @@ "node": ">=10" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz", - "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz", - "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz", - "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz", - "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz", - "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz", - "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz", - "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz", - "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", - "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/counter": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@swc/helpers": { "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", - "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@swc/types": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", - "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" } }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@trysound/sax": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10.13.0" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsd/typescript": { "version": "5.4.5", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-saiCxzHRhUrRxQV2JhH580aQUZiKQUXI38FcAcikcfOomAil4G4lxT0RfrrKywoAYP/rqAdYXYmNRLppcd+hQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17" } }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" @@ -10538,9 +8389,8 @@ }, "node_modules/@tufjs/models/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10553,23 +8403,20 @@ }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -10580,18 +8427,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -10599,18 +8444,16 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -10618,27 +8461,24 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -10646,17 +8486,15 @@ }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -10664,9 +8502,8 @@ }, "node_modules/@types/eslint-scope": { "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, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -10674,15 +8511,13 @@ }, "node_modules/@types/estree": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -10692,9 +8527,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -10704,9 +8538,8 @@ }, "node_modules/@types/express/node_modules/@types/express-serve-static-core": { "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -10716,57 +8549,50 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -10774,9 +8600,8 @@ }, "node_modules/@types/jsdom": { "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -10785,9 +8610,8 @@ }, "node_modules/@types/jsdom/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -10797,83 +8621,70 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "18.16.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.20.tgz", - "integrity": "sha512-nL54VfDjThdP2UXJXZao5wp76CDiDw4zSRO8d4Tk7UgDqNKGKVEQB0/t3ti63NS+YNNkIQDvwEAF04BO+WYu7Q==" + "license": "MIT" }, "node_modules/@types/node-forge": { "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -10881,18 +8692,16 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -10901,65 +8710,56 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/uuid": { "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/validator": { "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.14", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", - "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -10990,9 +8790,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -11018,9 +8817,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" @@ -11035,9 +8833,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/utils": "7.18.0", @@ -11062,9 +8859,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -11075,9 +8871,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", @@ -11103,9 +8898,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11118,9 +8912,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -11140,9 +8933,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" @@ -11157,15 +8949,13 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@verdaccio/commons-api": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@verdaccio/commons-api/-/commons-api-10.2.0.tgz", - "integrity": "sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==", "dev": true, + "license": "MIT", "dependencies": { "http-errors": "2.0.0", "http-status-codes": "2.2.0" @@ -11180,15 +8970,13 @@ }, "node_modules/@verdaccio/commons-api/node_modules/http-status-codes": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", - "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/config": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-7.0.0-next-7.10.tgz", - "integrity": "sha512-mB3qaf8wW4sUgS0h3Z4TXYH/V9spjjFA33kNqWl78IMJHipBddbyBvdmfh/vo/NGtfju8DrDbRZlhKCl6293Qg==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "@verdaccio/utils": "7.0.0-next-7.10", @@ -11208,9 +8996,8 @@ }, "node_modules/@verdaccio/config/node_modules/minimatch": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11223,9 +9010,8 @@ }, "node_modules/@verdaccio/core": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-7.0.0-next-7.10.tgz", - "integrity": "sha512-kS7/x5y9knbkSksHeawRV5Af8p/g0qk9GgQOZjuvOtv08kMFSttYk/eDglE9++SbvqP34+sDraUIMB/C3tZ2fw==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.12.0", "core-js": "3.35.0", @@ -11244,9 +9030,8 @@ }, "node_modules/@verdaccio/core/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11256,15 +9041,13 @@ }, "node_modules/@verdaccio/core/node_modules/process-warning": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/core/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11277,15 +9060,13 @@ }, "node_modules/@verdaccio/core/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@verdaccio/file-locking": { "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz", - "integrity": "sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==", "dev": true, + "license": "MIT", "dependencies": { "lockfile": "1.0.4" }, @@ -11299,9 +9080,8 @@ }, "node_modules/@verdaccio/local-storage": { "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@verdaccio/local-storage/-/local-storage-10.3.3.tgz", - "integrity": "sha512-/n0FH+1hxVg80YhYBfJuW7F2AuvLY2fra8/DTCilWDll9Y5yZDxwntZfcKHJLerCA4atrbJtvaqpWkoV3Q9x8w==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/commons-api": "10.2.0", "@verdaccio/file-locking": "10.3.1", @@ -11322,15 +9102,13 @@ }, "node_modules/@verdaccio/local-storage/node_modules/async": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/local-storage/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -11340,9 +9118,8 @@ }, "node_modules/@verdaccio/logger-7": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-7/-/logger-7-7.0.0-next-7.10.tgz", - "integrity": "sha512-UgbZnnapLmvcVMz7HzJhsyMTFLhVcAKTwKW/5dtaSwD2XrP721YawdTwJEPZnhcNrTcD9dUvRGfW4Dr/5QzJcg==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/logger-commons": "7.0.0-next-7.10", "pino": "7.11.0" @@ -11357,15 +9134,13 @@ }, "node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/logger-7/node_modules/pino": { "version": "7.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", - "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", @@ -11385,9 +9160,8 @@ }, "node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", "dev": true, + "license": "MIT", "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" @@ -11395,48 +9169,42 @@ }, "node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/logger-7/node_modules/process-warning": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/logger-7/node_modules/real-require": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/@verdaccio/logger-7/node_modules/sonic-boom": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, "node_modules/@verdaccio/logger-7/node_modules/thread-stream": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", - "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", "dev": true, + "license": "MIT", "dependencies": { "real-require": "^0.1.0" } }, "node_modules/@verdaccio/logger-commons": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-7.0.0-next-7.10.tgz", - "integrity": "sha512-RTA4K6KvoCrgqA1aVP4n8IDZfUQtaza2FcPjEsBShLQg0rHFJi/5/yQg+J4MpOvYlKbrusOy9pwN86h9pCe+CA==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "@verdaccio/logger-prettify": "7.0.0-next.1", @@ -11453,9 +9221,8 @@ }, "node_modules/@verdaccio/logger-prettify": { "version": "7.0.0-next.1", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-7.0.0-next.1.tgz", - "integrity": "sha512-ZF71AS2k0OiSnKVT05+NUWARZ+yn0keGAlpkgNWU7SHiYeFS1ZDVpapi9PXR23gJ5U756fyPKaqvlRcYgEpsgA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "2.0.20", "dayjs": "1.11.7", @@ -11473,8 +9240,6 @@ }, "node_modules/@verdaccio/logger-prettify/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -11490,6 +9255,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -11497,15 +9263,13 @@ }, "node_modules/@verdaccio/logger-prettify/node_modules/dayjs": { "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/logger-prettify/node_modules/pino-abstract-transport": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -11513,9 +9277,8 @@ }, "node_modules/@verdaccio/logger-prettify/node_modules/readable-stream": { "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -11529,27 +9292,24 @@ }, "node_modules/@verdaccio/logger-prettify/node_modules/sonic-boom": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, "node_modules/@verdaccio/logger-prettify/node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/@verdaccio/middleware": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-7.0.0-next-7.10.tgz", - "integrity": "sha512-NBQxi6ag2zSIoUUmnQn/n0YwJDnnHqqtyV5c73YTdQV5RSPn5i2YKz+8DSA+iJYa2ff8G4fx8hOdJR+QZZQ24w==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/config": "7.0.0-next-7.10", "@verdaccio/core": "7.0.0-next-7.10", @@ -11572,18 +9332,16 @@ }, "node_modules/@verdaccio/middleware/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@verdaccio/middleware/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -11593,9 +9351,8 @@ }, "node_modules/@verdaccio/search": { "version": "7.0.0-next.2", - "resolved": "https://registry.npmjs.org/@verdaccio/search/-/search-7.0.0-next.2.tgz", - "integrity": "sha512-NoGSpubKB+SB4gRMIoEl3E3NkoKE5f0DnANghB3SnMtVxpJGdwZgylosqDxt8swhQ80+16hYdAp6g44uhjVE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11606,9 +9363,8 @@ }, "node_modules/@verdaccio/signature": { "version": "7.0.0-next.3", - "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-7.0.0-next.3.tgz", - "integrity": "sha512-egs1VmEe+COUUZ83I6gzDy79Jo3b/AExPvp9EDuJHkmwxJj+9gb231Rv4wk+UoNPrQRNLljUepQwVrDmbqP5DQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4.3.4", "jsonwebtoken": "9.0.2" @@ -11623,9 +9379,8 @@ }, "node_modules/@verdaccio/streams": { "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz", - "integrity": "sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12", "npm": ">=5" @@ -11637,9 +9392,8 @@ }, "node_modules/@verdaccio/tarball": { "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-12.0.0-next-7.10.tgz", - "integrity": "sha512-kxctkPREUpe0oRDsTelKcLsWGv2llRBcK2AlyCAX7UENKGWvVqITTk81PkVpzlwXOpcRWdLJQmEE+dtXGwLr6Q==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "@verdaccio/url": "12.0.0-next-7.10", @@ -11657,15 +9411,13 @@ }, "node_modules/@verdaccio/ui-theme": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-7.0.0-next-7.10.tgz", - "integrity": "sha512-I1War/XBg3WzzAojXDtEDjZw/1qPKW0d8EIsJD3h6Xi5Atzvz/xBTbHjgbwApjmISyDWQ8Vevp8zOtGO33zLSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/url": { "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-12.0.0-next-7.10.tgz", - "integrity": "sha512-AiFG+W/H1iD+iXkh4b6zm3AsZdGdI7tiAPCHymN7jSV6dAvWTuhIEK30mmFyCSmOE0iwyn8ZN4xqsf9Qcu1emw==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "debug": "4.3.4", @@ -11682,9 +9434,8 @@ }, "node_modules/@verdaccio/utils": { "version": "7.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.0-next-7.10.tgz", - "integrity": "sha512-3sGyBj0leN3RjwPJPDkdsD9j1ahzQccHPj86IlIJqUJFhAcOT/nD6z9+W3sBAiro6Q2psWyWHxBJ8H3LhtlLeA==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "lodash": "4.17.21", @@ -11701,9 +9452,8 @@ }, "node_modules/@verdaccio/utils/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11713,9 +9463,8 @@ }, "node_modules/@verdaccio/utils/node_modules/minimatch": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11728,9 +9477,8 @@ }, "node_modules/@verdaccio/utils/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11743,15 +9491,13 @@ }, "node_modules/@verdaccio/utils/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -11759,27 +9505,23 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -11788,15 +9530,13 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11806,33 +9546,29 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11846,9 +9582,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -11859,9 +9594,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11871,9 +9605,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -11885,9 +9618,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -11895,9 +9627,8 @@ }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -11908,9 +9639,8 @@ }, "node_modules/@webpack-cli/info": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -11921,9 +9651,8 @@ }, "node_modules/@webpack-cli/serve": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -11939,27 +9668,23 @@ }, "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 + "dev": true, + "license": "BSD-3-Clause" }, "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 + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", - "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -11970,18 +9695,16 @@ }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11992,15 +9715,13 @@ }, "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", - "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -12010,25 +9731,21 @@ }, "node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -12038,8 +9755,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -12050,9 +9766,8 @@ }, "node_modules/acorn": { "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "devOptional": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -12062,9 +9777,8 @@ }, "node_modules/acorn-globals": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" @@ -12072,36 +9786,32 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -12112,9 +9822,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12126,18 +9835,16 @@ }, "node_modules/adm-zip": { "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" } }, "node_modules/agent-base": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.2.tgz", - "integrity": "sha512-JVzqkCNRT+VfqzzgPWDPnwvDheSAUdiMUn3NoLXpDJF5lRqeJqyC9iGsAxIOAW+mzIdq+uP1TvcX6bMtrH0agg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -12147,9 +9854,8 @@ }, "node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "devOptional": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -12163,8 +9869,7 @@ }, "node_modules/ajv-draft-04": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", "peerDependencies": { "ajv": "^8.5.0" }, @@ -12176,9 +9881,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -12193,9 +9897,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -12205,17 +9908,15 @@ }, "node_modules/ansi-colors": { "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==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -12228,28 +9929,25 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12262,14 +9960,12 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -12280,9 +9976,8 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -12292,125 +9987,107 @@ }, "node_modules/apache-md5": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", - "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/app-root-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/append-field": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + "license": "MIT" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/async": { "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/autoprefixer": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -12426,6 +10103,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", @@ -12446,31 +10124,27 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws-ssl-profiles": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/aws4": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/axios": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -12479,18 +10153,16 @@ }, "node_modules/axobject-query": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -12509,9 +10181,8 @@ }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12525,9 +10196,8 @@ }, "node_modules/babel-loader": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -12542,9 +10212,8 @@ }, "node_modules/babel-loader/node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -12558,9 +10227,8 @@ }, "node_modules/babel-loader/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -12574,9 +10242,8 @@ }, "node_modules/babel-loader/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -12589,9 +10256,8 @@ }, "node_modules/babel-loader/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -12604,9 +10270,8 @@ }, "node_modules/babel-loader/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -12619,18 +10284,16 @@ }, "node_modules/babel-loader/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/babel-loader/node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -12643,9 +10306,8 @@ }, "node_modules/babel-loader/node_modules/yocto-queue": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -12655,9 +10317,8 @@ }, "node_modules/babel-plugin-const-enum": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", - "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.3.3", @@ -12669,9 +10330,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12685,9 +10345,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12701,18 +10360,16 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12725,9 +10382,8 @@ }, "node_modules/babel-plugin-macros": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -12740,9 +10396,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", @@ -12754,18 +10409,16 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2", "core-js-compat": "^3.38.0" @@ -12776,9 +10429,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" }, @@ -12788,18 +10440,16 @@ }, "node_modules/babel-plugin-transform-typescript-metadata": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", - "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -12820,9 +10470,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -12836,13 +10485,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -12856,21 +10502,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -12880,36 +10525,31 @@ }, "node_modules/basic-auth/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcryptjs": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/beasties": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", - "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, + "license": "Apache-2.0", "dependencies": { "css-select": "^5.1.0", "css-what": "^6.1.0", @@ -12926,18 +10566,16 @@ }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -12947,9 +10585,8 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12958,9 +10595,8 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12972,8 +10608,7 @@ }, "node_modules/body-parser": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", - "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", + "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12991,8 +10626,7 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -13007,8 +10641,7 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -13018,24 +10651,21 @@ }, "node_modules/body-parser/node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/mime-db": { "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/body-parser/node_modules/mime-types": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", - "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", + "license": "MIT", "dependencies": { "mime-db": "^1.53.0" }, @@ -13045,13 +10675,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -13064,8 +10692,7 @@ }, "node_modules/body-parser/node_modules/raw-body": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -13078,8 +10705,7 @@ }, "node_modules/body-parser/node_modules/raw-body/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13089,8 +10715,7 @@ }, "node_modules/body-parser/node_modules/type-is": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", - "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "license": "MIT", "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -13102,9 +10727,8 @@ }, "node_modules/bonjour-service": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -13112,22 +10736,19 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -13137,8 +10758,6 @@ }, "node_modules/browserslist": { "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -13154,6 +10773,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -13169,9 +10789,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -13181,18 +10800,16 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/btoa": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -13202,8 +10819,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -13219,6 +10834,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -13226,37 +10842,32 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/buffer-writer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/builtins": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -13269,8 +10880,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -13280,17 +10889,15 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", @@ -13311,18 +10918,16 @@ }, "node_modules/cacache/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/cacache/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -13340,9 +10945,8 @@ }, "node_modules/cacache/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -13355,15 +10959,13 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -13376,9 +10978,8 @@ }, "node_modules/cacache/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -13391,9 +10992,8 @@ }, "node_modules/cacache/node_modules/tar": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -13408,18 +11008,16 @@ }, "node_modules/cacache/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/cache-content-type": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" @@ -13430,9 +11028,8 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -13449,8 +11046,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -13461,8 +11057,7 @@ }, "node_modules/call-bound": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" @@ -13476,27 +11071,24 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -13511,9 +11103,8 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -13523,8 +11114,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "dev": true, "funding": [ { @@ -13539,19 +11128,18 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13562,29 +11150,25 @@ }, "node_modules/change-case-commonjs": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case-commonjs/-/change-case-commonjs-5.4.4.tgz", - "integrity": "sha512-b9kVAvkOzngdK/JIMSqP1TixZ4lDvYwk+Lh+EL1+tYjQCp6FCLVQe/VmjwlYXt7MQsvlLaUdX6gJNEsRlQlwlw==" + "license": "MIT" }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/chokidar": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -13597,26 +11181,22 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -13624,25 +11204,23 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/class-transformer": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + "license": "MIT" }, "node_modules/class-validator": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "license": "MIT", "dependencies": { "@types/validator": "^13.11.8", "libphonenumber-js": "^1.10.53", @@ -13651,9 +11229,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -13663,8 +11240,7 @@ }, "node_modules/cli-highlight": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "license": "ISC", "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -13683,8 +11259,7 @@ }, "node_modules/cli-highlight/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13698,8 +11273,7 @@ }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -13708,13 +11282,11 @@ }, "node_modules/cli-highlight/node_modules/parse5": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "license": "MIT" }, "node_modules/cli-highlight/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13729,8 +11301,7 @@ }, "node_modules/cli-highlight/node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -13746,17 +11317,15 @@ }, "node_modules/cli-highlight/node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/cli-spinners": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -13766,9 +11335,8 @@ }, "node_modules/cli-truncate": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -13782,9 +11350,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -13794,15 +11361,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-truncate/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -13817,9 +11382,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -13832,18 +11396,19 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } }, "node_modules/clipanion": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-3.2.1.tgz", - "integrity": "sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==", "dev": true, + "license": "MIT", + "workspaces": [ + "website" + ], "dependencies": { "typanion": "^3.8.0" }, @@ -13853,8 +11418,7 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -13866,8 +11430,7 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13882,18 +11445,16 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -13905,9 +11466,8 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -13915,14 +11475,12 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13932,26 +11490,22 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/columnify": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, + "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -13962,8 +11516,7 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -13973,15 +11526,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/comment-json": { "version": "4.2.5", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", - "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", "dev": true, + "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -13995,21 +11546,18 @@ }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -14019,9 +11567,8 @@ }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -14037,47 +11584,41 @@ }, "node_modules/compression/node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -14085,1479 +11626,1736 @@ "typedarray": "^0.0.6" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.0", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "14.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.35.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/consola": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", - "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } + "node_modules/create-require": { + "version": "1.1.1", + "devOptional": true, + "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/cron-parser": { + "version": "4.9.0", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "luxon": "^3.2.1" }, "engines": { - "node": ">= 0.6" + "node": ">=12.0.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">= 8" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/css-declaration-sorter": { + "version": "7.2.0", "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "node_modules/css-loader": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", "dev": true, + "license": "MIT", "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.1.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/css-select": { + "version": "5.1.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "is-glob": "^4.0.3" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "node_modules/css-tree": { + "version": "2.3.1", "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/copy-webpack-plugin/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/cssnano-preset-default": { + "version": "6.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, "engines": { - "node": ">=14.16" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "node_modules/cssnano-utils": { + "version": "4.0.2", "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "node_modules/csso": { + "version": "5.0.5", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "css-tree": "~2.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">= 0.10" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", "dev": true, - "engines": { - "node": ">= 0.4.0" - } + "license": "CC0-1.0" }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "cssom": "~0.3.6" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/cuint": { + "version": "0.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" + "assert-plus": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/data-urls": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "node_modules/dataloader": { + "version": "2.2.3", + "license": "MIT" }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "node_modules/date-format": { + "version": "4.0.14", "dev": true, - "dependencies": { - "luxon": "^3.2.1" - }, + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=4.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/dayjs": { + "version": "1.11.10", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "node_modules/decamelize": { + "version": "1.2.0", "dev": true, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=0.10.0" } }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "node_modules/decamelize-keys": { + "version": "1.1.1", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">= 18.12.0" + "node": ">=0.10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/defaults": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "clone": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/define-data-property": { + "version": "1.1.4", "dev": true, + "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", "dev": true, - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=4" } }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", "dev": true, - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, + "license": "Apache-2.0", + "optional": true, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8" } }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "node_modules/detect-newline": { + "version": "3.1.0", "dev": true, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "node_modules/detect-node": { + "version": "2.1.0", "dev": true, + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "dev": true, + "license": "MIT", "dependencies": { - "css-tree": "~2.2.0" + "address": "^1.0.1", + "debug": "4" }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=0.3.1" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/diff-sequences": { + "version": "29.6.3", "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "path-type": "^4.0.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=8" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true + "node_modules/discontinuous-range": { + "version": "1.0.0", + "dev": true, + "license": "MIT" }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/dns-packet": { + "version": "5.6.1", "dev": true, + "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/doctrine": { + "version": "3.0.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "assert-plus": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10" + "node": ">=6.0.0" } }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "node_modules/dom-serializer": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dataloader": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", - "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==" + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "node_modules/domexception": { + "version": "4.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=12" } }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ms": "2.1.2" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=6.0" + "node": ">= 4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/domutils": { + "version": "3.2.2", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/dotenv-expand": { + "version": "11.0.7", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "dotenv": "^16.4.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://dotenvx.com" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { + "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "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==", + "node_modules/duplexify": { + "version": "4.1.2", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", "dev": true, + "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", "dev": true, + "license": "Apache-2.0", "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "safe-buffer": "^5.0.1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", "dev": true, + "license": "Apache-2.0", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "jake": "^10.8.5" }, - "engines": { - "node": ">= 0.4" + "bin": { + "ejs": "bin/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/electron-to-chromium": { + "version": "1.5.71", "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">= 4" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "node_modules/encoding": { + "version": "0.1.13", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.10.0" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "node_modules/end-of-stream": { + "version": "1.4.4", "dev": true, - "optional": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, + "node_modules/engine.io": { + "version": "6.6.4", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, "engines": { - "node": ">=8" + "node": ">=10.2.0" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, + "node_modules/engine.io-client": { + "version": "6.5.3", + "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/enhanced-resolve": { + "version": "5.17.1", "dev": true, + "license": "MIT", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/enquirer": { + "version": "2.3.6", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "ansi-colors": "^4.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.6" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/entities": { + "version": "4.5.0", "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/env-paths": { + "version": "2.2.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", + "node_modules/envinfo": { + "version": "7.11.0", "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/environment": { + "version": "1.1.0", "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "node_modules/err-code": { + "version": "2.0.3", "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } + "license": "MIT" }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" }, - "funding": { - "url": "https://dotenvx.com" + "bin": { + "errno": "cli.js" } }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, + "license": "MIT", "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" + "is-arrayish": "^0.2.1" } }, - "node_modules/dunder-proto": { + "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/es-module-lexer": { + "version": "1.5.4", "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "es-errors": "^1.3.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node": ">= 0.4" } }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/esbuild": { + "version": "0.24.2", "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "node_modules/esbuild-wasm": { + "version": "0.24.2", "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, + "license": "MIT", "bin": { - "ejs": "bin/cli.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", - "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "node": ">=18" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10.2.0" + "node": ">=18" } }, - "node_modules/engine.io-client": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", - "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=18" } }, - "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=18" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.13.0" + "node": ">=18" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" + "node": ">=18" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=18" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/esbuild-wasm": { + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz", - "integrity": "sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" } }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -15576,9 +13374,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -15586,9 +13383,8 @@ }, "node_modules/eslint": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -15641,9 +13437,8 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -15653,9 +13448,8 @@ }, "node_modules/eslint-formatter-pretty": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "^7.2.13", "ansi-escapes": "^4.2.1", @@ -15675,9 +13469,8 @@ }, "node_modules/eslint-formatter-pretty/node_modules/@types/eslint": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -15685,9 +13478,8 @@ }, "node_modules/eslint-formatter-pretty/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15701,15 +13493,13 @@ }, "node_modules/eslint-rule-docs": { "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-scope": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15723,9 +13513,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -15735,9 +13524,8 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15751,9 +13539,8 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15761,9 +13548,8 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15777,9 +13563,8 @@ }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15789,9 +13574,8 @@ }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15805,9 +13589,8 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -15821,9 +13604,8 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -15833,9 +13615,8 @@ }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -15848,15 +13629,13 @@ }, "node_modules/eslint/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 + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -15869,9 +13648,8 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15881,9 +13659,8 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -15896,9 +13673,8 @@ }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -15908,17 +13684,15 @@ }, "node_modules/esm": { "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -15933,8 +13707,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -15945,9 +13718,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -15957,9 +13729,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -15969,65 +13740,57 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -16048,8 +13811,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -16057,9 +13818,8 @@ }, "node_modules/expand-tilde": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -16069,9 +13829,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -16085,15 +13844,13 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -16133,15 +13890,13 @@ }, "node_modules/express-rate-limit": { "version": "5.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz", - "integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -16163,30 +13918,26 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -16199,15 +13950,13 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -16219,9 +13968,8 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -16231,22 +13979,19 @@ }, "node_modules/extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" - ] + ], + "license": "MIT" }, "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==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -16260,57 +14005,49 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-redact": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -16320,18 +14057,16 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/fdir": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, + "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -16343,8 +14078,7 @@ }, "node_modules/figlet": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", - "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", + "license": "MIT", "bin": { "figlet": "bin/index.js" }, @@ -16354,9 +14088,8 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -16369,9 +14102,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -16381,18 +14113,16 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -16402,8 +14132,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -16413,9 +14142,8 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -16431,24 +14159,21 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -16463,9 +14188,8 @@ }, "node_modules/find-file-up": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", - "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve-dir": "^1.0.1" }, @@ -16475,9 +14199,8 @@ }, "node_modules/find-pkg": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", - "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", "dev": true, + "license": "MIT", "dependencies": { "find-file-up": "^2.0.1" }, @@ -16487,9 +14210,8 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -16500,18 +14222,16 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -16523,20 +14243,18 @@ }, "node_modules/flatted": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -16548,8 +14266,7 @@ }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -16563,8 +14280,7 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -16574,18 +14290,16 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -16617,9 +14331,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16633,18 +14346,16 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -16652,9 +14363,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16668,9 +14378,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/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, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -16692,9 +14401,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "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, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -16706,15 +14414,13 @@ }, "node_modules/fork-ts-checker-webpack-plugin/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 + "dev": true, + "license": "MIT" }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16724,9 +14430,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -16736,9 +14441,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -16748,9 +14452,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "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, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16766,8 +14469,7 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -16779,17 +14481,15 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -16800,36 +14500,32 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/front-matter": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", "dev": true, + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1" } }, "node_modules/front-matter/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/front-matter/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -16840,21 +14536,18 @@ }, "node_modules/front-matter/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -16867,9 +14560,8 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -16879,22 +14571,18 @@ }, "node_modules/fs-monkey": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "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, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -16905,48 +14593,42 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", "dependencies": { "is-property": "^1.0.2" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -16956,8 +14638,7 @@ }, "node_modules/get-intrinsic": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", @@ -16979,16 +14660,14 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -16999,9 +14678,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17011,23 +14689,20 @@ }, "node_modules/getopts": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" + "license": "MIT" }, "node_modules/getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17045,8 +14720,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -17056,15 +14730,13 @@ }, "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 + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -17072,9 +14744,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -17084,9 +14755,8 @@ }, "node_modules/global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -17098,9 +14768,8 @@ }, "node_modules/global-prefix": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -17114,15 +14783,13 @@ }, "node_modules/global-prefix/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -17132,17 +14799,15 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -17160,8 +14825,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -17171,26 +14835,22 @@ }, "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==" + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -17209,50 +14869,44 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/harmony-reflect": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "dev": true + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-own-prop": { "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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -17262,8 +14916,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -17273,9 +14926,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -17288,8 +14940,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -17299,26 +14950,23 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/highlight.js": { "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/homedir-polyfill": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -17328,9 +14976,8 @@ }, "node_modules/hosted-git-info": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -17340,18 +14987,16 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -17361,9 +15006,8 @@ }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -17373,14 +15017,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -17389,6 +15030,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -17398,9 +15040,8 @@ }, "node_modules/http-assert": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, + "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" @@ -17411,18 +15052,16 @@ }, "node_modules/http-assert/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/http-assert/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -17436,29 +15075,25 @@ }, "node_modules/http-assert/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -17472,15 +15107,13 @@ }, "node_modules/http-parser-js": { "version": "0.5.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", - "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -17492,9 +15125,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -17506,9 +15138,8 @@ }, "node_modules/http-proxy-agent/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -17518,9 +15149,8 @@ }, "node_modules/http-proxy-middleware": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", - "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.15", "debug": "^4.3.6", @@ -17535,9 +15165,8 @@ }, "node_modules/http-proxy-middleware/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -17552,24 +15181,21 @@ }, "node_modules/http-proxy-middleware/node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/http-proxy-middleware/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-server": { "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, + "license": "MIT", "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", @@ -17594,9 +15220,8 @@ }, "node_modules/http-server/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17610,9 +15235,8 @@ }, "node_modules/http-signature": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "dev": true, + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", @@ -17624,15 +15248,13 @@ }, "node_modules/http-status-codes": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -17643,27 +15265,24 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/hyperdyperid": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.18" } }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -17673,9 +15292,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -17685,9 +15303,8 @@ }, "node_modules/identity-obj-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, + "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -17697,8 +15314,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -17712,21 +15327,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -17736,9 +15350,8 @@ }, "node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -17749,15 +15362,13 @@ }, "node_modules/immutable": { "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -17771,26 +15382,23 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/import-local": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -17807,27 +15415,24 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -17835,41 +15440,36 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/injection-js": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, "node_modules/interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/ip-address": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -17880,32 +15480,28 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/irregular-plurals": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -17915,8 +15511,7 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -17929,9 +15524,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -17944,34 +15538,30 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -17987,8 +15577,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -17998,9 +15587,8 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -18016,9 +15604,8 @@ }, "node_modules/is-inside-container/node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -18031,18 +15618,16 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-network-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -18052,26 +15637,23 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18081,9 +15663,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -18093,26 +15674,22 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-promise": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -18128,9 +15705,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -18140,15 +15716,13 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18158,24 +15732,21 @@ }, "node_modules/is-what": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -18188,62 +15759,54 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isomorphic-rslog": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.7.tgz", - "integrity": "sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17.6" } }, "node_modules/isomorphic-ws": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, + "license": "MIT", "peerDependencies": { "ws": "*" } }, "node_modules/isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -18257,9 +15820,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -18271,9 +15833,8 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -18286,9 +15847,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -18300,18 +15860,16 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -18322,16 +15880,14 @@ }, "node_modules/iterare": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", "engines": { "node": ">=6" } }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -18347,9 +15903,8 @@ }, "node_modules/jake": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -18365,9 +15920,8 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -18375,9 +15929,8 @@ }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18391,9 +15944,8 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -18403,9 +15955,8 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -18429,9 +15980,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -18443,9 +15993,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -18474,9 +16023,8 @@ }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18490,9 +16038,8 @@ }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -18504,9 +16051,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -18537,9 +16083,8 @@ }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18553,9 +16098,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -18598,9 +16142,8 @@ }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18614,9 +16157,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -18629,9 +16171,8 @@ }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18645,9 +16186,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -18657,9 +16197,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -18673,9 +16212,8 @@ }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18689,9 +16227,8 @@ }, "node_modules/jest-environment-jsdom": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -18716,9 +16253,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -18733,18 +16269,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -18767,9 +16301,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -18780,9 +16313,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -18795,9 +16327,8 @@ }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18811,9 +16342,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -18831,9 +16361,8 @@ }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18847,9 +16376,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -18861,9 +16389,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -18878,9 +16405,8 @@ }, "node_modules/jest-preset-angular": { "version": "14.4.2", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.4.2.tgz", - "integrity": "sha512-BYYv0FaTDfBNh8WyA9mpOV3krfw20kurBGK8INZUnv7KZDAWZuQtCET4TwTWxSNQ9jS1OX1+a5weCm/bTDDM1A==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "esbuild-wasm": ">=0.15.13", @@ -18905,18 +16431,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -18934,9 +16458,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -18947,9 +16470,8 @@ }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18963,9 +16485,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -18995,9 +16516,8 @@ }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19011,18 +16531,16 @@ }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19030,9 +16548,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -19063,9 +16580,8 @@ }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19079,9 +16595,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -19110,9 +16625,8 @@ }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19126,9 +16640,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -19143,9 +16656,8 @@ }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19159,9 +16671,8 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -19171,9 +16682,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -19188,9 +16698,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -19200,9 +16709,8 @@ }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19216,9 +16724,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -19235,9 +16742,8 @@ }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19251,9 +16757,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -19266,9 +16771,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19281,28 +16785,24 @@ }, "node_modules/jiti": { "version": "1.21.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.3.tgz", - "integrity": "sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -19312,15 +16812,13 @@ }, "node_modules/jsbn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsdom": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", @@ -19363,9 +16861,8 @@ }, "node_modules/jsdom/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -19375,9 +16872,8 @@ }, "node_modules/jsdom/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -19388,9 +16884,8 @@ }, "node_modules/jsdom/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -19400,9 +16895,8 @@ }, "node_modules/jsesc": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -19412,35 +16906,30 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/json-schema": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "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==" + "license": "MIT" }, "node_modules/json-stable-stringify": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -19456,20 +16945,17 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -19479,9 +16965,8 @@ }, "node_modules/jsonc-eslint-parser": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", - "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", @@ -19497,14 +16982,12 @@ }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -19514,27 +16997,24 @@ }, "node_modules/jsonify": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, + "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/JSONStream": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -19548,9 +17028,8 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, + "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -19570,12 +17049,11 @@ }, "node_modules/jsprim": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", "dev": true, "engines": [ "node >=0.6.0" ], + "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -19585,9 +17063,8 @@ }, "node_modules/jwa": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -19596,9 +17073,8 @@ }, "node_modules/jws": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dev": true, + "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -19606,18 +17082,16 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, + "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "node_modules/keygrip": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, + "license": "MIT", "dependencies": { "tsscmp": "1.0.6" }, @@ -19627,44 +17101,39 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/klona": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/knex": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "license": "MIT", "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", @@ -19713,9 +17182,8 @@ }, "node_modules/knex-pglite": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/knex-pglite/-/knex-pglite-0.11.0.tgz", - "integrity": "sha512-Z3v+vaF8C/VMJll7J2NHqFZo31ijLfYBsHMKU8jTnjfIF0edUonAB3sbAZYmUbSeJDDGfZdJPsvcB4ZyGBERcA==", "dev": true, + "license": "MIT", "dependencies": { "@electric-sql/pglite": "^0.2.14", "knex": "3.1.0" @@ -19723,30 +17191,26 @@ }, "node_modules/knex/node_modules/colorette": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "license": "MIT" }, "node_modules/knex/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/knex/node_modules/interpret": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/koa": { "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -19778,15 +17242,13 @@ }, "node_modules/koa-compose": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa-convert": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, + "license": "MIT", "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" @@ -19797,9 +17259,8 @@ }, "node_modules/koa/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -19813,27 +17274,24 @@ }, "node_modules/koa/node_modules/http-errors/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/koa/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/launch-editor": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -19841,9 +17299,8 @@ }, "node_modules/less": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -19867,9 +17324,8 @@ }, "node_modules/less-loader": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -19887,9 +17343,8 @@ }, "node_modules/less/node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -19901,9 +17356,8 @@ }, "node_modules/less/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -19911,9 +17365,8 @@ }, "node_modules/less/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -19921,9 +17374,8 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -19931,18 +17383,16 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -19953,14 +17403,12 @@ }, "node_modules/libphonenumber-js": { "version": "1.11.11", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.11.tgz", - "integrity": "sha512-mF3KaORjJQR6JBNcOkluDcJKhtoQT4VTLRMrX1v/wlBayL4M8ybwEDeryyPcrSEJmD0rVwHUbBarpZwN5NfPFQ==" + "license": "MIT" }, "node_modules/license-webpack-plugin": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, + "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" }, @@ -19975,9 +17423,8 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -19987,18 +17434,16 @@ }, "node_modules/lines-and-columns": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/listr2": { "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -20013,9 +17458,8 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -20025,9 +17469,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -20037,21 +17480,18 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -20066,9 +17506,8 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -20081,9 +17520,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -20098,10 +17536,9 @@ }, "node_modules/lmdb": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", - "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "msgpackr": "^1.11.2", @@ -20124,27 +17561,24 @@ }, "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, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -20154,101 +17588,85 @@ }, "node_modules/lockfile": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "dev": true, + "license": "ISC", "dependencies": { "signal-exit": "^3.0.2" } }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -20262,9 +17680,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20278,9 +17695,8 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", @@ -20297,9 +17713,8 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -20312,9 +17727,8 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -20324,9 +17738,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -20336,9 +17749,8 @@ }, "node_modules/log-update/node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" }, @@ -20351,15 +17763,13 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, + "license": "MIT", "dependencies": { "get-east-asian-width": "^1.0.0" }, @@ -20372,9 +17782,8 @@ }, "node_modules/log-update/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -20387,9 +17796,8 @@ }, "node_modules/log-update/node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" @@ -20403,9 +17811,8 @@ }, "node_modules/log-update/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -20415,9 +17822,8 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -20431,9 +17837,8 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -20448,9 +17853,8 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -20463,9 +17867,8 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -20480,9 +17883,8 @@ }, "node_modules/log4js": { "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -20496,14 +17898,12 @@ }, "node_modules/long": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", - "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + "license": "Apache-2.0" }, "node_modules/long-timeout": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -20520,9 +17920,8 @@ }, "node_modules/lowdb": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", - "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.3", "is-promise": "^2.1.0", @@ -20536,26 +17935,23 @@ }, "node_modules/lowdb/node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lru.min": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", + "license": "MIT", "engines": { "bun": ">=1.0.0", "deno": ">=1.30.0", @@ -20568,27 +17964,24 @@ }, "node_modules/luxon": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/magic-string": { "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -20601,24 +17994,21 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", @@ -20638,36 +18028,32 @@ }, "node_modules/make-fetch-happen/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/make-fetch-happen/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/map-obj": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -20677,31 +18063,27 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, + "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -20711,9 +18093,8 @@ }, "node_modules/meow": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -20737,9 +18118,8 @@ }, "node_modules/meow/node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -20749,9 +18129,8 @@ }, "node_modules/meow/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -20761,9 +18140,8 @@ }, "node_modules/meow/node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -20776,9 +18154,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -20788,51 +18165,44 @@ }, "node_modules/meow/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -20843,8 +18213,7 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -20854,17 +18223,15 @@ }, "node_modules/mikro-orm": { "version": "6.4.3", - "resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.3.tgz", - "integrity": "sha512-xDNzmLiL4EUTMOu9CbZ2d0sNIaUdH4RzDv4oqw27+u0/FPfvZTIagd+luxx1lWWqe/vg/iNtvqr5OcNQIYYrtQ==", + "license": "MIT", "engines": { "node": ">= 18.12.0" } }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -20874,16 +18241,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -20893,18 +18258,16 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -20914,18 +18277,16 @@ }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -20943,14 +18304,12 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20963,17 +18322,15 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -20985,26 +18342,23 @@ }, "node_modules/minimist-options/node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -21014,9 +18368,8 @@ }, "node_modules/minipass-fetch": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", - "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -21031,9 +18384,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -21043,9 +18395,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -21055,15 +18406,13 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -21073,9 +18422,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -21085,15 +18433,13 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -21103,9 +18449,8 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -21115,15 +18460,13 @@ }, "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minizlib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -21134,9 +18477,8 @@ }, "node_modules/minizlib/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -21154,9 +18496,8 @@ }, "node_modules/minizlib/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -21169,9 +18510,8 @@ }, "node_modules/minizlib/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -21184,9 +18524,8 @@ }, "node_modules/minizlib/node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^10.3.7" }, @@ -21199,8 +18538,7 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -21210,38 +18548,33 @@ }, "node_modules/moment": { "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/moo": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/mrmime": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/msgpackr": { "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", "dev": true, + "license": "MIT", "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -21249,10 +18582,9 @@ }, "node_modules/msgpackr-extract": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -21271,8 +18603,7 @@ }, "node_modules/multer": { "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -21288,9 +18619,8 @@ }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -21301,18 +18631,16 @@ }, "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/mv": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", "dev": true, + "license": "MIT", "dependencies": { "mkdirp": "~0.5.1", "ncp": "~2.0.0", @@ -21324,9 +18652,8 @@ }, "node_modules/mv/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -21334,9 +18661,8 @@ }, "node_modules/mv/node_modules/glob": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", "dev": true, + "license": "ISC", "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -21350,9 +18676,8 @@ }, "node_modules/mv/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -21362,9 +18687,8 @@ }, "node_modules/mv/node_modules/rimraf": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^6.0.1" }, @@ -21374,8 +18698,7 @@ }, "node_modules/mysql2": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.12.0.tgz", - "integrity": "sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==", + "license": "MIT", "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", @@ -21393,8 +18716,7 @@ }, "node_modules/mysql2/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -21404,8 +18726,7 @@ }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -21414,8 +18735,7 @@ }, "node_modules/named-placeholders": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", "dependencies": { "lru-cache": "^7.14.1" }, @@ -21425,22 +18745,18 @@ }, "node_modules/named-placeholders/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/nanoclone": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", - "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -21448,6 +18764,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -21457,24 +18774,21 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ncp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "dev": true, + "license": "MIT", "bin": { "ncp": "bin/ncp" } }, "node_modules/nearley": { "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", @@ -21494,9 +18808,8 @@ }, "node_modules/needle": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.3", @@ -21511,9 +18824,8 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -21524,23 +18836,20 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/nestjs-pino": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/nestjs-pino/-/nestjs-pino-4.3.0.tgz", - "integrity": "sha512-u/FRi+eRH+ER6cccyr9BBNaHg71qxLgWwDT7a0eGbSVZrSUzQ04O5zTNqydgzihNNHfuam6TBTz1wWdapOWYnQ==", "hasInstallScript": true, + "license": "MIT", "engines": { "node": ">= 14" }, @@ -21551,9 +18860,8 @@ }, "node_modules/ng-packagr": { "version": "19.1.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.1.2.tgz", - "integrity": "sha512-h8YDp6YdPwAwbl7rs0lJE7vVugobY6m+JogS0hQ7P+52RmslPT8kRCgdvGLIS1JySwPrDFQkPh2PLBaSjwcRqQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", @@ -21599,9 +18907,8 @@ }, "node_modules/ng-packagr/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21615,37 +18922,32 @@ }, "node_modules/ng-packagr/node_modules/commander": { "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/node-addon-api": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -21663,21 +18965,18 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -21685,18 +18984,16 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -21718,9 +19015,8 @@ }, "node_modules/node-gyp-build-optional-packages": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.1" @@ -21733,18 +19029,16 @@ }, "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/node-gyp/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -21762,18 +19056,16 @@ }, "node_modules/node-gyp/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/node-gyp/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -21786,9 +19078,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -21801,9 +19092,8 @@ }, "node_modules/node-gyp/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -21816,18 +19106,16 @@ }, "node_modules/node-gyp/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp/node_modules/tar": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -21842,9 +19130,8 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -21857,36 +19144,31 @@ }, "node_modules/node-gyp/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-machine-id": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-schedule": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", - "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", "dev": true, + "license": "MIT", "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", @@ -21898,9 +19180,8 @@ }, "node_modules/nopt": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, @@ -21913,9 +19194,8 @@ }, "node_modules/normalize-package-data": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", @@ -21927,9 +19207,8 @@ }, "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -21939,33 +19218,29 @@ }, "node_modules/normalize-package-data/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^4.0.0" }, @@ -21975,9 +19250,8 @@ }, "node_modules/npm-install-checks": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -21987,18 +19261,16 @@ }, "node_modules/npm-normalize-package-bin": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-package-arg": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", @@ -22011,9 +19283,8 @@ }, "node_modules/npm-packlist": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", "dev": true, + "license": "ISC", "dependencies": { "ignore-walk": "^7.0.0" }, @@ -22023,9 +19294,8 @@ }, "node_modules/npm-pick-manifest": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^7.1.0", "npm-normalize-package-bin": "^4.0.0", @@ -22038,9 +19308,8 @@ }, "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -22050,15 +19319,13 @@ }, "node_modules/npm-pick-manifest/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -22071,27 +19338,24 @@ }, "node_modules/npm-pick-manifest/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch": { "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", @@ -22108,9 +19372,8 @@ }, "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -22120,15 +19383,13 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -22141,27 +19402,24 @@ }, "node_modules/npm-registry-fetch/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -22171,9 +19429,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -22183,16 +19440,14 @@ }, "node_modules/nwsapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nx": { "version": "20.4.6", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.4.6.tgz", - "integrity": "sha512-gXRw3urAq4glK6B1+jxHjzXRyuNrFFI7L3ggNg34UmQ46AyT7a6FgjZp2OZ779urwnoQSTvxNfBuD4+RrB31MQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -22260,9 +19515,8 @@ }, "node_modules/nx/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22276,18 +19530,16 @@ }, "node_modules/nx/node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nx/node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -22297,15 +19549,13 @@ }, "node_modules/nx/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 + "dev": true, + "license": "MIT" }, "node_modules/nx/node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -22320,9 +19570,8 @@ }, "node_modules/nx/node_modules/ora": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -22342,9 +19591,8 @@ }, "node_modules/nx/node_modules/yaml": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -22354,25 +19602,22 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -22382,31 +19627,27 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -22416,26 +19657,23 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -22448,15 +19686,12 @@ }, "node_modules/only": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", "dev": true }, "node_modules/open": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", @@ -22493,18 +19728,16 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, + "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -22519,9 +19752,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -22542,9 +19774,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22558,25 +19789,22 @@ }, "node_modules/ordered-binary": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", - "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -22589,9 +19817,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -22601,9 +19828,8 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -22616,9 +19842,8 @@ }, "node_modules/p-map": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -22628,9 +19853,8 @@ }, "node_modules/p-retry": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", @@ -22645,38 +19869,33 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/packet-reader": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + "license": "MIT" }, "node_modules/pacote": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", @@ -22705,9 +19924,8 @@ }, "node_modules/pacote/node_modules/hosted-git-info": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -22717,15 +19935,13 @@ }, "node_modules/pacote/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -22738,27 +19954,24 @@ }, "node_modules/pacote/node_modules/proc-log": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/pacote/node_modules/validate-npm-package-name": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -22768,17 +19981,14 @@ }, "node_modules/parent-require": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", "engines": { "node": ">= 0.4.0" } }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -22794,45 +20004,39 @@ }, "node_modules/parse-json/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 + "dev": true, + "license": "MIT" }, "node_modules/parse-json/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 + "dev": true, + "license": "MIT" }, "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/parse-passwd": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/parse5": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.3.0", "parse5": "^7.0.0", @@ -22844,9 +20048,8 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -22856,22 +20059,19 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "license": "MIT" }, "node_modules/parse5-sax-parser": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, + "license": "MIT", "dependencies": { "parse5": "^7.0.0" }, @@ -22881,9 +20081,8 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -22893,47 +20092,41 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=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==" + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -22947,38 +20140,33 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pg": { "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "license": "MIT", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -23005,28 +20193,24 @@ }, "node_modules/pg-cloudflare": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", "engines": { "node": ">=4.0.0" } }, "node_modules/pg-mem": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pg-mem/-/pg-mem-3.0.2.tgz", - "integrity": "sha512-fbf55spR1nNWfxBm28h9Cx6lC5VSubqBjbTMkCMORtGJPiBD3GTDyHAntUm3s5eSt4/ork7HvpNmeWgkgRmDWg==", "dev": true, + "license": "MIT", "dependencies": { "functional-red-black-tree": "^1.0.1", "immutable": "^4.3.4", @@ -23082,9 +20266,8 @@ }, "node_modules/pg-mem/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -23094,27 +20277,23 @@ }, "node_modules/pg-mem/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/pg-pool": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", @@ -23128,17 +20307,15 @@ }, "node_modules/pgpass": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", "dependencies": { "split2": "^4.1.0" } }, "node_modules/pgsql-ast-parser": { "version": "12.0.1", - "resolved": "https://registry.npmjs.org/pgsql-ast-parser/-/pgsql-ast-parser-12.0.1.tgz", - "integrity": "sha512-pe8C6Zh5MsS+o38WlSu18NhrTjAv1UNMeDTs2/Km2ZReZdYBYtwtbWGZKK2BM2izv5CrQpbmP0oI10wvHOwv4A==", "dev": true, + "license": "MIT", "dependencies": { "moo": "^0.5.1", "nearley": "^2.19.5" @@ -23146,15 +20323,13 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -23164,17 +20339,15 @@ }, "node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pino": { "version": "9.6.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", - "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -23194,16 +20367,14 @@ }, "node_modules/pino-abstract-transport": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", "dependencies": { "split2": "^4.0.0" } }, "node_modules/pino-http": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.4.0.tgz", - "integrity": "sha512-vjQsKBE+VN1LVchjbfLE7B6nBeGASZNRNKsR68VS0DolTm5R3zo+47JX1wjm0O96dcbvA7vnqt8YqOWlG5nN0w==", + "license": "MIT", "dependencies": { "get-caller-file": "^2.0.5", "pino": "^9.0.0", @@ -23213,32 +20384,28 @@ }, "node_modules/pino-std-serializers": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + "license": "MIT" }, "node_modules/pirates": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/piscina": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", - "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, + "license": "MIT", "optionalDependencies": { "@napi-rs/nice": "^1.0.1" } }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -23248,18 +20415,16 @@ }, "node_modules/pkginfo": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/plur": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, + "license": "MIT", "dependencies": { "irregular-plurals": "^3.2.0" }, @@ -23272,26 +20437,23 @@ }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pony-cause": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "license": "0BSD", "engines": { "node": ">=12.0.0" } }, "node_modules/portfinder": { "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, + "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -23303,26 +20465,22 @@ }, "node_modules/portfinder/node_modules/async": { "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/postcss": { "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -23338,6 +20496,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -23349,9 +20508,8 @@ }, "node_modules/postcss-calc": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -23365,9 +20523,8 @@ }, "node_modules/postcss-colormin": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -23383,9 +20540,8 @@ }, "node_modules/postcss-convert-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -23399,9 +20555,8 @@ }, "node_modules/postcss-discard-comments": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -23411,9 +20566,8 @@ }, "node_modules/postcss-discard-duplicates": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -23423,9 +20577,8 @@ }, "node_modules/postcss-discard-empty": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -23435,9 +20588,8 @@ }, "node_modules/postcss-discard-overridden": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -23447,9 +20599,8 @@ }, "node_modules/postcss-import": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -23464,9 +20615,8 @@ }, "node_modules/postcss-loader": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^9.0.0", "jiti": "^1.20.0", @@ -23495,9 +20645,8 @@ }, "node_modules/postcss-loader/node_modules/cosmiconfig": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -23521,15 +20670,13 @@ }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-merge-longhand": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -23543,9 +20690,8 @@ }, "node_modules/postcss-merge-rules": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -23561,9 +20707,8 @@ }, "node_modules/postcss-minify-font-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23576,9 +20721,8 @@ }, "node_modules/postcss-minify-gradients": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dev": true, + "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -23593,9 +20737,8 @@ }, "node_modules/postcss-minify-params": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -23610,9 +20753,8 @@ }, "node_modules/postcss-minify-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -23625,9 +20767,8 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -23637,9 +20778,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -23654,9 +20794,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -23669,9 +20808,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -23684,9 +20822,8 @@ }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -23696,9 +20833,8 @@ }, "node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23711,9 +20847,8 @@ }, "node_modules/postcss-normalize-positions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23726,9 +20861,8 @@ }, "node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23741,9 +20875,8 @@ }, "node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23756,9 +20889,8 @@ }, "node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23771,9 +20903,8 @@ }, "node_modules/postcss-normalize-unicode": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -23787,9 +20918,8 @@ }, "node_modules/postcss-normalize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23802,9 +20932,8 @@ }, "node_modules/postcss-normalize-whitespace": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23817,9 +20946,8 @@ }, "node_modules/postcss-ordered-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dev": true, + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -23833,9 +20961,8 @@ }, "node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -23849,9 +20976,8 @@ }, "node_modules/postcss-reduce-transforms": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -23864,9 +20990,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -23877,9 +21002,8 @@ }, "node_modules/postcss-svgo": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -23893,9 +21017,8 @@ }, "node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -23908,9 +21031,8 @@ }, "node_modules/postcss-url": { "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, + "license": "MIT", "dependencies": { "make-dir": "~3.1.0", "mime": "~2.5.2", @@ -23926,9 +21048,8 @@ }, "node_modules/postcss-url/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -23936,9 +21057,8 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -23948,9 +21068,8 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -23960,38 +21079,33 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/postgres-bytea": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/postgres-date": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/postgres-interval": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", "dependencies": { "xtend": "^4.0.0" }, @@ -24001,18 +21115,16 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -24025,9 +21137,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -24039,9 +21150,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -24051,31 +21161,26 @@ }, "node_modules/proc-log": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "license": "MIT" }, "node_modules/process-warning": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", "funding": [ { "type": "github", @@ -24085,19 +21190,18 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -24108,9 +21212,8 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -24121,14 +21224,12 @@ }, "node_modules/property-expr": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -24139,34 +21240,28 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -24177,13 +21272,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -24196,14 +21291,11 @@ }, "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -24217,39 +21309,35 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/railroad-diagrams": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/rambda": { "version": "9.4.2", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", - "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/randexp": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", "dev": true, + "license": "MIT", "dependencies": { "discontinuous-range": "1.0.0", "ret": "~0.1.10" @@ -24260,26 +21348,23 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -24319,24 +21404,21 @@ }, "node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/read-cache": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/read-pkg": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -24349,9 +21431,8 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -24366,24 +21447,21 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -24393,26 +21471,23 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24425,19 +21500,16 @@ }, "node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/readdirp": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16.0" }, @@ -24448,16 +21520,14 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/rechoir": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -24467,9 +21537,8 @@ }, "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -24480,20 +21549,17 @@ }, "node_modules/reflect-metadata": { "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -24503,30 +21569,26 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexpu-core": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", @@ -24541,15 +21603,13 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regjsparser": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.0.2" }, @@ -24559,39 +21619,34 @@ }, "node_modules/repeat-string": { "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, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -24606,9 +21661,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -24618,9 +21672,8 @@ }, "node_modules/resolve-dir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -24631,17 +21684,15 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, + "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -24655,9 +21706,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -24669,27 +21719,24 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -24700,26 +21747,23 @@ }, "node_modules/ret": { "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12" } }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -24727,15 +21771,13 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -24748,9 +21790,8 @@ }, "node_modules/rollup": { "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -24786,8 +21827,7 @@ }, "node_modules/router": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", - "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", + "license": "MIT", "dependencies": { "is-promise": "^4.0.0", "parseurl": "^1.3.3", @@ -24799,14 +21839,12 @@ }, "node_modules/router/node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + "license": "MIT" }, "node_modules/run-applescript": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -24816,8 +21854,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -24832,22 +21868,20 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -24861,13 +21895,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -24882,22 +21916,19 @@ }, "node_modules/safe-stable-stringify": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/sass": { "version": "1.83.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", - "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -24915,9 +21946,8 @@ }, "node_modules/sass-loader": { "version": "16.0.4", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", - "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, + "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -24955,21 +21985,18 @@ }, "node_modules/sass/node_modules/immutable": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sax": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -24989,9 +22016,8 @@ }, "node_modules/schema-utils": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -25008,21 +22034,18 @@ }, "node_modules/secure-compare": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -25033,9 +22056,8 @@ }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -25045,9 +22067,8 @@ }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -25069,44 +22090,37 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + "version": "0.0.5" }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -25122,27 +22136,24 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -25155,36 +22166,31 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -25197,9 +22203,8 @@ }, "node_modules/set-function-length": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", @@ -25214,13 +22219,11 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -25231,9 +22234,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -25243,8 +22245,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -25254,17 +22255,15 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -25274,8 +22273,7 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -25292,8 +22290,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -25307,8 +22304,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -25324,8 +22320,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -25342,15 +22337,13 @@ }, "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 + "dev": true, + "license": "ISC" }, "node_modules/sigstore": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -25365,23 +22358,20 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -25395,9 +22385,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -25407,9 +22396,8 @@ }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -25419,9 +22407,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -25429,8 +22416,7 @@ }, "node_modules/socket.io": { "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -25446,8 +22432,7 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" @@ -25455,8 +22440,7 @@ }, "node_modules/socket.io-adapter/node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -25475,8 +22459,7 @@ }, "node_modules/socket.io-client": { "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", - "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -25489,8 +22472,7 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -25501,9 +22483,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -25512,18 +22493,16 @@ }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/socks": { "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -25535,9 +22514,8 @@ }, "node_modules/socks-proxy-agent": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -25549,41 +22527,36 @@ }, "node_modules/sonic-boom": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, "node_modules/sorted-array-functions": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", - "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" @@ -25601,9 +22574,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -25613,9 +22585,8 @@ }, "node_modules/source-map-support": { "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, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -25623,18 +22594,16 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -25642,15 +22611,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -25658,15 +22625,13 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -25680,9 +22645,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -25694,9 +22658,8 @@ }, "node_modules/spdy-transport/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -25708,31 +22671,27 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } }, "node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/sshpk": { "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, + "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -25755,15 +22714,13 @@ }, "node_modules/sshpk/node_modules/jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ssri": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -25773,9 +22730,8 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -25785,41 +22741,36 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/steno": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", - "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.3" } }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/streamroller": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, + "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -25831,9 +22782,8 @@ }, "node_modules/streamroller/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -25845,56 +22795,48 @@ }, "node_modules/streamroller/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/streamroller/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -25905,8 +22847,7 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25919,8 +22860,7 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -25932,8 +22872,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -25944,8 +22883,7 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -25955,27 +22893,24 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -25985,9 +22920,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -25997,9 +22931,8 @@ }, "node_modules/style-loader": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -26013,9 +22946,8 @@ }, "node_modules/stylehacks": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -26029,9 +22961,8 @@ }, "node_modules/stylus": { "version": "0.64.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", - "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "~4.3.3", "debug": "^4.3.2", @@ -26051,9 +22982,8 @@ }, "node_modules/stylus-loader": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", - "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.12", "normalize-path": "^3.0.0" @@ -26072,9 +23002,8 @@ }, "node_modules/stylus/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -26092,9 +23021,8 @@ }, "node_modules/stylus/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -26107,9 +23035,8 @@ }, "node_modules/stylus/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -26122,8 +23049,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -26133,9 +23059,8 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -26146,8 +23071,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "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==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -26157,9 +23081,8 @@ }, "node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -26182,50 +23105,44 @@ }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/swagger-ui-dist": { "version": "5.19.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.19.0.tgz", - "integrity": "sha512-bSVZeYaqanMFeW5ZY3+EejFbsjkjazYxm1I7Lz3xayYz5XU3m2aUzvuPC0jI95WCQdduszHYV3ER4buQoy8DXA==", + "license": "Apache-2.0", "dependencies": { "@scarf/scarf": "=1.4.0" } }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -26240,9 +23157,8 @@ }, "node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -26256,9 +23172,8 @@ }, "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -26270,9 +23185,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -26282,9 +23196,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -26294,18 +23207,16 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -26316,9 +23227,8 @@ }, "node_modules/tar/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -26328,9 +23238,8 @@ }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -26340,23 +23249,20 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/tarn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/terser": { "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -26372,9 +23278,8 @@ }, "node_modules/terser-webpack-plugin": { "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, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -26406,9 +23311,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -26422,18 +23326,16 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "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, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -26445,15 +23347,13 @@ }, "node_modules/terser-webpack-plugin/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 + "dev": true, + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "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, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -26469,9 +23369,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -26484,9 +23383,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -26498,9 +23396,8 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -26508,9 +23405,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -26520,22 +23416,19 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -26545,9 +23438,8 @@ }, "node_modules/thingies": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=10.18" }, @@ -26557,37 +23449,32 @@ }, "node_modules/thread-stream": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tildify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tinyglobby": { "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "dev": true, + "license": "MIT", "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" @@ -26601,23 +23488,20 @@ }, "node_modules/tmp": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.14" } }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -26627,23 +23511,20 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/toposort": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tough-cookie": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -26656,18 +23537,16 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -26677,9 +23556,8 @@ }, "node_modules/tree-dump": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -26693,27 +23571,24 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/trim-newlines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ts-api-utils": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -26723,17 +23598,15 @@ }, "node_modules/ts-deepmerge": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-6.2.1.tgz", - "integrity": "sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==", + "license": "ISC", "engines": { "node": ">=14.13.1" } }, "node_modules/ts-jest": { "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -26774,9 +23647,8 @@ }, "node_modules/ts-loader": { "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -26794,9 +23666,8 @@ }, "node_modules/ts-loader/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26810,9 +23681,8 @@ }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -26853,13 +23723,11 @@ }, "node_modules/ts-toolbelt": { "version": "9.6.0", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + "license": "Apache-2.0" }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -26871,9 +23739,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -26885,9 +23752,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26901,17 +23767,15 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tsd": { "version": "0.31.2", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", - "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", "dev": true, + "license": "MIT", "dependencies": { "@tsd/typescript": "~5.4.3", "eslint-formatter-pretty": "^4.1.0", @@ -26930,23 +23794,20 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.x" } }, "node_modules/tuf-js": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.3.6", @@ -26958,9 +23819,8 @@ }, "node_modules/tuf-js/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -26975,15 +23835,13 @@ }, "node_modules/tuf-js/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -26993,21 +23851,21 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/typanion": { "version": "3.14.0", - "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", - "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", - "dev": true + "dev": true, + "license": "MIT", + "workspaces": [ + "website" + ] }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -27017,18 +23875,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -27038,8 +23894,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -27050,19 +23905,16 @@ }, "node_modules/typed-assert": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "license": "MIT" }, "node_modules/typeorm": { "version": "0.3.20", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", - "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", + "license": "MIT", "dependencies": { "@sqltools/formatter": "^1.2.5", "app-root-path": "^3.1.0", @@ -27166,17 +24018,14 @@ }, "node_modules/typeorm-pglite": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/typeorm-pglite/-/typeorm-pglite-0.3.2.tgz", - "integrity": "sha512-/URkIx3MXaRqLKXjGfFY1uq8Fp6qSYTP09NjK6MAbsZhNwe7qAqnaWdTGtJ4aMr2e2TDPXT1rCt+w7xszMUzOg==", "dev": true, + "license": "MIT", "peerDependencies": { "@electric-sql/pglite": ">= 0.2.12" } }, "node_modules/typeorm/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -27191,6 +24040,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -27198,8 +24048,7 @@ }, "node_modules/typeorm/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27213,8 +24062,7 @@ }, "node_modules/typeorm/node_modules/glob": { "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -27234,8 +24082,7 @@ }, "node_modules/typeorm/node_modules/mkdirp": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -27248,26 +24095,23 @@ }, "node_modules/typeorm/node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + "license": "Apache-2.0" }, "node_modules/typeorm/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/typescript": { "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -27278,9 +24122,8 @@ }, "node_modules/uglify-js": { "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -27291,8 +24134,7 @@ }, "node_modules/uid": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.0.0" }, @@ -27302,8 +24144,7 @@ }, "node_modules/umzug": { "version": "3.8.2", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.2.tgz", - "integrity": "sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==", + "license": "MIT", "dependencies": { "@rushstack/ts-command-line": "^4.12.2", "emittery": "^0.13.0", @@ -27317,8 +24158,7 @@ }, "node_modules/umzug/node_modules/type-fest": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", - "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -27328,18 +24168,16 @@ }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -27350,27 +24188,24 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicorn-magic": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -27380,8 +24215,6 @@ }, "node_modules/union": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { "qs": "^6.4.0" @@ -27392,9 +24225,8 @@ }, "node_modules/unique-filename": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, + "license": "ISC", "dependencies": { "unique-slug": "^5.0.0" }, @@ -27404,9 +24236,8 @@ }, "node_modules/unique-slug": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -27416,31 +24247,27 @@ }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unix-crypt-td-js": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/upath": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" @@ -27448,8 +24275,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -27465,6 +24290,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.0" @@ -27478,23 +24304,20 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-join": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/url-parse": { "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -27502,40 +24325,35 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -27547,15 +24365,13 @@ }, "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -27563,9 +24379,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, + "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -27575,25 +24390,22 @@ }, "node_modules/validator": { "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/verdaccio": { "version": "5.29.2", - "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.29.2.tgz", - "integrity": "sha512-Ra9Bv8mMsGaFnvFJl80gSNg6yhHRFUYATA03xpVrfqC1Z1IDZt/f0jZ94tPnfyaY1ljUS5jKsZsj6ihN/ZSVbQ==", "dev": true, + "license": "MIT", "dependencies": { "@cypress/request": "3.0.1", "@verdaccio/config": "7.0.0-next-7.10", @@ -27647,9 +24459,8 @@ }, "node_modules/verdaccio-audit": { "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-12.0.0-next-7.10.tgz", - "integrity": "sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/config": "7.0.0-next-7.10", "@verdaccio/core": "7.0.0-next-7.10", @@ -27667,9 +24478,8 @@ }, "node_modules/verdaccio-audit/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -27679,9 +24489,8 @@ }, "node_modules/verdaccio-audit/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -27690,11 +24499,52 @@ "node": ">= 6" } }, + "node_modules/verdaccio-audit/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/verdaccio-audit/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/verdaccio-audit/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/verdaccio-audit/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/verdaccio-htpasswd": { "version": "12.0.0-next-7.10", - "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-12.0.0-next-7.10.tgz", - "integrity": "sha512-+P7kxWgWSxRyTlP+IFySwgvQjt529zXTetNmupUgYtu09qCZMffdZ74aGASuCvWa4Vcqavmytzg8McqCNheFiA==", "dev": true, + "license": "MIT", "dependencies": { "@verdaccio/core": "7.0.0-next-7.10", "@verdaccio/file-locking": "12.0.0-next.1", @@ -27715,9 +24565,8 @@ }, "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { "version": "12.0.0-next.1", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-12.0.0-next.1.tgz", - "integrity": "sha512-Zb5G2HEhVRB0jCq4z7QA4dqTdRv/2kIsw2Nkm3j2HqC1OeJRxas3MJAF/OxzbAb1IN32lbg1zycMSk6NcbQkgQ==", "dev": true, + "license": "MIT", "dependencies": { "lockfile": "1.0.4" }, @@ -27731,27 +24580,24 @@ }, "node_modules/verdaccio/node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/verdaccio/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/verdaccio/node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -27761,9 +24607,8 @@ }, "node_modules/verdaccio/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -27773,9 +24618,8 @@ }, "node_modules/verdaccio/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -27788,9 +24632,8 @@ }, "node_modules/verdaccio/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -27800,18 +24643,16 @@ }, "node_modules/verdaccio/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/verror": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" ], + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -27820,15 +24661,13 @@ }, "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^4.0.0" }, @@ -27838,18 +24677,16 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/watchpack": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -27860,43 +24697,38 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/weak-lru-cache": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/webpack": { "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -27940,9 +24772,8 @@ }, "node_modules/webpack-cli": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -27985,18 +24816,16 @@ }, "node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/webpack-dev-middleware": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -28023,9 +24852,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/memfs": { "version": "4.14.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.1.tgz", - "integrity": "sha512-Fq5CMEth+2iprLJ5mNizRcWuiwRZYjNkUD0zKk224jZunE9CRacTRDK8QLALbMBlNX2y3nY6lKZbesCwDwacig==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", "@jsonjoy.com/util": "^1.3.0", @@ -28042,9 +24870,8 @@ }, "node_modules/webpack-dev-server": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -28098,9 +24925,8 @@ }, "node_modules/webpack-dev-server/node_modules/body-parser": { "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -28122,9 +24948,8 @@ }, "node_modules/webpack-dev-server/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, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -28146,36 +24971,32 @@ }, "node_modules/webpack-dev-server/node_modules/cookie": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-server/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/webpack-dev-server/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/webpack-dev-server/node_modules/express": { "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -28219,9 +25040,8 @@ }, "node_modules/webpack-dev-server/node_modules/finalhandler": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -28237,9 +25057,8 @@ }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -28261,39 +25080,34 @@ }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-server/node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/path-to-regexp": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -28303,9 +25117,8 @@ }, "node_modules/webpack-dev-server/node_modules/qs": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -28318,9 +25131,8 @@ }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -28330,9 +25142,8 @@ }, "node_modules/webpack-dev-server/node_modules/send": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -28354,24 +25165,21 @@ }, "node_modules/webpack-dev-server/node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/webpack-dev-server/node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/serve-static": { "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -28384,9 +25192,8 @@ }, "node_modules/webpack-merge": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -28398,27 +25205,24 @@ }, "node_modules/webpack-node-externals": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/webpack-sources": { "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, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, + "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" }, @@ -28437,9 +25241,8 @@ }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -28453,18 +25256,16 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -28475,30 +25276,26 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/webpack/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 + "dev": true, + "license": "MIT" }, "node_modules/webpack/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 + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { "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, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -28514,9 +25311,8 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -28528,18 +25324,16 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -28549,9 +25343,8 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -28561,18 +25354,16 @@ }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -28583,8 +25374,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -28597,21 +25387,18 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -28624,8 +25411,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -28640,14 +25426,12 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -28658,8 +25442,7 @@ }, "node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -28678,71 +25461,61 @@ }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "engines": { "node": ">=0.4.0" } }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/xxhashjs": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, + "license": "MIT", "dependencies": { "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -28758,35 +25531,31 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/ylru": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -28796,9 +25565,8 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -28808,9 +25576,8 @@ }, "node_modules/yup": { "version": "0.32.11", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", - "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.15.4", "@types/lodash": "^4.14.175", @@ -28826,16 +25593,14 @@ }, "node_modules/zod": { "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-validation-error": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.4.0.tgz", - "integrity": "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==", + "license": "MIT", "engines": { "node": ">=18.0.0" }, @@ -28845,8 +25610,7 @@ }, "node_modules/zone.js": { "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==" + "license": "MIT" } } } From 2425fb6ba5c0c336f201b3a51d82cc62905b1d19 Mon Sep 17 00:00:00 2001 From: Alex H Date: Tue, 4 Mar 2025 18:18:10 +0100 Subject: [PATCH 09/22] refactor(json-api-nestjs-sdk): Use new structur Use type from shared library BREAKING CHANGE: New package name --- .../json-api-nestjs-sdk/.eslintrc.json | 17 +- .../json-api-nestjs-sdk/jest.config.ts | 1 - .../json-api-nestjs-sdk/ng-package.json | 7 - .../json-api/json-api-nestjs-sdk/package.json | 38 +++- .../json-api/json-api-nestjs-sdk/project.json | 106 ++++------ .../json-api/json-api-nestjs-sdk/src/index.ts | 13 +- .../src/lib/constants/index.ts | 2 - .../service/atomic-operations.service.spec.ts | 6 +- .../lib/service/atomic-operations.service.ts | 63 +++--- .../src/lib/service/fetch-inner-client.ts | 111 ++++++++--- .../src/lib/service/index.ts | 2 +- .../lib/service/json-api-sdk.service.spec.ts | 2 +- .../src/lib/service/json-api-sdk.service.ts | 187 +++++++++--------- .../service/json-api-utils.service.spec.ts | 11 +- .../src/lib/service/json-api-utils.service.ts | 83 ++++---- .../src/lib/token/index.ts | 3 +- .../types/{atomic.ts => atomic-operation.ts} | 53 ++--- .../src/lib/types/atomic-type.ts | 31 +++ .../src/lib/types/config.ts | 20 ++ .../src/lib/types/entity.ts | 15 -- .../src/lib/types/filter-operand.ts | 4 +- .../src/lib/types/http-inner-client.ts | 58 ++++-- .../src/lib/types/http-request-params.ts | 34 ++++ .../src/lib/types/index.ts | 72 +------ .../src/lib/types/promise-json-api-sdk.ts | 41 ++-- .../src/lib/types/query-params.ts | 29 +-- .../src/lib/types/response-body.ts | 13 -- .../src/lib/types/utils.ts | 23 +-- .../src/lib/utils/adapter-for-axios.ts | 69 +++++-- .../src/lib/utils/entity-array.ts | 2 +- .../lib/utils/generate-atomic-body.spec.ts | 3 +- .../src/lib/utils/generate-atomic-body.ts | 76 +++---- .../src/lib/utils/index.ts | 43 +--- .../src/lib/utils/utils.ts | 31 +++ .../json-api-nestjs-sdk/src/ngModule.ts | 9 +- .../json-api-nestjs-sdk/src/shared/index.ts | 2 - .../src/shared/lib/types/entity-type.ts | 17 -- .../src/shared/lib/types/index.ts | 4 - .../src/shared/lib/types/query-type.ts | 36 ---- .../src/shared/lib/types/response-body.ts | 76 ------- .../src/shared/lib/types/utils-string.type.ts | 26 --- .../src/shared/lib/utils/index.ts | 2 - .../src/shared/lib/utils/object-utils.ts | 21 -- .../src/shared/lib/utils/string-utils.spec.ts | 42 ---- .../src/shared/lib/utils/string-utils.ts | 38 ---- .../json-api-nestjs-sdk/tsconfig-mjs.lib.json | 27 +-- .../json-api-nestjs-sdk/tsconfig.json | 8 +- .../json-api-nestjs-sdk/tsconfig.lib.json | 4 +- .../json-api-nestjs-sdk/tsconfig.spec.json | 8 +- 49 files changed, 685 insertions(+), 904 deletions(-) delete mode 100644 libs/json-api/json-api-nestjs-sdk/ng-package.json rename libs/json-api/json-api-nestjs-sdk/src/lib/types/{atomic.ts => atomic-operation.ts} (63%) create mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts create mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts create mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts create mode 100644 libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/index.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts delete mode 100644 libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts diff --git a/libs/json-api/json-api-nestjs-sdk/.eslintrc.json b/libs/json-api/json-api-nestjs-sdk/.eslintrc.json index fae1b244..0af28030 100644 --- a/libs/json-api/json-api-nestjs-sdk/.eslintrc.json +++ b/libs/json-api/json-api-nestjs-sdk/.eslintrc.json @@ -1,6 +1,6 @@ { - "extends": ["../../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "**/*.spec.ts"], + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], @@ -18,13 +18,12 @@ "files": ["*.json"], "parser": "jsonc-eslint-parser", "rules": { - "@nx/dependency-checks": "error" - } - }, - { - "files": ["*.ts"], - "rules": { - "@angular-eslint/prefer-standalone": "off" + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] } } ] diff --git a/libs/json-api/json-api-nestjs-sdk/jest.config.ts b/libs/json-api/json-api-nestjs-sdk/jest.config.ts index ccd15445..167a2eaa 100644 --- a/libs/json-api/json-api-nestjs-sdk/jest.config.ts +++ b/libs/json-api/json-api-nestjs-sdk/jest.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable */ export default { displayName: 'json-api-nestjs-sdk', preset: '../../../jest.preset.js', diff --git a/libs/json-api/json-api-nestjs-sdk/ng-package.json b/libs/json-api/json-api-nestjs-sdk/ng-package.json deleted file mode 100644 index cb77cf59..00000000 --- a/libs/json-api/json-api-nestjs-sdk/ng-package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../../tmp/angular-lib/ngModule", - "lib": { - "entryFile": "../../index.ts" - } -} diff --git a/libs/json-api/json-api-nestjs-sdk/package.json b/libs/json-api/json-api-nestjs-sdk/package.json index 0d4e14c1..c625e8d3 100644 --- a/libs/json-api/json-api-nestjs-sdk/package.json +++ b/libs/json-api/json-api-nestjs-sdk/package.json @@ -1,5 +1,5 @@ { - "name": "json-api-nestjs-sdk", + "name": "@klerick/json-api-nestjs-sdk", "version": "9.0.0", "engines": { "node": ">= 16.0.0" @@ -17,7 +17,6 @@ }, "private": false, "license": "MIT", - "main": "./src/index.js", "files": [ "**/*" ], @@ -29,11 +28,34 @@ "typeorm", "CRUD" ], - "peerDependencies": { - "@angular/common": ">=19.0.0 <20.0.0", - "@angular/core": ">=19.0.0 <20.0.0", - "axios": "^1.6.0", - "reflect-metadata": "^0.1.13", - "tslib": "^2.3.0" + "dependencies": { + "tslib": ">2.3.0" + }, + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./mjs/src/index.d.ts", + "node": "./cjs/src/index.js", + "require": "./cjs/src/index.js", + "module": "./mjs/src/index.js", + "default": "./mjs/src/index.js" + }, + "./ngModule": { + "types": "./mjs/src/ngModule.d.ts", + "node": "./cjs/src/ngModule.js", + "require": "./cjs/src/ngModule.js", + "module": "./mjs/src/ngModule.js", + "default": "./mjs/src/ngModule.js" + } + }, + "main": "./cjs/src/index.js", + "module": "./mjs/src/index.js", + "types": "./mjs/src/index.d.ts", + "typesVersions": { + "*": { + "ngModule": [ + "./mjs/src/ngModule.d.ts" + ] + } } } diff --git a/libs/json-api/json-api-nestjs-sdk/project.json b/libs/json-api/json-api-nestjs-sdk/project.json index bba56381..6a35ce81 100644 --- a/libs/json-api/json-api-nestjs-sdk/project.json +++ b/libs/json-api/json-api-nestjs-sdk/project.json @@ -3,50 +3,29 @@ "$schema": "../../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/json-api/json-api-nestjs-sdk/src", "projectType": "library", - "targets": { - "compile-for-angular": { - "executor": "@nx/angular:package", - "outputs": ["{workspaceRoot}/dist/{projectRoot}"], - "options": { - "project": "libs/json-api/json-api-nestjs-sdk/ng-package.json" - }, - "configurations": { - "production": { - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json" - }, - "development": { - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json" - } - }, - "defaultConfiguration": "production" - }, - "build": { - "executor": "nx:run-commands", - "dependsOn": [ - "build-cjs" - ], - "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk", - "commands": [ - "node tools/scripts/preparation-hybrid-npm-package.mjs json-api-nestjs-sdk", - "node tools/scripts/preparation-npm-package.mjs json-api-nestjs-sdk" - ], - "cwd": "./", - "parallel": false + "release": { + "version": { + "generatorOptions": { + "packageRoot": "dist/{projectRoot}", + "currentVersionResolver": "git-tag", + "fallbackCurrentVersionResolver": "disk" } - }, + } + }, + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-sdk", "type:publish"], + "targets": { "build-cjs": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], - "dependsOn": [ - "build-mjs" - ], "options": { "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/cjs", "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json", - "assets": ["libs/json-api/json-api-nestjs-sdk/*.md"], - "external": "none", + "assets": [{ + "glob": "*.md", + "input": "libs/json-api/json-api-nestjs-sdk", + "output": "../" + }], "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", "additionalEntryPoints": [ @@ -62,8 +41,11 @@ "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/mjs", "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json", - "assets": ["libs/json-api/json-api-nestjs-sdk/*.md"], - "external": "none", + "assets": [{ + "glob": "*.md", + "input": "libs/json-api/json-api-nestjs-sdk", + "output": "../" + }], "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", "additionalEntryPoints": [ @@ -72,42 +54,40 @@ "generateExportsField": true } }, - "publish": { - "command": "node tools/scripts/publish.mjs json-api-nestjs-sdk {args.ver} {args.tag}", - "dependsOn": ["build"] - }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], - "options": { - "jestConfig": "libs/json-api/json-api-nestjs-sdk/jest.config.ts", - "codeCoverage": true, - "coverageReporters": ["json-summary"] - } - }, - "upload-badge": { + "build": { "executor": "nx:run-commands", "dependsOn": [ - { - "target": "test" - } + "build-cjs", "build-mjs" ], "options": { - "outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs-sdk", - "commands": ["node tools/scripts/upload-badge.mjs json-api-nestjs-sdk"], + "outputPath": "dist/libs/json-api/json-api-nestjs-sdk", + "commands": [ + { + "command": "mv dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", + "forwardAllArgs": false + }, + { + "command": "rm -rf dist/{projectRoot}/mjs/package.json", + "forwardAllArgs": false + }, + { + "command": "mkdir -p node_modules/@klerick && rm -rf node_modules/@klerick/json-api-nestjs-sdk", + "forwardAllArgs": false + }, + { + "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-sdk", + "forwardAllArgs": false + } + ], "cwd": "./", "parallel": false } }, "nx-release-publish": { "options": { - "packageRoot": "dist/libs/json-api/json-api-nestjs-sdk" + "packageRoot": "dist/{projectRoot}" } } }, - "tags": [] + "implicitDependencies": ["json-api-nestjs-shared"] } diff --git a/libs/json-api/json-api-nestjs-sdk/src/index.ts b/libs/json-api/json-api-nestjs-sdk/src/index.ts index 93246c39..7713ed70 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/index.ts @@ -1,11 +1,10 @@ -export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; -export * from './lib/json-api-js'; -export { adapterForAxios } from './lib/utils'; export { FilterOperand, ResourceObject, - AtomicOperations, - Operands, QueryField, - QueryParams, -} from './lib/types'; +} from '@klerick/json-api-nestjs-shared'; + +export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; +export * from './lib/json-api-js'; +export { adapterForAxios } from './lib/utils'; +export { AtomicOperations, Operands, QueryParams } from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts index 035321f4..a208dffe 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/constants/index.ts @@ -1,3 +1 @@ export const ID_KEY = 'id'; -export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; -export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts index 7a517892..bc995b71 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.spec.ts @@ -1,10 +1,8 @@ import { lastValueFrom, of } from 'rxjs'; +import { KEY_MAIN_OUTPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { AtomicOperationsService } from './atomic-operations.service'; -import { JsonApiUtilsService } from './'; +import { JsonApiUtilsService } from './index'; import { HttpInnerClient, JsonApiSdkConfig } from '../types'; -import { KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; - -// jest.mock('../utils'); class Users { public id!: number; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts index cd97146f..43250aff 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/atomic-operations.service.ts @@ -1,18 +1,22 @@ -import { AtomicVoidOperation, GenerateAtomicBody } from '../utils'; -import { JsonApiUtilsService } from './json-api-utils.service'; +import { Observable } from 'rxjs'; +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, + RelationKeys, +} from '@klerick/json-api-nestjs-shared'; import { map } from 'rxjs/operators'; +import { GenerateAtomicBody } from '../utils'; +import { JsonApiUtilsService } from './json-api-utils.service'; + import { AtomicBody, AtomicOperations, - Entity as EntityObject, - EntityRelation, HttpInnerClient, JsonApiSdkConfig, ReturnIfArray, + AtomicVoidOperation, } from '../types'; -import { Observable } from 'rxjs'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; type GetTypeBody = { [K in keyof T[number]]: GenerateAtomicBody; @@ -80,18 +84,16 @@ export class AtomicOperationsService ); } - deleteOne( - entity: Entity - ): AtomicOperations<[...T]>; - deleteOne( + deleteOne(entity: Entity): AtomicOperations<[...T]>; + deleteOne( entity: Entity, skipEmpty: true ): AtomicOperations<[...T]>; - deleteOne( + deleteOne( entity: Entity, skipEmpty: false ): AtomicOperations<[...T, 'EMPTY']>; - deleteOne( + deleteOne( entity: Entity, skipEmpty?: boolean ): AtomicOperations<[...T, 'EMPTY'] | [...T]> { @@ -102,28 +104,28 @@ export class AtomicOperationsService ); } - public patchOne( + public patchOne( entity: Entity ): AtomicOperations<[...T, Entity]> { return this.setToBody('patchOne', entity); } - public postOne( + public postOne( entity: Entity ): AtomicOperations<[...T, Entity]> { return this.setToBody('postOne', entity); } public deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >(entity: Entity, relationType: Rel): AtomicOperations { return this.setToBody('deleteRelationships', entity, relationType); } public patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >( entity: Entity, relationType: Rel @@ -132,8 +134,8 @@ export class AtomicOperationsService } public postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + Rel extends RelationKeys >( entity: Entity, relationType: Rel @@ -141,39 +143,30 @@ export class AtomicOperationsService return this.setToBody('postRelationships', entity, relationType); } - private setToBody( + private setToBody( operationType: Extract, entity: Entity ): AtomicOperations; - private setToBody( + private setToBody( operationType: Extract, entity: Entity, skipEmpty: boolean ): AtomicOperations<[...T, 'EMPTY']>; - private setToBody( + private setToBody( operationType: Exclude, entity: Entity ): AtomicOperations<[...T, Entity]>; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: Extract, entity: Entity, relationType: Rel ): AtomicOperations; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: Exclude, entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - private setToBody< - Entity extends EntityObject, - Rel extends EntityRelation - >( + private setToBody>( operationType: keyof AtomicVoidOperation, entity: Entity, relationType?: Rel | boolean diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts index 65b83e9e..3ec374f4 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/fetch-inner-client.ts @@ -1,16 +1,18 @@ import { Observable } from 'rxjs'; import { fromFetch } from 'rxjs/fetch'; - +import { + ResourceObject, + RelationKeys, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { ParamObject, HttpParams } from '../utils'; + import { HttpInnerClient, - RelationBodyData, - PostData, PatchData, - ResourceObject, + PostData, + RelationBodyData, AtomicBody, - EntityRelation, - ResourceObjectRelationships, AtomicResponse, } from '../types'; @@ -31,56 +33,111 @@ export class FetchInnerClient implements HttpInnerClient { return this.request(url, requestInit); } - get( + get< + T extends object, + R extends 'object' | 'array' = 'object', + IdKey extends string = string + >( + url: string, + params?: { params: ParamObject } + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( + url: string, + params?: { params: ParamObject } + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys, + R extends 'object' | 'array' = 'object' + >( url: string, params?: { params: ParamObject } - ): Observable> { + ): Observable< + | ResourceObjectRelationships + | ResourceObject + > { let filterParams = {}; if (params) { ({ params: filterParams } = params); } - return this.request>( - this.getResultUrl(url, filterParams), - { - method: 'get', - } - ); + return this.request< + | ResourceObject + | ResourceObjectRelationships + >(this.getResultUrl(url, filterParams), { + method: 'get', + }); } - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - patch>( + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: PatchData | RelationBodyData | RelationBodyData[] - ): Observable | ResourceObjectRelationships> { + ): Observable< + ResourceObject | ResourceObjectRelationships + > { return this.request< - ResourceObject | ResourceObjectRelationships + ResourceObject | ResourceObjectRelationships >(url, { method: 'patch', body: JSON.stringify(body), }); } - post(url: string, body: PostData): Observable>; - post( + post( + url: string, + body: PostData + ): Observable>; + post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - post>( + ): Observable>; + post< + T extends object | object[], + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] | PostData | AtomicBody ): Observable< - ResourceObject | ResourceObjectRelationships | AtomicResponse + | ResourceObject + | ResourceObjectRelationships + | AtomicResponse > { return this.request< - ResourceObject | ResourceObjectRelationships + + | ResourceObject + | ResourceObjectRelationships + | T extends object[] + ? AtomicResponse + : never >(url, { method: 'post', body: JSON.stringify(body), diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts index da793b19..62bb8ffb 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/index.ts @@ -1,3 +1,3 @@ export * from './json-api-utils.service'; -export * from './json-api-sdk.service'; export * from './atomic-operations.service'; +export * from './json-api-sdk.service'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts index 66f1089e..23644f33 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.spec.ts @@ -1,7 +1,7 @@ import { BehaviorSubject, of, take } from 'rxjs'; import { JsonApiSdkService } from './json-api-sdk.service'; import { HttpInnerClient, JsonApiSdkConfig } from '../types'; -import { JsonApiUtilsService } from './'; +import { JsonApiUtilsService } from './index'; import { EntityArray } from '../utils'; import { FetchInnerClient } from './fetch-inner-client'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts index a1f4aca6..063e38c2 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-sdk.service.ts @@ -1,20 +1,23 @@ +import { + RelationKeys, + ResourceObject, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; + import { EMPTY, expand, Observable, reduce, throwError } from 'rxjs'; import { map } from 'rxjs/operators'; import { - Entity as EntityObject, - EntityRelation, - EntityType, HttpInnerClient, JsonApiSdkConfig, + PatchData, QueryParams, QueryParamsForOneItem, RelationBodyData, - ResourceObject, ReturnIfArray, } from '../types'; import { EntityArray, getTypeForReq } from '../utils'; -import { JsonApiUtilsService } from '../service'; +import { JsonApiUtilsService } from './json-api-utils.service'; export class JsonApiSdkService { constructor( @@ -23,47 +26,49 @@ export class JsonApiSdkService { private jsonApiSdkConfig: JsonApiSdkConfig ) {} - public getList( - entity: EntityType, + public getList( + entity: EntityClass, params?: QueryParams ): Observable> { const query = this.jsonApiUtilsService.getQueryStringParams(params); return this.http - .get( + .get( this.jsonApiUtilsService.getUrlForResource(entity.name), { params: query.toObject(), } ) .pipe( - map, EntityArray>((result) => { - const resource = params - ? this.jsonApiUtilsService.convertResponseData( - result, - params.include - ) - : this.jsonApiUtilsService.convertResponseData(result); - const { totalItems, pageSize, pageNumber } = Object.assign( - { - totalItems: 0, - pageNumber: 0, - pageSize: 0, - }, - result.meta - ); - - return new EntityArray(resource, { - totalItems, - pageNumber, - pageSize, - }); - }) + map, EntityArray>( + (result) => { + const resource = params + ? this.jsonApiUtilsService.convertResponseData( + result, + params.include + ) + : this.jsonApiUtilsService.convertResponseData(result); + const { totalItems, pageSize, pageNumber } = Object.assign( + { + totalItems: 0, + pageNumber: 0, + pageSize: 0, + }, + result.meta + ); + + return new EntityArray(resource, { + totalItems, + pageNumber, + pageSize, + }); + } + ) ); } - getAll( - entity: EntityType, + getAll( + entity: EntityClass, params?: QueryParams, push = true ): Observable> { @@ -108,8 +113,8 @@ export class JsonApiSdkService { return request; } - getOne( - entity: EntityType, + getOne( + entity: EntityClass, id: string | number, params?: QueryParamsForOneItem ): Observable { @@ -118,6 +123,7 @@ export class JsonApiSdkService { } const query = this.jsonApiUtilsService.getQueryStringParams(params); + return this.http .get( `${this.jsonApiUtilsService.getUrlForResource(entity.name)}/${id}`, @@ -132,9 +138,7 @@ export class JsonApiSdkService { ); } - public postOne( - entity: Entity - ): Observable { + public postOne(entity: Entity): Observable { const { attributes, relationships } = this.jsonApiUtilsService.generateBody(entity); const body = { @@ -153,10 +157,9 @@ export class JsonApiSdkService { .pipe(map((r) => this.jsonApiUtilsService.convertResponseData(r))); } - public patchOne( - entity: Entity - ): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + public patchOne(entity: Entity): Observable { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -167,29 +170,35 @@ export class JsonApiSdkService { const { attributes, relationships } = this.jsonApiUtilsService.generateBody(entity); + const body = { data: { - id: entity[this.jsonApiSdkConfig.idKey].toString(), + id: String(id), type: getTypeForReq(entity.constructor.name), - ...(Object.keys(attributes).length > 0 ? { attributes } : {}), - ...(Object.keys(relationships).length > 0 ? { relationships } : {}), }, - }; + } satisfies PatchData; + + if (Object.keys(relationships).length > 0) { + Reflect.set(body.data, 'relationships', relationships); + } + + if (attributes && Object.keys(attributes).length > 0) { + Reflect.set(body.data, 'attributes', attributes); + } return this.http .patch( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}`, + )}/${id}`, body ) .pipe(map((r) => this.jsonApiUtilsService.convertResponseData(r))); } - public deleteOne( - entity: Entity - ): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + public deleteOne(entity: Entity): Observable { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -199,20 +208,22 @@ export class JsonApiSdkService { } return this.http.delete( - `${this.jsonApiUtilsService.getUrlForResource(entity.constructor.name)}/${ - entity[this.jsonApiSdkConfig.idKey] - }` + `${this.jsonApiUtilsService.getUrlForResource( + entity.constructor.name + )}/${id}` ); } public getRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -222,12 +233,10 @@ export class JsonApiSdkService { } return this.http - .get( + .get( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}` + )}/${id}/relationships/${String(relationType)}` ) .pipe( map((result) => this.jsonApiUtilsService.getResultForRelation(result)) @@ -235,13 +244,15 @@ export class JsonApiSdkService { } public patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -260,18 +271,16 @@ export class JsonApiSdkService { } const body: RelationBodyData = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http - .patch( + .patch( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe( @@ -280,13 +289,15 @@ export class JsonApiSdkService { } public postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( entity: Entity, relationType: Rel ): Observable> { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -305,18 +316,16 @@ export class JsonApiSdkService { } const body = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http - .post( + .post( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe( @@ -325,10 +334,12 @@ export class JsonApiSdkService { } public deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >(entity: Entity, relationType: Rel): Observable { - if (!entity[this.jsonApiSdkConfig.idKey]) { + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); + if (!id) { return throwError( () => new Error( @@ -347,18 +358,16 @@ export class JsonApiSdkService { } const body = { - data: this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]), + data: this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as object + ), }; return this.http .delete( `${this.jsonApiUtilsService.getUrlForResource( entity.constructor.name - )}/${entity[this.jsonApiSdkConfig.idKey]}/relationships/${String( - relationType - )}`, + )}/${id}/relationships/${String(relationType)}`, body ) .pipe(map(() => void 0)); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts index dd04a10e..b9d588f1 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.spec.ts @@ -92,7 +92,7 @@ describe('JsonApiUtilsService', () => { const includeArray: string[] = ['param1', 'param2']; const httpParams = new HttpParams(); const queryParams: QueryParams = { - include: includeArray, + include: includeArray as any, }; const httpParamsWithIncludes = service['getIncludeParam']( @@ -308,6 +308,13 @@ describe('JsonApiUtilsService', () => { expect(typeof entityInstance).toBe('object'); expect(entityInstance.constructor.name).toBe('Test'); + + const entityInstance1 = service['createEntityInstance']( + 'test-test' + ) as any; + + expect(typeof entityInstance1).toBe('object'); + expect(entityInstance1.constructor.name).toBe('TestTest'); }); }); @@ -412,7 +419,7 @@ describe('JsonApiUtilsService', () => { } as any; const response = service['convertResponseData'](data, [ 'relationship1', - ]) as any; + ] as any) as any; expect(response[0].constructor.name).toBe('Type1'); expect(response[0][mockJsonApiSdkConfig.idKey]).toBe(1); expect(response[0]).toHaveProperty('attr1'); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts index 6f029dce..13a4cc82 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/service/json-api-utils.service.ts @@ -1,35 +1,33 @@ -import { createEntityInstance } from '../../shared'; - import { - Attributes, - Entity as EntityObject, - Entity, - EntityRelation, + createEntityInstance, + isObject, + ObjectTyped, + BaseAttribute, + RelationKeys, + MainData, + ResourceObject, + ResourceObjectRelationships, Include, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; +import { JsonApiSdkConfig, - MainData, QueryParams, - RelationData, Relationships, - ResourceObject, - ResourceObjectRelationships, ReturnIfArray, } from '../types'; -import { - camelToKebab, - getTypeForReq, - HttpParams, - isObject, - isRelation, - ObjectTyped, -} from '../utils'; + +import { getTypeForReq, HttpParams, isRelation } from '../utils'; import { ID_KEY } from '../constants'; +type Attributes = BaseAttribute['attributes']; +type RelationData = MainData; + export class JsonApiUtilsService { constructor(private jsonApiSdkConfig: JsonApiSdkConfig) {} public getUrlForResource(resource: string): string { - const url: string[] = [camelToKebab(resource).toLocaleLowerCase()]; + const url: string[] = [kebabCase(resource).toLocaleLowerCase()]; if (this.jsonApiSdkConfig.apiPrefix) { url.unshift(this.jsonApiSdkConfig.apiPrefix); } @@ -180,23 +178,23 @@ export class JsonApiUtilsService { return httpParams; } - convertResponseData( + convertResponseData( body: ResourceObject, includeEntity?: QueryParams['include'] ): E; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E[]; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E; - convertResponseData( - body: ResourceObject, + convertResponseData( + body: ResourceObject, includeEntity?: QueryParams['include'] ): E[]; - convertResponseData( + convertResponseData( body: ResourceObject | ResourceObject, includeEntity?: QueryParams['include'] ): E[] | E { @@ -213,7 +211,7 @@ export class JsonApiUtilsService { ...Object.entries(dataItem.attributes || []).reduce( (acum, [key, val]) => { acum[key] = this.jsonApiSdkConfig.dateFields.includes(key) - ? new Date(val) + ? new Date(String(val)) : val; return acum; @@ -235,9 +233,10 @@ export class JsonApiUtilsService { continue; } const relationship = dataItem.relationships[itemInclude]; - if (!(relationship && relationship.data)) { + if (!relationship || !('data' in relationship) || !relationship.data) { continue; } + const relationshipData = relationship.data; if (Array.isArray(relationshipData)) { @@ -245,7 +244,7 @@ export class JsonApiUtilsService { const result = this.findIncludeEntity(item, included); if (result) acum.push(result); return acum; - }, [] as E[EntityRelation][]) as E[EntityRelation]; + }, [] as E[RelationKeys][]) as E[RelationKeys]; } else { const relation = this.findIncludeEntity(relationshipData, included); if (relation) itemEntity[itemInclude] = relation; @@ -264,10 +263,10 @@ export class JsonApiUtilsService { return createEntityInstance(name); } - private findIncludeEntity>>( + private findIncludeEntity( item: R, included: Include[] - ): E[EntityRelation] | undefined { + ): E[RelationKeys] | undefined { const relatedIncluded = included.find( (includedItem) => includedItem.type === item.type && includedItem.id === item.id @@ -282,7 +281,7 @@ export class JsonApiUtilsService { ...Object.entries(relatedIncluded.attributes || []).reduce( (acum, [key, val]) => { acum[key] = this.jsonApiSdkConfig.dateFields.includes(key) - ? new Date(val) + ? new Date(String(val)) : val; return acum; @@ -290,15 +289,16 @@ export class JsonApiUtilsService { {} as Record ), }; + return Object.assign( - this.createEntityInstance( + this.createEntityInstance]>( item.type.toString() ) as object, entityObject - ) as E[typeof item.type]; + ) as E[RelationKeys]; } - generateBody(entity: E) { + generateBody(entity: E) { const attributes = Object.entries(entity) .filter(([key, val]) => { if (key === ID_KEY) return false; @@ -347,10 +347,11 @@ export class JsonApiUtilsService { } getResultForRelation< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string, + Rel extends RelationKeys >( - body: ResourceObjectRelationships + body: ResourceObjectRelationships ): ReturnIfArray { if (Array.isArray(body.data)) { return body.data.map( @@ -361,13 +362,13 @@ export class JsonApiUtilsService { } } - public generateRelationshipsBody( + public generateRelationshipsBody( relationshipEntity: RelationshipEntity | RelationshipEntity[] ): RelationData | RelationData[] { const generateRelationObj = ( relation: RelationshipEntity ): RelationData => ({ - id: String(relation[this.jsonApiSdkConfig.idKey]), + id: String(Reflect.get(relation, this.jsonApiSdkConfig.idKey)), type: getTypeForReq(relation.constructor.name), }); diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts index c6911405..0eee1588 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/token/index.ts @@ -1,7 +1,6 @@ import { InjectionToken } from '@angular/core'; -import { JsonApiSdkConfig } from '../types'; -import { AtomicFactory as TypeAtomicFactory } from '../types/atomic'; +import { JsonApiSdkConfig, AtomicFactory as TypeAtomicFactory } from '../types'; export const JSON_API_SDK_CONFIG = new InjectionToken( 'Main config object for sdk' diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts similarity index 63% rename from libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts rename to libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts index c438c99f..6457e4b2 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-operation.ts @@ -1,7 +1,8 @@ -import { Entity as EntityObject, EntityRelation } from './entity'; -import { ReturnIfArray } from './utils'; +import { RelationKeys } from '@klerick/json-api-nestjs-shared'; import { Observable } from 'rxjs'; +import { ReturnIfArray } from './utils'; + export interface AtomicRunGeneral { run(): Observable; } @@ -11,76 +12,56 @@ export interface AtomicRunPromise { } export interface AtomicMainOperations { - postOne( + postOne( entity: Entity ): AtomicOperations<[...T, Entity]>; - patchOne( + patchOne( entity: Entity ): AtomicOperations<[...T, Entity]>; - deleteOne( - entity: Entity - ): AtomicOperations<[...T]>; - deleteOne( + deleteOne(entity: Entity): AtomicOperations<[...T]>; + deleteOne( entity: Entity, skipEmpty: true ): AtomicOperations<[...T]>; - deleteOne( + deleteOne( entity: Entity, skipEmpty: false ): AtomicOperations<[...T, 'EMPTY']>; - patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + patchRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + postRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T, ReturnIfArray]>; - deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + deleteRelationships>( entity: Entity, relationType: Rel ): AtomicOperations<[...T]>; } export interface AtomicMainOperationsPromise { - postOne( + postOne( entity: Entity ): AtomicOperationsPromise<[...T, Entity]>; - patchOne( + patchOne( entity: Entity ): AtomicOperationsPromise<[...T, Entity]>; - deleteOne( + deleteOne( entity: Entity ): AtomicOperationsPromise<[...T]>; - patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + patchRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T, ReturnIfArray]>; - postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + postRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T, ReturnIfArray]>; - deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation - >( + deleteRelationships>( entity: Entity, relationType: Rel ): AtomicOperationsPromise<[...T]>; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts new file mode 100644 index 00000000..8db6b354 --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/atomic-type.ts @@ -0,0 +1,31 @@ +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, + Operation, + ResourceObject, +} from '@klerick/json-api-nestjs-shared'; +import { AtomicMainOperations } from './atomic-operation'; + +export type BodyType = { + op: Operation; + ref: { + type: string; + id?: string; + relationship?: string; + tmpId?: string; + }; + data?: any; +}; + +export type AtomicBody = { + [KEY_MAIN_INPUT_SCHEMA]: BodyType[]; +}; +export type AtomicResponse = { + [KEY_MAIN_OUTPUT_SCHEMA]: { + [K in keyof R]: R[K] extends object ? ResourceObject : never; + }; +}; + +export type AtomicVoidOperation = { + [K in keyof AtomicMainOperations<[]>]: (...arg: any) => void; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts new file mode 100644 index 00000000..5281f1ed --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/config.ts @@ -0,0 +1,20 @@ +import { PartialByKeys } from './utils'; +import { HttpInnerClient } from './http-inner-client'; + +export type JsonApiSdkConfig = { + apiHost: string; + apiPrefix?: string; + idKey: string; + idIsNumber?: boolean; + operationUrl?: string; + dateFields: string[]; +}; + +export type JsonSdkConfig = PartialByKeys< + JsonApiSdkConfig, + 'idKey' | 'apiPrefix' | 'idIsNumber' | 'dateFields' | 'operationUrl' +>; + +export type JsonConfig = JsonSdkConfig & { + adapter?: HttpInnerClient; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts deleted file mode 100644 index 682c399a..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/entity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EntityField, EntityProps } from '../../shared'; - -export { EntityField, EntityProps }; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; - -export type EntityType = { - new (): T; -}; - -export type Entity = { - [key: string]: any; -}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts index c1f1a670..ce2afdff 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/filter-operand.ts @@ -1,6 +1,4 @@ -import { FilterOperand } from '../../shared'; - -export { FilterOperand }; +import { FilterOperand } from '@klerick/json-api-nestjs-shared'; export type FilterOperandForString = Exclude< FilterOperand, diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts index 684b60a5..9ad912ad 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts @@ -1,41 +1,61 @@ import { Observable } from 'rxjs'; +import { + RelationKeys, + ResourceObject, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { ParamObject } from '../utils'; -import { ResourceObject, ResourceObjectRelationships } from './response-body'; -import { EntityRelation } from './entity'; -import { - AtomicBody, - AtomicResponse, - PatchData, - PostData, - RelationBodyData, -} from './index'; +import { PostData, PatchData, RelationBodyData } from './http-request-params'; +import { AtomicBody, AtomicResponse } from './atomic-type'; export interface HttpInnerClient { - get( + get< + T extends object, + R extends 'object' | 'array' = 'object', + IdKey extends string = string + >( url: string, params?: { params: ParamObject } - ): Observable>; - get>( + ): Observable>; + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, params?: { params: ParamObject } - ): Observable>; + ): Observable>; - post(url: string, body: PostData): Observable>; + post( + url: string, + body: PostData + ): Observable>; post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; + ): Observable>; - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; + ): Observable>; delete( url: string, diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts new file mode 100644 index 00000000..78f4e766 --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-request-params.ts @@ -0,0 +1,34 @@ +import { + MainData, + BaseAttribute, + RelationKeys, + BaseMainData, +} from '@klerick/json-api-nestjs-shared'; + +export type Relationships< + Entity extends object, + IdKey extends string = 'id' +> = { + [P in RelationKeys]?: BaseMainData; +}; + +export type BaseRelationships< + Entity extends object, + IdKey extends string = 'id' +> = { relationships?: Relationships }; + +type PostMainData = Omit, 'id'> & { + id?: string; +}; + +export type PostData = { + data: PostMainData & BaseAttribute & BaseRelationships; +}; + +export type PatchData = { + data: MainData & BaseAttribute & BaseRelationships; +}; + +export type RelationBodyData = { + data: MainData | MainData[]; +}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts index 5269fa70..d0ebf4e6 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/index.ts @@ -1,69 +1,9 @@ -export * from './entity'; -export * from './query-params'; -export * from './response-body'; +export * from './http-inner-client'; +export * from './http-request-params'; +export * from './atomic-type'; +export * from './atomic-operation'; export * from './utils'; +export * from './config'; +export * from './query-params'; export * from './promise-json-api-sdk'; -export * from './atomic'; export * from './filter-operand'; -export * from './http-inner-client'; - -import { BodyType } from '../utils'; -import { - Attributes, - Relationships, - ResourceObject, - ResourceObjectRelationships, -} from './response-body'; -import { PartialByKeys } from './utils'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; - -import { HttpInnerClient } from './http-inner-client'; - -export type JsonApiSdkConfig = { - apiHost: string; - apiPrefix?: string; - idKey: string; - idIsNumber?: boolean; - operationUrl?: string; - dateFields: string[]; -}; - -export type JsonSdkConfig = PartialByKeys< - JsonApiSdkConfig, - 'idKey' | 'apiPrefix' | 'idIsNumber' | 'dateFields' | 'operationUrl' ->; - -export type JsonConfig = JsonSdkConfig & { - adapter?: HttpInnerClient; -}; - -type MainData = { - type: string; - attributes: Attributes; - relationships?: Relationships; -}; -export type PostData = { - data: MainData; -}; -export type PatchData = { - data: { id: string } & Omit, 'attributes'> & - Partial, 'attributes'>>; -}; -export type RelationData = { id: string; type: string }; -export type RelationBodyData = { - data: RelationData | RelationData[]; -}; - -export type AtomicBody = { - [KEY_MAIN_INPUT_SCHEMA]: BodyType[]; -}; - -type ResponseData = { - [K in keyof T]: T[K] extends string | string[] - ? ResourceObjectRelationships - : ResourceObject; -}; - -export type AtomicResponse = { - [KEY_MAIN_OUTPUT_SCHEMA]: ResponseData; -}; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts index 088eed08..7b4bc141 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/promise-json-api-sdk.ts @@ -1,57 +1,62 @@ -import { Entity as EntityObject, EntityRelation, EntityType } from './entity'; +import { EntityClass, RelationKeys } from '@klerick/json-api-nestjs-shared'; + import { QueryParams, QueryParamsForOneItem } from './query-params'; import { EntityArray } from '../utils'; import { ReturnIfArray } from './utils'; export interface PromiseJsonApiSdkService { - getList( - entity: EntityType, + getList( + entity: EntityClass, params?: QueryParams ): Promise>; - getAll( - entity: EntityType, + getAll( + entity: EntityClass, params?: QueryParams ): Promise>; - getOne( - entity: EntityType, + getOne( + entity: EntityClass, id: string | number, params?: QueryParamsForOneItem ): Promise; - postOne(entity: Entity): Promise; - patchOne(entity: Entity): Promise; + postOne(entity: Entity): Promise; + patchOne(entity: Entity): Promise; - deleteOne(entity: Entity): Promise; + deleteOne(entity: Entity): Promise; getRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; patchRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; postRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel ): Promise>; deleteRelationships< - Entity extends EntityObject, - Rel extends EntityRelation + Entity extends object, + IdKey extends string = 'id', + Rel extends RelationKeys = RelationKeys >( entity: Entity, relationType: Rel diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts index 8a555ac8..66a4aa8c 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/query-params.ts @@ -1,24 +1,25 @@ -import { QueryField } from '../../shared'; -import { EntityProps, EntityRelation } from './entity'; -import { TypeOfArray } from './utils'; -import { Operands, OperandsRelation } from './filter-operand'; +import { + QueryField, + RelationKeys, + PropertyKeys, + TypeOfArray, +} from '@klerick/json-api-nestjs-shared'; +import { Operands, OperandsRelation } from './filter-operand'; export type SortType = 'ASC' | 'DESC'; -export { QueryField }; - -export type Includes = EntityRelation[]; +export type Includes = RelationKeys[]; type TargetField = { - target?: EntityProps[]; + target?: PropertyKeys[]; }; type RelationField = { - [K in EntityRelation]?: EntityProps>[]; + [K in RelationKeys]?: PropertyKeys>[]; }; type SortForEntity = { - [K in EntityProps]?: SortType; + [K in PropertyKeys]?: SortType; }; type TargetSort = { @@ -26,7 +27,7 @@ type TargetSort = { }; type RelationSort = { - [K in EntityRelation]?: SortForEntity>; + [K in RelationKeys]?: SortForEntity>; }; type Sort = TargetSort & RelationSort; @@ -39,11 +40,11 @@ export type Pagination = { }; type TargetRelationFilter = { - [P in EntityRelation]?: OperandsRelation; + [P in RelationKeys]?: OperandsRelation; }; type EntityFilter = { - [K in EntityProps]?: Operands; + [K in PropertyKeys]?: Operands; }; type TargetFilter = { @@ -51,7 +52,7 @@ type TargetFilter = { }; type RelationFilter = { - [K in EntityRelation]?: EntityFilter>; + [K in RelationKeys]?: EntityFilter>; }; export type Filter = TargetFilter & RelationFilter; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts deleted file mode 100644 index 24813506..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/response-body.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { - PageProps, - DebugMetaProps, - MainData, - Links, - Attributes, - Data, - Relationships, - Include, - ResourceData, - ResourceObject, - ResourceObjectRelationships, -} from '../../shared'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts index 233d219b..2671b748 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/types/utils.ts @@ -1,19 +1,8 @@ -import { TypeOfArray } from '../../shared'; -export { TypeOfArray }; - -type IntersectionToObj = { - [K in keyof T]: T[K]; -}; -export type PartialByKeys = IntersectionToObj< - { - [P in keyof T as P extends K ? P : never]?: T[P]; - } & { - [P in Exclude]: T[P]; - } ->; - export type ReturnIfArray = I extends unknown[] ? O[] : O; +export type PartialByKeys = Omit & + Partial>; + export type FunctionProperty = T[K] extends ( ...args: any ) => any @@ -23,9 +12,3 @@ export type FunctionProperty = T[K] extends ( export type FunctionPropertyNames = { [K in keyof T]: T[K] extends (...args: any) => any ? K : never; }[keyof T]; - -export type Parameters unknown> = T extends ( - ...args: infer P -) => unknown - ? P - : never; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts index fc5c32b4..27340bab 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/adapter-for-axios.ts @@ -1,3 +1,8 @@ +import { + RelationKeys, + ResourceObject, + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import { Axios, AxiosResponse, Method } from 'axios'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -5,13 +10,10 @@ import { map } from 'rxjs/operators'; import { AtomicBody, AtomicResponse, - EntityRelation, HttpInnerClient, PatchData, PostData, RelationBodyData, - ResourceObject, - ResourceObjectRelationships, } from '../types'; import { ParamObject } from './http-params'; @@ -55,18 +57,25 @@ class AxiosHttpClient implements HttpInnerClient { return this.request(url, 'DELETE'); } - get( + get( url: string, params?: { params: ParamObject } ): Observable>; - get>( + get< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, params?: { params: ParamObject } - ): Observable>; + ): Observable>; get< - T, + T extends object, R, - A = R extends EntityRelation ? ResourceObjectRelationships : never, + IdKey extends string = string, + A = R extends RelationKeys + ? ResourceObjectRelationships + : never, B = R extends 'object' | 'array' ? ResourceObject : never >(url: string, params?: { params: ParamObject }): Observable { return this.request( @@ -77,37 +86,59 @@ class AxiosHttpClient implements HttpInnerClient { ); } - patch(url: string, body: PatchData): Observable>; - patch>( + patch( + url: string, + body: PatchData + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - patch>( + ): Observable>; + patch< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: PatchData | RelationBodyData | RelationBodyData[] - ): Observable | ResourceObjectRelationships> { + ): Observable< + ResourceObject | ResourceObjectRelationships + > { return this.request(url, 'PATCH', body); } - post(url: string, body: PostData): Observable>; + post( + url: string, + body: PostData + ): Observable>; post( url: string, body: AtomicBody ): Observable>; - post>( + post< + T extends object, + IdKey extends string, + Rel extends RelationKeys + >( url: string, body: RelationBodyData | RelationBodyData[] - ): Observable>; - post>( + ): Observable>; + post>( url: string, body: RelationBodyData | RelationBodyData[] | PostData | AtomicBody ): Observable< - ResourceObject | ResourceObjectRelationships | AtomicResponse + | ResourceObject + | ResourceObjectRelationships + | AtomicResponse > { return this.request< RelationBodyData | RelationBodyData[] | PostData | AtomicBody, | ResourceObject - | ResourceObjectRelationships + | ResourceObjectRelationships | AtomicResponse >(url, 'POST', body); } diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts index b02e1c7f..a2bedb40 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/entity-array.ts @@ -1,4 +1,4 @@ -import { PageProps } from '../types'; +import { PageProps } from '@klerick/json-api-nestjs-shared'; export class EntityArray extends Array { constructor(items: T[], private pageProps: PageProps) { diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts index 4a278865..ad28e07e 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.spec.ts @@ -1,4 +1,5 @@ -import { GenerateAtomicBody, Operation } from './generate-atomic-body'; +import { Operation } from '@klerick/json-api-nestjs-shared'; +import { GenerateAtomicBody } from './generate-atomic-body'; import { JsonApiUtilsService } from '../service'; import { JsonApiSdkConfig } from '../types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts index f52f7b14..6ad80cef 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/generate-atomic-body.ts @@ -1,36 +1,16 @@ -import { - AtomicMainOperations, - Entity as EntityObject, - EntityRelation, - JsonApiSdkConfig, -} from '../types'; -import { getTypeForReq } from './'; -import { JsonApiUtilsService } from '../service'; - -export enum Operation { - add = 'add', - update = 'update', - remove = 'remove', -} +import { Operation, RelationKeys } from '@klerick/json-api-nestjs-shared'; -export type BodyType = { - op: Operation; - ref: { - type: string; - id?: string; - relationship?: string; - tmpId?: string; - }; - data?: any; -}; +import { AtomicMainOperations, JsonApiSdkConfig, BodyType } from '../types'; +import { getTypeForReq } from './utils'; +import { JsonApiUtilsService } from '../service'; export type AtomicVoidOperation = { [K in keyof AtomicMainOperations<[]>]: (...arg: any) => void; }; export class GenerateAtomicBody< - Entity extends EntityObject = any, - Rel extends EntityRelation = any + Entity extends object = any, + Rel extends RelationKeys = any > implements AtomicVoidOperation { constructor( @@ -49,15 +29,13 @@ export class GenerateAtomicBody< const { relationships, attributes } = this.jsonApiUtilsService.generateBody(entity); + const id = Reflect.get(entity, this.jsonApiSdkConfig.idKey); - const idObj = - op === 'add' && !relationType - ? {} - : { id: entity[this.jsonApiSdkConfig.idKey].toString() }; + const idObj = op === 'add' && !relationType ? {} : { id: String(id) }; const data = relationType - ? this.jsonApiUtilsService.generateRelationshipsBody< - Entity[EntityRelation] - >(entity[relationType]) + ? this.jsonApiUtilsService.generateRelationshipsBody( + entity[relationType] as any + ) : { type: getTypeForReq(entity.constructor.name), attributes, @@ -67,9 +45,7 @@ export class GenerateAtomicBody< const rel = relationType ? { relationship: String(relationType) } : {}; const tmpId = - op === 'add' && entity[this.jsonApiSdkConfig.idKey] && !relationType - ? { tmpId: entity[this.jsonApiSdkConfig.idKey] } - : {}; + op === 'add' && id && !relationType ? { tmpId: String(id) } : {}; this.bodyData = { op, ref: { type, ...idObj, ...rel, ...tmpId }, @@ -85,8 +61,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.add, entity); } patchOne(entity: Entity): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (Reflect.get(entity, this.jsonApiSdkConfig.idKey) === undefined) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -94,8 +70,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.update, entity); } deleteOne(entity: Entity, skipEmpty: boolean): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -103,8 +79,8 @@ export class GenerateAtomicBody< this.setToBody(Operation.remove, entity); } patchRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } @@ -115,26 +91,30 @@ export class GenerateAtomicBody< this.setToBody(Operation.update, entity, relationType); } postRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } if (entity[relationType] === undefined) { - new Error(`${relationType.toString()} should not be undefined in entity`); + throw new Error( + `${relationType.toString()} should not be undefined in entity` + ); } this.setToBody(Operation.add, entity, relationType); } deleteRelationships(entity: Entity, relationType: Rel): void { - if (!entity[this.jsonApiSdkConfig.idKey]) { - new Error( + if (!Reflect.get(entity, this.jsonApiSdkConfig.idKey)) { + throw new Error( 'Resource params should be instance of resource with id params' ); } if (entity[relationType] === undefined) { - new Error(`${relationType.toString()} should not be undefined in entity`); + throw new Error( + `${relationType.toString()} should not be undefined in entity` + ); } this.setToBody(Operation.remove, entity, relationType); } diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts index 495bd3c5..2b358fdf 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/index.ts @@ -1,44 +1,5 @@ -import { camelToKebab } from '../../shared'; - -import { JsonApiSdkConfig, JsonSdkConfig } from '../types'; -import { ID_KEY } from '../constants'; - export * from './http-params'; +export * from './generate-atomic-body'; export * from './entity-array'; +export * from './utils'; export * from './adapter-for-axios'; -export * from './generate-atomic-body'; - -export { - camelToKebab, - ObjectTyped, - capitalizeFirstChar, - kebabToCamel, - isObject, -} from '../../shared'; - -export function resultConfig(partialConfig: JsonSdkConfig): JsonApiSdkConfig { - return { - ...partialConfig, - idKey: partialConfig.idKey ? partialConfig.idKey : ID_KEY, - idIsNumber: - partialConfig.idIsNumber === undefined - ? true - : !!partialConfig.idIsNumber, - dateFields: partialConfig.dateFields ? partialConfig.dateFields : [], - }; -} - -export function getTypeForReq(str: string): string { - return camelToKebab(str).toLowerCase(); -} - -export function isRelation(val: any): boolean { - const result = !( - val === null || - !val || - ['String', 'Boolean', 'Number', 'Date'].includes(val.constructor.name) - ); - - if (!result) return result; - return ID_KEY in val; -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts new file mode 100644 index 00000000..a4cd716d --- /dev/null +++ b/libs/json-api/json-api-nestjs-sdk/src/lib/utils/utils.ts @@ -0,0 +1,31 @@ +import { kebabCase } from 'change-case-commonjs'; + +import { ID_KEY } from '../constants'; +import { JsonApiSdkConfig, JsonSdkConfig } from '../types'; + +export function isRelation(val: any): boolean { + const result = !( + val === null || + !val || + ['String', 'Boolean', 'Number', 'Date'].includes(val.constructor.name) + ); + + if (!result) return result; + return ID_KEY in val; +} + +export function getTypeForReq(str: string): string { + return kebabCase(str).toLowerCase(); +} + +export function resultConfig(partialConfig: JsonSdkConfig): JsonApiSdkConfig { + return { + ...partialConfig, + idKey: partialConfig.idKey ? partialConfig.idKey : ID_KEY, + idIsNumber: + partialConfig.idIsNumber === undefined + ? true + : !!partialConfig.idIsNumber, + dateFields: partialConfig.dateFields ? partialConfig.dateFields : [], + }; +} diff --git a/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts b/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts index 29276e19..57d8942c 100644 --- a/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts +++ b/libs/json-api/json-api-nestjs-sdk/src/ngModule.ts @@ -1,3 +1,5 @@ +export { FilterOperand, ResourceObject } from '@klerick/json-api-nestjs-shared'; + export { AtomicFactory, provideJsonApi, @@ -5,9 +7,4 @@ export { getProviders, } from './lib/json-api-angular'; export { JsonApiUtilsService, JsonApiSdkService } from './lib/service'; -export { - FilterOperand, - ResourceObject, - AtomicOperations, - JsonSdkConfig, -} from './lib/types'; +export { AtomicOperations, JsonSdkConfig } from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts deleted file mode 100644 index a0fe9b9f..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './lib/utils'; -export * from './lib/types'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts deleted file mode 100644 index 5fbdd04f..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/entity-type.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type EntityField = - | string - | number - | bigint - | boolean - | string[] - | number[] - | null - | Date; - -export type EntityProps = { - [P in keyof T]: T[P] extends EntityField ? P : never; -}[keyof T]; - -export type EntityRelation = { - [P in keyof T]: T[P] extends EntityField ? never : P; -}[keyof T]; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts deleted file mode 100644 index 33b70ba6..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './utils-string.type'; -export * from './query-type'; -export * from './entity-type'; -export * from './response-body'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts deleted file mode 100644 index ddeead7a..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/query-type.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum QueryField { - filter = 'filter', - sort = 'sort', - include = 'include', - page = 'page', - fields = 'fields', -} - -export enum FilterOperand { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', - in = 'in', - nin = 'nin', - some = 'some', -} - -export enum FilterOperandOnlyInNin { - in = 'in', - nin = 'nin', -} -export enum FilterOperandOnlySimple { - eq = 'eq', - gt = 'gt', - gte = 'gte', - like = 'like', - lt = 'lt', - lte = 'lte', - ne = 'ne', - regexp = 'regexp', -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts deleted file mode 100644 index 85dbdb49..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/response-body.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - EntityField, - EntityProps, - EntityRelation, - TypeOfArray, - ValueOf, -} from '.'; -import { Collection } from '@mikro-orm/core'; - -export type PageProps = { - totalItems: number; - pageNumber: number; - pageSize: number; -}; - -export type DebugMetaProps = Partial<{ - time: number; -}>; - -export type MainData = { - type: T; - id: string; -}; - -export type Links = { - self: string; - related?: string; -}; - -export type Attributes = { - [P in EntityProps]?: D[P] extends EntityField ? D[P] : TypeOfArray; -}; - -export type DataResult = E extends unknown[] - ? MainData[] - : E extends Collection - ? MainData[] - : MainData | null; - -export type Data = { - data?: DataResult; -}; - -export type Relationships = { - [P in EntityRelation]?: { - links: Links; - } & Data; -}; - -export type Include = ValueOf<{ - [P in EntityRelation]: ResourceData>; -}>; - -export type ResourceData = MainData & { - attributes?: Attributes; - relationships?: Relationships; - links: Omit; -}; - -export type MetaProps = R extends null ? T : T & R; - -export type ResourceObject< - T, - R extends 'object' | 'array' = 'object', - M = null -> = { - meta: R extends 'array' - ? MetaProps - : MetaProps; - data: R extends 'array' ? ResourceData[] : ResourceData; - included?: Include[]; -}; - -export type ResourceObjectRelationships> = { - meta: DebugMetaProps; -} & Required>; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts deleted file mode 100644 index b861d238..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/types/utils-string.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Collection } from '@mikro-orm/core'; - -export type KebabCase = S extends `${infer C}${infer T}` - ? KebabCase extends infer U - ? U extends string - ? T extends Uncapitalize - ? `${Uncapitalize}${U}` - : `${Uncapitalize}-${U}` - : never - : never - : S; - -export type KebabToCamelCase = - S extends `${infer T}-${infer U}-${infer V}` - ? `${T}${Capitalize}${Capitalize>}` - : S extends `${infer T}-${infer U}` - ? `${Capitalize}${Capitalize>}` - : S; - -export type TypeOfArray = T extends (infer U)[] - ? U - : T extends Collection - ? U - : T; - -export type ValueOf = T[keyof T]; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts deleted file mode 100644 index a7799257..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './string-utils'; -export * from './object-utils'; diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts deleted file mode 100644 index 5d4ad26d..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/object-utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { kebabToCamel } from './string-utils'; - -export const ObjectTyped = { - keys: Object.keys as (yourObject: T) => Array, - values: Object.values as (yourObject: U) => Array, - entries: Object.entries as ( - yourObject: O - ) => Array<[keyof O, O[keyof O]]>, - fromEntries: Object.fromEntries as ( - yourObjectEntries: [K, V][] - ) => Record, -}; - -export function isObject(item: unknown): item is object { - return typeof item === 'object' && !Array.isArray(item) && item !== null; -} - -export function createEntityInstance(name: string): E { - const entityName = kebabToCamel(name); - return Function('return new class ' + entityName + '{}')(); -} diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts deleted file mode 100644 index 4596cd21..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - camelToKebab, - snakeToCamel, - isString, - kebabToCamel, -} from './string-utils'; - -describe('Test utils', () => { - it('camelToKebab', () => { - const result = camelToKebab('ApproverGroups'); - const result1 = camelToKebab('Users'); - - expect(result).toBe('approver-groups'); - expect(result1).toBe('users'); - }); - - it('snakeToCamel', () => { - const result = snakeToCamel('test_test'); - const result1 = snakeToCamel('test-test'); - const result2 = snakeToCamel('testTest'); - const result3 = snakeToCamel('event_incident_typeFK'); - expect(result).toBe('testTest'); - expect(result1).toBe('testTest'); - expect(result2).toBe('testTest'); - expect(result3).toBe('eventIncidentTypeFK'); - }); - - it('isString', () => { - expect(isString('string')).toBe(true); - expect(isString(String('string'))).toBe(true); - expect(isString(new Date())).toBe(false); - expect(isString(class {})).toBe(false); - }); - - it('kebabToCamel', () => { - const type = 'users-group'; - const type1 = 'users'; - - expect(kebabToCamel(type)).toBe('UsersGroup'); - expect(kebabToCamel(type1)).toBe('Users'); - }); -}); diff --git a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts b/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts deleted file mode 100644 index 3b678710..00000000 --- a/libs/json-api/json-api-nestjs-sdk/src/shared/lib/utils/string-utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { KebabToCamelCase, KebabCase } from '../types'; - -export function isString(value: T): value is P { - return typeof value === 'string' || value instanceof String; -} - -export function snakeToCamel(str: string): string { - if (!str.match(/[\s_-]/g)) { - return str; - } - return str.replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace('-', '').replace('_', '') - ); -} - -export function camelToKebab(string: S): KebabCase { - return string - .replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, '-$1') - .toLowerCase() as KebabCase; -} - -export function upperFirstLetter(string: S): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize; -} - -export function kebabToCamel(str: S): KebabToCamelCase { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join('') as KebabToCamelCase; -} - -export function capitalizeFirstChar(str: string) { - return str - .split('-') - .map((i) => i.charAt(0).toUpperCase() + i.substring(1)) - .join(''); -} diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json index b7ab9544..bf1f7f0e 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json @@ -1,19 +1,20 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "types": ["node"], - "module": "es2015", - "target": "ES2022", - "removeComments": false, + "outDir": "../../../dist/out-tsc", "declaration": true, + "target": "ES2022", + "types": [ + "node" + ] }, - "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], - "angularCompilerOptions": { - "compilationMode": "partial", - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test-d.ts", + "src/**/___test___/**/*.ts" + ] } diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.json index bf7d88a8..2e70621f 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.json @@ -1,16 +1,14 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "outDir": "../../../dist/out-tsc", + "module": "commonjs", "forceConsistentCasingInFileNames": true, "strict": true, + "importHelpers": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "inlineSources": true, - "inlineSourceMap": true, - "sourceMap": false + "noPropertyAccessFromIndexSignature": true }, "files": [], "include": [], diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json index 81ec818a..4befa7f0 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json @@ -1,8 +1,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "module": "commonjs", - "declaration": false, + "outDir": "../../../dist/out-tsc", + "declaration": true, "types": ["node"] }, "include": ["src/**/*.ts"], diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json index 69a251f3..49fc8fbb 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json @@ -3,7 +3,13 @@ "compilerOptions": { "outDir": "../../../dist/out-tsc", "module": "commonjs", - "types": ["jest", "node"] + "moduleResolution": "node10", + "types": ["jest", "node"], + "paths": { + "@klerick/json-api-nestjs-shared": [ + "libs/json-api/json-api-nestjs-shared/src/index.ts" + ] + } }, "include": [ "jest.config.ts", From 61f45e6a0708b7f1397dd3ce732f3cc0b62a540f Mon Sep 17 00:00:00 2001 From: Alex H Date: Tue, 4 Mar 2025 18:19:31 +0100 Subject: [PATCH 10/22] fix(json-api-nestjs): fix type in some place --- libs/json-api/json-api-nestjs/src/index.ts | 1 - .../atomic-operation.module.ts | 2 +- .../atomic-operation/constants/index.ts | 2 -- .../controllers/operation.controller.spec.ts | 12 +++++++----- .../controllers/operation.controller.ts | 6 ++++-- .../factory/map-controller-entity.ts | 2 +- .../factory/map-entity-name-to-entity.ts | 8 +++++--- .../factory/zod-input-operation.ts | 4 ++-- .../pipes/input-operation.pipe.spec.ts | 3 ++- .../pipes/input-operation.pipe.ts | 3 ++- .../service/execute.service.spec.ts | 2 +- .../service/execute.service.ts | 2 +- .../service/explorer.service.spec.ts | 3 ++- .../service/explorer.service.ts | 4 ++-- .../modules/atomic-operation/types/index.ts | 4 ++-- .../utils/zod/zod-helper.spec.ts | 15 +++++++++------ .../atomic-operation/utils/zod/zod-helper.ts | 19 ++++++++++--------- .../decorators/json-api/json-api.decorator.ts | 2 +- .../src/lib/modules/mixin/helpers/utils.ts | 8 ++++++-- .../check-item-entity.pipe.ts | 5 ++--- .../parse-relationship-name.pipe.spec.ts | 3 ++- .../parse-relationship-name.pipe.ts | 4 +--- .../mixin/service/entity-param-map.service.ts | 4 +++- .../service/json-api-transformer.service.ts | 3 ++- .../mixin/swagger/method/delete-one.ts | 3 ++- .../swagger/method/delete-relationship.ts | 3 ++- .../modules/mixin/swagger/method/get-all.ts | 4 +--- .../modules/mixin/swagger/method/get-one.ts | 4 ++-- .../mixin/swagger/method/get-relationship.ts | 3 ++- .../lib/modules/mixin/swagger/method/index.ts | 3 +-- .../modules/mixin/swagger/method/patch-one.ts | 3 ++- .../swagger/method/patch-relationship.ts | 3 ++- .../modules/mixin/swagger/method/post-one.ts | 2 +- .../mixin/swagger/method/post-relationship.ts | 3 ++- .../mixin/swagger/swagger-bind.service.ts | 3 +-- .../src/lib/modules/mixin/swagger/utils.ts | 14 ++++++-------- .../lib/modules/mixin/types/binding.type.ts | 5 +++-- .../lib/modules/mixin/types/module.type.ts | 3 ++- .../src/lib/types/entity-param.type.ts | 2 +- .../src/lib/types/entity-type.ts | 11 ----------- .../json-api-nestjs/src/lib/types/index.ts | 1 - .../src/lib/types/module-options.types.ts | 2 +- .../src/lib/types/utils-type.ts | 9 ++++++--- .../src/lib/utils/___test___/test.helper.ts | 3 ++- .../src/lib/utils/module-helper.ts | 3 +-- 45 files changed, 108 insertions(+), 100 deletions(-) delete mode 100644 libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts diff --git a/libs/json-api/json-api-nestjs/src/index.ts b/libs/json-api/json-api-nestjs/src/index.ts index 3963ae09..49c2b9bf 100644 --- a/libs/json-api/json-api-nestjs/src/index.ts +++ b/libs/json-api/json-api-nestjs/src/index.ts @@ -10,7 +10,6 @@ export { UnionToTuple, EntityParam, TypeField, - ObjectLiteral, } from './lib/types'; export { JsonApiTransformerService, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts index 7050865f..f8c75fcc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/atomic-operation.module.ts @@ -7,6 +7,7 @@ import { NestModule, } from '@nestjs/common'; import { DiscoveryModule, RouterModule } from '@nestjs/core'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { OperationController } from './controllers'; import { ExplorerService, ExecuteService, SwaggerService } from './service'; @@ -17,7 +18,6 @@ import { ZodInputOperation, AsyncIterate, } from './factory'; -import { AnyEntity, EntityClass } from '../../types'; import { MAP_CONTROLLER_INTERCEPTORS } from './constants'; @Module({}) diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts index 00798a3f..3dbb5aa0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/constants/index.ts @@ -5,5 +5,3 @@ export const MAP_CONTROLLER_INTERCEPTORS = Symbol( export const MAP_ENTITY = Symbol('MAP_ENTITY'); export const ZOD_INPUT_OPERATION = Symbol('ZOD_INPUT_OPERATION'); export const ASYNC_ITERATOR_FACTORY = Symbol('ASYNC_ITERATOR_FACTORY'); -export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations'; -export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts index 7c89df23..164ea78d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.spec.ts @@ -2,17 +2,20 @@ import { Test, TestingModule } from '@nestjs/testing'; import { DiscoveryModule } from '@nestjs/core'; import { HttpException } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; +import { + KEY_MAIN_OUTPUT_SCHEMA, + Operation, +} from '@klerick/json-api-nestjs-shared'; import { OperationController } from './operation.controller'; import { ExecuteService, ExplorerService } from '../service'; -import { InputArray, Operation } from '../utils'; -import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; +import { InputArray } from '../utils'; +import { JsonBaseController } from '../../mixin/controllers'; import { Users } from '../../../utils/___test___/test-classes.helper'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_OUTPUT_SCHEMA, MAP_CONTROLLER_ENTITY, MAP_ENTITY, ZOD_INPUT_OPERATION, @@ -21,7 +24,6 @@ import { import { OperationMethode } from '../types'; import { AsyncLocalStorage } from 'async_hooks'; -import { ObjectLiteral } from '../../../types'; import { RUN_IN_TRANSACTION_FUNCTION } from '../../../constants'; describe('OperationController', () => { @@ -106,7 +108,7 @@ describe('OperationController', () => { const getMethodNameByParamSpy = jest .spyOn(explorerService, 'getMethodNameByParam') .mockReturnValue( - paramsForExecuteMock[0].methodName as OperationMethode + paramsForExecuteMock[0].methodName as OperationMethode ); const getModulesByControllerSpy = jest .spyOn(explorerService, 'getParamsForMethod') diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts index a373f589..f5377b78 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/controllers/operation.controller.ts @@ -8,11 +8,13 @@ import { Type, } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; - +import { + KEY_MAIN_INPUT_SCHEMA, + KEY_MAIN_OUTPUT_SCHEMA, +} from '@klerick/json-api-nestjs-shared'; import { InputArray } from '../utils'; import { InputOperationPipe } from '../pipes/input-operation.pipe'; import { ExecuteService, ExplorerService } from '../service'; -import { KEY_MAIN_INPUT_SCHEMA, KEY_MAIN_OUTPUT_SCHEMA } from '../constants'; import { OperationMethode, ParamsForExecute } from '../types'; import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; import { ValidateQueryError } from '../../../types'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts index 71287fb5..7e149c4a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-controller-entity.ts @@ -1,6 +1,6 @@ import { DynamicModule, ValueProvider } from '@nestjs/common'; import { Type } from '@nestjs/common/interfaces/type.interface'; -import { EntityClass, AnyEntity } from '../../../types'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { MapController } from '../types'; import { MAP_CONTROLLER_ENTITY } from '../constants'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts index b0fac8e4..302fcf9f 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/map-entity-name-to-entity.ts @@ -1,10 +1,12 @@ import { ValueProvider } from '@nestjs/common'; +import { + getEntityName, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; import { kebabCase } from 'change-case-commonjs'; import { MapEntity } from '../types'; import { MAP_ENTITY } from '../constants'; -import { AnyEntity, EntityClass } from '../../../types'; - -import { getEntityName } from '@klerick/json-api-nestjs-shared'; export function MapEntityNameToEntity( entities: EntityClass[] diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts index 49ec0c6d..77687d94 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/factory/zod-input-operation.ts @@ -1,12 +1,12 @@ import { FactoryProvider } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { MAP_CONTROLLER_ENTITY, ZOD_INPUT_OPERATION } from '../constants'; import { MapController } from '../types'; import { zodInputOperation, ZodInputOperation } from '../utils'; import { ENTITY_PARAM_MAP } from '../../../constants'; import { EntityParamMap } from '../../mixin/types'; -import { AnyEntity, EntityClass, ObjectLiteral } from '../../../types'; -export function ZodInputOperation(): FactoryProvider< +export function ZodInputOperation(): FactoryProvider< ZodInputOperation > { return { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts index 26e6e704..d2b55af2 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.spec.ts @@ -1,4 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { ZodError } from 'zod'; import { InternalServerErrorException, @@ -7,7 +8,7 @@ import { import { InputOperationPipe } from './input-operation.pipe'; -import { KEY_MAIN_INPUT_SCHEMA, ZOD_INPUT_OPERATION } from '../constants'; +import { ZOD_INPUT_OPERATION } from '../constants'; import { ZodInputOperation } from '../utils'; describe('PatchInputPipe', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts index a920101f..a63c294e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/pipes/input-operation.pipe.ts @@ -4,11 +4,12 @@ import { Inject, PipeTransform, } from '@nestjs/common'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { errorMap } from 'zod-validation-error'; import { ZodError } from 'zod'; import { JSONValue } from '../../mixin/types'; import { InputArray, ZodInputOperation } from '../utils'; -import { KEY_MAIN_INPUT_SCHEMA, ZOD_INPUT_OPERATION } from '../constants'; +import { ZOD_INPUT_OPERATION } from '../constants'; export class InputOperationPipe implements PipeTransform diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts index 0b2215e6..361bd497 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.spec.ts @@ -1,11 +1,11 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ModuleRef } from '@nestjs/core'; import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; +import { KEY_MAIN_INPUT_SCHEMA } from '@klerick/json-api-nestjs-shared'; import { ExecuteService, isZodError } from './execute.service'; import { IterateFactory } from '../factory'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_INPUT_SCHEMA, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts index de5d0f8e..b477b5ee 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts @@ -17,6 +17,7 @@ import { ObjectTyped, ResourceObject, ResourceObjectRelationships, + KEY_MAIN_INPUT_SCHEMA, } from '@klerick/json-api-nestjs-shared'; import { InterceptorsConsumer, @@ -29,7 +30,6 @@ import { AsyncLocalStorage } from 'async_hooks'; import { MapControllerInterceptor, ParamsForExecute } from '../types'; import { ASYNC_ITERATOR_FACTORY, - KEY_MAIN_INPUT_SCHEMA, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; import { IterateFactory } from '../factory'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts index 1d1ea451..51fe575d 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.spec.ts @@ -1,11 +1,12 @@ import { Test } from '@nestjs/testing'; import { ModulesContainer } from '@nestjs/core'; +import { Operation } from '@klerick/json-api-nestjs-shared'; import { MAP_ENTITY, MAP_CONTROLLER_ENTITY, MAP_CONTROLLER_INTERCEPTORS, } from '../constants'; -import { Operation } from '../utils'; + import { ExplorerService } from './explorer.service'; describe('ExplorerService', () => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts index e70b0806..be3e680a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/explorer.service.ts @@ -1,11 +1,11 @@ import { Inject, Injectable, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { ModulesContainer } from '@nestjs/core'; -import { RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { RelationKeys, Operation } from '@klerick/json-api-nestjs-shared'; import { MAP_CONTROLLER_ENTITY, MAP_ENTITY } from '../constants'; import { MapController, MapEntity, OperationMethode } from '../types'; -import { InputArray, Operation } from '../utils'; +import { InputArray } from '../utils'; import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; import { PatchData, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts index f0068487..26ec14f3 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/types/index.ts @@ -1,8 +1,8 @@ import { NestInterceptor, Type } from '@nestjs/common'; import { Module } from '@nestjs/core/injector/module'; import { Controller } from '@nestjs/common/interfaces'; -import { EntityClass } from '../../../types'; -import { JsonBaseController } from '../../mixin/controllers/json-base.controller'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; +import { JsonBaseController } from '../../mixin/controllers'; export type MapControllerInterceptor = Map< Controller, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts index ae7df6bb..32660915 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.spec.ts @@ -1,8 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { RelationKeys } from '@klerick/json-api-nestjs-shared'; -import { z, ZodError } from 'zod'; import { + RelationKeys, + KEY_MAIN_INPUT_SCHEMA, Operation, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; +import { z, ZodError } from 'zod'; +import { ZodAdd, zodAdd, zodInputOperation, @@ -16,14 +21,12 @@ import { } from './zod-helper'; import { MapController } from '../../types'; -import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; - -import { AnyEntity, EntityClass, UnionToTuple } from '../../../../types'; -import { JsonBaseController } from '../../../mixin/controllers/json-base.controller'; +import { JsonBaseController } from '../../../mixin/controllers'; import { mapMock } from '../../../../utils/___test___/test.helper'; import { Users } from '../../../../utils/___test___/test-classes.helper'; import { ENTITY_PARAM_MAP } from '../../../../constants'; import { EntityParamMap } from '../../../mixin/types'; +import { UnionToTuple } from '../../../../types'; describe('ZodHelperSpec', () => { afterEach(() => { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts index 3f957cc6..a44e05ed 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/utils/zod/zod-helper.ts @@ -1,4 +1,11 @@ -import { getEntityName, RelationKeys } from '@klerick/json-api-nestjs-shared'; +import { + getEntityName, + RelationKeys, + KEY_MAIN_INPUT_SCHEMA, + Operation, + AnyEntity, + EntityClass, +} from '@klerick/json-api-nestjs-shared'; import { z, ZodArray, @@ -11,18 +18,12 @@ import { ZodUnion, } from 'zod'; import { kebabCase } from 'change-case-commonjs'; -import { KEY_MAIN_INPUT_SCHEMA } from '../../constants'; + import { MapController } from '../../types'; -import { AnyEntity, EntityClass, UnionToTuple } from '../../../../types'; +import { UnionToTuple } from '../../../../types'; import { EntityParamMap } from '../../../mixin/types'; -export enum Operation { - add = 'add', - update = 'update', - remove = 'remove', -} - const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); type Literal = z.infer; type Json = Literal | { [key: string]: Json } | Json[]; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts index ec045148..fdd77b93 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/decorators/json-api/json-api.decorator.ts @@ -1,8 +1,8 @@ +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { JSON_API_DECORATOR_ENTITY, JSON_API_DECORATOR_OPTIONS, } from '../../../../constants'; -import { AnyEntity, EntityClass } from '../../../../types'; import { DecoratorOptions } from '../../types'; export function JsonApi( diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts index f07264fb..ef93a2b8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/helpers/utils.ts @@ -1,7 +1,11 @@ -import { getEntityName, ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { + getEntityName, + ObjectTyped, + EntityClass, + AnyEntity, +} from '@klerick/json-api-nestjs-shared'; import { pascalCase } from 'change-case-commonjs'; -import { AnyEntity, EntityClass } from '../../../types'; import { MethodName } from '../types'; import { Bindings } from '../config/bindings'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts index 8bc9ef92..63287909 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.ts @@ -1,11 +1,10 @@ import { Inject, NotFoundException, PipeTransform } from '@nestjs/common'; +import { EntityClass, getEntityName } from '@klerick/json-api-nestjs-shared'; + import { ValidateQueryError } from '../../../../types'; import { CURRENT_ENTITY, FIND_ONE_ROW_ENTITY } from '../../../../constants'; -import { EntityClass } from '../../../../types'; import { FindOneRowEntity } from '../../types'; -import { getEntityName } from '@klerick/json-api-nestjs-shared'; - export class CheckItemEntityPipe implements PipeTransform> { diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts index c3c10d12..247fb82c 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.spec.ts @@ -1,8 +1,9 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UnprocessableEntityException } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; import { ParseRelationshipNamePipe } from './parse-relationship-name.pipe'; import { CURRENT_ENTITY, CHECK_RELATION_NAME } from '../../../../constants'; -import { EntityParam, EntityClass } from '../../../../types'; +import { EntityParam } from '../../../../types'; describe('CheckItemEntityPipe', () => { let pipe: ParseRelationshipNamePipe< diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts index 5b142523..d0d85ba9 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/parse-relationship-name/parse-relationship-name.pipe.ts @@ -3,14 +3,12 @@ import { UnprocessableEntityException, Inject, } from '@nestjs/common'; +import { EntityClass, getEntityName } from '@klerick/json-api-nestjs-shared'; import { EntityParam, ValidateQueryError } from '../../../../types'; import { CHECK_RELATION_NAME, CURRENT_ENTITY } from '../../../../constants'; -import { EntityClass } from '../../../../types'; import { CheckRelationName } from '../../types'; -import { getEntityName } from '@klerick/json-api-nestjs-shared'; - export class ParseRelationshipNamePipe< E extends object, I extends keyof EntityParam['relationProperty'] diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts index 23714ca1..0bd484b8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/entity-param-map.service.ts @@ -1,7 +1,9 @@ import { Inject, Injectable } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; + import { ENTITY_PARAM_MAP, CURRENT_ENTITY } from '../../../constants'; import { EntityParamMap } from '../types'; -import { AnyEntity, EntityClass, EntityParam } from '../../../types'; +import { EntityParam } from '../../../types'; @Injectable() export class EntityParamMapService< diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts index 13b733c6..82a20627 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.ts @@ -10,10 +10,11 @@ import { ResourceObject, BaseMainData, RelationKeys, + EntityClass, } from '@klerick/json-api-nestjs-shared'; import { RoutePathFactory } from '@nestjs/core/router/route-path-factory'; -import { EntityParam, EntityClass } from '../../../types'; +import { EntityParam } from '../../../types'; import { Query, QueryOne } from '../zod'; import { EntityParamMapService } from './entity-param-map.service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts index f99fe501..0674f646 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-one.ts @@ -1,7 +1,8 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { errorSchema } from '../utils'; import { EntityParamMapService } from '../../service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts index a5bf2092..b922f3b8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts @@ -1,8 +1,9 @@ import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { zodPatchRelationship } from '../../zod'; import { errorSchema } from '../utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts index 1bd7652c..c8b9fb24 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts @@ -1,8 +1,6 @@ import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger'; import { Type } from '@nestjs/common'; -import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; - -import { EntityClass } from '../../../../types'; +import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; import { assertIsKeysOfObject, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts index aa5b96ac..b3b1b303 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-one.ts @@ -1,9 +1,9 @@ import { ApiOperation, ApiParam, ApiQuery, ApiResponse } from '@nestjs/swagger'; -import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; import { Type } from '@nestjs/common'; import { errorSchema, jsonSchemaResponse } from '../utils'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { EntityParamMapService } from '../../service'; export function getOne( diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts index 5fb34738..2ed9b4ff 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-relationship.ts @@ -1,7 +1,8 @@ import { Type } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { errorSchema, schemaTypeForRelation } from '../utils'; import { EntityParamMapService } from '../../service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts index 61a4005f..404cbe19 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/index.ts @@ -9,7 +9,6 @@ import { postRelationship } from './post-relationship'; import { patchRelationship } from './patch-relationship'; import { OrmService } from '../../types'; -import { ObjectLiteral } from '../../../../types'; export const swaggerMethod = { getAll, @@ -23,6 +22,6 @@ export const swaggerMethod = { patchRelationship, } as const; -export type SwaggerMethod = { +export type SwaggerMethod = { [Key in keyof OrmService]?: (typeof swaggerMethod)[Key]; }; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts index c18ddb86..49bde0b6 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-one.ts @@ -5,8 +5,9 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { generateSchema } from '@anatine/zod-openapi'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPatch } from '../../zod'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts index 88b2fbe0..ef3d1a0a 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/patch-relationship.ts @@ -5,8 +5,9 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { generateSchema } from '@anatine/zod-openapi'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; import { EntityParamMapService } from '../../service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts index a6fafbfb..8c30a776 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-one.ts @@ -5,8 +5,8 @@ import { SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Type } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; -import { EntityClass } from '../../../../types'; import { errorSchema, jsonSchemaResponse } from '../utils'; import { zodPost } from '../../zod'; import { EntityParamMapService } from '../../service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts index b1f41ec2..58e6967b 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/post-relationship.ts @@ -5,10 +5,11 @@ import { SchemaObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { ApiBody, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; import { errorSchema, schemaTypeForRelation } from '../utils'; import { zodPatchRelationship } from '../../zod'; -import { EntityClass, TypeField } from '../../../../types'; +import { TypeField } from '../../../../types'; import { EntityParamMapService } from '../../service'; export function postRelationship( diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts index 58ab5489..78691e5e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/swagger-bind.service.ts @@ -2,7 +2,7 @@ import { Injectable, OnModuleInit, Inject } from '@nestjs/common'; import { DECORATORS } from '@nestjs/swagger/dist/constants'; import { ApiExtraModels, ApiTags } from '@nestjs/swagger'; import { DiscoveryService } from '@nestjs/core'; -import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; +import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; import { PARAMTYPES_METADATA } from '@nestjs/common/constants'; import { @@ -13,7 +13,6 @@ import { } from '../../../constants'; import { getProviderName, nameIt } from '../helpers'; import { JsonBaseController } from '../controllers'; -import { EntityClass } from '../../../types'; import { DecoratorOptions } from '../types'; import { FilterOperand } from './filter-operand-model'; import { createApiModels } from './utils'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts index d7ae58a2..2e5e0c06 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/utils.ts @@ -1,17 +1,15 @@ import { ApiProperty } from '@nestjs/swagger'; import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; -import { ObjectTyped } from '@klerick/json-api-nestjs-shared'; -import { kebabCase } from 'change-case-commonjs'; - import { + ObjectTyped, AnyEntity, EntityClass, - EntityParam, - RelationProperty, - TypeField, -} from '../../../types'; + PropertyKeys, +} from '@klerick/json-api-nestjs-shared'; +import { kebabCase } from 'change-case-commonjs'; + +import { EntityParam, RelationProperty, TypeField } from '../../../types'; -import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; import { EntityParamMap } from '../types'; import { EntityParamMapService } from '../service'; diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts index 949dc6b1..d3deadfa 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/binding.type.ts @@ -1,7 +1,8 @@ import { Type } from '@nestjs/common/interfaces'; import { PipeTransform, RequestMethod } from '@nestjs/common'; -import { JsonBaseController } from '../controllers/json-base.controller'; -import { AnyEntity, EntityClass, PipeMixin } from '../../../types'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; +import { JsonBaseController } from '../controllers'; +import { PipeMixin } from '../../../types'; import { EntityControllerParam } from './decorator-options.type'; export type MethodName = diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts index d2598f2a..e4f60eda 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/types/module.type.ts @@ -1,4 +1,5 @@ -import { EntityClass, EntityParam } from '../../../types'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; +import { EntityParam } from '../../../types'; export type EntityParamMap = Map>; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts index db95d330..6fc52b32 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/entity-param.type.ts @@ -3,11 +3,11 @@ import { PropertyKeys, RelationKeys, IsIterator, + Constructor, } from '@klerick/json-api-nestjs-shared'; import { CastIteratorType, UnionToTuple, - Constructor, IsArray, CastArrayType, } from './utils-type'; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts deleted file mode 100644 index fc563a47..00000000 --- a/libs/json-api/json-api-nestjs/src/lib/types/entity-type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Constructor } from './utils-type'; - -// export interface ObjectLiteral { -// [key: string]: unknown; -// } -export type ObjectLiteral = { - [P in keyof T]: T[P]; -}; - -export type AnyEntity = T; -export type EntityClass = Constructor; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/index.ts b/libs/json-api/json-api-nestjs/src/lib/types/index.ts index 1dd945b6..ce81cabf 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/index.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/index.ts @@ -1,4 +1,3 @@ -export * from './entity-type'; export * from './common-type'; export * from './module-options.types'; export * from './utils-type'; diff --git a/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts index f3b88d86..c9e5e448 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/module-options.types.ts @@ -1,6 +1,6 @@ import { DynamicModule } from '@nestjs/common'; import { NonEmptyArray } from 'zod-validation-error'; -import { AnyEntity, EntityClass } from './entity-type'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { NestController, NestImport, diff --git a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts index 0210f614..4a853979 100644 --- a/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts +++ b/libs/json-api/json-api-nestjs/src/lib/types/utils-type.ts @@ -1,5 +1,9 @@ -import { HasId, CastIteratorType } from '@klerick/json-api-nestjs-shared'; -import { Any, Union, Tuple } from 'ts-toolbelt'; +import { + CastIteratorType, + HasId, + Constructor, +} from '@klerick/json-api-nestjs-shared'; +import { Any, Tuple, Union } from 'ts-toolbelt'; import { Type } from '@nestjs/common/interfaces'; export { HasId, CastIteratorType }; @@ -20,7 +24,6 @@ export type UnionToTuple< export type IsArray = T extends unknown[] ? 1 : 0; export type CastArrayType = T extends (infer U)[] ? U : T; -export type Constructor = new (...args: any[]) => T; export type TypeOfConstructor = T extends Constructor ? E : T; export type NonEmptyStringTuple = T extends [] diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts index 7b6d668e..d83894fc 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/___test___/test.helper.ts @@ -1,3 +1,4 @@ +import { EntityClass, Constructor } from '@klerick/json-api-nestjs-shared'; import { kebabCase } from 'change-case-commonjs'; import { EntityParamMapService } from '../../modules/mixin/service'; @@ -8,7 +9,7 @@ import { UserGroups, Users, } from './test-classes.helper'; -import { Constructor, EntityClass, EntityParam, TypeField } from '../../types'; +import { EntityParam, TypeField } from '../../types'; const entityParamUsers: EntityParam = { relations: ['addresses', 'manager', 'roles', 'comments', 'userGroup'], diff --git a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts index c91e85f2..6649d37e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts +++ b/libs/json-api/json-api-nestjs/src/lib/utils/module-helper.ts @@ -1,8 +1,7 @@ import { ParseIntPipe } from '@nestjs/common'; +import { AnyEntity, EntityClass } from '@klerick/json-api-nestjs-shared'; import { - AnyEntity, - EntityClass, NestController, OptionOfConfig, Params, From edc3a6003cec97a19af797f10277e5186f475455 Mon Sep 17 00:00:00 2001 From: Alex H Date: Tue, 4 Mar 2025 18:20:16 +0100 Subject: [PATCH 11/22] chore: Fix dep and tests --- apps/json-api-front/project.json | 3 ++- apps/json-api-server-e2e/jest.config.ts | 2 ++ apps/json-api-server/project.json | 2 +- nx.json | 3 +-- tsconfig.base.json | 17 ++++------------- 5 files changed, 10 insertions(+), 17 deletions(-) diff --git a/apps/json-api-front/project.json b/apps/json-api-front/project.json index bbd03fae..9f92b9d0 100644 --- a/apps/json-api-front/project.json +++ b/apps/json-api-front/project.json @@ -68,5 +68,6 @@ "buildTarget": "json-api-front:build" } } - } + }, + "implicitDependencies": ["json-api-nestjs-sdk"] } diff --git a/apps/json-api-server-e2e/jest.config.ts b/apps/json-api-server-e2e/jest.config.ts index cf120cec..5c75a2f7 100644 --- a/apps/json-api-server-e2e/jest.config.ts +++ b/apps/json-api-server-e2e/jest.config.ts @@ -26,5 +26,7 @@ export default { '/../../dist/libs/json-api/json-api-nestjs-shared', '^@klerick/json-api-nestjs-typeorm$': '/../../dist/libs/json-api/json-api-nestjs-typeorm', + '^@klerick/json-api-nestjs-sdk$': + '/../../dist/libs/json-api/json-api-nestjs-sdk', }, }; diff --git a/apps/json-api-server/project.json b/apps/json-api-server/project.json index 657dc921..d05092b4 100644 --- a/apps/json-api-server/project.json +++ b/apps/json-api-server/project.json @@ -21,5 +21,5 @@ } }, "tags": [], - "implicitDependencies": ["json-api-nestjs-typeorm", "json-api-nestjs-microorm"] + "implicitDependencies": ["json-api-nestjs-typeorm", "json-api-nestjs-microorm", "json-api-nestjs-sdk"] } diff --git a/nx.json b/nx.json index 63589c20..e649c707 100644 --- a/nx.json +++ b/nx.json @@ -97,6 +97,5 @@ "fallbackCurrentVersionResolver": "1.0.0" } } - }, - "useLegacyCache": true + } } diff --git a/tsconfig.base.json b/tsconfig.base.json index 691bb87f..9c57cbad 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,24 +15,15 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@klerick/json-api-nestjs-sdk": [ - "libs/json-api/json-api-nestjs-sdk/src/index.ts" - ], - "@klerick/json-api-nestjs-sdk/ngModule": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" - ], - "@klerick/json-api-nestjs-shared": [ - "dist/libs/json-api/json-api-nestjs-shared" - ], - "@klerick/json-api-nestjs-typeorm": [ - "dist/libs/json-api/json-api-nestjs-typeorm" - ], "@klerick/json-api-nestjs": [ "dist/libs/json-api/json-api-nestjs" ], "@klerick/json-api-nestjs-microorm": [ "dist/libs/json-api/json-api-nestjs-microorm" ], + "@klerick/json-api-nestjs-typeorm": [ + "dist/libs/json-api/json-api-nestjs-typeorm" + ], "@klerick/nestjs-json-rpc": [ "libs/json-rpc/nestjs-json-rpc/src/index.ts" ], @@ -51,5 +42,5 @@ ] } }, - "exclude": ["node_modules", "tmp"] + "exclude": ["node_modules", "tmp", "**/___test___/**"], } From 130945739803ee33466f507d8cbd32179b044962 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 5 Mar 2025 15:42:09 +0100 Subject: [PATCH 12/22] ci: New CI/CD process --- .github/actions/action.yml | 58 +-- .github/workflows/build.yml | 52 +++ .../{ci.yml => bump-version-save.yml} | 83 +++- .github/workflows/bump-version.yml | 132 +----- .github/workflows/compute-projects.yml | 100 +++++ .github/workflows/create-release.yaml | 122 +++++ .github/workflows/e2e-test.yaml | 63 +++ .github/workflows/pr.yml | 22 + .github/workflows/test.yml | 51 +++ .github/workflows/upload-badge.yaml | 53 +++ .../json-api-nestjs-microorm/project.json | 61 ++- .../lib/orm-methods/get-all/get-all.spec.ts | 2 +- .../post-relationship.spec.ts | 14 +- .../tsconfig.spec.json | 3 +- .../json-api/json-api-nestjs-sdk/project.json | 33 +- .../json-api-nestjs-sdk/tsconfig.spec.json | 3 +- .../json-api-nestjs-shared/project.json | 29 +- .../utils/___test___/test-classes.helper.ts | 56 +++ .../json-api-nestjs-shared/tsconfig.lib.json | 16 +- .../json-api-nestjs-typeorm/project.json | 39 +- .../tsconfig.spec.json | 3 +- libs/json-api/json-api-nestjs/project.json | 41 +- .../json-api-nestjs/tsconfig.spec.json | 3 +- .../json-rpc/nestjs-json-rpc-sdk/project.json | 2 +- libs/json-rpc/nestjs-json-rpc/project.json | 2 +- .../rpc-ws-error-exception.filter.spec.ts | 27 +- nx.json | 29 +- package-lock.json | 420 ++++++++++++++++-- package.json | 6 +- 29 files changed, 1197 insertions(+), 328 deletions(-) create mode 100644 .github/workflows/build.yml rename .github/workflows/{ci.yml => bump-version-save.yml} (52%) create mode 100644 .github/workflows/compute-projects.yml create mode 100644 .github/workflows/create-release.yaml create mode 100644 .github/workflows/e2e-test.yaml create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/upload-badge.yaml diff --git a/.github/actions/action.yml b/.github/actions/action.yml index 71b6c894..f28a1067 100644 --- a/.github/actions/action.yml +++ b/.github/actions/action.yml @@ -1,34 +1,36 @@ -name: 'My composite action' -description: 'Checks out the repository and install' +name: Main action for Node.js +description: Setup Node.js + +inputs: + node-version: + description: Node.js version + required: false + default: 20.x + runs: - using: 'composite' + using: composite steps: - - name: Setup Node.js - uses: actions/setup-node@v4 + - name: Use Node.js ${{ inputs.node-version }} + uses: actions/setup-node@v3 with: - node-version: 20 + node-version: ${{ inputs.node-version }} registry-url: 'https://registry.npmjs.org' - - name: Restore cached npm dependencies - id: cache-dependencies-restore - uses: actions/cache/restore@v4 + cache: npm + + - name: Get npm cache directory + id: npm-cache-dir + shell: pwsh + run: echo "dir=$(npm config get cache)" >> ${env:GITHUB_OUTPUT} + + - name: Cache NPM dependencies + uses: actions/cache@v4 + id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' with: - path: | - node_modules - ~/.cache/Cypress # needed for the Cypress binary - key: ${{ runner.os }}-npm-dependencies-${{ hashFiles('package-lock.json') }} - - name: Npm install - if: steps.cache-dependencies-restore.outputs.cache-hit != 'true' - run: npm ci + path: ${{ steps.npm-cache-dir.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies shell: bash - - name: Cache npm dependencies - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - node_modules - ~/.cache/Cypress # needed for the Cypress binary - key: ${{ steps.cache-dependencies-restore.outputs.cache-primary-key }} - - name: Derive appropriate SHAs for base and head for `nx affected` commands - uses: nrwl/nx-set-shas@v4 - with: - main-branch-name: "master" + run: npm ci diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..536591be --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,52 @@ +name: ⚙️ Build + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Derive appropriate SHAs for base and head for `nx affected` commands + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: "master" + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Build Libraries + run: npx nx affected --target=build --parallel=3 --exclude='*,!tag:type:publish' diff --git a/.github/workflows/ci.yml b/.github/workflows/bump-version-save.yml similarity index 52% rename from .github/workflows/ci.yml rename to .github/workflows/bump-version-save.yml index 0820cc30..25f4eb35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/bump-version-save.yml @@ -1,32 +1,49 @@ -name: CI +name: Create Releases on: - pull_request: - branches: - - master - types: - - opened - - synchronize + workflow_dispatch: + inputs: + projects: + description: 'Package Bump' + required: true + default: 'json-api-nestjs,json-api-nestjs-sdk,nestjs-json-rpc,nestjs-json-rpc-sdk' + first-release: + description: 'Is first release?' + required: false + type: boolean + default: false + dry-run: + description: 'Is dry run?' + required: false + type: boolean + default: false jobs: - run-test: - name: Try build and run unit test + build-and-test: + name: "Build and test" runs-on: ubuntu-latest + permissions: + contents: "read" + actions: "read" steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Npm install uses: ./.github/actions - - name: Get branch names. - id: branch-names - uses: tj-actions/branch-names@v8 + - name: Get git hash + run: | + COMMIT=$(git show-ref --tags --hash | tail -n 1) + echo "NX_BASE=$(echo ${COMMIT})" >> $GITHUB_ENV + - name: Set GIST_SECRET to env + run: | + echo "GIST_SECRET=${{ secrets.GIST_SECRET }}" >> $GITHUB_ENV + echo "GIST_ID=${{ secrets.GIST_ID }}" >> $GITHUB_ENV - name: Restore cached .nx id: cache-nx-restore uses: actions/cache/restore@v4 with: path: | .nx - key: ${{ runner.os }}-nx-${{ steps.branch-names.outputs.current_branch }} - - run: git branch --track main origin/master + key: ${{ runner.os }}-nx-master - name: Test env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 @@ -35,6 +52,8 @@ jobs: env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' + - name: Upload test coverage badge + run: npx nx affected -t upload-badge --exclude='json-api-front,json-api-server,shared-utils,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - name: Save cached .nx id: cache-dependencies-save uses: actions/cache/save@v4 @@ -46,7 +65,7 @@ jobs: runs-on: ubuntu-latest name: Try run e2e test needs: - - run-test + - build-and-test services: # Label used to access the service container postgres: @@ -71,21 +90,17 @@ jobs: fetch-depth: 0 - name: Npm install uses: ./.github/actions - - name: Get branch names. - id: branch-names - uses: tj-actions/branch-names@v8 - name: Restore cached .nx id: cache-nx-restore uses: actions/cache/restore@v4 with: path: | .nx - key: ${{ runner.os }}-nx-${{ steps.branch-names.outputs.current_branch }} + key: ${{ runner.os }}-nx-master - run: git branch --track main origin/master - run: npm run typeorm migration:run - run: npm run seed:run - run: npx nx affected -t e2e --parallel=1 - - run: npx nx affected -t e2e-micro --parallel=1 - name: Save cached .nx id: cache-dependencies-save uses: actions/cache/save@v4 @@ -93,3 +108,31 @@ jobs: path: | .nx key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} + bump-version: + name: "Bump version" + needs: + - run-e2e-test + runs-on: ubuntu-latest + permissions: + contents: "write" + actions: "read" + id-token: "write" + timeout-minutes: 10 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.PAT }} + - name: Npm install + uses: ./.github/actions + - name: Bump version + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + npx nx release --skip-publish --first-release=${{ github.event.inputs.first-release }} --projects=${{ github.event.inputs.projects }} --dry-run=${{ github.event.inputs.dry-run }} + shell: bash + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 25f4eb35..8bcdf31d 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -1,123 +1,43 @@ -name: Create Releases +name: ⚙️ Bump version + on: - workflow_dispatch: + workflow_call: inputs: projects: - description: 'Package Bump' + description: "Project list" required: true - default: 'json-api-nestjs,json-api-nestjs-sdk,nestjs-json-rpc,nestjs-json-rpc-sdk' + type: string first-release: description: 'Is first release?' required: false type: boolean default: false + beta-release: + description: 'Is beta release?' + required: false + type: boolean + default: false dry-run: description: 'Is dry run?' required: false type: boolean default: false + secrets: + NODE_AUTH_TOKEN: + required: true + GITHUB_TOKEN_SECRET: + required: true + PAT: + required: true + +env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN_SECRET }} + NPM_CONFIG_PROVENANCE: true + jobs: - build-and-test: - name: "Build and test" - runs-on: ubuntu-latest - permissions: - contents: "read" - actions: "read" - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Npm install - uses: ./.github/actions - - name: Get git hash - run: | - COMMIT=$(git show-ref --tags --hash | tail -n 1) - echo "NX_BASE=$(echo ${COMMIT})" >> $GITHUB_ENV - - name: Set GIST_SECRET to env - run: | - echo "GIST_SECRET=${{ secrets.GIST_SECRET }}" >> $GITHUB_ENV - echo "GIST_ID=${{ secrets.GIST_ID }}" >> $GITHUB_ENV - - name: Restore cached .nx - id: cache-nx-restore - uses: actions/cache/restore@v4 - with: - path: | - .nx - key: ${{ runner.os }}-nx-master - - name: Test - env: - NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 - run: npx nx affected -t test --parallel=3 --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Build - env: - NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 - run: npx nx affected -t build --exclude='json-api-front,json-api-server,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Upload test coverage badge - run: npx nx affected -t upload-badge --exclude='json-api-front,json-api-server,shared-utils,json-api-server-e2e,json-shared-type,microorm-database,typeorm-database,@nestjs-json-api/source,type-for-rpc' - - name: Save cached .nx - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - .nx - key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} - run-e2e-test: - runs-on: ubuntu-latest - name: Try run e2e test - needs: - - build-and-test - services: - # Label used to access the service container - postgres: - # Docker Hub image - image: postgres - # Provide the password for postgres - env: - POSTGRES_PASSWORD: postgres - POSTGRES_DB: json-api-db - # Set health checks to wait until postgres has started - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - # Maps tcp port 5432 on service container to the host - - 5432:5432 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Npm install - uses: ./.github/actions - - name: Restore cached .nx - id: cache-nx-restore - uses: actions/cache/restore@v4 - with: - path: | - .nx - key: ${{ runner.os }}-nx-master - - run: git branch --track main origin/master - - run: npm run typeorm migration:run - - run: npm run seed:run - - run: npx nx affected -t e2e --parallel=1 - - name: Save cached .nx - id: cache-dependencies-save - uses: actions/cache/save@v4 - with: - path: | - .nx - key: ${{ steps.cache-nx-restore.outputs.cache-primary-key }} bump-version: - name: "Bump version" - needs: - - run-e2e-test runs-on: ubuntu-latest - permissions: - contents: "write" - actions: "read" - id-token: "write" - timeout-minutes: 10 steps: - name: Checkout repository uses: actions/checkout@v4 @@ -130,9 +50,5 @@ jobs: run: | git config --global user.email "actions@github.com" git config --global user.name "GitHub Actions" - npx nx release --skip-publish --first-release=${{ github.event.inputs.first-release }} --projects=${{ github.event.inputs.projects }} --dry-run=${{ github.event.inputs.dry-run }} + npx nx release --skip-publish --first-release=${{ inputs.first-release }} --projects=${{ inputs.projects }} --dry-run=${{ inputs.dry-run }} shell: bash - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/compute-projects.yml b/.github/workflows/compute-projects.yml new file mode 100644 index 00000000..eb740adb --- /dev/null +++ b/.github/workflows/compute-projects.yml @@ -0,0 +1,100 @@ +name: ⚙️ Compute Projects + +on: + workflow_call: + inputs: + tagChoice: + description: "Тег для фильтрации проектов. Если задан, используется вместо чекбоксов." + required: false + default: "" + type: string + project1: + description: "Project 1" + required: false + default: "" + type: string + project2: + description: "Project 2" + required: false + default: "" + type: string + project3: + description: "Project 3" + required: false + default: "" + type: string + project4: + description: "Project 4" + required: false + default: "" + type: string + outputs: + finalProjects: + description: "Result Project" + value: ${{ steps.final.outputs.finalProjects }} + +jobs: + compute: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Get projects by tag + id: tag_projects + if: ${{ inputs.tagChoice != '' }} + shell: bash + run: | + echo "Using tag: ${{ inputs.tagChoice }}" + projects=$(npx nx show projects --exclude="*,!${{ inputs.tagChoice }}" --sep=',') + echo "projects=$projects" >> $GITHUB_OUTPUT + echo "Projects by tag: $projects" + + - name: Collect projects from select + id: select_projects + if: ${{ inputs.tagChoice == '' }} + shell: bash + run: | + final="" + for var in "${{ inputs.projectList1 }}" "${{ inputs.projectList2 }}" "${{ inputs.projectList3 }}"; do + if [ ! -z "$var" ]; then + if [ -z "$final" ]; then + final="$var" + else + final="$final,$var" + fi + fi + done + echo "Final projects: $final" + if [ -z "$final" ]; then + echo "ERROR: Не выбрано ни одного проекта." >&2 + exit 1 + fi + echo "selectProjects=$final" >> $GITHUB_OUTPUT + echo "Checkbox-selected projects: $final" + + - name: Determine final projects list + id: final + shell: bash + run: | + if [ -n "${{ inputs.tagChoice }}" ]; then + final="${{ steps.tag_projects.outputs.projects }}" + else + final="${{ steps.select_projects.outputs.selectProjects }}" + fi + final=$(echo "$final" | xargs) + echo "finalProjects=$final" >> $GITHUB_OUTPUT + echo "Final projects: $final" + if [ -z "$final" ]; then + echo "ERROR: No projects selected or found." >&2 + exit 1 + fi + + - name: Output final projects + run: | + echo "Final projects: ${{ steps.final.outputs.finalProjects }}" diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml new file mode 100644 index 00000000..9a36f207 --- /dev/null +++ b/.github/workflows/create-release.yaml @@ -0,0 +1,122 @@ +name: 📦 Create Release + +defaults: &project_options + - "" + - json-api-nestjs + - json-api-nestjs-sdk + - nestjs-json-rpc + - nestjs-json-rpc-sdk + - json-api-nestjs-microorm + - json-api-nestjs-shared + - json-api-nestjs-typeorm + +on: + workflow_dispatch: + inputs: + tagChoice: + description: "Select projects by tag" + required: false + default: "" + type: choice + options: + - "" + - tag:type:publish + - tag:lib:json-api-nestjs + - tag:lib:nestjs-json-rpc + project1: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project2: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project3: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + project4: + description: "Select project" + required: false + default: "" + type: choice + options: *project_options + first-release: + description: 'Is first release?' + required: false + type: boolean + default: false + beta-release: + description: 'Is beta release?' + required: false + type: boolean + default: false + dry-run: + description: 'Is dry run?' + required: false + type: boolean + default: false + + +jobs: + compute-projects: + uses: ./.github/workflows/compute-projects.yml + with: + tagChoice: ${{ github.event.inputs.tagChoice }} + project1: ${{ github.event.inputs.project1 }} + project2: ${{ github.event.inputs.project2 }} + project3: ${{ github.event.inputs.project3 }} + project4: ${{ github.event.inputs.project4 }} + + test: + need: [compute-projects] + uses: ./.github/workflows/test.yml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + e2e-test: + needs: [test] + uses: ./.github/workflows/e2e-test.yaml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + build: + needs: [test, e2e-test] + uses: ./.github/workflows/build.yml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + upload-badge: + needs: [ test, e2e-test ] + uses: ./.github/workflows/upload-badge.yaml + with: + mainBranch: "last-tag" + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + GIST_SECRET: ${{ secrets.GIST_SECRET }} + GIST_ID: ${{ secrets.GIST_ID }} + + bump-version: + needs: [build] + uses: ./.github/workflows/bump-version.yml + with: + projects: ${{ needs.compute-projects.outputs.finalProjects }} + first-release: ${{ needs.compute-projects.outputs.first-release }} + beta-release: ${{ needs.compute-projects.outputs.beta-release }} + dry-run: ${{ needs.compute-projects.outputs.dry-run }} + secrets: + NPM_ACCESS_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + GITHUB_TOKEN_SECRET: ${{ secrets.GITHUB_TOKEN }} + PAT: ${{secrets.PAT}} diff --git a/.github/workflows/e2e-test.yaml b/.github/workflows/e2e-test.yaml new file mode 100644 index 00000000..eb0eb231 --- /dev/null +++ b/.github/workflows/e2e-test.yaml @@ -0,0 +1,63 @@ +name: ⚙️ E2E Test + + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true + +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + +jobs: + e2e-test: + runs-on: ubuntu-latest + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: json-api-db + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - run: npm run typeorm migration:run + - run: npm run seed:run + - run: npx nx run json-api-server-e2e:e2e --parallel=1 + - run: npx nx run json-api-server-e2e:e2e-micro --parallel=1 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..dc23c75c --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,22 @@ +name: 📝 PR Checks + +on: + [pull_request] + +jobs: + test: + uses: ./.github/workflows/test.yml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + e2e-test: + needs: [test] + uses: ./.github/workflows/e2e-test.yaml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + + build: + needs: [test, e2e-test] + uses: ./.github/workflows/build.yml + secrets: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..0b12ecee --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,51 @@ +name: ⚙️ Test + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + type: string + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Test + run: npx nx affected --target=test --parallel=3 --passWithNoTests --exclude='*,!tag:type:publish' + + - name: TS Test + run: npx nx affected --target=ts-test --parallel=3 --passWithNoTests --exclude='*,!tag:type:publish' diff --git a/.github/workflows/upload-badge.yaml b/.github/workflows/upload-badge.yaml new file mode 100644 index 00000000..7f1d7a83 --- /dev/null +++ b/.github/workflows/upload-badge.yaml @@ -0,0 +1,53 @@ +name: 📈️ Upload Badge + +on: + workflow_call: + inputs: + mainBranch: + description: Type for main nx affect + required: false + default: "master" + secrets: + NX_CLOUD_ACCESS_TOKEN: + required: true + GIST_SECRET: + required: true + GIST_ID: + required: true +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + GIST_SECRET: ${{ secrets.GIST_SECRET }} + GIST_ID: ${{ secrets.GIST_ID }} + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: ./.github/actions + + - name: Determine base for NX affected (if not master) + if: ${{ inputs.mainBranch != 'master' }} + shell: bash + run: | + LAST_TAG=$(git describe --tags --abbrev=0) + LAST_TAG_HASH=$(git rev-parse "$LAST_TAG") + CURRENT_COMMIT=$(git rev-parse HEAD) + echo "Using last tag hash as NX_BASE: $LAST_TAG_HASH" + echo "Using current commit as NX_HEAD: $CURRENT_COMMIT" + echo "NX_BASE=$LAST_TAG_HASH" >> $GITHUB_ENV + echo "NX_HEAD=$CURRENT_COMMIT" >> $GITHUB_ENV + + - name: Determine base for NX affected (if master) + if: ${{ inputs.mainBranch == 'master' }} + uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: ${{ inputs.mainBranch }} + + - name: Upload test coverage badge + run: npx nx affected --target=upload-badge --passWithNoTests --exclude='*,!tag:type:publish' diff --git a/libs/json-api/json-api-nestjs-microorm/project.json b/libs/json-api/json-api-nestjs-microorm/project.json index f9e0f0ae..3e450784 100644 --- a/libs/json-api/json-api-nestjs-microorm/project.json +++ b/libs/json-api/json-api-nestjs-microorm/project.json @@ -1,35 +1,56 @@ { "name": "json-api-nestjs-microorm", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-microorm/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag", - "fallbackCurrentVersionResolver": "disk" - } - } - }, - "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-microorm", "type:publish"], + "tags": [ + "type:lib", + "lib:json-api-nestjs", + "lib:json-api-nestjs-microorm", + "type:publish" + ], "targets": { "build": { "dependsOn": [ { - "projects": ["json-api-nestjs"], + "projects": [ + "json-api-nestjs" + ], "target": "build", "params": "ignore" } ], "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": [ + "{projectRoot}/*.md" + ], + "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true + } + }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-microorm", - "tsConfig": "libs/json-api/json-api-nestjs-microorm/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs-microorm/package.json", - "main": "libs/json-api/json-api-nestjs-microorm/src/index.ts", - "assets": ["libs/json-api/json-api-nestjs-microorm/*.md"] + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-microorm" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" } }, "nx-release-publish": { @@ -38,5 +59,7 @@ } } }, - "implicitDependencies": ["json-api-nestjs"] + "implicitDependencies": [ + "json-api-nestjs" + ] } diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts index 0ef0c9bc..7d7b6289 100644 --- a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/get-all/get-all.spec.ts @@ -860,7 +860,7 @@ describe('get-all', () => { }, }) .getResult(); - const count = await quweryBuilder.clone().count(); + const count = await quweryBuilder.clone().count('id', true); const query = getDefaultQuery(); query.page = { size: 5, diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts index 8192ba6a..b97fbfc6 100644 --- a/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/orm-methods/post-relationship/post-relationship.spec.ts @@ -81,14 +81,11 @@ describe('post-relationshipa', () => { jest.restoreAllMocks(); }); - afterAll(() => { - mikroORMUsers.close(true); - }); + afterAll(() => mikroORMUsers.close(true)); it('should be ok', async () => { - const roles1 = faker.helpers.arrayElement(roles); - const roles2 = faker.helpers.arrayElement(roles); - const roles3 = faker.helpers.arrayElement(roles); + const [roles1, roles2, roles3] = faker.helpers.arrayElements(roles, 3); + const userGroup1 = faker.helpers.arrayElement(userGroup); const saveIdUserGroup = userGroup1.id; @@ -139,12 +136,15 @@ describe('post-relationshipa', () => { }) .getSingleResult(); + const newRolesId = [roles1.id, roles2.id, roles3.id].filter( + (i) => !saveRolesIds.includes(i) + ); expect(checkData?.roles.map((i) => i.id)).toEqual( expect.arrayContaining([roles1.id, roles2.id, roles3.id]) ); expect(checkData?.roles.map((i) => i.id)).toHaveLength( - [roles1.id, roles2.id, roles3.id].length + saveRolesIds.length + newRolesId.length + saveRolesIds.length ); expect(checkData?.userGroup?.id).toBe(saveIdUserGroup); }); diff --git a/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json index 7b4aa57b..0e95750a 100644 --- a/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-microorm/tsconfig.spec.json @@ -15,7 +15,8 @@ "@klerick/json-api-nestjs": [ "libs/json-api/json-api-nestjs/src/index.ts" ] - } + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-api/json-api-nestjs-sdk/project.json b/libs/json-api/json-api-nestjs-sdk/project.json index 6a35ce81..80c89842 100644 --- a/libs/json-api/json-api-nestjs-sdk/project.json +++ b/libs/json-api/json-api-nestjs-sdk/project.json @@ -1,35 +1,26 @@ { "name": "json-api-nestjs-sdk", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-sdk/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag", - "fallbackCurrentVersionResolver": "disk" - } - } - }, "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-sdk", "type:publish"], "targets": { "build-cjs": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/cjs", - "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json", + "outputPath": "dist/{projectRoot}/cjs", + "main": "{projectRoot}/src/index.ts", + "tsConfig": "{projectRoot}/tsconfig.lib.json", "assets": [{ "glob": "*.md", - "input": "libs/json-api/json-api-nestjs-sdk", + "input": "{projectRoot}", "output": "../" }], "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", "additionalEntryPoints": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" + "{projectRoot}/src/ngModule.ts" ], "generateExportsField": true } @@ -38,18 +29,18 @@ "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk/mjs", - "main": "libs/json-api/json-api-nestjs-sdk/src/index.ts", - "tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json", + "outputPath": "dist/{projectRoot}/mjs", + "main": "{projectRoot}/src/index.ts", + "tsConfig": "{projectRoot}/tsconfig-mjs.lib.json", "assets": [{ "glob": "*.md", - "input": "libs/json-api/json-api-nestjs-sdk", + "input": "{projectRoot}", "output": "../" }], "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", "additionalEntryPoints": [ - "libs/json-api/json-api-nestjs-sdk/src/ngModule.ts" + "{projectRoot}/src/ngModule.ts" ], "generateExportsField": true } @@ -60,7 +51,7 @@ "build-cjs", "build-mjs" ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-sdk", + "outputPath": "dist/{projectRoot}", "commands": [ { "command": "mv dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json index 49fc8fbb..237bf4b5 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig.spec.json @@ -9,7 +9,8 @@ "@klerick/json-api-nestjs-shared": [ "libs/json-api/json-api-nestjs-shared/src/index.ts" ] - } + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json index c1b89925..7afb38aa 100644 --- a/libs/json-api/json-api-nestjs-shared/project.json +++ b/libs/json-api/json-api-nestjs-shared/project.json @@ -1,17 +1,9 @@ { "name": "json-api-nestjs-shared", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-shared/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag" - } - } - }, - "tags": [], + "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-shared", "type:publish"], "targets": { "build-cjs": { "executor": "@nx/js:tsc", @@ -30,6 +22,7 @@ "output": "../" } ], + "buildableProjectDepsInPackageJsonType": "peerDependencies", "updateBuildableProjectDepsInPackageJson": true } }, @@ -90,6 +83,22 @@ "parallel": false } }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], + "options": { + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-shared" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" + } + }, "nx-release-publish": { "options": { "packageRoot": "dist/{projectRoot}" diff --git a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts index e69de29b..46754b8e 100644 --- a/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts +++ b/libs/json-api/json-api-nestjs-shared/src/lib/utils/___test___/test-classes.helper.ts @@ -0,0 +1,56 @@ +import { Collection } from '@mikro-orm/core'; +type IUsers = Users; +export class Users { + public id!: number; + public login!: string; + public firstName!: string; + public testReal: number[] = []; + public testArrayNull!: number[] | null; + public lastName!: string | null; + public isActive!: null; + public testDate!: Date; + public createdAt: Date = new Date(); + public updatedAt: Date = new Date(); + + public addresses!: IAddresses; + public manager!: IUsers; + public roles = new Collection(this); + public comments!: Comments[]; + public userGroup!: UserGroups | null; +} +type IRoles = Roles; +export class Roles { + public id!: number; + public name!: string; + public key!: string; + public isDefault!: boolean; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IUserGroups = UserGroups; +export class UserGroups { + public id!: number; + public label!: string; +} +type IAddresses = Addresses; +export class Addresses { + public id!: number; + public city!: string; + public state!: string; + public country!: string; + public arrayField!: string[]; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +type IComments = Comments; +export class Comments { + public id!: number; + public kind!: CommentKind; + createdAt: Date = new Date(); + updatedAt: Date = new Date(); +} +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} diff --git a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json index 1a4d3afb..0acc1f8f 100644 --- a/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json +++ b/libs/json-api/json-api-nestjs-shared/tsconfig.lib.json @@ -3,7 +3,9 @@ "compilerOptions": { "outDir": "../../../dist/out-tsc", "declaration": true, - "types": ["node"], + "types": [ + "node" + ], "target": "es2021", "strictNullChecks": true, "noImplicitAny": true, @@ -11,6 +13,14 @@ "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true }, - "include": ["src/**/*.ts"], - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.test-d.ts", "src/lib/utils/___test___/**/*.ts"] + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.test-d.ts", + "src/lib/utils/___test___/**/*.ts" + ] } diff --git a/libs/json-api/json-api-nestjs-typeorm/project.json b/libs/json-api/json-api-nestjs-typeorm/project.json index a8973801..7f1ca770 100644 --- a/libs/json-api/json-api-nestjs-typeorm/project.json +++ b/libs/json-api/json-api-nestjs-typeorm/project.json @@ -1,35 +1,44 @@ { "name": "json-api-nestjs-typeorm", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs-typeorm/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag" - } - } - }, "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-typeorm", "type:publish"], "targets": { "build": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs-typeorm", - "tsConfig": "libs/json-api/json-api-nestjs-typeorm/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs-typeorm/package.json", - "main": "libs/json-api/json-api-nestjs-typeorm/src/index.ts", - "assets": ["libs/json-api/json-api-nestjs-typeorm/*.md"], + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", + "assets": ["{projectRoot}/*.md"], "buildableProjectDepsInPackageJsonType": "peerDependencies", - "generateExportsField": true + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true } }, "nx-release-publish": { "options": { "packageRoot": "dist/{projectRoot}" } + }, + "upload-badge": { + "executor": "nx:run-commands", + "dependsOn": [ + { + "target": "test" + } + ], + "options": { + "commands": [ + "node tools/scripts/upload-badge.mjs json-api-nestjs-typeorm" + ], + "cwd": "./", + "parallel": false, + "outputPath": "{workspaceRoot}/{projectRoot}" + } } }, "implicitDependencies": ["json-api-nestjs"] diff --git a/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json index 0934ad96..07100034 100644 --- a/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs-typeorm/tsconfig.spec.json @@ -12,7 +12,8 @@ "@klerick/json-api-nestjs": [ "libs/json-api/json-api-nestjs/src/index.ts" ] - } + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-api/json-api-nestjs/project.json b/libs/json-api/json-api-nestjs/project.json index 10694fc8..cba7e66b 100644 --- a/libs/json-api/json-api-nestjs/project.json +++ b/libs/json-api/json-api-nestjs/project.json @@ -1,7 +1,7 @@ { "name": "json-api-nestjs", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/json-api/json-api-nestjs/src", + "sourceRoot": "{projectRoot}/src", "projectType": "library", "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs", "type:publish"], "targets": { @@ -11,32 +11,16 @@ "{options.outputPath}" ], "options": { - "outputPath": "dist/libs/json-api/json-api-nestjs", - "tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs/package.json", - "main": "libs/json-api/json-api-nestjs/src/index.ts", + "outputPath": "dist/{projectRoot}", + "tsConfig": "{projectRoot}/tsconfig.lib.json", + "packageJson": "{projectRoot}/package.json", + "main": "{projectRoot}/src/index.ts", "assets": [ - "libs/json-api/json-api-nestjs/*.md" + "{projectRoot}/*.md" ], "buildableProjectDepsInPackageJsonType": "peerDependencies", - "generateExportsField": true - } - }, - "build-npm": { - "executor": "@nx/js:tsc", - "outputs": [ - "{options.outputPath}" - ], - "options": { - "outputPath": "node_modules/@klerick/json-api-nestjs", - "tsConfig": "libs/json-api/json-api-nestjs/tsconfig.lib.json", - "packageJson": "libs/json-api/json-api-nestjs/package.json", - "main": "libs/json-api/json-api-nestjs/src/index.ts", - "assets": [ - "libs/json-api/json-api-nestjs/*.md" - ], - "buildableProjectDepsInPackageJsonType": "peerDependencies", - "generateExportsField": true + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true } }, "nx-release-publish": { @@ -56,7 +40,7 @@ "{workspaceRoot}/coverage/{projectRoot}" ], "options": { - "jestConfig": "libs/json-api/json-api-nestjs/jest.config.ts", + "jestConfig": "{projectRoot}/jest.config.ts", "codeCoverage": true, "coverageReporters": [ "json-summary" @@ -64,6 +48,11 @@ } }, "ts-test": { + "dependsOn":[ { + "dependencies": true, + "target": "build", + "params": "ignore" + }], "executor": "nx:run-commands", "options": { "commands": [ @@ -86,7 +75,7 @@ ], "cwd": "./", "parallel": false, - "outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs" + "outputPath": "{workspaceRoot}/projectRoot}" } } }, diff --git a/libs/json-api/json-api-nestjs/tsconfig.spec.json b/libs/json-api/json-api-nestjs/tsconfig.spec.json index 2752a539..807e943f 100644 --- a/libs/json-api/json-api-nestjs/tsconfig.spec.json +++ b/libs/json-api/json-api-nestjs/tsconfig.spec.json @@ -9,7 +9,8 @@ "@klerick/json-api-nestjs-shared": [ "libs/json-api/json-api-nestjs-shared/src/index.ts" ] - } + }, + "allowJs": true }, "include": [ "jest.config.ts", diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/project.json b/libs/json-rpc/nestjs-json-rpc-sdk/project.json index 0e9067da..3f6cbc7b 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/project.json +++ b/libs/json-rpc/nestjs-json-rpc-sdk/project.json @@ -105,5 +105,5 @@ } } }, - "tags": [] + "tags": ["type:lib", "lib:nestjs-json-rpc", "lib:nestjs-json-rpc-sdk", "type:publish"] } diff --git a/libs/json-rpc/nestjs-json-rpc/project.json b/libs/json-rpc/nestjs-json-rpc/project.json index b40d8afb..2a845db5 100644 --- a/libs/json-rpc/nestjs-json-rpc/project.json +++ b/libs/json-rpc/nestjs-json-rpc/project.json @@ -50,5 +50,5 @@ } } }, - "tags": [] + "tags": ["type:lib", "lib:nestjs-json-rpc", "lib:nestjs-json-rpc", "type:publish"] } diff --git a/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts b/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts index 69ae8c9f..9ea44a8a 100644 --- a/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts +++ b/libs/json-rpc/nestjs-json-rpc/src/lib/modules/ws-socket-transport/filter/rpc-ws-error-exception.filter.spec.ts @@ -10,14 +10,20 @@ import { WS_EVENT_NAME } from '../constants'; describe('rpc-ws-error-exception.filter', () => { describe('WebSocket', () => { - const WebSocketInst = new WebSocket( - 'wss://demo.piesocket.com/v3/channel_123', - {} - ); + let WebSocketInst: WebSocket; let argumentsHost: ArgumentsHost; let getClient: () => WebSocket; - beforeEach(() => { + beforeAll(async () => { + WebSocketInst = new WebSocket( + 'wss://demo.piesocket.com/v3/channel_123', + {} + ); + + await new Promise((resolve) => { + WebSocketInst.addEventListener('open', (event) => resolve(void 0)); + }); + getClient = () => WebSocketInst; argumentsHost = { switchToWs(): WsArgumentsHost { @@ -26,6 +32,11 @@ describe('rpc-ws-error-exception.filter', () => { } as any; }, } as any; + WebSocketInst.onopen = () => console.log('open'); + }); + + afterAll(() => { + WebSocketInst.close(); }); it('should catch RpcError and transform it to RpcErrorObject', () => { @@ -76,7 +87,7 @@ describe('rpc-ws-error-exception.filter', () => { let argumentsHost: ArgumentsHost; let getClient: () => Socket; - beforeEach(() => { + beforeAll(() => { getClient = () => WebSocketInst; argumentsHost = { switchToWs(): WsArgumentsHost { @@ -87,6 +98,10 @@ describe('rpc-ws-error-exception.filter', () => { } as any; }); + afterAll(() => { + WebSocketInst.disconnect(); + }); + it('should catch RpcError and transform it to RpcErrorObject', () => { const filter = new RpcWsErrorExceptionFilter(); const exception = createError( diff --git a/nx.json b/nx.json index e649c707..38af183e 100644 --- a/nx.json +++ b/nx.json @@ -12,7 +12,9 @@ "!{projectRoot}/src/test-setup.[jt]s", "!{projectRoot}/test-setup.[jt]s" ], - "sharedGlobals": ["{workspaceRoot}/.github/**/*"] + "sharedGlobals": [ + "{workspaceRoot}/.github/**/*.yml" + ] }, "plugins": [ { @@ -73,29 +75,22 @@ }, "release": { "changelog": { + "automaticFromRef": true, "projectChangelogs": { "createRelease": "github" } }, "projectsRelationship": "independent", - "projects": [ - "*", - "!json-shared-type", - "!json-api-nestjs-shared", - "!json-api-server-e2e", - "!json-api-server", - "!json-api-front", - "!shared-utils", - "!typeorm-database", - "!microorm-database", - "!type-for-rpc" - ], + "projects": "tag:type:publish", "version": { - "preVersionCommand": "npx nx run-many -t build -p nestjs-json-rpc,nestjs-json-rpc-sdk,json-api-nestjs,json-api-nestjs-sdk", + "preVersionCommand": "npx nx run-many --projects=tag:type:publish --target=build --parallel", "conventionalCommits": true, "generatorOptions": { - "fallbackCurrentVersionResolver": "1.0.0" + "fallbackCurrentVersionResolver": "disk" } - } - } + }, + "releaseTagPattern": "{projectName}@{version}" + }, + "defaultBase": "master", + "nxCloudId": "67c859dd862a93f16da79c89" } diff --git a/package-lock.json b/package-lock.json index 79333af1..ba5c31b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,9 +78,9 @@ "@nx/webpack": "20.4.6", "@nx/workspace": "20.4.6", "@schematics/angular": "19.1.8", - "@swc-node/register": "1.9.2", - "@swc/core": "1.5.7", - "@swc/helpers": "0.5.11", + "@swc-node/register": "1.10.9", + "@swc/core": "1.11.7", + "@swc/helpers": "0.5.15", "@types/jest": "29.5.12", "@types/node": "~18.16.9", "@types/uuid": "^9.0.8", @@ -7653,6 +7653,152 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-1.12.0.tgz", + "integrity": "sha512-wYe+dlF8npM7cwopOOxbdNjtmJp17e/xF5c0K2WooQXy5VOh74icydM33+Uh/SZDgwyum09/U1FVCX5GdeQk+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-1.12.0.tgz", + "integrity": "sha512-FZxxp99om+SlvBr1cjzF8A3TjYcS0BInCqjUlM+2f9m9bPTR2Bng9Zq5Q09ZQyrKJjfGKqlOEHs3akuVOnrx3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-1.12.0.tgz", + "integrity": "sha512-BZi0iU6IEOnXGSkqt1OjTTkN9wfyaK6kTpQwL/axl8eCcNDc7wbv1vloHgILf7ozAY1TP75nsLYlASYI4B5kGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.12.0.tgz", + "integrity": "sha512-L2qnMEnZAqxbG9b1J3di/w/THIm+1fMVfbbTMWIQNMMXdMeqqDN6ojnOLDtuP564rAh4TBFPdLyEfGhMz6ipNA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.12.0.tgz", + "integrity": "sha512-otVbS4zeo3n71zgGLBYRTriDzc0zpruC0WI3ICwjpIk454cLwGV0yzh4jlGYWQJYJk0BRAmXFd3ooKIF+bKBHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.12.0.tgz", + "integrity": "sha512-IStQDjIT7Lzmqg1i9wXvPL/NsYsxF24WqaQFS8b8rxra+z0VG7saBOsEnOaa4jcEY8MVpLYabFhTV+fSsA2vnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.12.0.tgz", + "integrity": "sha512-SipT7EVORz8pOQSFwemOm91TpSiBAGmOjG830/o+aLEsvQ4pEy223+SAnCfITh7+AahldYsJnVoIs519jmIlKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-1.12.0.tgz", + "integrity": "sha512-mGh0XfUzKdn+WFaqPacziNraCWL5znkHRfQVxG9avGS9zb2KC/N1EBbPzFqutDwixGDP54r2gx4q54YCJEZ4iQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-1.12.0.tgz", + "integrity": "sha512-SZN6v7apKmQf/Vwiqb6e/s3Y2Oacw8uW8V2i1AlxtyaEFvnFE0UBn89zq6swEwE3OCajNWs0yPvgAXUMddYc7Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.12.0.tgz", + "integrity": "sha512-GRe4bqCfFsyghruEn5bv47s9w3EWBdO2q72xCz5kpQ0LWbw+enPHtTjw3qX5PUcFYpKykM55FaO0hFDs1yzatw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.12.0.tgz", + "integrity": "sha512-Z3llHH0jfJP4mlWq3DT7bK6qV+/vYe0+xzCgfc67+Tc/U3eYndujl880bexeGdGNPh87JeYznpZAOJ44N7QVVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@parcel/watcher": { "version": "2.5.0", "dev": true, @@ -8205,9 +8351,10 @@ "license": "MIT" }, "node_modules/@swc-node/core": { - "version": "1.13.1", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", + "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" }, @@ -8221,16 +8368,18 @@ } }, "node_modules/@swc-node/register": { - "version": "1.9.2", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.10.9.tgz", + "integrity": "sha512-iXy2sjP0phPEpK2yivjRC3PAgoLaT4sjSk0LDWCTdcTBJmR4waEog0E6eJbvoOkLkOtWw37SB8vCkl/bbh4+8A==", "dev": true, - "license": "MIT", "dependencies": { - "@swc-node/core": "^1.13.1", - "@swc-node/sourcemap-support": "^0.5.0", + "@swc-node/core": "^1.13.3", + "@swc-node/sourcemap-support": "^0.5.1", "colorette": "^2.0.20", - "debug": "^4.3.4", + "debug": "^4.3.5", + "oxc-resolver": "^1.10.2", "pirates": "^4.0.6", - "tslib": "^2.6.2" + "tslib": "^2.6.3" }, "funding": { "type": "github", @@ -8241,23 +8390,48 @@ "typescript": ">= 4.3" } }, + "node_modules/@swc-node/register/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@swc-node/register/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@swc-node/sourcemap-support": { - "version": "0.5.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", + "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", "dev": true, - "license": "MIT", "dependencies": { "source-map-support": "^0.5.21", - "tslib": "^2.6.2" + "tslib": "^2.6.3" } }, "node_modules/@swc/core": { - "version": "1.5.7", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.7.tgz", + "integrity": "sha512-ICuzjyfz8Hh3U16Mb21uCRJeJd/lUgV999GjgvPhJSISM1L8GDSB5/AMNcwuGs7gFywTKI4vAeeXWyCETUXHAg==", "dev": true, "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "0.1.7" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.19" }, "engines": { "node": ">=10" @@ -8267,19 +8441,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.7", - "@swc/core-darwin-x64": "1.5.7", - "@swc/core-linux-arm-gnueabihf": "1.5.7", - "@swc/core-linux-arm64-gnu": "1.5.7", - "@swc/core-linux-arm64-musl": "1.5.7", - "@swc/core-linux-x64-gnu": "1.5.7", - "@swc/core-linux-x64-musl": "1.5.7", - "@swc/core-win32-arm64-msvc": "1.5.7", - "@swc/core-win32-ia32-msvc": "1.5.7", - "@swc/core-win32-x64-msvc": "1.5.7" + "@swc/core-darwin-arm64": "1.11.7", + "@swc/core-darwin-x64": "1.11.7", + "@swc/core-linux-arm-gnueabihf": "1.11.7", + "@swc/core-linux-arm64-gnu": "1.11.7", + "@swc/core-linux-arm64-musl": "1.11.7", + "@swc/core-linux-x64-gnu": "1.11.7", + "@swc/core-linux-x64-musl": "1.11.7", + "@swc/core-win32-arm64-msvc": "1.11.7", + "@swc/core-win32-ia32-msvc": "1.11.7", + "@swc/core-win32-x64-msvc": "1.11.7" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -8288,12 +8462,13 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.7", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.7.tgz", + "integrity": "sha512-3+LhCP2H50CLI6yv/lhOtoZ5B/hi7Q/23dye1KhbSDeDprLTm/KfLJh/iQqwaHUponf5m8C2U0y6DD+HGLz8Yw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -8302,23 +8477,170 @@ "node": ">=10" } }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.7.tgz", + "integrity": "sha512-1diWpJqwX1XmOghf9ENFaeRaTtqLiqlZIW56RfOqmeZ7tPp3qS7VygWb9akptBsO5pEA5ZwNgSerD6AJlQcjAw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.7.tgz", + "integrity": "sha512-MV8+hLREf0NN23NuSKemsjFaWjl/HnqdOkE7uhXTnHzg8WTwp6ddVtU5Yriv15+d/ktfLWPVAOhLHQ4gzaoa8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.7.tgz", + "integrity": "sha512-5GNs8ZjHQy/UTSnzzn+gm1RCUpCYo43lsxYOl8mpcnZSfxkNFVpjfylBv0QuJ5qhdfZ2iU55+v4iJCwCMtw0nA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.7.tgz", + "integrity": "sha512-cTydaYBwDbVV5CspwVcCp9IevYWpGD1cF5B5KlBdjmBzxxeWyTAJRtKzn8w5/UJe/MfdAptarpqMPIs2f33YEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.7.tgz", + "integrity": "sha512-YAX2KfYPlbDsnZiVMI4ZwotF3VeURUrzD+emJgFf1g26F4eEmslldgnDrKybW7V+bObsH22cDqoy6jmQZgpuPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.7.tgz", + "integrity": "sha512-mYT6FTDZyYx5pailc8xt6ClS2yjKmP8jNHxA9Ce3K21n5qkKilI5M2N7NShwXkd3Ksw3F29wKrg+wvEMXTRY/A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.7.tgz", + "integrity": "sha512-uLDQEcv0BHcepypstyxKkNsW6KfLyI5jVxTbcxka+B2UnMcFpvoR87nGt2JYW0grO2SNZPoFz+UnoKL9c6JxpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.7.tgz", + "integrity": "sha512-wiq5G3fRizdxAJVFcon7zpyfbfrb+YShuTy+TqJ4Nf5PC0ueMOXmsmeuyQGApn6dVWtGCyymYQYt77wHeQajdA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.7.tgz", + "integrity": "sha512-/zQdqY4fHkSORxEJ2cKtRBOwglvf/8gs6Tl4Q6VMx2zFtFpIOwFQstfY5u8wBNN2Z+PkAzyUCPoi8/cQFK8HLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true }, "node_modules/@swc/helpers": { - "version": "0.5.11", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@swc/types": { - "version": "0.1.7", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.19.tgz", + "integrity": "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" } @@ -19801,6 +20123,28 @@ "node": ">=0.10.0" } }, + "node_modules/oxc-resolver": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-1.12.0.tgz", + "integrity": "sha512-YlaCIArvWNKCWZFRrMjhh2l5jK80eXnpYP+bhRc1J/7cW3TiyEY0ngJo73o/5n8hA3+4yLdTmXLNTQ3Ncz50LQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-darwin-arm64": "1.12.0", + "@oxc-resolver/binding-darwin-x64": "1.12.0", + "@oxc-resolver/binding-freebsd-x64": "1.12.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "1.12.0", + "@oxc-resolver/binding-linux-arm64-gnu": "1.12.0", + "@oxc-resolver/binding-linux-arm64-musl": "1.12.0", + "@oxc-resolver/binding-linux-x64-gnu": "1.12.0", + "@oxc-resolver/binding-linux-x64-musl": "1.12.0", + "@oxc-resolver/binding-wasm32-wasi": "1.12.0", + "@oxc-resolver/binding-win32-arm64-msvc": "1.12.0", + "@oxc-resolver/binding-win32-x64-msvc": "1.12.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "dev": true, diff --git a/package.json b/package.json index e4ac00e0..3f0835ce 100644 --- a/package.json +++ b/package.json @@ -83,9 +83,9 @@ "@nx/webpack": "20.4.6", "@nx/workspace": "20.4.6", "@schematics/angular": "19.1.8", - "@swc-node/register": "1.9.2", - "@swc/core": "1.5.7", - "@swc/helpers": "0.5.11", + "@swc-node/register": "1.10.9", + "@swc/core": "1.11.7", + "@swc/helpers": "0.5.15", "@types/jest": "29.5.12", "@types/node": "~18.16.9", "@types/uuid": "^9.0.8", From 985a4af11b1f2cebac70620a64e8a1f1dcafa37c Mon Sep 17 00:00:00 2001 From: Alex H Date: Mon, 10 Mar 2025 07:46:15 +0100 Subject: [PATCH 13/22] chore: bump nx version --- .nxignore | 5 +- .../json-api-nestjs-microorm/README.md | 19 +- .../json-api-nestjs-microorm/package.json | 14 +- .../json-api-nestjs-microorm/project.json | 6 + .../src/lib/micro-orm-json-api.module.ts | 1 - .../json-api/json-api-nestjs-sdk/package.json | 23 +- .../json-api/json-api-nestjs-sdk/project.json | 41 +- .../json-api-nestjs-sdk/tsconfig-mjs.lib.json | 1 + .../json-api/json-api-nestjs-shared/README.md | 12 +- .../json-api-nestjs-shared/package.json | 14 +- .../json-api-nestjs-shared/project.json | 16 +- .../json-api-nestjs-typeorm/README.md | 23 +- .../json-api-nestjs-typeorm/package.json | 16 +- .../json-api-nestjs-typeorm/project.json | 6 + libs/json-api/json-api-nestjs/README.md | 40 +- libs/json-api/json-api-nestjs/package.json | 36 +- libs/json-api/json-api-nestjs/src/index.ts | 5 +- .../check-item-entity.pipe.spec.ts | 6 +- .../json-api-transformer.service.spec.ts | 8 +- package-lock.json | 7606 +++++++++-------- package.json | 80 +- tools/scripts/publish.mjs | 49 +- tsconfig.base.json | 6 +- 23 files changed, 4455 insertions(+), 3578 deletions(-) diff --git a/.nxignore b/.nxignore index c429e119..93b40710 100644 --- a/.nxignore +++ b/.nxignore @@ -1,2 +1,3 @@ -**/*.test-d.ts -**/__test__/**/* +libs/**/*.test-d.ts +libs/json-api/**/___test___/ + diff --git a/libs/json-api/json-api-nestjs-microorm/README.md b/libs/json-api/json-api-nestjs-microorm/README.md index 03a6499f..d9e7ede4 100644 --- a/libs/json-api/json-api-nestjs-microorm/README.md +++ b/libs/json-api/json-api-nestjs-microorm/README.md @@ -1,11 +1,20 @@ # json-api-nestjs-microorm -This library was generated with [Nx](https://nx.dev). +MocroOrm adapter for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** -## Building +## Installation -Run `nx build json-api-nestjs-microorm` to build the library. +```bash +$ npm install @klerick/json-api-nestjs-microorm +``` -## Running unit tests +## Configuration params -Run `nx test json-api-nestjs-microorm` to execute the unit tests via [Jest](https://jestjs.io). +The following interface is using for the configuration: + +```typescript +export type MicroOrmParam = { + arrayType?: string[]; //Custom type for indicate of array +}; + +``` diff --git a/libs/json-api/json-api-nestjs-microorm/package.json b/libs/json-api/json-api-nestjs-microorm/package.json index aaf52996..c6cf0637 100644 --- a/libs/json-api/json-api-nestjs-microorm/package.json +++ b/libs/json-api/json-api-nestjs-microorm/package.json @@ -4,7 +4,19 @@ "type": "commonjs", "main": "./src/index.js", "types": "./src/index.d.ts", + "description": "MicroOrm adapter for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ], "dependencies": { - "tslib": "^2.3.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" } } diff --git a/libs/json-api/json-api-nestjs-microorm/project.json b/libs/json-api/json-api-nestjs-microorm/project.json index 3e450784..04be98fb 100644 --- a/libs/json-api/json-api-nestjs-microorm/project.json +++ b/libs/json-api/json-api-nestjs-microorm/project.json @@ -57,6 +57,12 @@ "options": { "packageRoot": "dist/{projectRoot}" } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-microorm {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] } }, "implicitDependencies": [ diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts index 41b41f07..2cf56d9b 100644 --- a/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/micro-orm-json-api.module.ts @@ -21,7 +21,6 @@ import { import { MicroOrmUtilService } from './service/micro-orm-util.service'; export class MicroOrmJsonApiModule { - static module = 'microOrm' as const; static forRoot(options: PrepareParams): DynamicModule { const optionProvider = { provide: MODULE_OPTIONS_TOKEN, diff --git a/libs/json-api/json-api-nestjs-sdk/package.json b/libs/json-api/json-api-nestjs-sdk/package.json index c625e8d3..8963af37 100644 --- a/libs/json-api/json-api-nestjs-sdk/package.json +++ b/libs/json-api/json-api-nestjs-sdk/package.json @@ -1,35 +1,20 @@ { "name": "@klerick/json-api-nestjs-sdk", "version": "9.0.0", - "engines": { - "node": ">= 16.0.0" - }, "description": "Helper for client JsonAPi Plugin for NestJs", - "contributors": [ - { - "email": "klerick666@gmain.com", - "name": "Aleksandr Kharkovey" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/klerick/nestjs-json-api.git" - }, - "private": false, - "license": "MIT", - "files": [ - "**/*" - ], "keywords": [ "nestjs", "nest", "jsonapi", "json-api", "typeorm", + "microorm", "CRUD" ], "dependencies": { - "tslib": ">2.3.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" }, "exports": { "./package.json": "./package.json", diff --git a/libs/json-api/json-api-nestjs-sdk/project.json b/libs/json-api/json-api-nestjs-sdk/project.json index 80c89842..7fa3ec1e 100644 --- a/libs/json-api/json-api-nestjs-sdk/project.json +++ b/libs/json-api/json-api-nestjs-sdk/project.json @@ -6,6 +6,15 @@ "tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs-sdk", "type:publish"], "targets": { "build-cjs": { + "dependsOn": [ + { + "projects": [ + "json-api-nestjs-shared" + ], + "target": "build", + "params": "ignore" + } + ], "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { @@ -17,15 +26,25 @@ "input": "{projectRoot}", "output": "../" }], - "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true, "additionalEntryPoints": [ "{projectRoot}/src/ngModule.ts" ], - "generateExportsField": true + "externalBuildTargets": ["build-cjs"] } }, "build-mjs": { + "dependsOn": [ + { + "projects": [ + "json-api-nestjs-shared" + ], + "target": "build", + "params": "ignore" + } + ], "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { @@ -37,12 +56,12 @@ "input": "{projectRoot}", "output": "../" }], - "updateBuildableProjectDepsInPackageJson": true, "buildableProjectDepsInPackageJsonType": "peerDependencies", + "generateExportsField": true, + "updateBuildableProjectDepsInPackageJson": true, "additionalEntryPoints": [ "{projectRoot}/src/ngModule.ts" - ], - "generateExportsField": true + ] } }, "build": { @@ -54,11 +73,7 @@ "outputPath": "dist/{projectRoot}", "commands": [ { - "command": "mv dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", - "forwardAllArgs": false - }, - { - "command": "rm -rf dist/{projectRoot}/mjs/package.json", + "command": "cp dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", "forwardAllArgs": false }, { @@ -78,6 +93,12 @@ "options": { "packageRoot": "dist/{projectRoot}" } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-sdk {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] } }, "implicitDependencies": ["json-api-nestjs-shared"] diff --git a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json index bf1f7f0e..2fb411e3 100644 --- a/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json +++ b/libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json @@ -3,6 +3,7 @@ "compilerOptions": { "outDir": "../../../dist/out-tsc", "declaration": true, + "module": "es2015", "target": "ES2022", "types": [ "node" diff --git a/libs/json-api/json-api-nestjs-shared/README.md b/libs/json-api/json-api-nestjs-shared/README.md index 8703f1bf..45bd9c0f 100644 --- a/libs/json-api/json-api-nestjs-shared/README.md +++ b/libs/json-api/json-api-nestjs-shared/README.md @@ -1,11 +1,9 @@ # json-api-nestjs-shared -This library was generated with [Nx](https://nx.dev). +Helper module for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** -## Building +## Installation -Run `nx build json-api-nestjs-shared` to build the library. - -## Running unit tests - -Run `nx test json-api-nestjs-shared` to execute the unit tests via [Jest](https://jestjs.io). +```bash +$ npm install @klerick/json-api-nestjs-shared +``` diff --git a/libs/json-api/json-api-nestjs-shared/package.json b/libs/json-api/json-api-nestjs-shared/package.json index f473d100..9f57500f 100644 --- a/libs/json-api/json-api-nestjs-shared/package.json +++ b/libs/json-api/json-api-nestjs-shared/package.json @@ -1,8 +1,20 @@ { "name": "@klerick/json-api-nestjs-shared", "version": "0.0.1", + "description": "Shared Helper for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ], "dependencies": { - "tslib": "^2.3.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" }, "type": "commonjs", "main": "./cjs/src/index.js", diff --git a/libs/json-api/json-api-nestjs-shared/project.json b/libs/json-api/json-api-nestjs-shared/project.json index 7afb38aa..7696c291 100644 --- a/libs/json-api/json-api-nestjs-shared/project.json +++ b/libs/json-api/json-api-nestjs-shared/project.json @@ -52,13 +52,10 @@ "build-mjs" ], "options": { + "outputPath": "dist/{projectRoot}", "commands": [ { - "command": "[ ! -f dist/{projectRoot}/cjs/package.json ] || mv dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", - "forwardAllArgs": false - }, - { - "command": "rm -rf dist/{projectRoot}/mjs/package.json", + "command": "[ ! -f dist/{projectRoot}/cjs/package.json ] || cp dist/{projectRoot}/cjs/package.json dist/{projectRoot}/package.json", "forwardAllArgs": false }, { @@ -66,7 +63,8 @@ "forwardAllArgs": false }, { - "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-shared" + "command": "ln -s $(pwd)/dist/{projectRoot} node_modules/@klerick/json-api-nestjs-shared", + "forwardAllArgs": false } ], "cwd": "./", @@ -99,6 +97,12 @@ "outputPath": "{workspaceRoot}/{projectRoot}" } }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-shared {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] + }, "nx-release-publish": { "options": { "packageRoot": "dist/{projectRoot}" diff --git a/libs/json-api/json-api-nestjs-typeorm/README.md b/libs/json-api/json-api-nestjs-typeorm/README.md index 44b26bc0..8121b63b 100644 --- a/libs/json-api/json-api-nestjs-typeorm/README.md +++ b/libs/json-api/json-api-nestjs-typeorm/README.md @@ -1,11 +1,24 @@ # json-api-nestjs-typeorm -This library was generated with [Nx](https://nx.dev). +TypeOrm adapter for **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** -## Building +## Installation -Run `nx build json-api-nestjs-typeorm` to build the library. +```bash +$ npm install @klerick/json-api-nestjs-typeorm +``` -## Running unit tests -Run `nx test json-api-nestjs-typeorm` to execute the unit tests via [Jest](https://jestjs.io). +## Configuration params + +The following interface is using for the configuration: + +```typescript +export type TypeOrmParam = { + useSoftDelete?: boolean // Use soft delete + runInTransaction?: any>( + isolationLevel: IsolationLevel, + fn: Func + ) => ReturnType // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional +}; +``` diff --git a/libs/json-api/json-api-nestjs-typeorm/package.json b/libs/json-api/json-api-nestjs-typeorm/package.json index 305ebaec..05a37cc8 100644 --- a/libs/json-api/json-api-nestjs-typeorm/package.json +++ b/libs/json-api/json-api-nestjs-typeorm/package.json @@ -2,9 +2,21 @@ "name": "@klerick/json-api-nestjs-typeorm", "version": "0.0.1", "dependencies": { - "tslib": "^2.3.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" }, "type": "commonjs", "main": "./src/index.js", - "typings": "./src/index.d.ts" + "typings": "./src/index.d.ts", + "description": "MicroOrm adapter for JsonApi Plugin for NestJs", + "keywords": [ + "nestjs", + "nest", + "jsonapi", + "json-api", + "typeorm", + "microorm", + "CRUD" + ] } diff --git a/libs/json-api/json-api-nestjs-typeorm/project.json b/libs/json-api/json-api-nestjs-typeorm/project.json index 7f1ca770..74981bfb 100644 --- a/libs/json-api/json-api-nestjs-typeorm/project.json +++ b/libs/json-api/json-api-nestjs-typeorm/project.json @@ -39,6 +39,12 @@ "parallel": false, "outputPath": "{workspaceRoot}/{projectRoot}" } + }, + "publish": { + "command": "node tools/scripts/publish.mjs json-api-nestjs-typeorm {args.ver} {args.tag}", + "dependsOn": [ + "build" + ] } }, "implicitDependencies": ["json-api-nestjs"] diff --git a/libs/json-api/json-api-nestjs/README.md b/libs/json-api/json-api-nestjs/README.md index ffa4bf6a..ca43d8f9 100644 --- a/libs/json-api/json-api-nestjs/README.md +++ b/libs/json-api/json-api-nestjs/README.md @@ -18,7 +18,7 @@ need to write any code. ## Installation ```bash -$ npm install json-api-nestjs +$ npm install @klerick/json-api-nestjs ``` ## Example @@ -27,7 +27,8 @@ Once the installation process is complete, we can import the **JsonApiModule** i ### TypeOrm ```typescript import {Module} from '@nestjs/common'; -import {JsonApiModule, TypeOrmJsonApiModule} from 'json-api-nestjs'; +import {JsonApiModule} from '@klerick/json-api-nestjs'; +import {TypeOrmJsonApiModule} from '@klerick/json-api-nestjs-typeorm'; import {Users} from 'type-orm/database'; @Module({ @@ -44,7 +45,8 @@ export class AppModule { ### MicroOrm ```typescript import {Module} from '@nestjs/common'; -import {JsonApiModule, MicroOrmJsonApiModule} from 'json-api-nestjs'; +import {JsonApiModule} from '@klerick/json-api-nestjs'; +import {MicroOrmJsonApiModule} from '@klerick/json-api-nestjs-microorm'; import {Users} from 'micro-orm/database'; @Module({ @@ -86,15 +88,8 @@ export interface ModuleOptions { debug?: boolean; // Debug info in result object, like error message pipeForId?: Type // Nestjs pipe for validate id params, by default ParseIntPipe operationUrl?: string // Url for atomic operation https://jsonapi.org/ext/atomic/ - // TypeOrm - useSoftDelete?: boolean // Use soft delete - runInTransaction?: any>( - isolationLevel: IsolationLevel, - fn: Func - ) => ReturnType // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional - // MicroOrm - arrayType?: string[]; //Custom type for indicate of array - }; + // You can add params for MicroOrm or TypeOrm adapter + } ; } ``` @@ -110,9 +105,11 @@ import { JsonBaseController, InjectService, JsonApiService, - ResourceObjectRelationships, Query, -} from 'json-api-nestjs'; +} from '@klerick/json-api-nestjs'; +import { + ResourceObjectRelationships, +} from '@klerick/json-api-nestjs-shared'; import {ExampleService} from '../../service/example/example.service'; @JsonApi(Users, { @@ -120,11 +117,11 @@ import {ExampleService} from '../../service/example/example.service'; requiredSelectField: true, overrideRoute: 'user', }) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; - public override getAll(query: Query): Promise> { + public override getAll(query: Query): Promise> { if (!this.exampleService.someCheck(query)) { throw new BadRequestException({}); } @@ -135,7 +132,7 @@ export class ExtendUserController extends JsonBaseController { id: string | number, relName: Rel, input: PatchRelationshipData - ): Promise> { + ): Promise> { return super.patchRelationship(id, relName, input); } @@ -168,12 +165,12 @@ import { requiredSelectField: true, overrideRoute: 'user', }) -export class ExtendUserController extends JsonBaseController { +export class ExtendUserController extends JsonBaseController { @InjectService() public service: JsonApiService; @Inject(ExampleService) protected exampleService: ExampleService; public override getAll( - @Query(ExamplePipe) query: QueryType + @Query(ExamplePipe) query: QueryType ): Promise> { return super.getAll(query); } @@ -186,8 +183,8 @@ import { ArgumentMetadata, PipeTransform } from '@nestjs/common'; import { Query } from 'json-api-nestjs'; import { Users } from 'database'; -export class ExamplePipe implements PipeTransform, Query> { - transform(value: Query, metadata: ArgumentMetadata): Query { +export class ExamplePipe implements PipeTransform, Query> { + transform(value: Query, metadata: ArgumentMetadata): Query { return value; } } @@ -200,6 +197,7 @@ For using swagger, you should only add [@nestjs/swagger](https://docs.nestjs.com const app = await NestFactory.create(AppModule); const config = new DocumentBuilder() + .setOpenAPIVersion('3.1.0') .setTitle('JSON API swagger example') .setDescription('The JSON API list example') .setVersion('1.0') diff --git a/libs/json-api/json-api-nestjs/package.json b/libs/json-api/json-api-nestjs/package.json index ce431afa..bb8b9499 100644 --- a/libs/json-api/json-api-nestjs/package.json +++ b/libs/json-api/json-api-nestjs/package.json @@ -1,26 +1,8 @@ { "name": "@klerick/json-api-nestjs", "version": "9.0.0", - "engines": { - "node": ">= 16.0.0" - }, "type": "commonjs", "description": "JsonApi Plugin for NestJs", - "contributors": [ - { - "email": "klerick666@gmain.com", - "name": "Aleksandr Kharkovey" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/klerick/nestjs-json-api.git" - }, - "private": false, - "license": "MIT", - "files": [ - "**/*" - ], "keywords": [ "nestjs", "nest", @@ -30,21 +12,9 @@ "microorm", "CRUD" ], - "peerDependencies": { - "reflect-metadata": "^0.1.13", - "tslib": "^2.3.0", - "@mikro-orm/core": "^6.0.0 || ^6.0.0-dev.0", - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/swagger": "^7.3.0", - "@nestjs/typeorm": "^10.0.0", - "@mikro-orm/knex": "^6.0.0", - "typeorm": "^0.3.20" - }, "dependencies": { - "@anatine/zod-openapi": "^2.0.0", - "zod": "^3.24.0", - "zod-validation-error": "^3.4.0", - "uuid": "^10.0.0" + "tslib": ">2.3.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" } } diff --git a/libs/json-api/json-api-nestjs/src/index.ts b/libs/json-api/json-api-nestjs/src/index.ts index 49c2b9bf..48b2b225 100644 --- a/libs/json-api/json-api-nestjs/src/index.ts +++ b/libs/json-api/json-api-nestjs/src/index.ts @@ -2,7 +2,10 @@ export { JsonApiModule } from './lib/json-api.module'; export { JsonBaseController } from './lib/modules/mixin/controllers/json-base.controller'; export { JsonApi, InjectService } from './lib/modules/mixin/decorators'; -export { entityForClass } from './lib/modules/mixin/helpers/utils'; +export { + entityForClass, + excludeMethod, +} from './lib/modules/mixin/helpers/utils'; export { PrepareParams, NestProvider, diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts index a8e52f7d..64de13f0 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/pipe/check-item-entity/check-item-entity.pipe.spec.ts @@ -1,13 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; import { NotFoundException } from '@nestjs/common'; +import { EntityClass } from '@klerick/json-api-nestjs-shared'; import { CheckItemEntityPipe } from './check-item-entity.pipe'; import { CURRENT_ENTITY, FIND_ONE_ROW_ENTITY } from '../../../../constants'; -import { EntityTarget } from 'typeorm/common/EntityTarget'; describe('CheckItemEntityPipe', () => { let pipe: CheckItemEntityPipe; let mockFindOneRowEntity: jest.Mock; - let mockEntityTarget: EntityTarget; + let mockEntityTarget: EntityClass; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -19,7 +19,7 @@ describe('CheckItemEntityPipe', () => { }).compile(); pipe = module.get>(CheckItemEntityPipe); - mockEntityTarget = module.get>(CURRENT_ENTITY); + mockEntityTarget = module.get>(CURRENT_ENTITY); mockFindOneRowEntity = module.get(FIND_ONE_ROW_ENTITY); }); diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts index a5729b22..74b11cf4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/json-api-transformer.service.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ApplicationConfig } from '@nestjs/core'; import { faker } from '@faker-js/faker'; - +import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; import { JsonApiTransformerService } from './json-api-transformer.service'; import { EntityParamMapService } from './entity-param-map.service'; import { usersEntityParamMapMockData } from '../../../utils/___test___/test.helper'; @@ -12,8 +12,6 @@ import { Comments, } from '../../../utils/___test___/test-classes.helper'; import { EntityParam } from '../../../types'; -import { Collection } from '@mikro-orm/core'; -import { PropertyKeys } from '@klerick/json-api-nestjs-shared'; describe('JsonApiTransformerService - extractAttributes', () => { let service: JsonApiTransformerService; @@ -134,7 +132,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { key: faker.string.alphanumeric(5), name: faker.word.words(), }, - ] as unknown as Collection; + ] as any; userObject.manager = null as any; }); @@ -255,7 +253,7 @@ describe('JsonApiTransformerService - extractAttributes', () => { roleFake.key = faker.string.alphanumeric(5); roleFake.name = faker.word.words(); - userObject.roles = [roleFake] as unknown as Collection; + userObject.roles = [roleFake] as any; userObject.manager = null as any; }); diff --git a/package-lock.json b/package-lock.json index ba5c31b0..daadefb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,14 @@ "license": "MIT", "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.1.7", - "@angular/common": "19.1.7", - "@angular/compiler": "19.1.7", - "@angular/core": "19.1.7", - "@angular/forms": "19.1.7", - "@angular/platform-browser": "19.1.7", - "@angular/platform-browser-dynamic": "19.1.7", - "@angular/router": "19.1.7", + "@angular/animations": "^19.2.1", + "@angular/common": "^19.2.1", + "@angular/compiler": "^19.2.1", + "@angular/core": "^19.2.1", + "@angular/forms": "^19.2.1", + "@angular/platform-browser": "^19.2.1", + "@angular/platform-browser-dynamic": "^19.2.1", + "@angular/router": "^19.2.1", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", @@ -52,32 +52,32 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.1.8", - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@angular-eslint/eslint-plugin": "19.1.0", - "@angular-eslint/eslint-plugin-template": "19.1.0", - "@angular-eslint/template-parser": "19.1.0", - "@angular/cli": "~19.1.0", - "@angular/compiler-cli": "19.1.7", - "@angular/language-service": "19.1.7", + "@angular-devkit/build-angular": "19.2.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@angular-eslint/eslint-plugin": "19.2.0", + "@angular-eslint/eslint-plugin-template": "19.2.0", + "@angular-eslint/template-parser": "19.2.0", + "@angular/cli": "~19.2.0", + "@angular/compiler-cli": "19.2.1", + "@angular/language-service": "19.2.1", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", "@nestjs/schematics": "^11.0.1", "@nestjs/testing": "^11.0.10", - "@nx/angular": "20.4.6", - "@nx/eslint": "20.4.6", - "@nx/eslint-plugin": "20.4.6", - "@nx/jest": "20.4.6", - "@nx/js": "20.4.6", - "@nx/nest": "20.4.6", - "@nx/node": "20.4.6", - "@nx/web": "20.4.6", - "@nx/webpack": "20.4.6", - "@nx/workspace": "20.4.6", - "@schematics/angular": "19.1.8", + "@nx/angular": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/eslint-plugin": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", + "@nx/nest": "20.5.0", + "@nx/node": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", + "@schematics/angular": "19.2.1", "@swc-node/register": "1.10.9", "@swc/core": "1.11.7", "@swc/helpers": "0.5.15", @@ -96,8 +96,8 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.1.2", - "nx": "20.4.6", + "ng-packagr": "19.2.0", + "nx": "20.5.0", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", @@ -107,8 +107,11 @@ "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", "typescript": "5.7.3", - "verdaccio": "^5.0.4", + "verdaccio": "6.0.5", "webpack-cli": "^5.1.4" + }, + "engines": { + "node": ">= 20.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -121,8 +124,9 @@ }, "node_modules/@adobe/css-tools": { "version": "4.3.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true }, "node_modules/@ampproject/remapping": { "version": "2.3.0", @@ -148,11 +152,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.8", + "version": "0.1902.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.1.tgz", + "integrity": "sha512-iCm6F4HYO5aIgjzhjOUPKnyFHcn6yVE8gCpjWFQL8JVqrVzFG27vMZ0wK8b8rMDIDt6/hr2FOSSwChVg/cv9GQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", + "@angular-devkit/core": "19.2.1", "rxjs": "7.8.1" }, "engines": { @@ -162,26 +167,27 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.1.tgz", + "integrity": "sha512-YJdHON1005lBzXFFfTJBrcFvbgWMEhvkziQw1IuQpbl+aa2XbkPnBFbT/d5FWjQpIWVpPYRMMMCSVSqeICYUcg==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.8", - "@angular-devkit/build-webpack": "0.1901.8", - "@angular-devkit/core": "19.1.8", - "@angular/build": "19.1.8", - "@babel/core": "7.26.0", - "@babel/generator": "7.26.3", + "@angular-devkit/architect": "0.1902.1", + "@angular-devkit/build-webpack": "0.1902.1", + "@angular-devkit/core": "19.2.1", + "@angular/build": "19.2.1", + "@babel/core": "7.26.9", + "@babel/generator": "7.26.9", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.25.9", + "@babel/plugin-transform-async-generator-functions": "7.26.8", "@babel/plugin-transform-async-to-generator": "7.25.9", - "@babel/plugin-transform-runtime": "7.25.9", - "@babel/preset-env": "7.26.0", - "@babel/runtime": "7.26.0", + "@babel/plugin-transform-runtime": "7.26.9", + "@babel/preset-env": "7.26.9", + "@babel/runtime": "7.26.9", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.1.8", + "@ngtools/webpack": "19.2.1", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -189,13 +195,13 @@ "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.24.2", + "esbuild-wasm": "0.25.0", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.3", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.1", + "less": "4.2.2", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", @@ -204,19 +210,19 @@ "ora": "5.4.1", "picomatch": "4.0.2", "piscina": "4.8.0", - "postcss": "8.4.49", + "postcss": "8.5.2", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.83.1", - "sass-loader": "16.0.4", - "semver": "7.6.3", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.37.0", + "terser": "5.39.0", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.97.1", + "webpack": "5.98.0", "webpack-dev-middleware": "7.4.2", "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", @@ -228,23 +234,23 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.24.2" + "esbuild": "0.25.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.8", - "@web/test-runner": "^0.19.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.1", + "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^19.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -293,38 +299,11 @@ "node": ">=14.17.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/less": { - "version": "4.2.1", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -373,8 +352,9 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -386,8 +366,9 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -395,162 +376,34 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=6" } }, - "node_modules/@angular-devkit/build-angular/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", - "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", - "dev": true, - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "hasInstallScript": true, - "peer": true, "bin": { - "esbuild": "bin/esbuild" + "semver": "bin/semver.js" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" + "node": ">=10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, + "optional": true, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { @@ -566,26 +419,13 @@ "node": ">=18.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1901.8", + "version": "0.1902.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.1.tgz", + "integrity": "sha512-KXvYkxvdun90GxAzaHIXkIKaYeJY9kQ89xaFXOaaJi6a9a+EkovnkHSPwPQ6uNqJo/zbwU5jKkT/rI/g+5D5Bg==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/architect": "0.1902.1", "rxjs": "7.8.1" }, "engines": { @@ -599,9 +439,10 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.1.tgz", + "integrity": "sha512-DYsoU8emxmBkfIKI693BNUqocwHTVHLjgybyD5nU1qMOH+D/jqEzL5bQbjhUeqeARyrzDg7tyPM5Xno+GsS7KQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -656,11 +497,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.1.tgz", + "integrity": "sha512-IVWXGROEACyV+YH/s9xvpbLVblK55GvqldZRCMvpevtXMJy1aubOPOB+8TkHOVBlmAteW/5I7ouDbQWVZjNfww==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", + "@angular-devkit/core": "19.2.1", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -673,17 +515,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.1.0", - "dev": true, - "license": "MIT" + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.2.0.tgz", + "integrity": "sha512-hmmAogTpYGbBvnJ0j7DNLi8YQ+YEEuwFdx0heU8XjTpZlRoSRIP7MJJVlaQCt+ZT5f5XwdGtqi9lOXqqcyGHLA==", + "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.1.0", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.2.0.tgz", + "integrity": "sha512-QQWWDrTdJ22tBd7RLFG/FdPwNyYEhg7YwWgn29z6XcdnV00ZFtf7FRbv/te1kqVNPvfjtht7bvtHcPQ432aUdQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", - "@angular-eslint/utils": "19.1.0" + "@angular-eslint/bundled-angular-compiler": "19.2.0", + "@angular-eslint/utils": "19.2.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -692,12 +536,13 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.1.0", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.2.0.tgz", + "integrity": "sha512-lUSzmk5/Dr0bNc2Omb5CZDu3zQZh70bJyuXnN5MKd00V1b3u90eqvMSveFzWFJ6Eot8Hh8+FxtiozPwGqOE+Og==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", - "@angular-eslint/utils": "19.1.0", + "@angular-eslint/bundled-angular-compiler": "19.2.0", + "@angular-eslint/utils": "19.2.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, @@ -709,11 +554,12 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "19.1.0", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.2.0.tgz", + "integrity": "sha512-VqgvFrILhoMe0GHZrx+Bjy8kx7/LJfJTd+x/wzE/X1cCChSU81MBZFMVeFMnoI75OOQUf4fwaaKrtUhUvAkVyw==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0", + "@angular-eslint/bundled-angular-compiler": "19.2.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -722,11 +568,12 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "19.1.0", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.2.0.tgz", + "integrity": "sha512-1XQXzIqYadKUxcAgW1DPev56SVbR8Uld6TthgolU7rfIX23RYMIIRtQlrQCk7zoXLXm5fzcGqjTR4wHfoD+iWg==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.1.0" + "@angular-eslint/bundled-angular-compiler": "19.2.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -735,8 +582,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.1.tgz", + "integrity": "sha512-I67XYXBic9bM+yfce6Dqa950TsrEWB6uwSB2l6eIg3Byp48yJxQYbyjvjDbMXPieU2Bzo8FYVSD+lc8cF4+L6A==", "dependencies": { "tslib": "^2.3.0" }, @@ -744,39 +592,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.7" + "@angular/core": "19.2.1" } }, "node_modules/@angular/build": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.1.tgz", + "integrity": "sha512-+gRcH2F+qGSN/JRT5J650FzXW2kPrhjoSwOMYW06zhSpyX+oDZenFygUxORNhb5CnXJyZf/L5UEj6ypUojx4KQ==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.8", - "@angular-devkit/core": "19.1.8", - "@babel/core": "7.26.0", + "@angular-devkit/architect": "0.1902.1", + "@babel/core": "7.26.9", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.1", + "@inquirer/confirm": "5.1.6", "@vitejs/plugin-basic-ssl": "1.2.0", "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.2", + "esbuild": "0.25.0", "fast-glob": "3.3.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", "magic-string": "0.30.17", - "mrmime": "2.0.0", + "mrmime": "2.0.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.8.0", - "rollup": "4.30.1", - "sass": "1.83.1", - "semver": "7.6.3", - "vite": "6.0.11", + "rollup": "4.34.8", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.2.0", "watchpack": "2.4.2" }, "engines": { @@ -785,20 +634,21 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.2.2" + "lmdb": "3.2.6" }, "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.8", + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.1", + "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^19.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -813,6 +663,9 @@ "@angular/ssr": { "optional": true }, + "karma": { + "optional": true + }, "less": { "optional": true }, @@ -827,139 +680,58 @@ } } }, - "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", + "node_modules/@angular/build/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.21.3" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "engines": { + "node": ">=10" } }, - "node_modules/@angular/build/node_modules/vite": { - "version": "6.0.11", + "node_modules/@angular/cli": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.1.tgz", + "integrity": "sha512-0ioZmuaapsbndXhpoUAew1uA4RFhNEa16kKgYPw5XlouaS2SLLrzC4nLW9DPJv6XrkOsOebf+OpyyHazzdFoSw==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "@angular-devkit/architect": "0.1902.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@inquirer/prompts": "7.3.2", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.2.1", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.7.1", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" }, "bin": { - "vite": "bin/vite.js" + "ng": "bin/ng.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@angular/cli": { - "version": "19.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.1901.8", - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@inquirer/prompts": "7.2.1", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.8", - "@yarnpkg/lockfile": "1.1.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.1", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", - "resolve": "1.22.10", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/hosted-git-info": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/hosted-git-info": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -967,13 +739,15 @@ }, "node_modules/@angular/cli/node_modules/lru-cache": { "version": "10.4.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "12.0.1", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -986,8 +760,9 @@ }, "node_modules/@angular/cli/node_modules/proc-log": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, - "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -1011,17 +786,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular/cli/node_modules/validate-npm-package-name": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", + "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, - "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@angular/common": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.1.tgz", + "integrity": "sha512-k+ikxn6SlWXxXEtwRmsYZeknf3a6n3Oicde6zTLBrD/Rie/u0+okuoQcuYjntQWGgH//QBQxH4UQpvRw51AR8w==", "dependencies": { "tslib": "^2.3.0" }, @@ -1029,13 +818,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.7", + "@angular/core": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.1.tgz", + "integrity": "sha512-yCN/lgXMvMsPtEmTChd621zV17RLn+flhcJ6mNZjyGA7zx16m5zity4/00G6phbGfG8WXOtH5vQ/k7nnO7wS4A==", "dependencies": { "tslib": "^2.3.0" }, @@ -1043,7 +833,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.7" + "@angular/core": "19.2.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -1052,11 +842,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.7", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.1.tgz", + "integrity": "sha512-5uuUx0ibX7cQP7eSBaJzfZlU0Hbe0kLwc85uCnH47hfzCsd3u2VU623IZIN7ctaInoOFBjl9fUUqKnFuYibC/w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", @@ -1074,8 +865,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.7", - "typescript": ">=5.5 <5.8" + "@angular/compiler": "19.2.1", + "typescript": ">=5.5 <5.9" } }, "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { @@ -1084,8 +875,9 @@ "license": "Apache-2.0" }, "node_modules/@angular/core": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.1.tgz", + "integrity": "sha512-gwdytbZSM9m5v9PhRsvh6Q13vI1Ydcx52QGs93bpWx5ACOGYGp/Y7zc2mcZb1aUM63zGBTpS9Qw9bEsPHeLZPA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1098,8 +890,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.1.tgz", + "integrity": "sha512-a+ifgpX5ie2KgTNI9m8tJWS+ym51u3LZ8Kd67dXX7+CbYe9RzdIgVtuXcTklrP1fmmhfKnQVNmsUqpAYAjrByg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1107,23 +900,25 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "19.1.7", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.1.tgz", + "integrity": "sha512-JJPxFQp3tbKy6xSKLHMYUA6SOBxtJoOKDNAasj8tNrgZLgxtGABWz3kPNlgzpVQ6HHyderrzPhDir9aQDooSJQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.1.tgz", + "integrity": "sha512-omBNCMk0Gim+HntrofVQR8dOY2zLCFOW02+FX4y57QvuDBh/FpFfnQ14xxx1Y4qEgGculEcBe914uJlxr4ccIg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1131,9 +926,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.7", - "@angular/common": "19.1.7", - "@angular/core": "19.1.7" + "@angular/animations": "19.2.1", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1142,8 +937,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.1.tgz", + "integrity": "sha512-jYEXI2CymdK8R27YKy/q0O36dZwSdbIyJAjX9vPTgAsORGwX8hdhm5NJwkKlOWT+ccf2ySUatJD7RCElhsEBNA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1151,15 +947,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/compiler": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7" + "@angular/common": "19.2.1", + "@angular/compiler": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1" } }, "node_modules/@angular/router": { - "version": "19.1.7", - "license": "MIT", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.1.tgz", + "integrity": "sha512-HZTewSLnHpNbnOnTp9X7r17/eb8h3ex/b8da6z2OPpC3diV7EZsrrjrLpdkzm3wpuapaVATzRgC4I4gN8XwTxA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1167,9 +964,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.7", - "@angular/core": "19.1.7", - "@angular/platform-browser": "19.1.7", + "@angular/common": "19.2.1", + "@angular/core": "19.2.1", + "@angular/platform-browser": "19.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1187,28 +984,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1237,12 +1036,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1263,11 +1063,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1338,9 +1139,10 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -1404,9 +1206,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1457,8 +1260,9 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -1504,23 +1308,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -1865,13 +1671,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -1897,11 +1704,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2089,11 +1897,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -2267,11 +2076,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2458,12 +2268,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz", + "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -2528,11 +2339,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2542,11 +2354,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2632,13 +2445,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -2650,9 +2464,9 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -2663,21 +2477,21 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -2693,17 +2507,17 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -2713,6 +2527,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "dev": true, @@ -2753,9 +2580,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", "dev": true, - "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2764,28 +2592,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2794,9 +2624,10 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -2810,6 +2641,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", + "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", + "dev": true + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "devOptional": true, @@ -2831,9 +2668,10 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.1", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz", + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -2841,16 +2679,16 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.10.4", + "qs": "6.13.1", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2858,37 +2696,38 @@ "node": ">= 6" } }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dev": true, - "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.12" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.10.4", + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "tldts": "^6.1.32" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, "node_modules/@cypress/request/node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -2943,7 +2782,6 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } @@ -2960,7 +2798,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -2977,7 +2814,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -2994,18 +2830,18 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3026,7 +2862,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -3043,7 +2878,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3060,7 +2894,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3077,7 +2910,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3094,7 +2926,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3111,7 +2942,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3128,7 +2958,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3145,7 +2974,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3162,7 +2990,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3179,7 +3006,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3196,7 +3022,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3213,7 +3038,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -3230,7 +3054,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3247,7 +3070,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3264,7 +3086,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3281,7 +3102,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -3298,7 +3118,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -3315,7 +3134,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -3332,7 +3150,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -3349,7 +3166,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -3538,8 +3354,9 @@ }, "node_modules/@inquirer/checkbox": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -3560,20 +3377,26 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.1", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" - } - }, + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/core": { "version": "10.1.7", "dev": true, @@ -3613,8 +3436,9 @@ }, "node_modules/@inquirer/editor": { "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -3634,8 +3458,9 @@ }, "node_modules/@inquirer/expand": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -3663,8 +3488,9 @@ }, "node_modules/@inquirer/input": { "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" @@ -3683,8 +3509,9 @@ }, "node_modules/@inquirer/number": { "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" @@ -3703,8 +3530,9 @@ }, "node_modules/@inquirer/password": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -3723,32 +3551,39 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.2.1", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.4", - "@inquirer/confirm": "^5.1.1", - "@inquirer/editor": "^4.2.1", - "@inquirer/expand": "^4.0.4", - "@inquirer/input": "^4.1.1", - "@inquirer/number": "^3.0.4", - "@inquirer/password": "^4.0.4", - "@inquirer/rawlist": "^4.0.4", - "@inquirer/search": "^3.0.4", - "@inquirer/select": "^4.0.4" + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/rawlist": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", @@ -3768,8 +3603,9 @@ }, "node_modules/@inquirer/search": { "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -3790,8 +3626,9 @@ }, "node_modules/@inquirer/select": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", @@ -4463,8 +4300,9 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -4574,17 +4412,83 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.2.2", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "license": "MIT", @@ -4834,23 +4738,24 @@ } }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", + "integrity": "sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.8.12", + "@module-federation/sdk": "0.9.1", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/data-prefetch": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.8.12.tgz", - "integrity": "sha512-YjCk6KPBQ4Ml2/2aIKQt11I4jBKOTvK3xHyAQMKPpX5aBbMEwonDhkpTitygUw3SMBdi3CP1KMRDJ3suj3O6Mg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", + "integrity": "sha512-rS1AsgRvIMAWK8oMprEBF0YQ3WvsqnumjinvAZU1Dqut5DICmpQMTPEO1OrAKyjO+PQgEhmq13HggzN6ebGLrQ==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.8.12", - "@module-federation/sdk": "0.8.12", + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -4859,21 +4764,22 @@ } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.1.tgz", + "integrity": "sha512-DezBrFaIKfDcEY7UhqyO1WbYocERYsR/CDN8AV6OvMnRlQ8u0rgM8qBUJwx0s+K59f+CFQFKEN4C8p7naCiHrw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.8.12", - "@module-federation/managers": "0.8.12", - "@module-federation/sdk": "0.8.12", - "@module-federation/third-party-dts-extractor": "0.8.12", + "@module-federation/error-codes": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", + "@module-federation/third-party-dts-extractor": "0.9.1", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.7.4", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "2.15.3", + "koa": "2.15.4", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -4891,20 +4797,21 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "0.8.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.8.12", - "@module-federation/data-prefetch": "0.8.12", - "@module-federation/dts-plugin": "0.8.12", - "@module-federation/error-codes": "0.8.12", - "@module-federation/inject-external-runtime-core-plugin": "0.8.12", - "@module-federation/managers": "0.8.12", - "@module-federation/manifest": "0.8.12", - "@module-federation/rspack": "0.8.12", - "@module-federation/runtime-tools": "0.8.12", - "@module-federation/sdk": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.1.tgz", + "integrity": "sha512-c9siKVjcgT2gtDdOTqEr+GaP2X/PWAS0OV424ljKLstFL1lcS/BIsxWFDmxPPl5hDByAH+1q4YhC1LWY4LNDQw==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/data-prefetch": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/error-codes": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/rspack": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1", "btoa": "^1.2.1", "upath": "2.0.1" }, @@ -4926,49 +4833,54 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.8.12", - "dev": true, - "license": "MIT" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.1.tgz", + "integrity": "sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==", + "dev": true }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.1.tgz", + "integrity": "sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==", "dev": true, - "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.8.12" + "@module-federation/runtime-tools": "0.9.1" } }, "node_modules/@module-federation/managers": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.1.tgz", + "integrity": "sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.8.12", + "@module-federation/sdk": "0.9.1", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.1.tgz", + "integrity": "sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.8.12", - "@module-federation/managers": "0.8.12", - "@module-federation/sdk": "0.8.12", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node": { - "version": "2.6.26", + "version": "2.6.28", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.28.tgz", + "integrity": "sha512-0N0vb4wRRvbKXWQUIWcurvBYHXzkzV8M1yzhhQzeYAVGyfGMmx/WRXPLTld6rEk1iymRuhyC7gYNcA1TnXDb6w==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.9.0", - "@module-federation/runtime": "0.9.0", - "@module-federation/sdk": "0.9.0", - "@module-federation/utilities": "3.1.44", + "@module-federation/enhanced": "0.10.0", + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0", + "@module-federation/utilities": "3.1.46", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -4991,23 +4903,24 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.10.0.tgz", + "integrity": "sha512-wvqsjqqVXNI36Q98zFFK4saBFH3M+kJC9c/UZfGIWC86kBVRgWDOKphP4nF+cpjJsFEexoGCNefUswqsx14Y1Q==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.9.0", + "@module-federation/sdk": "0.10.0", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.0.tgz", - "integrity": "sha512-KFC3lOzW/Hwvcgm/tn7075fqC/ONhA+5zPqDz090EsCQqnWQHodzx0XF88/tTvWdfc3mYK9BGYfsnpjlVGT1zA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.10.0.tgz", + "integrity": "sha512-aXomkuNNTNhJmU9TQALvvRbf8NlDkPd3Q3iGJ817qAwnHIXAQ3x9nRtWqhAIovQra3R7i3u3KI1hIe0ivTIrNg==", "dev": true, "dependencies": { - "@module-federation/runtime": "0.9.0", - "@module-federation/sdk": "0.9.0", + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -5016,14 +4929,15 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.10.0.tgz", + "integrity": "sha512-RP5Rv0dhU2OovcMKjnMIoi6ybcS2vftT/v5Ia5qCHIyl3YtvbqS1Eo4C59sKEfnYUkGYMFZxjPhKNZjKVfrATg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.9.0", - "@module-federation/managers": "0.9.0", - "@module-federation/sdk": "0.9.0", - "@module-federation/third-party-dts-extractor": "0.9.0", + "@module-federation/error-codes": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/sdk": "0.10.0", + "@module-federation/third-party-dts-extractor": "0.10.0", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.7.4", @@ -5048,20 +4962,21 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.9.0", - "@module-federation/data-prefetch": "0.9.0", - "@module-federation/dts-plugin": "0.9.0", - "@module-federation/error-codes": "0.9.0", - "@module-federation/inject-external-runtime-core-plugin": "0.9.0", - "@module-federation/managers": "0.9.0", - "@module-federation/manifest": "0.9.0", - "@module-federation/rspack": "0.9.0", - "@module-federation/runtime-tools": "0.9.0", - "@module-federation/sdk": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.10.0.tgz", + "integrity": "sha512-JN6LXGM2mu17JaXJMRZVSwbsxnBDO+6vz2VcQAwnlAQkBn2dvTwBBj0YyCYaO6BzNWjiYtGF8TEu5NAVhAxxLQ==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.10.0", + "@module-federation/data-prefetch": "0.10.0", + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/error-codes": "0.10.0", + "@module-federation/inject-external-runtime-core-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/manifest": "0.10.0", + "@module-federation/rspack": "0.10.0", + "@module-federation/runtime-tools": "0.10.0", + "@module-federation/sdk": "0.10.0", "btoa": "^1.2.1", "upath": "2.0.1" }, @@ -5083,52 +4998,57 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.9.0", - "dev": true, - "license": "MIT" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.10.0.tgz", + "integrity": "sha512-DfLcssfcCG0gXW2GY8v1ZCa7u0oSwtRnrk1gCjL+SfQxvpCL4S9RgYdl6me3vKOjirttCp289MVa1IHF7wu8qg==", + "dev": true }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.10.0.tgz", + "integrity": "sha512-+Da+uvnexREenBDISIuwEj0dC9ZjLFkMM06xxUBJ7ahvq0rk0/11XVBO2G4oo2ceqQQpUex0BzRWKSZ7ys8IFQ==", "dev": true, - "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.9.0" + "@module-federation/runtime-tools": "0.10.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.10.0.tgz", + "integrity": "sha512-k+AM7Cg9mwlfSo4KPK04oSxXWwv9EHWOMgOJnrb77r5ZBGQoBE6cwrICJGfppiIZGyY7z2k1RvYuy/1DK1PXDA==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.9.0", + "@module-federation/sdk": "0.10.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.10.0.tgz", + "integrity": "sha512-XdZqYb5hQCzZhJPbgfXM9VDgDKLqZmHKpQrsYFeK5MTOJX6EmpHSCCZs8vcnf9DXUy9flxtjwBzDeHgASQnpJQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.9.0", - "@module-federation/managers": "0.9.0", - "@module-federation/sdk": "0.9.0", + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/sdk": "0.10.0", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.10.0.tgz", + "integrity": "sha512-qLbQbPVVOhpmehfGjsnJBdSQqqsLhbEcCMnKG+/e5FZma0I+J716wo70WaXyGk2GsCLe4O0yJOm3kvKygKwR+A==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.9.0", - "@module-federation/dts-plugin": "0.9.0", - "@module-federation/inject-external-runtime-core-plugin": "0.9.0", - "@module-federation/managers": "0.9.0", - "@module-federation/manifest": "0.9.0", - "@module-federation/runtime-tools": "0.9.0", - "@module-federation/sdk": "0.9.0" + "@module-federation/bridge-react-webpack-plugin": "0.10.0", + "@module-federation/dts-plugin": "0.10.0", + "@module-federation/inject-external-runtime-core-plugin": "0.10.0", + "@module-federation/managers": "0.10.0", + "@module-federation/manifest": "0.10.0", + "@module-federation/runtime-tools": "0.10.0", + "@module-federation/sdk": "0.10.0" }, "peerDependencies": { "@rspack/core": ">=0.7", @@ -5145,45 +5065,47 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.10.0.tgz", + "integrity": "sha512-qO09AAuiVhYzHXeZiNd04oPb/I6O2/voW/GrSHvQQ2/CterakKHXq27xfFcmlKMY0TnxQNpIV0dQq2vWUEjeRw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.9.0", - "@module-federation/runtime-core": "0.6.21", - "@module-federation/sdk": "0.9.0" + "@module-federation/error-codes": "0.10.0", + "@module-federation/runtime-core": "0.10.0", + "@module-federation/sdk": "0.10.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.6.21", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.10.0.tgz", + "integrity": "sha512-eIQoJ302ZNVcz3B5OfRCg2+CykK6+tKtLzyyN1hRaK8rzhuEj9UpNugshPeGWw+G+n0mtYmE7oydKGKWnkqgFA==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.9.0", - "@module-federation/sdk": "0.9.0" + "@module-federation/error-codes": "0.10.0", + "@module-federation/sdk": "0.10.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.10.0.tgz", + "integrity": "sha512-RB0lfWFlhgjnAeGD+Mn1xrg7X91QSAtsC39cR/nwhb0InNB/ZSK8naP3/O/V6lz6Za9GPNpoXa06NOexdn0tOg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.9.0", - "@module-federation/webpack-bundler-runtime": "0.9.0" + "@module-federation/runtime": "0.10.0", + "@module-federation/webpack-bundler-runtime": "0.10.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "isomorphic-rslog": "0.0.7" - } + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.10.0.tgz", + "integrity": "sha512-enS4rKLSsoLCB6RxmRgcIdPRiRLgk94qtT2x0CKYhsqz3OJmHVkD0c6Pt5dMgSyLd+1Uo83d9rI492YqzuxO6Q==", + "dev": true }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.9.0", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.10.0.tgz", + "integrity": "sha512-QEsCm24F3M6rWwoD0IYB/15DzQvqfbdwzGxAc0BsZ2iD/t//Pz8MQ4w+U0nizFto94i8T1gQBYP4nfPcfWUpjg==", "dev": true, - "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -5191,90 +5113,28 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.9.0", - "@module-federation/sdk": "0.9.0" - } - }, - "node_modules/@module-federation/node/node_modules/http-errors": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@module-federation/node/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@module-federation/node/node_modules/koa": { - "version": "2.15.4", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.10.0.tgz", + "integrity": "sha512-ArgG3qaB99JkfJ6+EfH/Omgq01FB/tnJZrkw//rFfXpPMCXO7vo9ZURrbT2YPZGGrjDsT9PCdPKfPmUPKnTaqw==", "dev": true, - "license": "MIT", "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/@module-federation/node/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "@module-federation/runtime": "0.10.0", + "@module-federation/sdk": "0.10.0" } }, "node_modules/@module-federation/rspack": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", + "integrity": "sha512-ZJqG75dWHhyTMa9I0YPJEV2XRt0MFxnDiuMOpI92esdmwWY633CBKyNh1XxcLd629YVeTv03+whr+Fz/f91JEw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.8.12", - "@module-federation/dts-plugin": "0.8.12", - "@module-federation/inject-external-runtime-core-plugin": "0.8.12", - "@module-federation/managers": "0.8.12", - "@module-federation/manifest": "0.8.12", - "@module-federation/runtime-tools": "0.8.12", - "@module-federation/sdk": "0.8.12" + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1" }, "peerDependencies": { "@rspack/core": ">=0.7", @@ -5291,45 +5151,47 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.1.tgz", + "integrity": "sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.8.12", - "@module-federation/runtime-core": "0.6.20", - "@module-federation/sdk": "0.8.12" + "@module-federation/error-codes": "0.9.1", + "@module-federation/runtime-core": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.6.20", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.9.1.tgz", + "integrity": "sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.8.12", - "@module-federation/sdk": "0.8.12" + "@module-federation/error-codes": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.1.tgz", + "integrity": "sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.12", - "@module-federation/webpack-bundler-runtime": "0.8.12" + "@module-federation/runtime": "0.9.1", + "@module-federation/webpack-bundler-runtime": "0.9.1" } }, "node_modules/@module-federation/sdk": { - "version": "0.8.12", - "dev": true, - "license": "MIT", - "dependencies": { - "isomorphic-rslog": "0.0.7" - } + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.1.tgz", + "integrity": "sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==", + "dev": true }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.1.tgz", + "integrity": "sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==", "dev": true, - "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -5337,11 +5199,12 @@ } }, "node_modules/@module-federation/utilities": { - "version": "3.1.44", + "version": "3.1.46", + "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.46.tgz", + "integrity": "sha512-m0J5TirDzJfOjiDnn5YrcTLEPjOwc7MI2q4DNxc41YOXoSyochwSJLy6PBMkdbCwlUHE2aNhFn6zgHtvGYpsmQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.9.0" + "@module-federation/sdk": "0.10.0" }, "peerDependencies": { "react": "^16 || ^17 || ^18", @@ -5361,76 +5224,141 @@ } }, "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { - "version": "0.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "isomorphic-rslog": "0.0.7" - } + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.10.0.tgz", + "integrity": "sha512-enS4rKLSsoLCB6RxmRgcIdPRiRLgk94qtT2x0CKYhsqz3OJmHVkD0c6Pt5dMgSyLd+1Uo83d9rI492YqzuxO6Q==", + "dev": true }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.8.12", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", + "integrity": "sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.12", - "@module-federation/sdk": "0.8.12" + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/@napi-rs/nice": { - "version": "1.0.1", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", "optional": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" - } + "os": [ + "darwin" + ] }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ - "arm64" + "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" - ], + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">= 10" } @@ -5569,13 +5497,6 @@ "node": ">= 0.6" } }, - "node_modules/@nestjs/platform-express/node_modules/cookie": { - "version": "0.7.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { "version": "1.2.2", "license": "MIT", @@ -5598,13 +5519,6 @@ } } }, - "node_modules/@nestjs/platform-express/node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nestjs/platform-express/node_modules/express": { "version": "5.0.1", "license": "MIT", @@ -5728,19 +5642,6 @@ "node": ">= 0.6" } }, - "node_modules/@nestjs/platform-express/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@nestjs/platform-express/node_modules/send": { "version": "1.1.0", "license": "MIT", @@ -6035,17 +5936,18 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.1.tgz", + "integrity": "sha512-K8b3+eCG+Iz0EXTE/UDuXabr6yOL9NP6sW1CLk9AUdUUnL4AhoQy/vjfaOtxZx1T8qEErAWizJ51dHD25ysXHw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0", - "typescript": ">=5.5 <5.8", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", "webpack": "^5.54.0" } }, @@ -6388,17 +6290,18 @@ } }, "node_modules/@nx/angular": { - "version": "20.4.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "20.4.6", - "@nx/eslint": "20.4.6", - "@nx/js": "20.4.6", - "@nx/module-federation": "20.4.6", - "@nx/web": "20.4.6", - "@nx/webpack": "20.4.6", - "@nx/workspace": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.5.0.tgz", + "integrity": "sha512-xAImgqAe0tosatUPuTB5dM5vjdIhlvMqmLzVpqcszlAdNK0sud0AuDo783axKCEkVnZplD79rtv7EytltK1NjQ==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/js": "20.5.0", + "@nx/module-federation": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", "magic-string": "~0.30.2", @@ -6566,9 +6469,10 @@ } }, "node_modules/@nx/devkit": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.5.0.tgz", + "integrity": "sha512-FLHjNRb6VImdlnDsp3ioIdM600y2xPvN88LFV9zPrG2hDXSaD9Np9YBZvvfCr4x46MrPCTTMoAVwWsCXIBgchg==", "dev": true, - "license": "MIT", "dependencies": { "ejs": "^3.1.7", "enquirer": "~2.3.6", @@ -6584,12 +6488,13 @@ } }, "node_modules/@nx/eslint": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.5.0.tgz", + "integrity": "sha512-9rMnlkSJ+Be+rXICDXaBoDfE5PbSV4TBnG0BM2V9dB1iRWpVtgv49ZreDUFYW0AAJ/RrlGHtlbYl6vupxL9EGg==", "dev": true, - "license": "MIT", "dependencies": { - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.7.2" @@ -6605,12 +6510,13 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.5.0.tgz", + "integrity": "sha512-SEryJj5c50JWZgv2NaJUgQTy6l2Xwzmgu7hJpDD4Xc0LWMirrLix95XY8Plkom4y328GXL5k8CuFESjCh+9aew==", "dev": true, - "license": "MIT", "dependencies": { - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -6805,14 +6711,15 @@ } }, "node_modules/@nx/jest": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.5.0.tgz", + "integrity": "sha512-/wfADqIHQx2QYmylkAYimP1J7XFbBThce9fPaRQ/Ybows3x9YCfHJT0A7eetIf0qEaxmogigm/0QVmtkPArorg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", @@ -6827,9 +6734,10 @@ } }, "node_modules/@nx/js": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.5.0.tgz", + "integrity": "sha512-TFdmmSARDNYiwxXUsVowHgMYhjuGzYG4wWExCXkb8m4g6ER1zT9oUzGRf9eC7CHFTGonvAQ8hgBt90xt2EUdQA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", "@babel/plugin-proposal-decorators": "^7.22.7", @@ -6838,8 +6746,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.4.6", - "@nx/workspace": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/workspace": "20.5.0", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -6851,10 +6759,11 @@ "ignore": "^5.0.4", "js-tokens": "^4.0.0", "jsonc-parser": "3.2.0", - "minimatch": "9.0.3", "npm-package-arg": "11.0.1", "npm-run-path": "^4.0.1", "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", "semver": "^7.5.3", "source-map-support": "0.5.19", "tinyglobby": "^0.2.10", @@ -6863,7 +6772,7 @@ "tslib": "^2.3.0" }, "peerDependencies": { - "verdaccio": "^5.0.4" + "verdaccio": "^6.0.5" }, "peerDependenciesMeta": { "verdaccio": { @@ -6930,388 +6839,348 @@ } }, "node_modules/@nx/module-federation": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.5.0.tgz", + "integrity": "sha512-dQG3QSsWpdbammmPBP1E4sCkcUCxL5OIwwIDVyYrf2Rdw4f8s6VAGq+BlVFOfP28sVi5xB0wOgDomohVrUXoig==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/enhanced": "^0.8.8", - "@module-federation/node": "^2.6.21", - "@module-federation/sdk": "^0.8.8", - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", - "@nx/web": "20.4.6", - "@rspack/core": "^1.1.5", + "@module-federation/enhanced": "^0.9.0", + "@module-federation/node": "^2.6.26", + "@module-federation/sdk": "^0.9.0", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", + "@nx/web": "20.5.0", "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", "picocolors": "^1.1.0", "tslib": "^2.3.0", "webpack": "^5.88.0" + }, + "peerDependencies": { + "@rspack/core": "^1.1.5" } }, - "node_modules/@nx/module-federation/node_modules/body-parser": { - "version": "1.20.3", + "node_modules/@nx/nest": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.5.0.tgz", + "integrity": "sha512-/rbI9snHVY+cCUjlee5jjPufBTJYjFUFpZ/n30CuvitGIa+oBvzQlSPYH8n9N3v4/7I6Hg/CYcn9+jDl3DNu/w==", "dev": true, - "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "@nestjs/schematics": "^9.1.0", + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/js": "20.5.0", + "@nx/node": "20.5.0", + "tslib": "^2.3.0" } }, - "node_modules/@nx/module-federation/node_modules/cookie": { - "version": "0.7.1", + "node_modules/@nx/nest/node_modules/@angular-devkit/core": { + "version": "16.0.1", "dev": true, "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, "engines": { - "node": ">= 0.6" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@nx/module-federation/node_modules/debug": { - "version": "2.6.9", + "node_modules/@nx/nest/node_modules/@angular-devkit/schematics": { + "version": "16.0.1", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@angular-devkit/core": "16.0.1", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@nx/module-federation/node_modules/encodeurl": { - "version": "2.0.0", + "node_modules/@nx/nest/node_modules/@nestjs/schematics": { + "version": "9.2.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@angular-devkit/core": "16.0.1", + "@angular-devkit/schematics": "16.0.1", + "jsonc-parser": "3.2.0", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.3.5" } }, - "node_modules/@nx/module-federation/node_modules/express": { - "version": "4.21.2", + "node_modules/@nx/nest/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, - "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 8.10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@nx/module-federation/node_modules/finalhandler": { - "version": "1.3.1", + "node_modules/@nx/nest/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/nest/node_modules/magic-string": { + "version": "0.30.0", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/@nx/module-federation/node_modules/merge-descriptors": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nx/module-federation/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/path-to-regexp": { - "version": "0.1.12", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/qs": { - "version": "6.13.0", + "node_modules/@nx/nest/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=0.6" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nx/module-federation/node_modules/send": { - "version": "0.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nx/module-federation/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nx/module-federation/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/serve-static": { - "version": "1.16.2", + "node_modules/@nx/nest/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.10.0" } }, - "node_modules/@nx/nest": { - "version": "20.4.6", + "node_modules/@nx/node": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.5.0.tgz", + "integrity": "sha512-L89o7daSJpgjBfYRQVbpr0i/WNE8zs/lRIcI6+cbP0mgZA6Wa7lzgQ3qR8hP+Bqttl8SCooJodv3Wyk57qnbdQ==", "dev": true, - "license": "MIT", "dependencies": { - "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.4.6", - "@nx/eslint": "20.4.6", - "@nx/js": "20.4.6", - "@nx/node": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", "tslib": "^2.3.0" } }, - "node_modules/@nx/nest/node_modules/@angular-devkit/core": { - "version": "16.0.1", + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.5.0.tgz", + "integrity": "sha512-HlMMC4d253kk/yrafiepk8bhXMl+v4BIugftwUzRl7AOznyNgaj5WDaIVXZLZzt+WwYw6CTb+zYxfY4LuPFvOg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/@angular-devkit/schematics": { - "version": "16.0.1", + "node_modules/@nx/nx-darwin-x64": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.5.0.tgz", + "integrity": "sha512-+LO8YC5Iy1168saPeItNePChToP2TuRCj3MuxEtTTJXoRlab38rNaOjWaV1itvtcgrzkQi/IohINWMI8WC5b7g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.0.1", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/@nestjs/schematics": { - "version": "9.2.0", + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.5.0.tgz", + "integrity": "sha512-he3VOuj35XDAAmO3s6LqiWx00CsCMgHceNOHziCELQL0tfQlvvyI0Agmhesw68BAbabt+mKH9g+miENiaMknbg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.0.1", - "@angular-devkit/schematics": "16.0.1", - "jsonc-parser": "3.2.0", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": ">=4.3.5" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.5.0.tgz", + "integrity": "sha512-xeysjXvm4xZa/ED7XlbzuS28sCOGZ0AlS7DKWRxEMv60iprxewj0WKPdH7RveiNNauzgHWOW/wxvTWXRu+i36Q==", + "cpu": [ + "arm" + ], "dev": true, "optional": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, + "os": [ + "linux" + ], "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/nest/node_modules/magic-string": { - "version": "0.30.0", + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.5.0.tgz", + "integrity": "sha512-pj+6OA7d1ltkW/ZYFooi3bDtqVFPxi8YYiZlQx7enEuOxbrTvpjEPvBjVyf+oYpCe9rfKlx9ghzufqsI4uGM0w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.5.0.tgz", + "integrity": "sha512-gCIJEb/VYv6pxiAcSeizX0jpOmTnPmgYVi2EZLSWus0Pg6FIwMHE4MX5kuqehyvnDt9xInb7Rh8vgz/JBOOsbA==", + "cpu": [ + "arm64" + ], "dev": true, "optional": true, - "peer": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">= 10" } }, - "node_modules/@nx/nest/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.5.0.tgz", + "integrity": "sha512-hfCDmfy7TBQJdgBwNvOh55e8Y00Cxcddw2QeKguvy6vsnVa7fesXDWCw2t3m/VPPQDKQGd8cY1lS1JqX3N+wCA==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=8.10.0" + "node": ">= 10" } }, - "node_modules/@nx/node": { - "version": "20.4.6", + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.5.0.tgz", + "integrity": "sha512-RTTCPjZNSDFE5mUdavDFimDw/aXNBY0w+iuRM5q17rDHxwa//DghCY0GEkBdfuxD7wpw+sRwE18mWsNDek5lXA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "20.4.6", - "@nx/eslint": "20.4.6", - "@nx/jest": "20.4.6", - "@nx/js": "20.4.6", - "tslib": "^2.3.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "20.4.6", + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.5.0.tgz", + "integrity": "sha512-nT9WlG0QA8D74UJhEP1feGrV00/bas1nnqS+zkwnpJs0vcPmMuIktdETh3lEnqrGD04R7GtwbKtoGIGiZh5m9w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">= 10" } }, - "node_modules/@nx/web": { - "version": "20.4.6", + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.5.0.tgz", + "integrity": "sha512-KQVqFSYfc8ToSBgzhVNV8WcFEvLdy1zp58qwewa0xnE7DDncMbA+6YoVizUcQ/6GZRlMJ9sdVn3kwm5B8eD5mg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/web": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.5.0.tgz", + "integrity": "sha512-hxM9CKedYC8uE4e6Wo2/5xt2wCzJPHiJLq/6AK3liwK/o7bAJfkvwM/b9gwPAIVYy5R0DDgfA4N6vYO231eflA==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -7319,13 +7188,14 @@ } }, "node_modules/@nx/webpack": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.5.0.tgz", + "integrity": "sha512-sA02FviLw8D/hWm/u4l13onwNTl1lJX2nJaC0dOIJ1RfZZauD7Ca5tYjqwPC8uXh4/9h+0Kpewm66aJYML+WnA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.4.6", - "@nx/js": "20.4.6", + "@nx/devkit": "20.5.0", + "@nx/js": "20.5.0", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -7346,8 +7216,9 @@ "postcss-import": "~14.1.0", "postcss-loader": "^6.1.1", "rxjs": "^7.8.0", - "sass": "^1.42.1", - "sass-loader": "^12.2.0", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", "source-map-loader": "^5.0.0", "style-loader": "^3.3.0", "stylus": "^0.64.0", @@ -7364,8 +7235,9 @@ }, "node_modules/@nx/webpack/node_modules/array-union": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7375,8 +7247,9 @@ }, "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", @@ -7398,8 +7271,9 @@ }, "node_modules/@nx/webpack/node_modules/css-loader": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -7432,8 +7306,9 @@ }, "node_modules/@nx/webpack/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7443,8 +7318,9 @@ }, "node_modules/@nx/webpack/node_modules/globby": { "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^3.0.1", "dir-glob": "^3.0.1", @@ -7462,8 +7338,9 @@ }, "node_modules/@nx/webpack/node_modules/less": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -7487,8 +7364,9 @@ }, "node_modules/@nx/webpack/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7500,8 +7378,9 @@ }, "node_modules/@nx/webpack/node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -7513,8 +7392,9 @@ }, "node_modules/@nx/webpack/node_modules/make-dir/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -7522,8 +7402,9 @@ }, "node_modules/@nx/webpack/node_modules/mini-css-extract-plugin": { "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", + "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", "dev": true, - "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -7540,8 +7421,9 @@ }, "node_modules/@nx/webpack/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -7549,8 +7431,9 @@ }, "node_modules/@nx/webpack/node_modules/postcss-loader": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -7568,47 +7451,11 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/sass-loader": { - "version": "12.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7618,30 +7465,33 @@ }, "node_modules/@nx/webpack/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@nx/workspace": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.5.0.tgz", + "integrity": "sha512-Oe5p7rcgF/o4G2XDHYOxQxa/eDEfvmQV+kFCs8DBQwlzUwREAP4/pHFI0AIdWSfYkq55C5PE/PNKUGHrk2/xTA==", "dev": true, - "license": "MIT", "dependencies": { - "@nx/devkit": "20.4.6", + "@nx/devkit": "20.5.0", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.4.6", + "nx": "20.5.0", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, "node_modules/@nx/workspace/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7941,18 +7791,253 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/wasm-node": { "version": "4.28.1", "dev": true, @@ -7972,90 +8057,233 @@ } }, "node_modules/@rspack/binding": { - "version": "1.1.5", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.7.tgz", + "integrity": "sha512-QH+kxkG0I9C6lmlwgBUDFsy24ihXMGG5lfiNtQilk4CyBN+AgSWFENcYrnkUaBioZAvMBznQLiccV3X0JeH9iQ==", "dev": true, - "license": "MIT", + "peer": true, "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.1.5", - "@rspack/binding-darwin-x64": "1.1.5", - "@rspack/binding-linux-arm64-gnu": "1.1.5", - "@rspack/binding-linux-arm64-musl": "1.1.5", - "@rspack/binding-linux-x64-gnu": "1.1.5", - "@rspack/binding-linux-x64-musl": "1.1.5", - "@rspack/binding-win32-arm64-msvc": "1.1.5", - "@rspack/binding-win32-ia32-msvc": "1.1.5", - "@rspack/binding-win32-x64-msvc": "1.1.5" + "@rspack/binding-darwin-arm64": "1.2.7", + "@rspack/binding-darwin-x64": "1.2.7", + "@rspack/binding-linux-arm64-gnu": "1.2.7", + "@rspack/binding-linux-arm64-musl": "1.2.7", + "@rspack/binding-linux-x64-gnu": "1.2.7", + "@rspack/binding-linux-x64-musl": "1.2.7", + "@rspack/binding-win32-arm64-msvc": "1.2.7", + "@rspack/binding-win32-ia32-msvc": "1.2.7", + "@rspack/binding-win32-x64-msvc": "1.2.7" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.1.5", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-dT5eSMTknZaI8Djmz8KnaWM68rjZuBZwsKyF144o+ZSJM55vgiNXyL0lQYB8mX9nR3Gck+jKuGUAT2W/EF/t5Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, - "node_modules/@rspack/core": { - "version": "1.1.5", + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-5n8IhKBxH71d4BUIvyzTwSOAOKNneLPJwLIphSPNIbCMGjLI59/EVpxSQ/AAUfyMkqOs635NNCn0eGQVuzpI/w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime-tools": "0.5.1", - "@rspack/binding": "1.1.5", - "@rspack/lite-tapable": "1.0.1", - "caniuse-lite": "^1.0.30001616" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.1" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-DTtFBJmgQQrVWjbklpgJDr3kE9Uf1fHsPh+1GVslsBuyn+o4O7JslrnjuVsQCYKoiEg0Lg4ZPQmwnhJLHssZ5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-01/OoQQF9eyDvRKkxj4DzCznfGZIvnzI8qOsrv+M7VBm8FLoKpb3hygXixaGQOXmNL42XTh61qjgm++fBu6aUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-lUOAUq0YSsofCXsP6XnlgfH0ZRDZ2X2XqXLXYjqf4xkSxCl5eBmE0EQYjAHF4zjUvU5rVx4a4bDLWv7+t3bOHg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-ZrPXfgT30p4DlydYavaTHiluxHkWvZHt7K4q7qNyTfYYowG6jRGwWi/PATdugNICGv027Wsh5nzEO4o27Iuhwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-1OzzM+OUSWX39XYcDfxJ8bGX5vNNrRejCMGotBEdP+uQ3KMWCPz0G4KRc3QIjghaLIYk3ofd83hcfUxyk/2Xog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.7.tgz", + "integrity": "sha512-VWlDCV9kDtijk9GK6ZtBQmYoVzKGpnrJB0iI3d2gIEa/2NwikJ89bLMFE4dFx8UNH3p/sSyb5pmPOQnbudFK7Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-l/sTdeMsQF1a1aB79cWykDNRZG6nkUA0biJo2/sEARP3ijdr8TuwUdirp2JRDmZfQJkoJnQ2un9y9qyW+TIZzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/core": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.7.tgz", + "integrity": "sha512-Vg7ySflnqI1nNOBPd6VJkQozWADssxn3einbxa9OqDVAB+dGSj8qihTs6rlaTSewidoaYTGIAiTMHO2y+61qqQ==", + "dev": true, + "peer": true, + "dependencies": { + "@module-federation/runtime-tools": "0.8.4", + "@rspack/binding": "1.2.7", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001700" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/tracing": "^1.x", + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true + }, + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", + "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "dev": true, + "peer": true }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { - "version": "0.5.1", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", + "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@module-federation/sdk": "0.5.1" + "@module-federation/error-codes": "0.8.4", + "@module-federation/sdk": "0.8.4" } }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.5.1", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", + "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@module-federation/runtime": "0.5.1", - "@module-federation/webpack-bundler-runtime": "0.5.1" + "@module-federation/runtime": "0.8.4", + "@module-federation/webpack-bundler-runtime": "0.8.4" } }, "node_modules/@rspack/core/node_modules/@module-federation/sdk": { - "version": "0.5.1", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", + "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", "dev": true, - "license": "MIT" + "peer": true, + "dependencies": { + "isomorphic-rslog": "0.0.6" + } }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.5.1", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", + "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@module-federation/runtime": "0.5.1", - "@module-federation/sdk": "0.5.1" + "@module-federation/runtime": "0.8.4", + "@module-federation/sdk": "0.8.4" } }, "node_modules/@rspack/lite-tapable": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, - "license": "MIT", + "peer": true, "engines": { "node": ">=16.0.0" } @@ -8220,12 +8448,13 @@ "license": "Apache-2.0" }, "node_modules/@schematics/angular": { - "version": "19.1.8", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.1.tgz", + "integrity": "sha512-QYYGVR2n+YtLzqo0IsQq7OUnBMeP6OjyuVlGdjsAnSDCKQ9kUcqZDwjxxh5NUj25R4vvu+5aVaa6W6iTxfHadQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", "jsonc-parser": "3.3.1" }, "engines": { @@ -8655,8 +8884,9 @@ }, "node_modules/@trysound/sax": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -8815,8 +9045,9 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -8824,8 +9055,9 @@ }, "node_modules/@types/eslint-scope": { "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, - "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -8946,11 +9178,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "dev": true, - "license": "MIT" - }, "node_modules/@types/mime": { "version": "1.3.5", "dev": true, @@ -9000,8 +9227,9 @@ }, "node_modules/@types/semver": { "version": "7.5.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", @@ -9274,39 +9502,39 @@ "dev": true, "license": "ISC" }, - "node_modules/@verdaccio/commons-api": { - "version": "10.2.0", + "node_modules/@verdaccio/auth": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/auth/-/auth-8.0.0-next-8.7.tgz", + "integrity": "sha512-CSLBAsCJT1oOpJ4OWnVGmN6o/ZilDNa7Aa5+AU1LI2lbRblqgr4BVRn07GFqimJ//6+tPzl8BHgyiCbBhh1ZiA==", "dev": true, - "license": "MIT", "dependencies": { - "http-errors": "2.0.0", - "http-status-codes": "2.2.0" + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/loaders": "8.0.0-next-8.4", + "@verdaccio/signature": "8.0.0-next-8.1", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "lodash": "4.17.21", + "verdaccio-htpasswd": "13.0.0-next-8.7" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/commons-api/node_modules/http-status-codes": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@verdaccio/config": { - "version": "7.0.0-next-7.10", + "node_modules/@verdaccio/auth/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", - "js-yaml": "4.1.0", + "@verdaccio/core": "8.0.0-next-8.7", "lodash": "4.17.21", "minimatch": "7.4.6", - "yup": "0.32.11" + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -9316,10 +9544,28 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/config/node_modules/minimatch": { + "node_modules/@verdaccio/auth/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/auth/node_modules/minimatch": { "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9330,230 +9576,326 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@verdaccio/core": { - "version": "7.0.0-next-7.10", + "node_modules/@verdaccio/auth/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/commons-api": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@verdaccio/commons-api/-/commons-api-10.2.0.tgz", + "integrity": "sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==", "dev": true, - "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "core-js": "3.35.0", "http-errors": "2.0.0", - "http-status-codes": "2.3.0", - "process-warning": "1.0.0", - "semver": "7.5.4" + "http-status-codes": "2.2.0" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/core/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@verdaccio/core/node_modules/process-warning": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@verdaccio/core/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@verdaccio/core/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" + "node_modules/@verdaccio/commons-api/node_modules/http-status-codes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", + "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==", + "dev": true }, - "node_modules/@verdaccio/file-locking": { - "version": "10.3.1", + "node_modules/@verdaccio/config": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-8.0.0-next-8.7.tgz", + "integrity": "sha512-pA0WCWvvWY6vPRav+X0EuFmuK6M08zIpRzTKkqSriCWk6JUCZ07TDnN054AS8TSSOy6EaWgHxnUw3nTd34Z4Sg==", "dev": true, - "license": "MIT", "dependencies": { - "lockfile": "1.0.4" + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "minimatch": "7.4.6" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/local-storage": { - "version": "10.3.3", + "node_modules/@verdaccio/config/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/commons-api": "10.2.0", - "@verdaccio/file-locking": "10.3.1", - "@verdaccio/streams": "10.2.1", - "async": "3.2.4", - "debug": "4.3.4", + "@verdaccio/core": "8.0.0-next-8.7", "lodash": "4.17.21", - "lowdb": "1.0.0", - "mkdirp": "1.0.4" + "minimatch": "7.4.6", + "semver": "7.6.3" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/local-storage/node_modules/async": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@verdaccio/local-storage/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/@verdaccio/config/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "ms": "^2.1.3" }, "engines": { - "node": ">=10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@verdaccio/logger-7": { - "version": "7.0.0-next-7.10", + "node_modules/@verdaccio/config/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/logger-commons": "7.0.0-next-7.10", - "pino": "7.11.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": { - "version": "0.2.0", - "dev": true, - "license": "MIT" + "node_modules/@verdaccio/config/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, - "node_modules/@verdaccio/logger-7/node_modules/pino": { - "version": "7.11.0", + "node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.7.tgz", + "integrity": "sha512-pf8M2Z5EI/5Zdhdcm3aadb9Q9jiDsIredPD3+cIoDum8x3di2AIYvQD7i5BEramfzZlLXVICmFAulU7nUY11qg==", "dev": true, - "license": "MIT", "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.0.0", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.15.1" + "ajv": "8.17.1", + "core-js": "3.37.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "process-warning": "1.0.0", + "semver": "7.6.3" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": { - "version": "0.5.0", + "node_modules/@verdaccio/core/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": { - "version": "4.0.0", + "node_modules/@verdaccio/core/node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", + "dev": true + }, + "node_modules/@verdaccio/file-locking": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz", + "integrity": "sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==", "dev": true, - "license": "MIT" + "dependencies": { + "lockfile": "1.0.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } }, - "node_modules/@verdaccio/logger-7/node_modules/process-warning": { - "version": "1.0.0", + "node_modules/@verdaccio/loaders": { + "version": "8.0.0-next-8.4", + "resolved": "https://registry.npmjs.org/@verdaccio/loaders/-/loaders-8.0.0-next-8.4.tgz", + "integrity": "sha512-Powlqb4SuMbe6RVgxyyOXaCjuHCcK7oZA+lygaKZDpV9NSHJtbkkV4L+rXyCfTX3b0tKsBh7FzaIdgWc1rDeGQ==", "dev": true, - "license": "MIT" + "dependencies": { + "debug": "4.3.7", + "lodash": "4.17.21" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } }, - "node_modules/@verdaccio/logger-7/node_modules/real-require": { - "version": "0.1.0", + "node_modules/@verdaccio/loaders/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">= 12.13.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@verdaccio/logger-7/node_modules/sonic-boom": { - "version": "2.8.0", + "node_modules/@verdaccio/loaders/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/local-storage-legacy": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@verdaccio/local-storage-legacy/-/local-storage-legacy-11.0.2.tgz", + "integrity": "sha512-7AXG7qlcVFmF+Nue2oKaraprGRtaBvrQIOvc/E89+7hAe399V01KnZI6E/ET56u7U9fq0MSlp92HBcdotlpUXg==", "dev": true, - "license": "MIT", "dependencies": { - "atomic-sleep": "^1.0.0" + "@verdaccio/commons-api": "10.2.0", + "@verdaccio/file-locking": "10.3.1", + "@verdaccio/streams": "10.2.1", + "async": "3.2.4", + "debug": "4.3.4", + "lodash": "4.17.21", + "lowdb": "1.0.0", + "mkdirp": "1.0.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/logger-7/node_modules/thread-stream": { - "version": "0.15.2", + "node_modules/@verdaccio/local-storage-legacy/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/@verdaccio/local-storage-legacy/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@verdaccio/logger": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/logger/-/logger-8.0.0-next-8.7.tgz", + "integrity": "sha512-5EMPdZhz2V08BP2rjhtN/Fz5KxCfPJBkYDitbk/eo+FCZ9nVdMCQE3WRbHEaXyJQcIso/LJ6RnL/zKN20E/rPg==", "dev": true, - "license": "MIT", "dependencies": { - "real-require": "^0.1.0" + "@verdaccio/logger-commons": "8.0.0-next-8.7", + "pino": "9.5.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, "node_modules/@verdaccio/logger-commons": { - "version": "7.0.0-next-7.10", + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-8.0.0-next-8.7.tgz", + "integrity": "sha512-sXNx57G1LVp81xF4qHer3AOcMEZ90W4FjxtYF0vmULcVg3ybdtStKAT/9ocZtVMvLWTPAauhqylfnXoRZYf32A==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/logger-prettify": "7.0.0-next.1", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/logger-prettify": "8.0.0-next-8.1", "colorette": "2.0.20", - "debug": "4.3.4" + "debug": "4.4.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/logger-commons/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/logger-commons/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/logger-prettify": { - "version": "7.0.0-next.1", + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-8.0.0-next-8.1.tgz", + "integrity": "sha512-vLhaGq0q7wtMCcqa0aQY6QOsMNarhTu/l4e6Z8mG/5LUH95GGLsBwpXLnKS94P3deIjsHhc9ycnEmG39txbQ1w==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "2.0.20", - "dayjs": "1.11.7", + "dayjs": "1.11.13", "lodash": "4.17.21", - "pino-abstract-transport": "1.0.0", - "sonic-boom": "3.3.0" + "pino-abstract-transport": "1.2.0", + "sonic-boom": "3.8.1" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -9562,6 +9904,8 @@ }, "node_modules/@verdaccio/logger-prettify/node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -9577,30 +9921,26 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, - "node_modules/@verdaccio/logger-prettify/node_modules/dayjs": { - "version": "1.11.7", - "dev": true, - "license": "MIT" - }, "node_modules/@verdaccio/logger-prettify/node_modules/pino-abstract-transport": { - "version": "1.0.0", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "node_modules/@verdaccio/logger-prettify/node_modules/readable-stream": { - "version": "4.5.2", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, - "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -9613,37 +9953,81 @@ } }, "node_modules/@verdaccio/logger-prettify/node_modules/sonic-boom": { - "version": "3.3.0", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", "dev": true, - "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, "node_modules/@verdaccio/logger-prettify/node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, + "node_modules/@verdaccio/logger/node_modules/pino": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", + "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, "node_modules/@verdaccio/middleware": { - "version": "7.0.0-next-7.10", + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-8.0.0-next-8.7.tgz", + "integrity": "sha512-Zad7KcdOsI1DUBt1TjQb08rIi/IFFaJKdPhj7M6oy5BX9l/4OM0TtbBueHFNS1+aU+t5eo8ue7ZHbqmjDY/6VQ==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", - "express": "4.18.2", + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "express": "4.21.2", "express-rate-limit": "5.5.1", "lodash": "4.17.21", "lru-cache": "7.18.3", "mime": "2.6.0" }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/middleware/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" + }, "engines": { "node": ">=12" }, @@ -9652,18 +10036,37 @@ "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/middleware/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@verdaccio/middleware/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@verdaccio/middleware/node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9671,12 +10074,34 @@ "node": ">=4.0.0" } }, - "node_modules/@verdaccio/search": { - "version": "7.0.0-next.2", + "node_modules/@verdaccio/middleware/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "MIT", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/middleware/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/search-indexer": { + "version": "8.0.0-next-8.2", + "resolved": "https://registry.npmjs.org/@verdaccio/search-indexer/-/search-indexer-8.0.0-next-8.2.tgz", + "integrity": "sha512-sWliVN5BkAGbZ3e/GD0CsZMfPJdRMRuN0tEKQFsvEJifxToq5UkfCw6vKaVvhezsTWqb+Rp5y+2d4n5BDOA49w==", + "dev": true, + "engines": { + "node": ">=18" }, "funding": { "type": "opencollective", @@ -9684,25 +10109,50 @@ } }, "node_modules/@verdaccio/signature": { - "version": "7.0.0-next.3", + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-8.0.0-next-8.1.tgz", + "integrity": "sha512-lHD/Z2FoPQTtDYz6ZlXhj/lrg0SFirHrwCGt/cibl1GlePpx78WPdo03tgAyl0Qf+I35n484/gR1l9eixBQqYw==", "dev": true, - "license": "MIT", "dependencies": { - "debug": "4.3.4", + "debug": "4.3.7", "jsonwebtoken": "9.0.2" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/signature/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/signature/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/streams": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz", + "integrity": "sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12", "npm": ">=5" @@ -9713,15 +10163,37 @@ } }, "node_modules/@verdaccio/tarball": { - "version": "12.0.0-next-7.10", + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-13.0.0-next-8.7.tgz", + "integrity": "sha512-EWRuEOLgb3UETxUsYg6+Mml6DDRiwQqKIEsE4Ys6y6rcH2vgW6XMnTt+s/v5pFI+zlbi6fxjOgQB1e6IJAwxVA==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "debug": "4.3.4", - "lodash": "4.17.21" + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "8.1.0-next-8.7", + "debug": "4.4.0", + "gunzip-maybe": "^1.4.2", + "lodash": "4.17.21", + "tar-stream": "^3.1.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/tarball/node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-8.1.0-next-8.7.tgz", + "integrity": "sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==", + "dev": true, + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.7", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -9731,38 +10203,113 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/ui-theme": { - "version": "7.0.0-next-7.10", + "node_modules/@verdaccio/tarball/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "license": "MIT" + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/tarball/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/tarball/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@verdaccio/tarball/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@verdaccio/ui-theme": { + "version": "8.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-8.0.0-next-8.7.tgz", + "integrity": "sha512-+7f7XqqIU+TVCHjsP6lWzCdsD4sM7MEhn4cu3mLW1kJZ7eenWKEltoqixQnoXJzaBjCiz+yXW1WkjMyEFLNbpg==", + "dev": true }, "node_modules/@verdaccio/url": { - "version": "12.0.0-next-7.10", + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-13.0.0-next-8.7.tgz", + "integrity": "sha512-biFvwH3zIXYicA+SXNGvjMAe8oIQ5VddsfbO0ZXWlFs0lIz8cgI7QYPeSiCkU2VKpGzZ8pEKgqkxFsfFkU5kGA==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "debug": "4.3.4", + "@verdaccio/core": "8.0.0-next-8.7", + "debug": "4.4.0", "lodash": "4.17.21", - "validator": "13.11.0" + "validator": "13.12.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, + "node_modules/@verdaccio/url/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/url/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/@verdaccio/utils": { - "version": "7.0.0-next-7.10", + "version": "7.0.1-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.1-next-8.1.tgz", + "integrity": "sha512-cyJdRrVa+8CS7UuIQb3K3IJFjMe64v38tYiBnohSmhRbX7dX9IT3jWbjrwkqWh4KeS1CS6BYENrGG1evJ2ggrQ==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", + "@verdaccio/core": "8.0.0-next-8.1", "lodash": "4.17.21", "minimatch": "7.4.6", - "semver": "7.5.4" + "semver": "7.6.3" }, "engines": { "node": ">=12" @@ -9772,21 +10319,48 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@verdaccio/utils/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@verdaccio/utils/node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.1.tgz", + "integrity": "sha512-kQRCB2wgXEh8H88G51eQgAFK9IxmnBtkQ8sY5FbmB6PbBkyHrbGcCp+2mtRqqo36j0W1VAlfM3XzoknMy6qQnw==", "dev": true, - "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "ajv": "8.17.1", + "core-js": "3.37.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "process-warning": "1.0.0", + "semver": "7.6.3" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@verdaccio/utils/node_modules/minimatch": { "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9797,29 +10371,29 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@verdaccio/utils/node_modules/semver": { - "version": "7.5.4", + "node_modules/@verdaccio/utils/node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@verdaccio/utils/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -9827,23 +10401,27 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -9852,13 +10430,15 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -9868,29 +10448,33 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -9904,8 +10488,9 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -9916,8 +10501,9 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -9927,8 +10513,9 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -9940,8 +10527,9 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -9990,13 +10578,15 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -10005,8 +10595,9 @@ }, "node_modules/@yarnpkg/parsers": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -10017,16 +10608,18 @@ }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -10037,13 +10630,15 @@ }, "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10066,8 +10661,9 @@ }, "node_modules/abort-controller": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, - "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -10157,8 +10753,9 @@ }, "node_modules/adm-zip": { "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0" } @@ -10309,8 +10906,9 @@ }, "node_modules/apache-md5": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", + "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10370,24 +10968,27 @@ }, "node_modules/asn1": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/async": { - "version": "3.2.5", - "dev": true, - "license": "MIT" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true }, "node_modules/asynckit": { "version": "0.4.0", @@ -10395,8 +10996,9 @@ }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -10446,8 +11048,9 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } @@ -10460,9 +11063,10 @@ } }, "node_modules/aws4": { - "version": "1.12.0", - "dev": true, - "license": "MIT" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true }, "node_modules/axios": { "version": "1.7.4", @@ -10481,6 +11085,12 @@ "node": ">= 0.4" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, "node_modules/babel-jest": { "version": "29.7.0", "dev": true, @@ -10809,6 +11419,13 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "optional": true + }, "node_modules/base64-js": { "version": "1.5.1", "funding": [ @@ -10836,8 +11453,9 @@ }, "node_modules/basic-auth": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -10847,8 +11465,9 @@ }, "node_modules/basic-auth/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/batch": { "version": "0.6.1", @@ -10857,21 +11476,24 @@ }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcryptjs": { "version": "2.4.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "dev": true }, "node_modules/beasties": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, - "license": "Apache-2.0", "dependencies": { "css-select": "^5.1.0", "css-what": "^6.1.0", @@ -11058,8 +11680,9 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -11078,8 +11701,19 @@ "node": ">=8" } }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, "node_modules/browserslist": { - "version": "4.24.2", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -11095,11 +11729,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -11130,8 +11763,9 @@ }, "node_modules/btoa": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, - "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -11162,10 +11796,17 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true }, "node_modules/buffer-from": { "version": "1.1.2", @@ -11338,8 +11979,9 @@ }, "node_modules/cache-content-type": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" @@ -11425,8 +12067,9 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -11435,7 +12078,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", "dev": true, "funding": [ { @@ -11450,18 +12095,19 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/caseless": { "version": "0.12.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "node_modules/chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11484,8 +12130,9 @@ }, "node_modules/chardet": { "version": "0.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "node_modules/chokidar": { "version": "4.0.1", @@ -11511,8 +12158,9 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0" } @@ -11725,9 +12373,10 @@ } }, "node_modules/clipanion": { - "version": "3.2.1", + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz", + "integrity": "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==", "dev": true, - "license": "MIT", "workspaces": [ "website" ], @@ -11816,14 +12465,21 @@ }, "node_modules/colord": { "version": "2.9.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", "dev": true, "license": "MIT" }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true + }, "node_modules/columnify": { "version": "1.6.0", "dev": true, @@ -11888,30 +12544,23 @@ } }, "node_modules/compression": { - "version": "1.7.4", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "dev": true, - "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "dev": true, @@ -11925,10 +12574,14 @@ "dev": true, "license": "MIT" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -11992,9 +12645,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.5.0", - "dev": true, - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -12006,8 +12659,9 @@ }, "node_modules/cookies": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" @@ -12103,21 +12757,23 @@ } }, "node_modules/core-js": { - "version": "3.35.0", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.39.0", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -12141,8 +12797,9 @@ }, "node_modules/corser": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -12162,6 +12819,15 @@ "node": ">=10" } }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/create-jest": { "version": "29.7.0", "dev": true, @@ -12204,8 +12870,9 @@ }, "node_modules/cron-parser": { "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dev": true, - "license": "MIT", "dependencies": { "luxon": "^3.2.1" }, @@ -12227,8 +12894,9 @@ }, "node_modules/css-declaration-sorter": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, - "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" }, @@ -12272,8 +12940,9 @@ }, "node_modules/css-minimizer-webpack-plugin": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "cssnano": "^6.0.1", @@ -12315,8 +12984,9 @@ }, "node_modules/css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -12330,8 +13000,9 @@ }, "node_modules/css-tree": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, - "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -12342,8 +13013,9 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -12364,8 +13036,9 @@ }, "node_modules/cssnano": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dev": true, - "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" @@ -12383,8 +13056,9 @@ }, "node_modules/cssnano-preset-default": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", @@ -12426,8 +13100,9 @@ }, "node_modules/cssnano-utils": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -12437,8 +13112,9 @@ }, "node_modules/csso": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, - "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -12449,8 +13125,9 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -12462,8 +13139,9 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "dev": true, - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true }, "node_modules/cssom": { "version": "0.5.0", @@ -12493,8 +13171,9 @@ }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -12521,15 +13200,17 @@ }, "node_modules/date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0" } }, "node_modules/dayjs": { - "version": "1.11.10", - "license": "MIT" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { "version": "4.3.4", @@ -12584,8 +13265,9 @@ }, "node_modules/deep-equal": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true }, "node_modules/deep-is": { "version": "0.1.4", @@ -12673,8 +13355,9 @@ }, "node_modules/delegates": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/denque": { "version": "2.1.0", @@ -12708,8 +13391,9 @@ }, "node_modules/detect-libc": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, - "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -12796,8 +13480,9 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -12809,14 +13494,15 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domexception": { "version": "4.0.0", @@ -12831,8 +13517,9 @@ }, "node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -12845,8 +13532,9 @@ }, "node_modules/domutils": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -12868,8 +13556,9 @@ }, "node_modules/dotenv-expand": { "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" }, @@ -12893,37 +13582,26 @@ } }, "node_modules/duplexify": { - "version": "4.1.2", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, - "license": "MIT", "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -12931,13 +13609,15 @@ }, "node_modules/ecc-jsbn/node_modules/jsbn": { "version": "0.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } @@ -12948,8 +13628,9 @@ }, "node_modules/ejs": { "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -12961,9 +13642,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.71", - "dev": true, - "license": "ISC" + "version": "1.5.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz", + "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==", + "dev": true }, "node_modules/emittery": { "version": "0.13.1", @@ -12988,9 +13670,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -13016,8 +13698,9 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -13104,9 +13787,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -13146,511 +13830,131 @@ } }, "node_modules/envinfo": { - "version": "7.11.0", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, - "license": "MIT", "bin": { "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/errno": { - "version": "0.1.8", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.24.2", - "dev": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + }, "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], + "node_modules/environment": { + "version": "1.1.0", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], + "node_modules/esbuild-wasm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.0.tgz", + "integrity": "sha512-60iuWr6jdTVylmGXjpnqk3pCktUi5Rmjiv6EMza3h4X20BLtfL2BjUGs1+UCt2G9UK7jVGrJdUr5i1k0sL3wBg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=18" } @@ -13668,8 +13972,9 @@ }, "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, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -14090,8 +14395,9 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -14103,8 +14409,9 @@ }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -14140,8 +14447,9 @@ }, "node_modules/expand-tilde": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, - "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -14170,36 +14478,37 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.18.2", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -14208,28 +14517,34 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-rate-limit": { "version": "5.5.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz", + "integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==", + "dev": true }, "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -14240,45 +14555,36 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true }, "node_modules/extend": { "version": "3.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -14290,8 +14596,9 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -14301,16 +14608,23 @@ }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.3", "license": "MIT", @@ -14410,8 +14724,9 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -14435,16 +14750,18 @@ }, "node_modules/filelist": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -14463,12 +14780,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -14481,16 +14799,18 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -14510,8 +14830,9 @@ }, "node_modules/find-file-up": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", + "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", "dev": true, - "license": "MIT", "dependencies": { "resolve-dir": "^1.0.1" }, @@ -14521,8 +14842,9 @@ }, "node_modules/find-pkg": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", + "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", "dev": true, - "license": "MIT", "dependencies": { "find-file-up": "^2.0.1" }, @@ -14612,16 +14934,18 @@ }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -14653,8 +14977,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14668,16 +14993,18 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14685,8 +15012,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14700,8 +15028,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/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, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -14723,8 +15052,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "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, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -14736,13 +15066,15 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14752,8 +15084,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -14763,8 +15096,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -14774,8 +15108,9 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "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, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14830,24 +15165,27 @@ }, "node_modules/front-matter": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", "dev": true, - "license": "MIT", "dependencies": { "js-yaml": "^3.13.1" } }, "node_modules/front-matter/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/front-matter/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -14858,18 +15196,21 @@ }, "node_modules/front-matter/node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/fs-constants": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, "node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -14893,8 +15234,9 @@ }, "node_modules/fs-monkey": { "version": "1.0.6", - "dev": true, - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -15015,8 +15357,9 @@ }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } @@ -15052,8 +15395,9 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", @@ -15077,8 +15421,9 @@ }, "node_modules/global-modules": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, - "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -15090,8 +15435,9 @@ }, "node_modules/global-prefix": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, - "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -15105,13 +15451,15 @@ }, "node_modules/global-prefix/node_modules/ini": { "version": "1.3.8", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -15164,6 +15512,23 @@ "dev": true, "license": "MIT" }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "dev": true, @@ -15248,8 +15613,9 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -15272,8 +15638,9 @@ }, "node_modules/he": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT", "bin": { "he": "bin/he" } @@ -15287,8 +15654,9 @@ }, "node_modules/homedir-polyfill": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, - "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -15344,6 +15712,8 @@ }, "node_modules/htmlparser2": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -15352,7 +15722,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -15362,8 +15731,9 @@ }, "node_modules/http-assert": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, - "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" @@ -15374,16 +15744,18 @@ }, "node_modules/http-assert/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/http-assert/node_modules/http-errors": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -15397,8 +15769,9 @@ }, "node_modules/http-assert/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15516,8 +15889,9 @@ }, "node_modules/http-server": { "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, - "license": "MIT", "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", @@ -15542,8 +15916,9 @@ }, "node_modules/http-server/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15556,13 +15931,14 @@ } }, "node_modules/http-signature": { - "version": "1.3.6", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -15570,8 +15946,9 @@ }, "node_modules/http-status-codes": { "version": "2.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "dev": true }, "node_modules/https-proxy-agent": { "version": "7.0.6", @@ -15844,10 +16221,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -15882,8 +16266,9 @@ }, "node_modules/is-generator-function": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -15907,6 +16292,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", "dev": true, @@ -16001,8 +16395,9 @@ }, "node_modules/is-promise": { "version": "2.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true }, "node_modules/is-property": { "version": "1.0.2", @@ -16010,8 +16405,9 @@ }, "node_modules/is-regex": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -16038,8 +16434,9 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -16059,8 +16456,9 @@ }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16097,25 +16495,29 @@ } }, "node_modules/isomorphic-rslog": { - "version": "0.0.7", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", + "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", "dev": true, - "license": "MIT", + "peer": true, "engines": { "node": ">=14.17.6" } }, "node_modules/isomorphic-ws": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, - "license": "MIT", "peerDependencies": { "ws": "*" } }, "node_modules/isstream": { "version": "0.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -16225,8 +16627,9 @@ }, "node_modules/jake": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -16242,8 +16645,9 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -16251,8 +16655,9 @@ }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16266,8 +16671,9 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -17241,8 +17647,9 @@ }, "node_modules/json-schema": { "version": "0.4.0", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -17272,8 +17679,9 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -17350,8 +17758,9 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, - "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -17371,11 +17780,12 @@ }, "node_modules/jsprim": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", "dev": true, "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -17385,8 +17795,9 @@ }, "node_modules/jwa": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dev": true, - "license": "MIT", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -17395,8 +17806,9 @@ }, "node_modules/jws": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dev": true, - "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -17412,8 +17824,9 @@ }, "node_modules/keygrip": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, - "license": "MIT", "dependencies": { "tsscmp": "1.0.6" }, @@ -17447,8 +17860,9 @@ }, "node_modules/klona": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -17530,9 +17944,10 @@ } }, "node_modules/koa": { - "version": "2.15.3", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", + "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -17564,13 +17979,15 @@ }, "node_modules/koa-compose": { "version": "4.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true }, "node_modules/koa-convert": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, - "license": "MIT", "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" @@ -17579,10 +17996,20 @@ "node": ">= 10" } }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/koa/node_modules/http-errors": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -17596,16 +18023,18 @@ }, "node_modules/koa/node_modules/http-errors/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/koa/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -17646,8 +18075,9 @@ }, "node_modules/less-loader": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, - "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -17745,8 +18175,9 @@ }, "node_modules/lilconfig": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14" }, @@ -17756,8 +18187,9 @@ }, "node_modules/lines-and-columns": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -17857,10 +18289,11 @@ } }, "node_modules/lmdb": { - "version": "3.2.2", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "msgpackr": "^1.11.2", @@ -17873,18 +18306,19 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.2.2", - "@lmdb/lmdb-darwin-x64": "3.2.2", - "@lmdb/lmdb-linux-arm": "3.2.2", - "@lmdb/lmdb-linux-arm64": "3.2.2", - "@lmdb/lmdb-linux-x64": "3.2.2", - "@lmdb/lmdb-win32-x64": "3.2.2" + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" } }, "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, - "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -17910,8 +18344,9 @@ }, "node_modules/lockfile": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "dev": true, - "license": "ISC", "dependencies": { "signal-exit": "^3.0.2" } @@ -17920,15 +18355,11 @@ "version": "4.17.21", "license": "MIT" }, - "node_modules/lodash-es": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -17937,33 +18368,39 @@ }, "node_modules/lodash.includes": { "version": "4.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true }, "node_modules/lodash.isstring": { "version": "4.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -17977,13 +18414,15 @@ }, "node_modules/lodash.once": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", @@ -18205,8 +18644,9 @@ }, "node_modules/log4js": { "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -18224,8 +18664,9 @@ }, "node_modules/long-timeout": { "version": "0.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", @@ -18242,8 +18683,9 @@ }, "node_modules/lowdb": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.3", "is-promise": "^2.1.0", @@ -18257,8 +18699,9 @@ }, "node_modules/lowdb/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -18286,8 +18729,9 @@ }, "node_modules/luxon": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" } @@ -18392,8 +18836,9 @@ }, "node_modules/mdn-data": { "version": "2.0.30", - "dev": true, - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -18404,8 +18849,9 @@ }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -18499,9 +18945,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -18882,9 +19332,10 @@ "license": "BSD-3-Clause" }, "node_modules/mrmime": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -18895,8 +19346,9 @@ }, "node_modules/msgpackr": { "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", "dev": true, - "license": "MIT", "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -18904,9 +19356,10 @@ }, "node_modules/msgpackr-extract": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -18959,65 +19412,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/mv": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/mysql2": { "version": "3.12.0", "license": "MIT", @@ -19072,11 +19466,6 @@ "node": ">=12" } }, - "node_modules/nanoclone": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.8", "dev": true, @@ -19099,14 +19488,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ncp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/nearley": { "version": "2.20.1", "dev": true, @@ -19181,9 +19562,10 @@ } }, "node_modules/ng-packagr": { - "version": "19.1.2", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.0.tgz", + "integrity": "sha512-bDyB9tmXMCL/4IhKcX84zGQlQrZhPhdCaomdJocz6EN57cZWdTP7SGhrswzpdGJY+y89855detet27oJLgR3IQ==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", @@ -19194,7 +19576,7 @@ "commander": "^13.0.0", "convert-source-map": "^2.0.0", "dependency-graph": "^1.0.0", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "fast-glob": "^3.3.2", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", @@ -19219,7 +19601,7 @@ "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "tailwindcss": { @@ -19257,19 +19639,22 @@ }, "node_modules/node-abort-controller": { "version": "3.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true }, "node_modules/node-addon-api": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -19287,18 +19672,21 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -19337,8 +19725,9 @@ }, "node_modules/node-gyp-build-optional-packages": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.1" @@ -19479,18 +19868,21 @@ }, "node_modules/node-machine-id": { "version": "1.1.12", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true }, "node_modules/node-releases": { - "version": "2.0.18", - "dev": true, - "license": "MIT" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true }, "node_modules/node-schedule": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", "dev": true, - "license": "MIT", "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", @@ -19751,8 +20143,9 @@ }, "node_modules/nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -19766,10 +20159,11 @@ "license": "MIT" }, "node_modules/nx": { - "version": "20.4.6", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.5.0.tgz", + "integrity": "sha512-KuAzhTj1NHu3iOVsTBrzu7cboO69UgwzUMoAb8KfszV5FwQD5dARrkR7Ew4NZzFdB+arUr2rvo1ik9f1O19keg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -19811,16 +20205,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.4.6", - "@nx/nx-darwin-x64": "20.4.6", - "@nx/nx-freebsd-x64": "20.4.6", - "@nx/nx-linux-arm-gnueabihf": "20.4.6", - "@nx/nx-linux-arm64-gnu": "20.4.6", - "@nx/nx-linux-arm64-musl": "20.4.6", - "@nx/nx-linux-x64-gnu": "20.4.6", - "@nx/nx-linux-x64-musl": "20.4.6", - "@nx/nx-win32-arm64-msvc": "20.4.6", - "@nx/nx-win32-x64-msvc": "20.4.6" + "@nx/nx-darwin-arm64": "20.5.0", + "@nx/nx-darwin-x64": "20.5.0", + "@nx/nx-freebsd-x64": "20.5.0", + "@nx/nx-linux-arm-gnueabihf": "20.5.0", + "@nx/nx-linux-arm64-gnu": "20.5.0", + "@nx/nx-linux-arm64-musl": "20.5.0", + "@nx/nx-linux-x64-gnu": "20.5.0", + "@nx/nx-linux-x64-musl": "20.5.0", + "@nx/nx-win32-arm64-msvc": "20.5.0", + "@nx/nx-win32-x64-msvc": "20.5.0" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -19837,8 +20231,9 @@ }, "node_modules/nx/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19852,16 +20247,18 @@ }, "node_modules/nx/node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nx/node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -19871,13 +20268,15 @@ }, "node_modules/nx/node_modules/jsonc-parser": { "version": "3.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/nx/node_modules/open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -19892,8 +20291,9 @@ }, "node_modules/nx/node_modules/ora": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -19906,20 +20306,9 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/yaml": { - "version": "2.7.0", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/object-assign": { @@ -20008,6 +20397,8 @@ }, "node_modules/only": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", "dev": true }, "node_modules/open": { @@ -20036,22 +20427,11 @@ "yaml": "^2.5.0" } }, - "node_modules/openapi3-ts/node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/opener": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } @@ -20111,14 +20491,16 @@ }, "node_modules/ordered-binary": { "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20312,6 +20694,12 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -20366,21 +20754,24 @@ }, "node_modules/parse-passwd": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/parse5": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^4.3.0", "parse5": "^7.0.0", @@ -20392,8 +20783,9 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -20414,8 +20806,9 @@ }, "node_modules/parse5-sax-parser": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, - "license": "MIT", "dependencies": { "parse5": "^7.0.0" }, @@ -20425,8 +20818,9 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -20503,10 +20897,22 @@ "node": ">=8" } }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, "node_modules/performance-now": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/pg": { "version": "8.11.3", @@ -20683,8 +21089,9 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20795,9 +21202,10 @@ } }, "node_modules/portfinder": { - "version": "1.0.32", + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.33.tgz", + "integrity": "sha512-+2jndHT63cL5MdQOwDm9OT2dIe11zVpjV+0GGRXdtO1wpPxv260NfVqoEXtYAi/shanmm3W4+yLduIe55ektTw==", "dev": true, - "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -20809,22 +21217,26 @@ }, "node_modules/portfinder/node_modules/async": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.17.14" } }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/postcss": { - "version": "8.4.49", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -20840,9 +21252,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -20852,8 +21263,9 @@ }, "node_modules/postcss-calc": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -20867,8 +21279,9 @@ }, "node_modules/postcss-colormin": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -20884,8 +21297,9 @@ }, "node_modules/postcss-convert-values": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -20899,8 +21313,9 @@ }, "node_modules/postcss-discard-comments": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -20910,8 +21325,9 @@ }, "node_modules/postcss-discard-duplicates": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -20921,8 +21337,9 @@ }, "node_modules/postcss-discard-empty": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -20932,8 +21349,9 @@ }, "node_modules/postcss-discard-overridden": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -20943,8 +21361,9 @@ }, "node_modules/postcss-import": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -21014,13 +21433,15 @@ }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true }, "node_modules/postcss-merge-longhand": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -21034,8 +21455,9 @@ }, "node_modules/postcss-merge-rules": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -21051,8 +21473,9 @@ }, "node_modules/postcss-minify-font-values": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21065,8 +21488,9 @@ }, "node_modules/postcss-minify-gradients": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dev": true, - "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -21081,8 +21505,9 @@ }, "node_modules/postcss-minify-params": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -21097,8 +21522,9 @@ }, "node_modules/postcss-minify-selectors": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -21166,8 +21592,9 @@ }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -21177,8 +21604,9 @@ }, "node_modules/postcss-normalize-display-values": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21191,8 +21619,9 @@ }, "node_modules/postcss-normalize-positions": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21205,8 +21634,9 @@ }, "node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21219,8 +21649,9 @@ }, "node_modules/postcss-normalize-string": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21233,8 +21664,9 @@ }, "node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21247,8 +21679,9 @@ }, "node_modules/postcss-normalize-unicode": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -21262,8 +21695,9 @@ }, "node_modules/postcss-normalize-url": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21276,8 +21710,9 @@ }, "node_modules/postcss-normalize-whitespace": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21290,8 +21725,9 @@ }, "node_modules/postcss-ordered-values": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dev": true, - "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -21305,8 +21741,9 @@ }, "node_modules/postcss-reduce-initial": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -21320,8 +21757,9 @@ }, "node_modules/postcss-reduce-transforms": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -21346,8 +21784,9 @@ }, "node_modules/postcss-svgo": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -21361,8 +21800,9 @@ }, "node_modules/postcss-unique-selectors": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -21513,8 +21953,9 @@ }, "node_modules/process": { "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -21566,11 +22007,6 @@ "node": ">= 6" } }, - "node_modules/property-expr": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "license": "MIT", @@ -21597,6 +22033,27 @@ "dev": true, "license": "MIT" }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "license": "MIT", @@ -21620,11 +22077,11 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -21675,8 +22132,9 @@ }, "node_modules/rambda": { "version": "9.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", + "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", + "dev": true }, "node_modules/randexp": { "version": "0.4.6", @@ -21707,8 +22165,9 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -21753,8 +22212,9 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -21842,456 +22302,846 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.0.2", + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", "dev": true, "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">= 14.16.0" + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/real-require": { - "version": "0.2.0", + "node_modules/resolve-from": { + "version": "5.0.0", "license": "MIT", "engines": { - "node": ">= 12.13.0" + "node": ">=8" } }, - "node_modules/rechoir": { - "version": "0.8.0", + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=12" } }, - "node_modules/redent": { - "version": "3.0.0", + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", "dev": true, "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=8" + "node": ">=8.9.0" } }, - "node_modules/reflect-metadata": { - "version": "0.1.14", - "license": "Apache-2.0" + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/regenerate": { - "version": "1.4.2", + "node_modules/resolve.exports": { + "version": "2.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", + "node_modules/restore-cursor": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", + "node_modules/ret": { + "version": "0.1.15", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.12" + } }, - "node_modules/regenerator-transform": { - "version": "0.15.2", + "node_modules/retry": { + "version": "0.12.0", "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" + "engines": { + "node": ">= 4" } }, - "node_modules/regex-parser": { - "version": "2.3.0", + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", "dev": true, "license": "MIT" }, - "node_modules/regexpu-core": { - "version": "6.2.0", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=4" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "@types/estree": "1.0.6" }, "bin": { - "regjsparser": "bin/parser" + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" } }, - "node_modules/repeat-string": { - "version": "1.6.1", + "node_modules/router": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-directory": { - "version": "2.1.1", + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-from-string": { - "version": "2.0.2", + "node_modules/safe-stable-stringify": { + "version": "2.4.3", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, + "node_modules/safer-buffer": { + "version": "2.1.2", "license": "MIT" }, - "node_modules/resolve": { - "version": "1.22.8", - "license": "MIT", + "node_modules/sass": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { - "resolve": "bin/resolve" + "sass": "sass.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", + "node_modules/sass-embedded": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.1.tgz", + "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==", "dev": true, - "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.85.1", + "sass-embedded-android-arm64": "1.85.1", + "sass-embedded-android-ia32": "1.85.1", + "sass-embedded-android-riscv64": "1.85.1", + "sass-embedded-android-x64": "1.85.1", + "sass-embedded-darwin-arm64": "1.85.1", + "sass-embedded-darwin-x64": "1.85.1", + "sass-embedded-linux-arm": "1.85.1", + "sass-embedded-linux-arm64": "1.85.1", + "sass-embedded-linux-ia32": "1.85.1", + "sass-embedded-linux-musl-arm": "1.85.1", + "sass-embedded-linux-musl-arm64": "1.85.1", + "sass-embedded-linux-musl-ia32": "1.85.1", + "sass-embedded-linux-musl-riscv64": "1.85.1", + "sass-embedded-linux-musl-x64": "1.85.1", + "sass-embedded-linux-riscv64": "1.85.1", + "sass-embedded-linux-x64": "1.85.1", + "sass-embedded-win32-arm64": "1.85.1", + "sass-embedded-win32-ia32": "1.85.1", + "sass-embedded-win32-x64": "1.85.1" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.1.tgz", + "integrity": "sha512-GkcgUGMZtEF9gheuE1dxCU0ZSAifuaFXi/aX7ZXvjtdwmTl9Zc/OHR9oiUJkc8IW9UI7H8TuwlTAA8+SwgwIeQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", + "node_modules/sass-embedded-android-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.1.tgz", + "integrity": "sha512-27oRheqNA3SJM2hAxpVbs7mCKUwKPWmEEhyiNFpBINb5ELVLg+Ck5RsGg+SJmo130ul5YX0vinmVB5uPWc8X5w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", + "node_modules/sass-embedded-android-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.1.tgz", + "integrity": "sha512-f3x16NyRgtXFksIaO/xXKrUhttUBv8V0XsAR2Dhdb/yz4yrDrhzw9Wh8fmw7PlQqECcQvFaoDr3XIIM6lKzasw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", + "node_modules/sass-embedded-android-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.1.tgz", + "integrity": "sha512-IP6OijpJ8Mqo7XqCe0LsuZVbAxEFVboa0kXqqR5K55LebEplsTIA2GnmRyMay3Yr/2FVGsZbCb6Wlgkw23eCiA==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", + "node_modules/sass-embedded-android-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.1.tgz", + "integrity": "sha512-Mh7CA53wR3ADvXAYipFc/R3vV4PVOzoKwWzPxmq+7i8UZrtsVjKONxGtqWe9JG1mna0C9CRZAx0sv/BzbOJxWg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8.9.0" + "node": ">=14.0.0" } }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.1.tgz", + "integrity": "sha512-msWxzhvcP9hqGVegxVePVEfv9mVNTlUgGr6k7O7Ihji702mbtrH/lKwF4aRkkt4g1j7tv10+JtQXmTNi/pi9kA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/resolve.exports": { - "version": "2.0.3", + "node_modules/sass-embedded-darwin-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.1.tgz", + "integrity": "sha512-J4UFHUiyI9Z+mwYMwz11Ky9TYr3hY1fCxeQddjNGL/+ovldtb0yAIHvoVM0BGprQDm5JqhtUk8KyJ3RMJqpaAA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", + "node_modules/sass-embedded-linux-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.1.tgz", + "integrity": "sha512-X0fDh95nNSw1wfRlnkE4oscoEA5Au4nnk785s9jghPFkTBg+A+5uB6trCjf0fM22+Iw6kiP4YYmDdw3BqxAKLQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/ret": { - "version": "0.1.15", + "node_modules/sass-embedded-linux-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.1.tgz", + "integrity": "sha512-jGadetB03BMFG2rq3OXub/uvC/lGpbQOiLGEz3NLb2nRZWyauRhzDtvZqkr6BEhxgIWtMtz2020yD8ZJSw/r2w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" + "node": ">=14.0.0" } }, - "node_modules/retry": { - "version": "0.12.0", + "node_modules/sass-embedded-linux-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.1.tgz", + "integrity": "sha512-7HlYY90d9mitDtNi5s+S+5wYZrTVbkBH2/kf7ixrzh2BFfT0YM81UHLJRnGX93y9aOMBL6DSZAIfkt1RsV9bkQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=14.0.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.1.tgz", + "integrity": "sha512-5vcdEqE8QZnu6i6shZo7x2N36V7YUoFotWj2rGekII5ty7Nkaj+VtZhUEOp9tAzEOlaFuDp5CyO1kUCvweT64A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.1.tgz", + "integrity": "sha512-FLkIT0p18XOkR6wryJ13LqGBDsrYev2dRk9dtiU18NCpNXruKsdBQ1ZnWHVKB3h1dA9lFyEEisC0sooKdNfeOQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/rimraf": { - "version": "3.0.2", + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.1.tgz", + "integrity": "sha512-N1093T84zQJor1yyIAdYScB5eAuQarGK1tKgZ4uTnxVlgA7Xi1lXV8Eh7ox9sDqKCaWkVQ3MjqU26vYRBeRWyw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rollup": { - "version": "4.30.1", + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.1.tgz", + "integrity": "sha512-WRsZS/7qlfYXsa93FBpSruieuURIu7ySfFhzYfF1IbKrNAGwmbduutkHZh2ddm5/vQMvQ0Rdosgv+CslaQHMcw==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", - "fsevents": "~2.3.2" + "node": ">=14.0.0" } }, - "node_modules/router": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.1.tgz", + "integrity": "sha512-+OlLIilA5TnP0YEqTQ8yZtkW+bJIQYvzoGoNLUEskeyeGuOiIyn2CwL6G4JQB4xZQFaxPHb7JD3EueFkQbH0Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" + "node": ">=14.0.0" } }, - "node_modules/router/node_modules/is-promise": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.0.0", + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.1.tgz", + "integrity": "sha512-mKKlOwMGLN7yP1p0gB5yG/HX4fYLnpWaqstNuOOXH+fOzTaNg0+1hALg0H0CDIqypPO74M5MS9T6FAJZGdT6dQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/sass-embedded-linux-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.1.tgz", + "integrity": "sha512-uKRTv0z8NgtHV7xSren78+yoWB79sNi7TMqI7Bxd8fcRNIgHQSA8QBdF8led2ETC004hr8h71BrY60RPO+SSvA==", + "cpu": [ + "x64" ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "node_modules/sass-embedded-win32-arm64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.1.tgz", + "integrity": "sha512-/GMiZXBOc6AEMBC3g25Rp+x8fq9Z6Ql7037l5rajBPhZ+DdFwtdHY0Ou3oIU6XuWUwD06U3ii4XufXVFhsP6PA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/sass-embedded-win32-ia32": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.1.tgz", + "integrity": "sha512-L+4BWkKKBGFOKVQ2PQ5HwFfkM5FvTf1Xx2VSRvEWt9HxPXp6SPDho6zC8fqNQ3hSjoaoASEIJcSvgfdQYO0gdg==", + "cpu": [ + "ia32" ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "license": "MIT", + "node_modules/sass-embedded-win32-x64": { + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.1.tgz", + "integrity": "sha512-/FO0AGKWxVfCk4GKsC0yXWBpUZdySe3YAAbQQL0lL6xUd1OiUY8Kow6g4Kc1TB/+z0iuQKKTqI/acJMEYl4iTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" + "node_modules/sass-embedded/node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true }, - "node_modules/sass": { - "version": "1.83.1", + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/sass-loader": { - "version": "16.0.4", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, - "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -22359,9 +23209,10 @@ } }, "node_modules/schema-utils": { - "version": "4.2.0", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -22369,7 +23220,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -22378,8 +23229,9 @@ }, "node_modules/secure-compare": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true }, "node_modules/select-hose": { "version": "2.0.0", @@ -22410,9 +23262,10 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -22434,21 +23287,33 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/seq-queue": { "version": "0.0.5" @@ -22532,14 +23397,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -22878,8 +23744,9 @@ }, "node_modules/sorted-array-functions": { "version": "1.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true }, "node_modules/source-map": { "version": "0.7.4", @@ -23034,8 +23901,9 @@ }, "node_modules/sshpk": { "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, - "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -23058,8 +23926,9 @@ }, "node_modules/sshpk/node_modules/jsbn": { "version": "0.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/ssri": { "version": "12.0.0", @@ -23100,21 +23969,24 @@ }, "node_modules/steno": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.3" } }, "node_modules/stream-shift": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true }, "node_modules/streamroller": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, - "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -23126,8 +23998,9 @@ }, "node_modules/streamroller/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -23139,16 +24012,18 @@ }, "node_modules/streamroller/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/streamroller/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -23159,6 +24034,19 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "license": "MIT", @@ -23275,8 +24163,9 @@ }, "node_modules/style-loader": { "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -23290,8 +24179,9 @@ }, "node_modules/stylehacks": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -23305,8 +24195,9 @@ }, "node_modules/stylus": { "version": "0.64.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", "dev": true, - "license": "MIT", "dependencies": { "@adobe/css-tools": "~4.3.3", "debug": "^4.3.2", @@ -23326,8 +24217,9 @@ }, "node_modules/stylus-loader": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", + "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.2.12", "normalize-path": "^3.0.0" @@ -23346,8 +24238,9 @@ }, "node_modules/stylus/node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -23365,8 +24258,9 @@ }, "node_modules/stylus/node_modules/jackspeak": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -23379,8 +24273,9 @@ }, "node_modules/stylus/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -23425,8 +24320,9 @@ }, "node_modules/svgo": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, - "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -23449,8 +24345,9 @@ }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } @@ -23475,6 +24372,27 @@ "dev": true, "license": "MIT" }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -23501,8 +24419,9 @@ }, "node_modules/tar-stream": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -23516,8 +24435,9 @@ }, "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -23604,9 +24524,10 @@ } }, "node_modules/terser": { - "version": "5.37.0", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -23621,15 +24542,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -23653,33 +24575,11 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "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, - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -23689,32 +24589,11 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -23758,6 +24637,15 @@ "node": "*" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -23803,6 +24691,16 @@ "dev": true, "license": "MIT" }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/thunky": { "version": "1.1.0", "dev": true, @@ -23830,10 +24728,29 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tldts": { + "version": "6.1.83", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.83.tgz", + "integrity": "sha512-FHxxNJJ0WNsEBPHyC1oesQb3rRoxpuho/z2g3zIIAhw1WHJeQsUzK1jYK8TI1/iClaa4fS3Z2TCA9mtxXsENSg==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.83" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.83", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.83.tgz", + "integrity": "sha512-I2wb9OJc6rXyh9d4aInhSNWChNI+ra6qDnFEGEwe9OoA68lE4Temw29bOkf1Uvwt8VZS079t1BFZdXVBmmB4dw==", + "dev": true + }, "node_modules/tmp": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.14" } @@ -23860,11 +24777,6 @@ "node": ">=0.6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/tough-cookie": { "version": "4.1.3", "dev": true, @@ -23991,8 +24903,9 @@ }, "node_modules/ts-loader": { "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -24010,8 +24923,9 @@ }, "node_modules/ts-loader/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24083,8 +24997,9 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -24096,8 +25011,9 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24142,8 +25058,9 @@ }, "node_modules/tsscmp": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.x" } @@ -24184,8 +25101,9 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -24195,13 +25113,15 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", - "dev": true, - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true }, "node_modules/typanion": { "version": "3.14.0", + "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", + "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", "dev": true, - "license": "MIT", "workspaces": [ "website" ] @@ -24559,6 +25479,8 @@ }, "node_modules/union": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { "qs": "^6.4.0" @@ -24598,8 +25520,9 @@ }, "node_modules/unix-crypt-td-js": { "version": "1.1.4", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "dev": true }, "node_modules/unpipe": { "version": "1.0.0", @@ -24610,8 +25533,9 @@ }, "node_modules/upath": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" @@ -24655,8 +25579,9 @@ }, "node_modules/url-join": { "version": "4.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true }, "node_modules/url-parse": { "version": "1.5.10", @@ -24733,12 +25658,19 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "license": "MIT", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true + }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -24747,31 +25679,32 @@ } }, "node_modules/verdaccio": { - "version": "5.29.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@cypress/request": "3.0.1", - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/local-storage": "10.3.3", - "@verdaccio/logger-7": "7.0.0-next-7.10", - "@verdaccio/middleware": "7.0.0-next-7.10", - "@verdaccio/search": "7.0.0-next.2", - "@verdaccio/signature": "7.0.0-next.3", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-6.0.5.tgz", + "integrity": "sha512-hv+v4mtG/rcNidGUHXAtNuVySiPE3/PM+7dYye5jCDrhCUmRJYOtnvDe/Ym1ZE/twti39g6izVRxEkjnSp52gA==", + "dev": true, + "dependencies": { + "@cypress/request": "3.0.7", + "@verdaccio/auth": "8.0.0-next-8.7", + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/local-storage-legacy": "11.0.2", + "@verdaccio/logger": "8.0.0-next-8.7", + "@verdaccio/middleware": "8.0.0-next-8.7", + "@verdaccio/search-indexer": "8.0.0-next-8.2", + "@verdaccio/signature": "8.0.0-next-8.1", "@verdaccio/streams": "10.2.1", - "@verdaccio/tarball": "12.0.0-next-7.10", - "@verdaccio/ui-theme": "7.0.0-next-7.10", - "@verdaccio/url": "12.0.0-next-7.10", - "@verdaccio/utils": "7.0.0-next-7.10", - "async": "3.2.5", - "clipanion": "3.2.1", - "compression": "1.7.4", - "cookies": "0.9.1", + "@verdaccio/tarball": "13.0.0-next-8.7", + "@verdaccio/ui-theme": "8.0.0-next-8.7", + "@verdaccio/url": "13.0.0-next-8.7", + "@verdaccio/utils": "7.0.1-next-8.1", + "async": "3.2.6", + "clipanion": "4.0.0-rc.4", + "compression": "1.7.5", "cors": "2.8.5", - "debug": "^4.3.4", - "envinfo": "7.11.0", - "express": "4.18.2", + "debug": "4.4.0", + "envinfo": "7.14.0", + "express": "4.21.2", "express-rate-limit": "5.5.1", "fast-safe-stringify": "2.1.1", "handlebars": "4.7.8", @@ -24783,18 +25716,17 @@ "lru-cache": "7.18.3", "mime": "3.0.0", "mkdirp": "1.0.4", - "mv": "2.1.1", "pkginfo": "0.4.1", - "semver": "7.5.4", - "validator": "13.11.0", - "verdaccio-audit": "12.0.0-next-7.10", - "verdaccio-htpasswd": "12.0.0-next-7.10" + "semver": "7.6.3", + "validator": "13.12.0", + "verdaccio-audit": "13.0.0-next-8.7", + "verdaccio-htpasswd": "13.0.0-next-8.7" }, "bin": { "verdaccio": "bin/verdaccio" }, "engines": { - "node": ">=12.18" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -24802,18 +25734,19 @@ } }, "node_modules/verdaccio-audit": { - "version": "12.0.0-next-7.10", + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-13.0.0-next-8.7.tgz", + "integrity": "sha512-kd6YdrDztkP1/GDZT7Ue2u41iGPvM9y+5aaUbIBUPvTY/YVv57K6MaCMfn9C/I+ZL4R7XOTSxTtWvz3JK4QrNg==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/config": "7.0.0-next-7.10", - "@verdaccio/core": "7.0.0-next-7.10", - "express": "4.18.2", + "@verdaccio/config": "8.0.0-next-8.7", + "@verdaccio/core": "8.0.0-next-8.7", + "express": "4.21.2", "https-proxy-agent": "5.0.1", "node-fetch": "cjs" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -24822,8 +25755,9 @@ }, "node_modules/verdaccio-audit/node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "4" }, @@ -24833,8 +25767,9 @@ }, "node_modules/verdaccio-audit/node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -24843,64 +25778,23 @@ "node": ">= 6" } }, - "node_modules/verdaccio-audit/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/verdaccio-audit/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/verdaccio-audit/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/verdaccio-audit/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/verdaccio-htpasswd": { - "version": "12.0.0-next-7.10", + "version": "13.0.0-next-8.7", + "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-13.0.0-next-8.7.tgz", + "integrity": "sha512-znyFnwt59mLKTAu6eHJrfWP07iaHUlYiQN7QoBo8KMAOT1AecUYreBqs93oKHdIOzjTI8j6tQLg57DpeVS5vgg==", "dev": true, - "license": "MIT", "dependencies": { - "@verdaccio/core": "7.0.0-next-7.10", - "@verdaccio/file-locking": "12.0.0-next.1", + "@verdaccio/core": "8.0.0-next-8.7", + "@verdaccio/file-locking": "13.0.0-next-8.2", "apache-md5": "1.1.8", "bcryptjs": "2.4.3", - "core-js": "3.35.0", - "debug": "4.3.4", + "core-js": "3.37.1", + "debug": "4.4.0", "http-errors": "2.0.0", "unix-crypt-td-js": "1.1.4" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -24908,20 +25802,61 @@ } }, "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { - "version": "12.0.0-next.1", + "version": "13.0.0-next-8.2", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-13.0.0-next-8.2.tgz", + "integrity": "sha512-TcHgN3I/N28WBSvtukpGrJhBljl4jyIXq0vEv94vXAG6nUE3saK+vtgo8PfYA3Ueo88v/1zyAbiZM4uxwojCmQ==", "dev": true, - "license": "MIT", "dependencies": { "lockfile": "1.0.4" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/verdaccio" } }, + "node_modules/verdaccio-htpasswd/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/verdaccio-htpasswd/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/verdaccio/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/verdaccio/node_modules/kleur": { "version": "4.1.5", "dev": true, @@ -24960,54 +25895,131 @@ "node": ">=10" } }, - "node_modules/verdaccio/node_modules/semver": { - "version": "7.5.4", + "node_modules/verdaccio/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, - "license": "ISC", + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/verdaccio/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vite": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, - "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=10" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/verdaccio/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/verror": { - "version": "1.10.0", + "node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, - "engines": [ - "node >=0.6.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "dev": true, @@ -25029,8 +26041,9 @@ }, "node_modules/watchpack": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -25057,8 +26070,9 @@ }, "node_modules/weak-lru-cache": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/webidl-conversions": { @@ -25070,9 +26084,10 @@ } }, "node_modules/webpack": { - "version": "5.97.1", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -25092,9 +26107,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -25267,29 +26282,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "dev": true, @@ -25313,92 +26305,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.7.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.21.2", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", "dev": true, @@ -25430,24 +26336,6 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "dev": true, - "license": "MIT" - }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", "dev": true, @@ -25459,20 +26347,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/qs": { - "version": "6.13.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", "dev": true, @@ -25484,56 +26358,6 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/send": { - "version": "0.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/webpack-dev-server/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.2", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -25549,8 +26373,9 @@ }, "node_modules/webpack-node-externals": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -25583,33 +26408,11 @@ } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -25620,38 +26423,18 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/webpack/node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } + "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 }, "node_modules/websocket-driver": { "version": "0.7.4", @@ -25850,11 +26633,14 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { @@ -25882,8 +26668,9 @@ }, "node_modules/ylru": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -25918,23 +26705,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yup": { - "version": "0.32.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/lodash": "^4.14.175", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "nanoclone": "^0.2.1", - "property-expr": "^2.0.4", - "toposort": "^2.0.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/zod": { "version": "3.24.1", "license": "MIT", diff --git a/package.json b/package.json index 3f0835ce..39963084 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,23 @@ "name": "@nestjs-json-api/source", "version": "0.0.0", "license": "MIT", + "contributors": [ + { + "email": "klerick666@gmain.com", + "name": "Aleksandr Kharkovey" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/klerick/nestjs-json-api.git" + }, + "engines": { + "node": ">= 20.0.0" + }, + "private": false, + "files": [ + "**/*" + ], "scripts": { "typeorm": "ts-node -r tsconfig-paths/register -r dotenv/config --project libs/typeorm-database/tsconfig.lib.json ./node_modules/typeorm/cli.js -d libs/typeorm-database/src/lib/config-cli.ts", "typeorm:run": "npm run typeorm migration:run", @@ -12,17 +29,16 @@ "demo:json-api": "nx run json-api-server:serve:development", "demo:json-api-front": "nx run json-api-front:serve:development" }, - "private": true, "dependencies": { "@anatine/zod-openapi": "^2.2.3", - "@angular/animations": "19.1.7", - "@angular/common": "19.1.7", - "@angular/compiler": "19.1.7", - "@angular/core": "19.1.7", - "@angular/forms": "19.1.7", - "@angular/platform-browser": "19.1.7", - "@angular/platform-browser-dynamic": "19.1.7", - "@angular/router": "19.1.7", + "@angular/animations": "^19.2.1", + "@angular/common": "^19.2.1", + "@angular/compiler": "^19.2.1", + "@angular/core": "^19.2.1", + "@angular/forms": "^19.2.1", + "@angular/platform-browser": "^19.2.1", + "@angular/platform-browser-dynamic": "^19.2.1", + "@angular/router": "^19.2.1", "@mikro-orm/cli": "^6.4.3", "@mikro-orm/core": "^6.4.3", "@mikro-orm/migrations": "^6.4.3", @@ -57,32 +73,32 @@ "zone.js": "0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "19.1.8", - "@angular-devkit/core": "19.1.8", - "@angular-devkit/schematics": "19.1.8", - "@angular-eslint/eslint-plugin": "19.1.0", - "@angular-eslint/eslint-plugin-template": "19.1.0", - "@angular-eslint/template-parser": "19.1.0", - "@angular/cli": "~19.1.0", - "@angular/compiler-cli": "19.1.7", - "@angular/language-service": "19.1.7", + "@angular-devkit/build-angular": "19.2.1", + "@angular-devkit/core": "19.2.1", + "@angular-devkit/schematics": "19.2.1", + "@angular-eslint/eslint-plugin": "19.2.0", + "@angular-eslint/eslint-plugin-template": "19.2.0", + "@angular-eslint/template-parser": "19.2.0", + "@angular/cli": "~19.2.0", + "@angular/compiler-cli": "19.2.1", + "@angular/language-service": "19.2.1", "@electric-sql/pglite": "^0.2.16", "@faker-js/faker": "^8.4.1", "@jorgebodega/typeorm-factory": "^1.4.0", "@jorgebodega/typeorm-seeding": "^6.0.1", "@nestjs/schematics": "^11.0.1", "@nestjs/testing": "^11.0.10", - "@nx/angular": "20.4.6", - "@nx/eslint": "20.4.6", - "@nx/eslint-plugin": "20.4.6", - "@nx/jest": "20.4.6", - "@nx/js": "20.4.6", - "@nx/nest": "20.4.6", - "@nx/node": "20.4.6", - "@nx/web": "20.4.6", - "@nx/webpack": "20.4.6", - "@nx/workspace": "20.4.6", - "@schematics/angular": "19.1.8", + "@nx/angular": "20.5.0", + "@nx/eslint": "20.5.0", + "@nx/eslint-plugin": "20.5.0", + "@nx/jest": "20.5.0", + "@nx/js": "20.5.0", + "@nx/nest": "20.5.0", + "@nx/node": "20.5.0", + "@nx/web": "20.5.0", + "@nx/webpack": "20.5.0", + "@nx/workspace": "20.5.0", + "@schematics/angular": "19.2.1", "@swc-node/register": "1.10.9", "@swc/core": "1.11.7", "@swc/helpers": "0.5.15", @@ -101,8 +117,8 @@ "jest-preset-angular": "14.4.2", "jsonc-eslint-parser": "^2.1.0", "knex-pglite": "^0.11.0", - "ng-packagr": "19.1.2", - "nx": "20.4.6", + "ng-packagr": "19.2.0", + "nx": "20.5.0", "pg-mem": "^3.0.2", "postcss": "^8.4.5", "postcss-url": "~10.1.3", @@ -112,7 +128,7 @@ "tsd": "^0.31.2", "typeorm-pglite": "^0.3.2", "typescript": "5.7.3", - "verdaccio": "^5.0.4", + "verdaccio": "6.0.5", "webpack-cli": "^5.1.4" }, "nx": { diff --git a/tools/scripts/publish.mjs b/tools/scripts/publish.mjs index 4d6b50a6..819695d0 100644 --- a/tools/scripts/publish.mjs +++ b/tools/scripts/publish.mjs @@ -8,10 +8,11 @@ */ import { execSync } from 'child_process'; -import { readFileSync, writeFileSync } from 'fs'; +import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs'; +import { join } from 'path'; import devkit from '@nx/devkit'; -const { readCachedProjectGraph } = devkit; +const { readCachedProjectGraph, workspaceRoot } = devkit; function invariant(condition, message) { if (!condition) { @@ -46,15 +47,59 @@ invariant( ); process.chdir(outputPath); +const sharedProperty = [ + 'license', + 'contributors', + 'repository', + 'engines', + 'private', + 'files', +]; // Updating the version in "package.json" before publishing try { + const mainJson = JSON.parse( + readFileSync(join(workspaceRoot, 'package.json')).toString() + ); const json = JSON.parse(readFileSync(`package.json`).toString()); json.version = version; + + for (const props of sharedProperty) { + if (!mainJson[props] || json[props]) continue; + json[props] = mainJson[props]; + } + removeDepFromOtherLib(graph, name, json); writeFileSync(`package.json`, JSON.stringify(json, null, 2)); } catch (e) { + console.log(e); console.error(`Error reading package.json file from library build output.`); } +if (existsSync(join(workspaceRoot, outputPath, 'cjs', 'package.json'))) { + unlinkSync(join(workspaceRoot, outputPath, 'cjs', 'package.json')); +} + +if (existsSync(join(workspaceRoot, outputPath, 'mjs', 'package.json'))) { + unlinkSync(join(workspaceRoot, outputPath, 'mjs', 'package.json')); +} + // Execute "npm publish" to publish execSync(`npm publish --access public --tag ${tag}`); + +function removeDepFromOtherLib(graph, name, json) { + const libsName = Object.values(graph.nodes) + .filter((i) => i.data.tags.includes('type:publish')) + .map((i) => i.data.metadata.js.packageName); + + if (!('peerDependencies' in json)) return; + + json['peerDependencies'] = Object.entries(json['peerDependencies']).reduce( + (acum, [name, value]) => { + if (libsName.includes(name)) { + acum[name] = `^${value}`; + } + return acum; + }, + {} + ); +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 9c57cbad..a1a3c886 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,9 +15,7 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@klerick/json-api-nestjs": [ - "dist/libs/json-api/json-api-nestjs" - ], + "@klerick/json-api-nestjs": ["dist/libs/json-api/json-api-nestjs"], "@klerick/json-api-nestjs-microorm": [ "dist/libs/json-api/json-api-nestjs-microorm" ], @@ -42,5 +40,5 @@ ] } }, - "exclude": ["node_modules", "tmp", "**/___test___/**"], + "exclude": ["node_modules", "tmp", "**/___test___/**"] } From 780bbf994bf8ec40e359c4274e74e9643e869016 Mon Sep 17 00:00:00 2001 From: Alex H Date: Tue, 11 Mar 2025 08:04:56 +0100 Subject: [PATCH 14/22] fix(json-api-nestjs-typeorm, json-api-nestjs-microorm): Fix mysql like error Mysql do not support ilike, use for it like fixes: #104 --- .env | 10 +- .../json-api/json-api-sdk/get-method.spec.ts | 14 +- docker-compose.yaml | 33 ++--- .../service/micro-orm-util.service.spec.ts | 2 +- .../src/lib/service/micro-orm-util.service.ts | 13 +- .../lib/service/typeorm-utils.service.spec.ts | 10 +- .../src/lib/service/typeorm-utils.service.ts | 23 +++- .../json-api-nestjs-typeorm/src/lib/type.ts | 3 +- libs/typeorm-database/src/lib/config-cli.ts | 26 ++-- .../src/lib/entities-mysql/addresses.ts | 58 +++++++++ .../src/lib/entities-mysql/book-list.ts | 40 ++++++ .../src/lib/entities-mysql/comments.ts | 57 +++++++++ .../src/lib/entities-mysql/index.ts | 5 + .../src/lib/entities-mysql/roles.ts | 56 ++++++++ .../src/lib/entities-mysql/users.ts | 121 ++++++++++++++++++ .../migrations-mysql/1741669072861-test.ts | 105 +++++++++++++++ package.json | 1 + 17 files changed, 528 insertions(+), 49 deletions(-) create mode 100644 libs/typeorm-database/src/lib/entities-mysql/addresses.ts create mode 100644 libs/typeorm-database/src/lib/entities-mysql/book-list.ts create mode 100644 libs/typeorm-database/src/lib/entities-mysql/comments.ts create mode 100644 libs/typeorm-database/src/lib/entities-mysql/index.ts create mode 100644 libs/typeorm-database/src/lib/entities-mysql/roles.ts create mode 100644 libs/typeorm-database/src/lib/entities-mysql/users.ts create mode 100644 libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts diff --git a/.env b/.env index 4a927090..eea2869d 100644 --- a/.env +++ b/.env @@ -1,19 +1,17 @@ DB_HOST=localhost DB_LOGGING=1 +DB_NAME="json-api-db" DB_USERNAME="postgres" DB_PASSWORD="postgres" -#DB_NAME="json-api-db" -DB_NAME="postgres" DB_PORT=5432 DB_TYPE=postgres #DB_USERNAME="root" -#DB_PASSWORD="password" -#DB_NAME="example_new" +#DB_PASSWORD="mysql" #DB_PORT=3306 #DB_TYPE=mysql -ORM_TYPE=microorm -#ORM_TYPE=typeorm +#ORM_TYPE=microorm +ORM_TYPE=typeorm diff --git a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts index 50bbd940..34df9ff4 100644 --- a/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-api-sdk/get-method.spec.ts @@ -32,7 +32,7 @@ describe('GET method:', () => { beforeAll(async () => { jsonSdk = creatSdk(); - const addressesPromise = Array.from(new Array(2)).map(() => { + const addressesPromise = Array.from(new Array(5)).map(() => { const address = new Addresses(); address.city = faker.string.alpha(50); address.state = faker.string.alpha(50); @@ -61,7 +61,7 @@ describe('GET method:', () => { const addressIndex = index % 2 === 0 ? 0 : 1; const user = getUser(); user.isActive = !!addressIndex; - user.addresses = addressArray[addressIndex]; + user.addresses = addressArray[index]; return jsonSdk.jonApiSdkService.postOne(user); }); usersArray = await Promise.all(usersPromise); @@ -148,6 +148,16 @@ describe('GET method:', () => { users2.forEach((user) => { expect(user.isActive).toBe(false); }); + + const resultFindLike = await jsonSdk.jonApiSdkService.getAll(Users, { + filter: { + target: { + login: { [FilterOperand.like]: users2.at(0)?.login.slice(5, -5) }, + }, + }, + }); + expect(resultFindLike.length).toBe(1); + expect(resultFindLike.at(0)?.id).toBe(users2.at(0)?.id); }); it('Should be get entities with filter by relation target', async () => { diff --git a/docker-compose.yaml b/docker-compose.yaml index 52340133..9518d9d6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,11 +1,5 @@ version: '3.8' services: -# api-gate: -# container_name: api-gate -# restart: always -# build: apps/api-gate/ -# ports: -# - "3000:3000" postgres: image: postgres:15.1-alpine restart: always @@ -29,23 +23,20 @@ services: - pgadmin:/root/.pgadmin ports: - '8000:80' -# redis: -# image: redis:6.2-alpine -# restart: always -# ports: -# - '6379:6379' -# command: redis-server --save 20 1 --loglevel warning -# volumes: -# - redis:/data -# jaeger: -# image: jaegertracing/all-in-one:1.41 -# ports: -# - "16686:16686" -# - "14268:14268" + db: + image: mysql:latest + restart: always + environment: + MYSQL_ROOT_PASSWORD: mysql + ports: + - '3306:3306' + volumes: + - mysql-db:/var/lib/mysql + volumes: db: driver: local -# redis: -# driver: local + mysql-db: + driver: local pgadmin: driver: local diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts index ca329ee9..4c146c32 100644 --- a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.spec.ts @@ -185,7 +185,7 @@ describe('MicroOrmUtilService', () => { [otherFiled]: { ['$' + FilterOperand.in]: otherFiledValue1, ['$' + FilterOperand.nin]: otherFiledValue1, - ['$' + FilterOperand.like]: otherFiledValue2, + ['$ilike']: `%${otherFiledValue2}%`, ['$' + FilterOperand.gt]: otherFiledValue3, }, }); diff --git a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts index f0cab820..20a9a0ea 100644 --- a/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts +++ b/libs/json-api/json-api-nestjs-microorm/src/lib/service/micro-orm-util.service.ts @@ -252,8 +252,12 @@ export class MicroOrmUtilService< [tmpField]: {}, }; let subQueryExpression: QBFilterQuery | undefined; + for (const entries of ObjectTyped.entries(filter as any)) { - const [operand, value] = entries as [FilterOperand, string]; + const [operand, valueInput] = entries as [FilterOperand, string]; + + const value = + operand === FilterOperand.like ? `%${valueInput}%` : valueInput; if (!this.relationsName.includes(tmpField)) { const operandForMiroOrmResult = this.extractedResultOperand(operand); @@ -329,6 +333,13 @@ export class MicroOrmUtilService< } private extractedResultOperand(operand: FilterOperand) { + if ( + operand === FilterOperand.like && + this.entityManager.getDriver().constructor.name === 'PostgreSqlDriver' + ) { + return '$ilike'; + } + return operand === 'regexp' ? '$re' : operand === 'some' diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts index 2ad30600..09a08cdd 100644 --- a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.spec.ts @@ -363,9 +363,15 @@ describe('TypeormUtilsService', () => { throw new Error(`name is not pattern: params_${alias}_\\d{1,}`); } const expressionMap = expression.replace(name, EXPRESSION); - const checkFilterOperand = Object.entries(FilterOperand).find( + + const checkFilterOperand = Object.entries({ + ...FilterOperand, + like: 'ilike', + } as any).find( + // @ts-ignore ([key, val]) => OperandsMapExpression[val] === expressionMap ); + if (!checkFilterOperand) { expect(checkFilterOperand).not.toBe(undefined); throw new Error(`expression incorrect`); @@ -580,7 +586,7 @@ describe('TypeormUtilsService', () => { throw Error('Should be like pattern'); } - expect(second.expression).toBe(`ILIKE :${secondResult[0]}`); + expect(second.expression).toBe(`LIKE :${secondResult[0]}`); expect(second.alias).toBe('Users__Comments_comments.createdAt'); expect(second.selectInclude).toBe('comments'); if (!Array.isArray(second.params)) { diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts index a936f76f..1d1597ff 100644 --- a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/typeorm-utils.service.ts @@ -5,7 +5,14 @@ import { NotFoundException, UnprocessableEntityException, } from '@nestjs/common'; -import { EntityMetadata, Equal, In, Repository } from 'typeorm'; +import { + EntityMetadata, + Equal, + In, + Repository, + ILike, + FindOperator, +} from 'typeorm'; import { RelationMetadata as TypeOrmRelationMetadata } from 'typeorm/metadata/RelationMetadata'; import { ObjectTyped, @@ -31,6 +38,7 @@ import { } from '../type'; import { CURRENT_ENTITY_REPOSITORY } from '../constants'; +import { DriverUtils } from 'typeorm/driver/DriverUtils'; type RelationAlias = { [K in UnionToTuple>[number] & PropertyKey]: string; @@ -255,9 +263,18 @@ export class TypeormUtilsService< for (const [fieldName, filter] of ObjectTyped.entries(filterTarget)) { if (!filter) continue; for (const entries of ObjectTyped.entries(filter)) { - const [operand, value] = entries as [FilterOperand, string]; + const [operandFromQuery, value] = entries as [FilterOperand, string]; const valueConditional = - operand === FilterOperand.like ? `%${value}%` : value; + operandFromQuery === FilterOperand.like ? `%${value}%` : value; + + const operand = DriverUtils.isPostgresFamily( + this.repository.manager.connection.driver + ) + ? operandFromQuery === FilterOperand.like + ? 'ilike' + : operandFromQuery + : operandFromQuery; + const fieldWithAlias = this.getAliasPath(fieldName); const paramsName = this.getParamName(fieldWithAlias); diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts index 74d93ef8..356bb26e 100644 --- a/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/type.ts @@ -17,11 +17,12 @@ export const OperandsMapExpression = { [FilterOperand.gt]: `> :${EXPRESSION}`, [FilterOperand.gte]: `>= :${EXPRESSION}`, [FilterOperand.in]: `IN (:...${EXPRESSION})`, - [FilterOperand.like]: `ILIKE :${EXPRESSION}`, + [FilterOperand.like]: `LIKE :${EXPRESSION}`, [FilterOperand.lt]: `< :${EXPRESSION}`, [FilterOperand.lte]: `<= :${EXPRESSION}`, [FilterOperand.nin]: `NOT IN (:...${EXPRESSION})`, [FilterOperand.some]: `&& :${EXPRESSION}`, + ilike: `ILIKE :${EXPRESSION}`, }; export const OperandMapExpressionForNull = { diff --git a/libs/typeorm-database/src/lib/config-cli.ts b/libs/typeorm-database/src/lib/config-cli.ts index 8f782496..9ca9bd1b 100644 --- a/libs/typeorm-database/src/lib/config-cli.ts +++ b/libs/typeorm-database/src/lib/config-cli.ts @@ -2,7 +2,7 @@ import { DataSource, DataSourceOptions } from 'typeorm'; import { join } from 'path'; import * as process from 'process'; -const config: DataSourceOptions = { +const configPg: DataSourceOptions = { type: process.env['DB_TYPE'] as 'mysql' | 'postgres', host: process.env['DB_HOST'], port: parseInt(`${process.env['DB_PORT']}`, 10), @@ -15,23 +15,25 @@ const config: DataSourceOptions = { ...(process.env['DB_TYPE'] === 'mysql' ? { connectorPackage: 'mysql2' } : {}), }; -// const config: DataSourceOptions = { -// type: 'mysql', -// host: 'localhost', -// username: 'root', -// connectorPackage: 'mysql2', -// password: 'password', -// database: 'example_new', -// logging: true, -// migrations: [join(__dirname, '/migrations/**/*{.ts,.js}')], -// entities: [join(__dirname, '/entities/**/*{.ts,.js}')], -// }; +const configMysql: DataSourceOptions = { + type: process.env['DB_TYPE'] as 'mysql' | 'postgres', + host: process.env['DB_HOST'], + port: parseInt(`${process.env['DB_PORT']}`, 10), + username: process.env['DB_USERNAME'], + password: process.env['DB_PASSWORD'], + database: process.env['DB_NAME'], + logging: process.env['DB_LOGGING'] === '1', + migrations: [join(__dirname, '/migrations-mysql/**/*{.ts,.js}')], + entities: [join(__dirname, '/entities-mysql/**/*{.ts,.js}')], + connectorPackage: 'mysql2', +}; const configSeeder = { seeders: ['./libs/database/src/lib/seeders/*.ts'], defaultSeeder: 'RootSeeder', }; +const config = process.env['DB_TYPE'] === 'mysql' ? configMysql : configPg; export { config, configSeeder }; export default new DataSource({ ...config, ...configSeeder }); diff --git a/libs/typeorm-database/src/lib/entities-mysql/addresses.ts b/libs/typeorm-database/src/lib/entities-mysql/addresses.ts new file mode 100644 index 00000000..84653202 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/addresses.ts @@ -0,0 +1,58 @@ +import { + PrimaryGeneratedColumn, + OneToOne, + Column, + Entity, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from '.'; + +export type IAddresses = Addresses; + +@Entity('addresses') +export class Addresses { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public city!: string; + + @Column({ + type: 'varchar', + length: 70, + nullable: true, + default: 'NULL', + }) + public state!: string; + + @Column({ + type: 'varchar', + length: 68, + nullable: true, + default: 'NULL', + }) + public country!: string; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @OneToOne(() => Users, (item) => item.addresses) + public user!: IUsers; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/book-list.ts b/libs/typeorm-database/src/lib/entities-mysql/book-list.ts new file mode 100644 index 00000000..135045c2 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/book-list.ts @@ -0,0 +1,40 @@ +import { + Column, + Entity, + ManyToMany, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm'; + +import { IUsers, Users } from './users'; + +export type IBookList = BookList; + +@Entity('book_list') +export class BookList { + @PrimaryGeneratedColumn() + public id!: string; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToMany(() => Users, (item) => item.books) + public users!: IUsers[]; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/comments.ts b/libs/typeorm-database/src/lib/entities-mysql/comments.ts new file mode 100644 index 00000000..a0e82a7e --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/comments.ts @@ -0,0 +1,57 @@ +import { + PrimaryGeneratedColumn, + Column, + Entity, + JoinColumn, + ManyToOne, + UpdateDateColumn, +} from 'typeorm'; + +export enum CommentKind { + Comment = 'COMMENT', + Message = 'MESSAGE', + Note = 'NOTE', +} + +import { Users, IUsers } from '.'; + +export type IComments = Comments; + +@Entity('comments') +export class Comments { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'text', + nullable: false, + }) + public text!: string; + + @Column({ + type: 'enum', + enum: CommentKind, + nullable: false, + }) + public kind!: CommentKind; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToOne(() => Users, (item: Users) => item.id) + @JoinColumn({ + name: 'created_by', + }) + public createdBy!: IUsers; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/index.ts b/libs/typeorm-database/src/lib/entities-mysql/index.ts new file mode 100644 index 00000000..c7af2ac0 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/index.ts @@ -0,0 +1,5 @@ +export * from './addresses'; +export * from './roles'; +export * from './users'; +export * from './comments'; +export * from './book-list'; diff --git a/libs/typeorm-database/src/lib/entities-mysql/roles.ts b/libs/typeorm-database/src/lib/entities-mysql/roles.ts new file mode 100644 index 00000000..1de8ea8e --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/roles.ts @@ -0,0 +1,56 @@ +import { + PrimaryGeneratedColumn, + Entity, + Column, + ManyToMany, + UpdateDateColumn, +} from 'typeorm'; + +import { Users, IUsers } from '.'; + +export type IRoles = Roles; + +@Entity('roles') +export class Roles { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 128, + nullable: true, + default: 'NULL', + }) + public name!: string; + + @Column({ + type: 'varchar', + length: 128, + nullable: false, + unique: true, + }) + public key!: string; + + @Column({ + name: 'is_default', + default: false, + }) + public isDefault!: boolean; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @ManyToMany(() => Users, (item: Users) => item.roles) + public users!: IUsers[]; +} diff --git a/libs/typeorm-database/src/lib/entities-mysql/users.ts b/libs/typeorm-database/src/lib/entities-mysql/users.ts new file mode 100644 index 00000000..33861b69 --- /dev/null +++ b/libs/typeorm-database/src/lib/entities-mysql/users.ts @@ -0,0 +1,121 @@ +import { + PrimaryGeneratedColumn, + ManyToMany, + JoinColumn, + JoinTable, + OneToOne, + OneToMany, + Entity, + Column, + UpdateDateColumn, +} from 'typeorm'; + +import { + Addresses, + IAddresses, + Roles, + IRoles, + Comments, + IComments, + IBookList, + BookList, +} from '.'; + +export type IUsers = Users; + +@Entity('users') +export class Users { + @PrimaryGeneratedColumn() + public id!: number; + + @Column({ + type: 'varchar', + length: 100, + nullable: false, + unique: true, + }) + public login!: string; + + @Column({ + name: 'first_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public firstName!: string; + + @Column({ + name: 'last_name', + type: 'varchar', + length: 100, + nullable: true, + default: 'NULL', + }) + public lastName!: string; + + @Column({ + nullable: false, + default: false, + name: 'is_active', + type: 'boolean', + }) + public isActive!: boolean; + + @Column({ + name: 'created_at', + type: 'timestamp', + nullable: true, + }) + public createdAt!: Date; + + @UpdateDateColumn({ + name: 'updated_at', + type: 'timestamp', + nullable: true, + }) + public updatedAt!: Date; + + @OneToOne(() => Addresses, (item: Addresses) => item.id) + @JoinColumn({ + name: 'addresses_id', + }) + public addresses!: IAddresses; + + @OneToOne(() => Users, (item) => item.id) + @JoinColumn({ + name: 'manager_id', + }) + public manager!: IUsers; + + @ManyToMany(() => Roles, (item: Roles) => item.users) + @JoinTable({ + name: 'users_have_roles', + inverseJoinColumn: { + referencedColumnName: 'id', + name: 'roles_id', + }, + joinColumn: { + referencedColumnName: 'id', + name: 'users_id', + }, + }) + public roles!: IRoles[]; + + @OneToMany(() => Comments, (item: Comments) => item.createdBy) + public comments!: IComments[]; + + @ManyToMany(() => BookList, (item: BookList) => item.users) + @JoinTable({ + name: 'users_have_book', + inverseJoinColumn: { + referencedColumnName: 'id', + name: 'book_list_id', + }, + joinColumn: { + referencedColumnName: 'id', + name: 'users_id', + }, + }) + public books!: IBookList[]; +} diff --git a/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts b/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts new file mode 100644 index 00000000..18dcf130 --- /dev/null +++ b/libs/typeorm-database/src/lib/migrations-mysql/1741669072861-test.ts @@ -0,0 +1,105 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class Test1741669072861 implements MigrationInterface { + name = 'Test1741669072861'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE \`addresses\` (\`id\` int NOT NULL AUTO_INCREMENT, \`city\` varchar(70) NULL DEFAULT 'NULL', \`state\` varchar(70) NULL DEFAULT 'NULL', \`country\` varchar(68) NULL DEFAULT 'NULL', \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`roles\` (\`id\` int NOT NULL AUTO_INCREMENT, \`name\` varchar(128) NULL DEFAULT 'NULL', \`key\` varchar(128) NOT NULL, \`is_default\` tinyint NOT NULL DEFAULT 0, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), UNIQUE INDEX \`IDX_a87cf0659c3ac379b339acf36a\` (\`key\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`comments\` (\`id\` int NOT NULL AUTO_INCREMENT, \`text\` text NOT NULL, \`kind\` enum ('COMMENT', 'MESSAGE', 'NOTE') NOT NULL, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`created_by\` int NULL, PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`book_list\` (\`id\` int NOT NULL AUTO_INCREMENT, \`text\` text NOT NULL, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users\` (\`id\` int NOT NULL AUTO_INCREMENT, \`login\` varchar(100) NOT NULL, \`first_name\` varchar(100) NULL DEFAULT 'NULL', \`last_name\` varchar(100) NULL DEFAULT 'NULL', \`is_active\` tinyint NOT NULL DEFAULT 0, \`created_at\` timestamp NULL, \`updated_at\` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`addresses_id\` int NULL, \`manager_id\` int NULL, UNIQUE INDEX \`IDX_2d443082eccd5198f95f2a36e2\` (\`login\`), UNIQUE INDEX \`REL_2f8d527df0d3acb8aa51945a96\` (\`addresses_id\`), UNIQUE INDEX \`REL_fba2d8e029689aa8fea98e53c9\` (\`manager_id\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users_have_roles\` (\`users_id\` int NOT NULL, \`roles_id\` int NOT NULL, INDEX \`IDX_bb66594b23503c32a315a63fe1\` (\`users_id\`), INDEX \`IDX_afa6ce5ffd14d2e5580fd54624\` (\`roles_id\`), PRIMARY KEY (\`users_id\`, \`roles_id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`users_have_book\` (\`users_id\` int NOT NULL, \`book_list_id\` int NOT NULL, INDEX \`IDX_7b85c8711c8d45d686a1b6ea64\` (\`users_id\`), INDEX \`IDX_88eb6d4c67dab296d402b0ae2e\` (\`book_list_id\`), PRIMARY KEY (\`users_id\`, \`book_list_id\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `ALTER TABLE \`comments\` ADD CONSTRAINT \`FK_980bfefe00ed11685f325d0bd4c\` FOREIGN KEY (\`created_by\`) REFERENCES \`users\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users\` ADD CONSTRAINT \`FK_2f8d527df0d3acb8aa51945a968\` FOREIGN KEY (\`addresses_id\`) REFERENCES \`addresses\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users\` ADD CONSTRAINT \`FK_fba2d8e029689aa8fea98e53c91\` FOREIGN KEY (\`manager_id\`) REFERENCES \`users\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` ADD CONSTRAINT \`FK_bb66594b23503c32a315a63fe1e\` FOREIGN KEY (\`users_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` ADD CONSTRAINT \`FK_afa6ce5ffd14d2e5580fd54624e\` FOREIGN KEY (\`roles_id\`) REFERENCES \`roles\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` ADD CONSTRAINT \`FK_7b85c8711c8d45d686a1b6ea64e\` FOREIGN KEY (\`users_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` ADD CONSTRAINT \`FK_88eb6d4c67dab296d402b0ae2e2\` FOREIGN KEY (\`book_list_id\`) REFERENCES \`book_list\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`users_have_book\` DROP FOREIGN KEY \`FK_88eb6d4c67dab296d402b0ae2e2\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_book\` DROP FOREIGN KEY \`FK_7b85c8711c8d45d686a1b6ea64e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` DROP FOREIGN KEY \`FK_afa6ce5ffd14d2e5580fd54624e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users_have_roles\` DROP FOREIGN KEY \`FK_bb66594b23503c32a315a63fe1e\`` + ); + await queryRunner.query( + `ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_fba2d8e029689aa8fea98e53c91\`` + ); + await queryRunner.query( + `ALTER TABLE \`users\` DROP FOREIGN KEY \`FK_2f8d527df0d3acb8aa51945a968\`` + ); + await queryRunner.query( + `ALTER TABLE \`comments\` DROP FOREIGN KEY \`FK_980bfefe00ed11685f325d0bd4c\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_88eb6d4c67dab296d402b0ae2e\` ON \`users_have_book\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_7b85c8711c8d45d686a1b6ea64\` ON \`users_have_book\`` + ); + await queryRunner.query(`DROP TABLE \`users_have_book\``); + await queryRunner.query( + `DROP INDEX \`IDX_afa6ce5ffd14d2e5580fd54624\` ON \`users_have_roles\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_bb66594b23503c32a315a63fe1\` ON \`users_have_roles\`` + ); + await queryRunner.query(`DROP TABLE \`users_have_roles\``); + await queryRunner.query( + `DROP INDEX \`REL_fba2d8e029689aa8fea98e53c9\` ON \`users\`` + ); + await queryRunner.query( + `DROP INDEX \`REL_2f8d527df0d3acb8aa51945a96\` ON \`users\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_2d443082eccd5198f95f2a36e2\` ON \`users\`` + ); + await queryRunner.query(`DROP TABLE \`users\``); + await queryRunner.query(`DROP TABLE \`book_list\``); + await queryRunner.query(`DROP TABLE \`comments\``); + await queryRunner.query( + `DROP INDEX \`IDX_a87cf0659c3ac379b339acf36a\` ON \`roles\`` + ); + await queryRunner.query(`DROP TABLE \`roles\``); + await queryRunner.query(`DROP TABLE \`addresses\``); + } +} diff --git a/package.json b/package.json index 39963084..0c9d183c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "typeorm": "ts-node -r tsconfig-paths/register -r dotenv/config --project libs/typeorm-database/tsconfig.lib.json ./node_modules/typeorm/cli.js -d libs/typeorm-database/src/lib/config-cli.ts", "typeorm:run": "npm run typeorm migration:run", "typeorm:revert": "npm run typeorm migration:revert", + "typeorm:generate": "npm run typeorm migration:generate", "seed:run": "ts-node -r tsconfig-paths/register -r dotenv/config --project libs/typeorm-database/tsconfig.lib.json ./node_modules/@jorgebodega/typeorm-seeding/dist/cli.js -d libs/typeorm-database/src/lib/config-cli.ts seed libs/typeorm-database/src/lib/seeders/root.seeder.ts", "microorm": "ts-node -r tsconfig-paths/register -r dotenv/config -P ./libs/microorm-database/tsconfig.lib.json ./node_modules/@mikro-orm/cli/cli.js", "microorm:up": "npm run microorm migration:up", From 5ca71324d599ca60f9d49d419dcb637b8c451806 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 06:45:42 +0100 Subject: [PATCH 15/22] refactor(json-api-nestjs-typeorm): remove unused code --- .../src/lib/service/type-orm-format.error.service.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts index 0f51bae1..e66dc644 100644 --- a/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts +++ b/libs/json-api/json-api-nestjs-typeorm/src/lib/service/type-orm-format.error.service.ts @@ -3,8 +3,6 @@ import { EntityParam, ValidateQueryError, ENTITY_PARAM_MAP, - EntityControllerParam, - MODULE_OPTIONS_TOKEN, } from '@klerick/json-api-nestjs'; import { BadRequestException, @@ -108,7 +106,6 @@ export const PostgresError = { }; export class TypeOrmFormatErrorService extends ErrorFormatService { - @Inject(MODULE_OPTIONS_TOKEN) private moduleOptions!: EntityControllerParam; @Inject(CURRENT_ENTITY_MANAGER_TOKEN) private entityManager!: EntityManager; @Inject(ENTITY_PARAM_MAP) private readonly mapProperty!: Map< EntityTarget, From e52cc92cbcc3c0f8f07854b70557546abcc00fd8 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 06:46:37 +0100 Subject: [PATCH 16/22] fix(json-api-nestjs): Use correct options for check is debug or not --- .../lib/modules/mixin/service/error-format.service.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts index 5c355b89..b5c96ca8 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/service/error-format.service.ts @@ -5,13 +5,12 @@ import { InternalServerErrorException, } from '@nestjs/common'; import { MODULE_OPTIONS_TOKEN } from '../../../constants'; -import { EntityControllerParam } from '../types'; -import { ValidateQueryError } from '../../../types'; +import { PrepareParams, ValidateQueryError } from '../../../types'; import { HttpExceptionOptions } from '@nestjs/common/exceptions/http.exception'; @Injectable() export class ErrorFormatService { - @Inject(MODULE_OPTIONS_TOKEN) private config!: EntityControllerParam; + @Inject(MODULE_OPTIONS_TOKEN) private config!: PrepareParams; private defaultErrorMsg = 'Internal Server Error'; formatError(error: unknown): HttpException { if (error instanceof HttpException) { @@ -20,7 +19,7 @@ export class ErrorFormatService { const errMessage = error instanceof Error - ? this.config.debug + ? this.config.options.debug ? error.message : this.defaultErrorMsg : this.defaultErrorMsg; @@ -31,7 +30,7 @@ export class ErrorFormatService { path: [], }; - const descriptionOrOptions: HttpExceptionOptions = this.config.debug + const descriptionOrOptions: HttpExceptionOptions = this.config.options.debug ? { description: this.defaultErrorMsg, cause: error instanceof Error ? error : undefined, From 9a0f190e1ea06f697c3cf6e5377e25e948648df2 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 06:47:43 +0100 Subject: [PATCH 17/22] fix(json-api-nestjs): Some fix for swagger add json schema for filter use correct name of controller for delete rel --- .../swagger/method/delete-relationship.ts | 2 +- .../modules/mixin/swagger/method/get-all.ts | 47 +++++++++++++++++-- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts index b922f3b8..7b236c2e 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/delete-relationship.ts @@ -29,7 +29,7 @@ export function deleteRelationship< ApiOperation({ summary: `Delete list of relation for resource "${entityName}"`, - operationId: `${controller.name}_${methodName}`, + operationId: `${controller.constructor.name}_${methodName}`, })(controller, methodName, descriptor); ApiParam({ diff --git a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts index c8b9fb24..555d0dc4 100644 --- a/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts +++ b/libs/json-api/json-api-nestjs/src/lib/modules/mixin/swagger/method/get-all.ts @@ -1,6 +1,10 @@ import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger'; import { Type } from '@nestjs/common'; -import { ObjectTyped, EntityClass } from '@klerick/json-api-nestjs-shared'; +import { + ObjectTyped, + EntityClass, + FilterOperand, +} from '@klerick/json-api-nestjs-shared'; import { assertIsKeysOfObject, @@ -72,13 +76,44 @@ export function getAll( }, description: `Object of field for select field from "${entity.name}" resource`, })(controller, methodName, descriptor); - + // https://github.com/OAI/OpenAPI-Specification/issues/1706#issuecomment-2704374644 need wait fix deepObject ApiQuery({ name: 'filter', required: false, style: 'deepObject', schema: { type: 'object', + properties: { + ...props.reduce((acum, i) => { + Reflect.set(acum, String(i), { + type: 'object', + properties: Object.keys(FilterOperand).reduce((acum, name) => { + Reflect.set(acum, String(name), { + type: 'string', + }); + return acum; + }, {}), + minProperties: 1, + additionalProperties: false, + }); + return acum; + }, {}), + ...relationTree.reduce((acum, i) => { + Reflect.set(acum, String(i), { + type: 'object', + properties: Object.keys(FilterOperand).reduce((acum, name) => { + Reflect.set(acum, String(name), { + type: 'string', + }); + return acum; + }, {}), + minProperties: 1, + additionalProperties: false, + }); + return acum; + }, {}), + }, + additionalProperties: false, }, examples: { simpleExample: { @@ -204,16 +239,20 @@ export function getAll( required: false, schema: { type: 'object', + examples: [ + { + number: DEFAULT_QUERY_PAGE, + size: DEFAULT_PAGE_SIZE, + }, + ], properties: { number: { type: 'integer', minimum: 1, - example: DEFAULT_QUERY_PAGE, }, size: { type: 'integer', minimum: 1, - example: DEFAULT_PAGE_SIZE, maximum: 500, }, }, From 62011c890015dcd9aa5bece54f2c7827a3e1a634 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 07:35:41 +0100 Subject: [PATCH 18/22] docs: Add link to new package fron main readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b268dff2..5f58d33f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ - **[JSON:API](https://jsonapi.org/)** – A specification for building RESTful APIs with standardized request and response formats. > **[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)** - This package enables you to quickly set up a server API that adheres to the JSON:API specification, handling standard CRUD operations for your resources.
+ > **[json-api-nestjs-microorm](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-microorm)** - This package is adapter for MicroOrm.
+ > **[json-api-nestjs-typeorm](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-typeorm)** - This package is adapter for TypeOrm.
> **[json-api-nestjs-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-sdk)** - tool for client, call api over *json-api-nestjs* From 0d3c852d6dd586235f10ef0876980748583597ca Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 07:36:24 +0100 Subject: [PATCH 19/22] refactor(microorm-database): remove unused code --- .../src/lib/micro-orm-database.module.ts | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/libs/microorm-database/src/lib/micro-orm-database.module.ts b/libs/microorm-database/src/lib/micro-orm-database.module.ts index 88aca6dc..cab84d50 100644 --- a/libs/microorm-database/src/lib/micro-orm-database.module.ts +++ b/libs/microorm-database/src/lib/micro-orm-database.module.ts @@ -8,17 +8,6 @@ import { config } from './config'; imports: [MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware()], exports: [MikroOrmCoreModule], }) -export class MicroOrmDatabaseModule { - // static async forRootAsync() { - // const microOrmModule = await MikroOrmModule.forRoot(config); - // console.log(microOrmModule.providers); - // return { - // module: MicroOrmDatabaseModule, - // imports: [microOrmModule], - // // imports: [microOrmModule], - // // exports: [MikroOrmCoreModule], - // }; - // } -} +export class MicroOrmDatabaseModule {} export { config }; From 1e836d18e12c4251aa130d567f08c48761d87b77 Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 07:36:49 +0100 Subject: [PATCH 20/22] docs(json-api-nestjs-microorm): Change readme --- .../json-api-nestjs-microorm/README.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libs/json-api/json-api-nestjs-microorm/README.md b/libs/json-api/json-api-nestjs-microorm/README.md index d9e7ede4..e7361f24 100644 --- a/libs/json-api/json-api-nestjs-microorm/README.md +++ b/libs/json-api/json-api-nestjs-microorm/README.md @@ -18,3 +18,36 @@ export type MicroOrmParam = { }; ``` + +## NOTE: MikroORM Default Named Context Issue in NestJS + +[@mikro-orm/nestjs](https://github.com/mikro-orm/nestjs) does not create a [default named context](https://github.com/mikro-orm/nestjs/discussions/214). + +As a result, the module initialization behaves differently depending on whether a single or multiple connections are used. +More specifically, the [dependency injection token for MikroORM differs](https://github.com/mikro-orm/nestjs/issues/213) between one and multiple database connections. + +To maintain a consistent JSON:API module configuration across different database adapters, +I decided **not to add extra conditional checks** in the setup. + +For everything to work correctly, @mikro-orm/nestjs should be integrated using the following module: +👉 [MicroORM Database Module](https://github.com/klerick/nestjs-json-api/blob/master/libs/microorm-database/src/lib/micro-orm-database.module.ts). + +```typescript +import ormConfig from './config'; + +// need set contextName and registerRequestContext +export const config: Options = { + contextName: 'default', + registerRequestContext: false, + ...ormConfig, +}; + +@Module({ + imports: [MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware()], + exports: [MikroOrmCoreModule], +}) +export class MicroOrmDatabaseModule {} +``` + + + From 93c2d535669d02db14de709c964bd26c59f112cd Mon Sep 17 00:00:00 2001 From: Alex H Date: Wed, 12 Mar 2025 07:36:58 +0100 Subject: [PATCH 21/22] docs(json-api-nestjs): Change readme --- libs/json-api/json-api-nestjs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/json-api/json-api-nestjs/README.md b/libs/json-api/json-api-nestjs/README.md index ca43d8f9..1bf33659 100644 --- a/libs/json-api/json-api-nestjs/README.md +++ b/libs/json-api/json-api-nestjs/README.md @@ -427,6 +427,7 @@ but [Atomic operation](https://jsonapi.org/ext/atomic/) allow for one request. ``` **tmpId** - is params for operation **add**, should be unique for all operations. + If you have Interceptor you can check call it from **AtomicOperation** From 5ecb11e1149b442f85536accae044f24be2d1209 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 13 Mar 2025 06:45:41 +0100 Subject: [PATCH 22/22] ci: change yaml --- .github/workflows/bump-version.yml | 7 +------ .github/workflows/create-release.yaml | 10 ++-------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 8bcdf31d..ddf27740 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -7,11 +7,6 @@ on: description: "Project list" required: true type: string - first-release: - description: 'Is first release?' - required: false - type: boolean - default: false beta-release: description: 'Is beta release?' required: false @@ -50,5 +45,5 @@ jobs: run: | git config --global user.email "actions@github.com" git config --global user.name "GitHub Actions" - npx nx release --skip-publish --first-release=${{ inputs.first-release }} --projects=${{ inputs.projects }} --dry-run=${{ inputs.dry-run }} + npx nx release --skip-publish --projects=${{ inputs.projects }} --dry-run=${{ inputs.dry-run }} shell: bash diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 9a36f207..46c2daca 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -47,11 +47,6 @@ on: default: "" type: choice options: *project_options - first-release: - description: 'Is first release?' - required: false - type: boolean - default: false beta-release: description: 'Is beta release?' required: false @@ -113,9 +108,8 @@ jobs: uses: ./.github/workflows/bump-version.yml with: projects: ${{ needs.compute-projects.outputs.finalProjects }} - first-release: ${{ needs.compute-projects.outputs.first-release }} - beta-release: ${{ needs.compute-projects.outputs.beta-release }} - dry-run: ${{ needs.compute-projects.outputs.dry-run }} + beta-release: ${{ github.event.inputs.beta-release }} + dry-run: ${{ github.event.inputs.dry-run }} secrets: NPM_ACCESS_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} GITHUB_TOKEN_SECRET: ${{ secrets.GITHUB_TOKEN }}