diff --git a/apps/server-nestjs/.env-example b/apps/server-nestjs/.env-example new file mode 100644 index 000000000..84236efbe --- /dev/null +++ b/apps/server-nestjs/.env-example @@ -0,0 +1,18 @@ +DEV_SETUP="true" +NODE_ENV=development +# HOME=/home/node +SESSION_SECRET=a-very-strong-secret-with-more-than-32-char +KEYCLOAK_DOMAIN=localhost:8090 +KEYCLOAK_REALM=cloud-pi-native +KEYCLOAK_PROTOCOL=http +KEYCLOAK_CLIENT_ID=dso-console-backend +KEYCLOAK_CLIENT_SECRET=client-secret-backend +KEYCLOAK_REDIRECT_URI=http://localhost:8080 +SERVER_PORT=4000 +DB_URL=postgresql://admin:admin@localhost:5432/dso-console-db?schema=public +CONTACT_EMAIL=cloudpinative-relations@interieur.gouv.fr + +# Configuration OpenCDS +OPENCDS_URL= +OPENCDS_API_TOKEN=token +OPENCDS_API_TLS_REJECT_UNAUTHORIZED=true diff --git a/apps/server-nestjs/.env.docker-example b/apps/server-nestjs/.env.docker-example new file mode 100644 index 000000000..0da54a8e4 --- /dev/null +++ b/apps/server-nestjs/.env.docker-example @@ -0,0 +1,13 @@ +DOCKER=true +DEV_SETUP="true" +NODE_ENV=development +SESSION_SECRET=a-very-strong-secret-with-more-than-32-char +KEYCLOAK_DOMAIN=keycloak:8080 +KEYCLOAK_REALM=cloud-pi-native +KEYCLOAK_PROTOCOL=http +KEYCLOAK_CLIENT_ID=dso-console-backend +KEYCLOAK_CLIENT_SECRET=client-secret-backend +KEYCLOAK_REDIRECT_URI=http://localhost:8080 +SERVER_PORT=8080 +DB_URL=postgresql://admin:admin@postgres:5432/dso-console-db?schema=public +CONTACT_EMAIL=cloudpinative-relations@interieur.gouv.fr diff --git a/apps/server-nestjs/.env.integ-example b/apps/server-nestjs/.env.integ-example new file mode 100644 index 000000000..33e23e778 --- /dev/null +++ b/apps/server-nestjs/.env.integ-example @@ -0,0 +1,43 @@ +DEV_SETUP="false" +INTEGRATION=true +KEYCLOAK_PROTOCOL=https +KEYCLOAK_CLIENT_ID= +KEYCLOAK_CLIENT_SECRET= +KEYCLOAK_DOMAIN= +KEYCLOAK_REALM= +ARGO_NAMESPACE= +ARGOCD_URL= +GITLAB_TOKEN= +GITLAB_URL= +HARBOR_ADMIN= +HARBOR_ADMIN_PASSWORD= +HARBOR_URL= +KEYCLOAK_ADMIN= +KEYCLOAK_ADMIN_PASSWORD= +KEYCLOAK_URL= +NEXUS_ADMIN= +NEXUS_ADMIN_PASSWORD= +NEXUS_URL= +PROJECTS_ROOT_DIR= +SONAR_API_TOKEN= +SONARQUBE_URL= +VAULT_TOKEN= +VAULT_URL= + +KUBECONFIG_HOST_PATH= +KUBECONFIG_PATH=$HOME/.kube/config +KUBECONFIG_CTX= + +EXTERNAL_PLUGINS_DIR_HOST_PATH=/path/to/plugins + +# Variables de plugins externes + +# GRAVITEE_APIM_API_ID= +# GRAVITEE_APIM_PLAN_ID= +# GRAVITEE_APIM_TOKEN= +# GRAVITEE_APIM_URL= +# GRAVITEE_GATEWAY_URL= + +# HTTP_PROXY= +# HTTPS_PROXY= +# NO_PROXY= diff --git a/apps/server-nestjs/.gitignore b/apps/server-nestjs/.gitignore new file mode 100644 index 000000000..4b56acfbe --- /dev/null +++ b/apps/server-nestjs/.gitignore @@ -0,0 +1,56 @@ +# compiled output +/dist +/node_modules +/build + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# temp directory +.temp +.tmp + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/apps/server-nestjs/.prettierrc b/apps/server-nestjs/.prettierrc new file mode 100644 index 000000000..8deec5d94 --- /dev/null +++ b/apps/server-nestjs/.prettierrc @@ -0,0 +1,12 @@ +{ + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "importOrderParserPlugins": ["typescript", "decorators"], + "importOrder": ["^@core/(.*)$", "^@server/(.*)$", "^@ui/(.*)$", "^[./]"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true, + "printWidth": 80, + "semi": true, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "all" +} diff --git a/apps/server-nestjs/README.md b/apps/server-nestjs/README.md new file mode 100644 index 000000000..5fbfdeaf8 --- /dev/null +++ b/apps/server-nestjs/README.md @@ -0,0 +1,444 @@ +# À propos + +Ce dossier contient une nouvelle version de `server`, basée sur NestJS. + +## Objectifs + +Rappel : L'objectif principal de cette démarche est de préparer l'extraction de +chaque "plugin" en tant que module NestJS incluant à la fois la partie Front et +la partie Backend pour une meilleure composition de la Console. + +On va profiter de cette vision pour passer, côté `server` d'un "Back For +Front", à un backend qui va gérer à la fois le Front et le Back de différentes +fonctionnalités (appelée "Plugins"), et ce parfois de manière dynamique (mais +déjà en statique, ce sera pas mal 😅). + + +## Conséquences pour apps/server + +On va donc passer de ça : + +```mermaid +flowchart TD + + %% --- Top-level --- + NestJS["Nest.js"] + FutursModules["Futurs modules
Nest.js correctement
découpés..."] + MainModule["MainModule"] + + NestJS --> MainModule + MainModule --> CPinModule + MainModule -.-> FutursModules + + CPinModule["CPinModule
(Contient TOUT le code actuel de 'server')"] + + %% --- Core services --- + ConnectionService["ConnectionService"] + LoggerService["LoggerService"] + FastifyService["FastifyService"] + ServerService["ServerService"] + AppService["AppService"] + ResourceService["ResourceService"] + PrepareAppService["PrepareAppService"] + InitDbService["InitDbService"] + PluginService["PluginService"] + + %% --- Router services --- + AdminRoleRouterService["AdminRoleRouterService"] + AdminTokenRouterService["AdminTokenRouterService"] + ClusterRouterService["ClusterRouterService"] + OtherRouterService["...RouterService"] + + %% --- External services --- + Gitlab["Gitlab"] + ArgoCD["ArgoCD"] + Dots["..."] + + %% --- CPinModule connections --- + CPinModule --> ConnectionService + CPinModule --> AppService + CPinModule --> LoggerService + CPinModule --> FastifyService + CPinModule --> ServerService + CPinModule --> ResourceService + CPinModule --> PrepareAppService + + %% --- AppService central connections --- + ConnectionService --> AppService + LoggerService --> AppService + FastifyService --> AppService + ServerService --> AppService + + AppService --> ResourceService + AppService --> PrepareAppService + AppService --> ServerService + AppService --> FastifyService + AppService --> LoggerService + AppService --> ConnectionService + + %% --- ResourceService to routers --- + ResourceService --> AdminRoleRouterService + ResourceService --> AdminTokenRouterService + ResourceService --> ClusterRouterService + ResourceService --> OtherRouterService + + %% --- PrepareAppService --- + PrepareAppService --> InitDbService + PrepareAppService --> PluginService + PrepareAppService --> ServerService + + %% --- PluginService external interactions --- + PluginService --> Gitlab + PluginService --> ArgoCD + PluginService --> Dots + + %% --- Bounding box (visual grouping only) --- + subgraph CPinBlock[" "] + CPinModule + ConnectionService + LoggerService + FastifyService + ServerService + AppService + ResourceService + PrepareAppService + InitDbService + PluginService + AdminRoleRouterService + AdminTokenRouterService + ClusterRouterService + OtherRouterService + end +``` + +à ça : + +```mermaid +flowchart TD + + %% --- Top-level Nest module --- + NestJS["Point d'entrée de NestJS"] + MainModule["MainModule"] + CPinModule["CPinModule"] + FutursModules["Futurs modules
NestJS correctement
découpés..."] + + NestJS --> MainModule + MainModule --> CPinModule + MainModule -.-> FutursModules + + %% --- Layering for clarity --- + subgraph LayerInit["Initialisation de l'application"] + ApplicationInitializationService["ApplicationInitializationService"] + DatabaseInitializationService["DatabaseInitializationService"] + PluginManagementService["PluginManagementService"] + end + + subgraph LayerCore["Coeur de l'application"] + AppService["AppService"] + RouterService["RouterService"] + ServerService["ServerService"] + end + + subgraph LayerInfra["Couche Infrastructure"] + LoggerService["LoggerService"] + ConfigurationService["ConfigurationService"] + DatabaseService["DatabaseService"] + FastifyService["FastifyService"] + HTTPClientService["HTTPClientService"] + end + + OtherAPIService["APIs externes
(par ex. OpenCDS)"] + HTTPClientService --> OtherAPIService + + subgraph LayerBusiness["Modules métiers"] + subgraph AdminRole["Admin Roles"] + AdminRoleRouterService["AdminRoleRouterService"] + AdminRoleBusinessService["AdminRoleBusinessService"] + AdminRoleDTOService["AdminRoleDTOService"] + AdminRoleRouterService --> AdminRoleBusinessService + AdminRoleRouterService --> LoggerService + AdminRoleBusinessService --> AdminRoleDTOService + AdminRoleBusinessService --> LoggerService + AdminRoleDTOService --> LoggerService + AdminRoleDTOService --> DatabaseService + end + subgraph AdminToken["Admin Tokens"] + AdminTokenRouterService["AdminTokenRouterService"] + AdminTokenBusinessService["AdminTokenBusinessService"] + AdminTokenDTOService["AdminTokenDTOService"] + AdminTokenRouterService --> AdminTokenBusinessService + AdminTokenRouterService --> LoggerService + AdminTokenBusinessService --> AdminTokenDTOService + AdminTokenBusinessService --> LoggerService + AdminTokenDTOService --> DatabaseService + AdminTokenDTOService --> LoggerService + end + subgraph ServiceChain["Service chains"] + ServiceChainRouterService["ServiceChainRouterService"] + ServiceChainBusinessService["ServiceChainBusinessService"] + ServiceChainRouterService --> ServiceChainBusinessService + ServiceChainRouterService --> LoggerService + ServiceChainBusinessService --> HTTPClientService + ServiceChainBusinessService --> LoggerService + + end + subgraph Cluster["Clusters"] + ClusterRouterService["ClusterRouterService"] + ClusterBusinessService["ClusterBusinessService"] + ClusterDTOService["ClusterDTOService"] + ClusterRouterService --> ClusterBusinessService + ClusterRouterService --> LoggerService + ClusterBusinessService --> ClusterDTOService + ClusterBusinessService --> LoggerService + ClusterDTOService --> DatabaseService + ClusterDTOService --> LoggerService + end + OtherBusinessModules["...Other Business Modules"] + end + + RouterService --> AdminRoleRouterService + RouterService --> AdminTokenRouterService + RouterService --> ClusterRouterService + RouterService --> ServiceChainRouterService + RouterService --> OtherBusinessModules + RouterService --> LoggerService + + subgraph LayerPlugins["Plugins compatibles CPiN"] + Gitlab["Gitlab"] + ArgoCD["ArgoCD"] + Kubernetes["Kubernetes"] + Dots["..."] + end + + %% --- Module wiring --- + CPinModule --> ApplicationInitializationService + + %% Application initialization + ApplicationInitializationService --> LoggerService + ApplicationInitializationService --> ConfigurationService + ApplicationInitializationService --> FastifyService + ApplicationInitializationService --> AppService + ApplicationInitializationService --> DatabaseInitializationService + DatabaseInitializationService --> DatabaseService + DatabaseInitializationService --> LoggerService + ApplicationInitializationService --> PluginManagementService + ApplicationInitializationService --> LoggerService + + %% App Core internal flow + AppService --> RouterService + AppService --> ServerService + AppService --> LoggerService + ServerService --> LoggerService + + %% Plugin Management + PluginManagementService --> Gitlab + PluginManagementService --> ArgoCD + PluginManagementService --> Kubernetes + PluginManagementService --> Dots + PluginManagementService --> LoggerService + Gitlab --> LoggerService + ArgoCD --> LoggerService + Kubernetes --> LoggerService + Dots --> LoggerService +``` + +et enfin à ça : + +```mermaid +flowchart TD + + %% --- Top-level Nest module --- + NestJS["Point d'entrée de NestJS"] + MainModule["MainModule"] + + NestJS --> MainModule + + subgraph CoreModule["CoreModule"] + ApplicationInitializationService["ApplicationInitializationService"] + end + + subgraph InfrastructureModule["InfrastructureModule"] + LoggerService["LoggerService"] + ConfigurationService["ConfigurationService"] + DatabaseService["DatabaseService"] + HTTPClientService["HTTPClientService"] + end + + OtherAPIService["APIs externes
(par ex. OpenCDS)"] + HTTPClientService --> OtherAPIService + + subgraph MandatoryModules["Modules obligatoires CPiN"] + subgraph GitlabModule["GitlabModule"] + GitlabController["GitlabController"] + GitlabBusinessService["GitlabBusinessService"] + GitlabDTOService["GitlabDTOService"] + GitlabController --> GitlabBusinessService + GitlabController --> LoggerService + GitlabBusinessService --> GitlabDTOService + GitlabBusinessService --> LoggerService + GitlabDTOService --> DatabaseService + GitlabDTOService --> LoggerService + end + + subgraph ArgoCDModule["ArgoCDModule"] + ArgoCDController["ArgoCDController"] + ArgoCDBusinessService["ArgoCDBusinessService"] + ArgoCDDTOService["ArgoCDDTOService"] + ArgoCDController --> ArgoCDBusinessService + ArgoCDController --> LoggerService + ArgoCDBusinessService --> ArgoCDDTOService + ArgoCDBusinessService --> LoggerService + ArgoCDDTOService --> DatabaseService + ArgoCDDTOService --> LoggerService + end + + subgraph KubernetesModule["KubernetesModule"] + KubernetesController["KubernetesController"] + KubernetesBusinessService["KubernetesBusinessService"] + KubernetesDTOService["KubernetesDTOService"] + KubernetesController --> KubernetesBusinessService + KubernetesController --> LoggerService + KubernetesBusinessService --> KubernetesDTOService + KubernetesBusinessService --> LoggerService + KubernetesDTOService --> DatabaseService + KubernetesDTOService --> LoggerService + end + + subgraph AdminRoleModule["AdminRoleModule"] + AdminRoleController["AdminRoleController"] + AdminRoleBusinessService["AdminRoleBusinessService"] + AdminRoleDTOService["AdminRoleDTOService"] + AdminRoleController --> AdminRoleBusinessService + AdminRoleController --> LoggerService + AdminRoleBusinessService --> AdminRoleDTOService + AdminRoleBusinessService --> LoggerService + AdminRoleDTOService --> LoggerService + AdminRoleDTOService --> DatabaseService + end + + subgraph AdminTokenModule["AdminTokenModule"] + AdminTokenController["AdminTokenController"] + AdminTokenBusinessService["AdminTokenBusinessService"] + AdminTokenDTOService["AdminTokenDTOService"] + AdminTokenController --> AdminTokenBusinessService + AdminTokenController --> LoggerService + AdminTokenBusinessService --> AdminTokenDTOService + AdminTokenBusinessService --> LoggerService + AdminTokenDTOService --> DatabaseService + AdminTokenDTOService --> LoggerService + end + + subgraph ClusterModule["ClusterModule"] + ClusterController["ClusterController"] + ClusterBusinessService["ClusterBusinessService"] + ClusterDTOService["ClusterDTOService"] + ClusterController --> ClusterBusinessService + ClusterController --> LoggerService + ClusterBusinessService --> ClusterDTOService + ClusterBusinessService --> LoggerService + ClusterDTOService --> DatabaseService + ClusterDTOService --> LoggerService + end + OtherBusinessModules["...Other Business Modules"] + end + + CoreModule --> GitlabModule + CoreModule --> ArgoCDModule + CoreModule --> KubernetesModule + CoreModule --> AdminRoleModule + CoreModule --> AdminTokenModule + CoreModule --> ClusterModule + + subgraph ThirdPartyModules["Modules optionnels de CPin"] + subgraph ServiceChainModule["ServiceChainModule"] + ServiceChainController["ServiceChainController"] + ServiceChainBusinessService["ServiceChainBusinessService"] + ServiceChainController --> ServiceChainBusinessService + ServiceChainController --> LoggerService + ServiceChainBusinessService --> HTTPClientService + ServiceChainBusinessService --> LoggerService + end + end + + CoreModule --> ServiceChainModule + + %% --- Module wiring --- + MainModule --> ApplicationInitializationService + + %% Application initialization + ApplicationInitializationService --> LoggerService + ApplicationInitializationService --> ConfigurationService + ApplicationInitializationService --> LoggerService +``` + +Pour mettre à jour `old-server` (après avoir rebasé sur `origin/master`, par exemple) : + +```bash +server-nestjs/$ rm -rf src/cpin-module/old-server +server-nestjs/$ cp -r ../server src/cpin-module/old-server +server-nestjs/$ find src/cpin-module/old-server -type f -iname "*.ts" -exec sed -i -e "s#@/#@old-server/#g" {} \; +server-nestjs/$ find src/cpin-module/old-server -type f -iname "*.ts" -exec sed -i -e "s#\.[jt]s'#'#g" {} \; +``` + +## Fichiers à supprimer dans le futur + +Certains fichiers de `old-server` servait de "framework" pour le backend, et +vont donc être réécrits en tant que modules/services NestJS. On va garder la +liste ici, ce qui permettra de ne pas être constamment en conflit sur le code +de `server`. En attendant de pouvoir s'en débarrasser, et afin de s'assurer que +leur code n'est pas utilisé dans d'autres parties du backend, on va commenter +l'intégralité de ces fichiers (comme ça pas d'erreur d'import quand on les +supprimera). + + +Voilà donc la liste des fichiers "dépréciés" : + +``` +old-server/src/app.ts -> Réécrit en AppService +old-server/src/connect.ts -> Réécrit en DatabaseService +old-server/src/init/db/* (à part dump.ts) -> Réécrit en DatabaseInitializationService +old-server/src/resources/**/router.ts -> Réécrit en **RouterService +old-server/src/resources/index.ts -> Réécrit en RouterService +old-server/src/server.ts -> Intégré à ApplicationInitializationService +old-server/src/utils/env.ts -> Réécrit en ConfigurationModule +old-server/src/utils/fastify.ts -> Réécrit en FastifyService +old-server/src/utils/keycloak-utils.ts -> Intégré dans AppService +old-server/src/utils/keycloak.ts -> Intégré dans AppService +old-server/src/utils/logger.ts -> Réécrit en LoggerModule +old-server/src/utils/plugin.ts -> Réécrit en PluginManagementService +``` + +## Prochaines itérations sur le sujet + +Tâches à réaliser par la suite dans d'autres itérations/tickets/etc. : + +- Migrer une fonctionnalité "verticale" complète (Route, Contract, Controller, + Business, Queries, Prisma schema) dans son propre module NestJS qui sera + importé dans `MainModule` (et pas dans `CpinModule` qui devra disparaître + à terme). +- Définir la liste de ces fonctionnalités verticales, et planifier l'extraction + de certaines d'entre elles (OpenCDS, typiquement, qui n'a rien à faire dans + le code de base de la Console) +- Migrer la base actuelle de NestJS de Jest vers Vitest et s'assurer que les + tests unitaires passent à nouveaux (attention, certains d'entre eux devront + être adaptés vu qu'on a commencé à réécrire du code au standard NestJS) +- Intérgrer `server-nestjs` dans tous les `docker compose` et les différents + scripts PNPM/Bash qui font tout le sel de nos process de dev +- Revoir les imports de données (le fameux `dump.ts`). C'était déjà une + mauvaise idée à l'époque, ça l'est encore plus aujourd'hui. On ferait mieux + d'utiliser un side-container pour ça +- Être capable de déployer `server-nestjs` en parallèle de `server`, avec + probablement un reverse proxy dédié à la migration des routes de l'ancien + vers le nouveau (à rediscuter plus concrètement) + +Les étapes d'après-après (quand on sera sereins sur la migration de `server` +vers `server-nestjs`) : + +- Tester les capacités de NestJS SSR (Server Side Rendering), notamment + vis-à-vis de nos composants VueJS. Il y aura probablement des sujets autour + de l'isolation du code VueJS des différentes fonctionnalités afin de + faciliter leur extraction de `client` vers `server` +- Implémenter une fonctionnalité du Front en tant que module NestJS SSR + (OpenCDS est un très bon cas d'étude grâce à son côté très isolé dans le + code). Idéalement ce code "Front" ajouté "côté Backend" devra être colocalisé + avec le code "Backend" correspondant. diff --git a/apps/server-nestjs/eslint.config.mjs b/apps/server-nestjs/eslint.config.mjs new file mode 100644 index 000000000..5a664d2b5 --- /dev/null +++ b/apps/server-nestjs/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintConfigBase from '@cpn-console/eslint-config' + +export default eslintConfigBase diff --git a/apps/server-nestjs/nest-cli.json b/apps/server-nestjs/nest-cli.json new file mode 100644 index 000000000..f9aa683b1 --- /dev/null +++ b/apps/server-nestjs/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/apps/server-nestjs/package.json b/apps/server-nestjs/package.json new file mode 100644 index 000000000..bd0ae1726 --- /dev/null +++ b/apps/server-nestjs/package.json @@ -0,0 +1,117 @@ +{ + "name": "server-nestjs", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix" + }, + "dependencies": { + "@cpn-console/argocd-plugin": "workspace:^", + "@cpn-console/gitlab-plugin": "workspace:^", + "@cpn-console/harbor-plugin": "workspace:^", + "@cpn-console/hooks": "workspace:^", + "@cpn-console/keycloak-plugin": "workspace:^", + "@cpn-console/kubernetes-plugin": "workspace:^", + "@cpn-console/nexus-plugin": "workspace:^", + "@cpn-console/shared": "workspace:^", + "@cpn-console/sonarqube-plugin": "workspace:^", + "@cpn-console/vault-plugin": "workspace:^", + "@fastify/cookie": "^9.4.0", + "@fastify/helmet": "^11.1.1", + "@fastify/session": "^10.9.0", + "@fastify/swagger": "^8.15.0", + "@fastify/swagger-ui": "^4.2.0", + "@gitbeaker/core": "^40.6.0", + "@gitbeaker/rest": "^40.6.0", + "@kubernetes-models/argo-cd": "^2.6.2", + "@kubernetes/client-node": "^0.22.3", + "@nestjs/common": "^11.0.1", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.0.1", + "@nestjs/platform-express": "^11.0.1", + "@prisma/client": "^6.0.1", + "@ts-rest/core": "^3.52.1", + "@ts-rest/fastify": "^3.52.1", + "@ts-rest/open-api": "^3.52.1", + "axios": "1.12.2", + "date-fns": "^4.1.0", + "dotenv": "^16.4.7", + "fastify": "^4.29.1", + "fastify-keycloak-adapter": "2.3.2", + "json-2-csv": "^5.5.7", + "mustache": "^4.2.0", + "nestjs-pino": "^4.5.0", + "pino-http": "^11.0.0", + "prisma": "^6.0.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1", + "undici": "^7.1.0", + "vitest-mock-extended": "^2.0.2" + }, + "devDependencies": { + "@cpn-console/eslint-config": "workspace:^", + "@cpn-console/test-utils": "workspace:^", + "@cpn-console/ts-config": "workspace:^", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.18.0", + "@faker-js/faker": "^9.3.0", + "@nestjs/cli": "^11.0.0", + "@nestjs/schematics": "^11.0.0", + "@nestjs/testing": "^11.0.1", + "@trivago/prettier-plugin-sort-imports": "^6.0.0", + "@types/express": "^5.0.0", + "@types/jest": "^30.0.0", + "@types/node": "^22.10.7", + "@types/supertest": "^6.0.2", + "@vitest/coverage-v8": "^2.1.8", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2", + "fastify-plugin": "^5.0.1", + "globals": "^16.0.0", + "jest": "^30.0.0", + "nodemon": "^3.1.7", + "pino-pretty": "^13.0.0", + "prettier": "^3.4.2", + "rimraf": "^6.0.1", + "source-map-support": "^0.5.21", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "ts-patch": "^3.3.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "typescript-transform-paths": "^3.5.2", + "vite": "^7.2.1", + "vite-node": "^2.1.8", + "vitest": "^2.1.8" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.spec.ts b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.spec.ts new file mode 100644 index 000000000..3ef55fb0c --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.spec.ts @@ -0,0 +1,22 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { ApplicationInitializationService } from './application-initialization.service'; + +describe('applicationInitializationServiceService', () => { + let service: ApplicationInitializationService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ApplicationInitializationService], + }).compile(); + + service = module.get( + ApplicationInitializationService, + ); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.ts b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.ts new file mode 100644 index 000000000..15f3d99b2 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization-service/application-initialization.service.ts @@ -0,0 +1,120 @@ +import { ConfigurationService } from '@/cpin-module/infrastructure/configuration/configuration.service'; +import { DatabaseService } from '@/cpin-module/infrastructure/database/database.service'; +import { Injectable, Logger } from '@nestjs/common'; +import { rm } from 'node:fs/promises'; +import { resolve } from 'node:path'; + +import { DatabaseInitializationService } from '../database-initialization/database-initialization.service'; +import { PluginManagementService } from '../plugin-management/plugin-management.service'; + +@Injectable() +export class ApplicationInitializationService { + private readonly logger = new Logger(ApplicationInitializationService.name); + constructor( + private readonly configurationService: ConfigurationService, + private readonly pluginManagementService: PluginManagementService, + private readonly databaseInitializationService: DatabaseInitializationService, + private readonly databaseService: DatabaseService, + ) { + this.handleExit(); + } + + async setUpHTTPProxy() { + // Workaround because fetch isn't using http_proxy variables + // See. https://github.com/gajus/global-agent/issues/52#issuecomment-1134525621 + if (process.env.HTTP_PROXY) { + const Undici = await import('undici'); + const ProxyAgent = Undici.ProxyAgent; + const setGlobalDispatcher = Undici.setGlobalDispatcher; + setGlobalDispatcher(new ProxyAgent(process.env.HTTP_PROXY)); + } + } + + async injectDataInDatabase(path: string) { + this.logger.log('Starting init DB...'); + const { data } = await import(path); + await this.databaseInitializationService.initDb(data); + this.logger.log('initDb invoked successfully'); + } + + async initApp() { + try { + await this.databaseService.getConnection(); + } catch (error) { + this.logger.error(error.message); + throw error; + } + + this.pluginManagementService.initPm(); + + this.logger.log('Reading init database file'); + + try { + const dataPath = + this.configurationService.isProd || + this.configurationService.isInt + ? './init/db/imports/data' + : '@cpn-console/test-utils/src/imports/data'; + await this.injectDataInDatabase(dataPath); + if ( + this.configurationService.isProd && + !this.configurationService.isDevSetup + ) { + this.logger.log('Cleaning up imported data file...'); + await rm(resolve(__dirname, dataPath)); + this.logger.log(`Successfully deleted '${dataPath}'`); + } + } catch (error) { + if ( + error.code === 'ERR_MODULE_NOT_FOUND' || + error.message.includes('Failed to load') || + error.message.includes('Cannot find module') + ) { + this.logger.log('No initDb file, skipping'); + } else { + this.logger.warn(error.message); + throw error; + } + } + + this.logger.debug({ + isDev: this.configurationService.isDev, + isTest: this.configurationService.isTest, + isCI: this.configurationService.isCI, + isDevSetup: this.configurationService.isDevSetup, + isProd: this.configurationService.isProd, + }); + } + + async exitGracefully(error?: Error) { + if (error instanceof Error) { + this.logger.fatal(error); + } + // @TODO Determine if it is necessary, or if we would rather plug ourselves + // onto NestJS lifecycle, or even if all this is actually necessary + // at all anymore + // + // await app.close(); + + this.logger.log('Closing connections...'); + await this.databaseService.closeConnections(); + this.logger.log('Exiting...'); + process.exit(error instanceof Error ? 1 : 0); + } + + logExitCode(code: number) { + this.logger.warn(`received signal: ${code}`); + } + + logUnhandledRejection(reason: unknown, promise: Promise) { + this.logger.error({ message: 'Unhandled Rejection', promise, reason }); + } + + handleExit() { + process.on('exit', this.logExitCode); + process.on('SIGINT', this.exitGracefully); + process.on('SIGTERM', this.exitGracefully); + process.on('uncaughtException', this.exitGracefully); + process.on('unhandledRejection', this.logUnhandledRejection); + } +} diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization.module.ts b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization.module.ts new file mode 100644 index 000000000..f8405b2c2 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/application-initialization.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; + +import { ConfigurationModule } from '../infrastructure/configuration/configuration.module'; +import { InfrastructureModule } from '../infrastructure/infrastructure.module'; +import { ApplicationInitializationService } from './application-initialization-service/application-initialization.service'; +import { DatabaseInitializationService } from './database-initialization/database-initialization.service'; +import { PluginManagementService } from './plugin-management/plugin-management.service'; + +@Module({ + imports: [ConfigurationModule, InfrastructureModule], + providers: [ + ApplicationInitializationService, + DatabaseInitializationService, + PluginManagementService, + ], + exports: [ApplicationInitializationService], +}) +export class ApplicationInitializationModule {} diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.spec.ts b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.spec.ts new file mode 100644 index 000000000..b736d5163 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.spec.ts @@ -0,0 +1,22 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { DatabaseInitializationService } from './database-initialization.service'; + +describe('databaseInitializationService', () => { + let service: DatabaseInitializationService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DatabaseInitializationService], + }).compile(); + + service = module.get( + DatabaseInitializationService, + ); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.ts b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.ts new file mode 100644 index 000000000..14d3152d6 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/database-initialization.service.ts @@ -0,0 +1,67 @@ +import prisma from '@/prisma'; +import { Injectable, Logger } from '@nestjs/common'; + +import { modelKeys } from './utils'; + +type ExtractKeysWithFields = { + [K in keyof T]: T[K] extends { fields: any } ? K : never; +}[keyof T]; + +type Models = ExtractKeysWithFields; + +type Imports = Partial> & { + associations: [Models, any[]]; +}; + +@Injectable() +export class DatabaseInitializationService { + private readonly loggerService = new Logger( + DatabaseInitializationService.name, + ); + + async initDb(data: Imports) { + const dataStringified = JSON.stringify(data); + const dataParsed = JSON.parse(dataStringified, (key, value) => { + try { + if (['permissions', 'everyonePerms'].includes(key)) { + return BigInt(value.slice(0, value.length - 1)); + } + } catch (_error) { + return value; + } + return value; + }); + this.loggerService.log('Drop tables'); + for (const modelKey of modelKeys.toReversed()) { + // @ts-ignore + await prisma[modelKey].deleteMany(); + } + this.loggerService.log('Import models'); + for (const modelKey of modelKeys) { + // @ts-ignore + await prisma[modelKey].createMany({ data: dataParsed[modelKey] }); + } + this.loggerService.log('Import associations'); + for (const [modelKey, rows] of dataParsed.associations) { + for (const row of rows) { + const idKey = 'id'; + const connectKeys = Object.keys(row).filter( + (key) => key !== idKey, + ); + const dataConnects = connectKeys.reduce( + (acc, curr) => { + acc[curr] = { connect: row[curr] }; + return acc; + }, + {} as Record, + ); + // @ts-ignore + await prisma[modelKey].update({ + where: { id: row.id }, + data: dataConnects, + }); + } + } + this.loggerService.log('End import'); + } +} diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.spec.ts b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.spec.ts new file mode 100644 index 000000000..50cce2c10 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.spec.ts @@ -0,0 +1,53 @@ +import { describe, expect, it, vi } from 'vitest'; + +import prisma from '../../__mocks__/prisma'; +import { modelKeys, moveBefore, resourceListToDict } from './utils'; + +vi.mock('fs', () => ({ writeFileSync: vi.fn() })); +for (const modelKey of modelKeys) { + prisma[modelKey].findMany.mockResolvedValue([]); +} + +describe('test moveBefore', () => { + it('should be moved', () => { + const arr = ['a', 'b', 'c']; + const arrSorted = moveBefore(arr, 'c', 'b'); + expect(arrSorted).toEqual(['a', 'c', 'b']); + + const arrSorted2 = moveBefore(arr, 'c', 'a'); + expect(arrSorted2).toEqual(['c', 'a', 'b']); + }); + it('should not be moved', () => { + const arr = ['a', 'b', 'c']; + const arrSorted = moveBefore(arr, 'b', 'c'); + expect(arrSorted).toEqual(false); + + const arrSorted2 = moveBefore(arr, 'a', 'c'); + expect(arrSorted2).toEqual(false); + + const arrSorted3 = moveBefore(arr, 'c', 'c'); + expect(arrSorted3).toEqual(false); + }); +}); + +it('test resourceListToDict (by name)', () => { + const list = [ + { name: 'a', value: 1 }, + { name: 'b', value: 2 }, + { name: 'c', value: 3 }, + ]; + const dict = resourceListToDict(list); + expect(dict).toEqual({ + a: { name: 'a', value: 1 }, + b: { name: 'b', value: 2 }, + c: { name: 'c', value: 3 }, + }); +}); + +it('stringify bigint', () => { + const list = { name: 'a', value: 1n }; + + const dict = JSON.stringify(list); + + expect(dict).toEqual('{"name":"a","value":"1n"}'); +}); diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.ts b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.ts new file mode 100644 index 000000000..941a10fa3 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/database-initialization/utils.ts @@ -0,0 +1,107 @@ +// @ts-nocheck +import { Prisma } from '@prisma/client'; + +// eslint-disable-next-line no-extend-native +BigInt.prototype.toJSON = function () { + return `${this.toString()}n`; +}; + +export type ResourceByName< + T extends { + name: string; + }, +> = Record; +export function resourceListToDict( + resList: Array, +): ResourceByName { + return resList.reduce( + (acc, curr) => { + return { + ...acc, + [curr.name]: curr, + }; + }, + {} as ResourceByName, + ); +} + +// @ts-ignore +const Models = resourceListToDict(Prisma.dmmf.datamodel.models); +let ModelsNames = Object.keys(Models); +let ModelsOrder = [...ModelsNames]; + +export function moveBefore( + arr: T, + toMove: T[number], + ref: T[number], +): T | false { + const iref = arr.indexOf(ref); + const moveref = arr.indexOf(toMove); + if (moveref <= iref) return false; + return [ + ...arr.slice(0, iref), + arr[moveref], + ...arr.slice(iref, moveref), + ...arr.slice(moveref + 1), + ] as T; +} + +export const manyToManyRelation: [string, string, string][] = []; +function sort() { + let hasChanged = false; + for (const model of ModelsNames) { + for (const field of Models[model].fields) { + if (field.isId) Models[model].id = field.name; + if (field.type in Models) { + const relationField = Models[field.type].fields.find( + ({ type }) => type === model, + ); + if (!relationField) + throw new Error('unable to find matching model'); + if ( + (relationField.isRequired && + field.isRequired && + !relationField.isList) || + (relationField.isRequired && !field.isRequired) + ) { + const moveRes = moveBefore(ModelsOrder, model, field.type); + if (moveRes) { + hasChanged = true; + ModelsOrder = moveRes; + } + } + if ( + field.isList && + relationField.isList && + !manyToManyRelation.find( + (test) => + (test[0] === model && test[1] === field.type) || + (test[0] === field.type && test[1] === model), + ) + ) { + manyToManyRelation.push([model, field.type, field.name]); + } + } + } + } + ModelsNames = ModelsOrder; + if (hasChanged) sort(); +} + +sort(); + +// special case to study +const logUserCase = moveBefore(ModelsOrder, 'User', 'Log'); +if (logUserCase) { + ModelsOrder = logUserCase; +} +const logProjectCase = moveBefore(ModelsOrder, 'Project', 'Log'); +if (logProjectCase) { + ModelsOrder = logProjectCase; +} + +export const models: Record = {}; +export const associations: Record = []; +export const modelKeys = ModelsOrder.map( + (model) => model.slice(0, 1).toLocaleLowerCase() + model.slice(1), +); diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.spec.ts b/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.spec.ts new file mode 100644 index 000000000..f299b1df6 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { PluginManagementService } from './plugin-management.service'; + +describe('pluginManagementService', () => { + let service: PluginManagementService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [PluginManagementService], + }).compile(); + + service = module.get(PluginManagementService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.ts b/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.ts new file mode 100644 index 000000000..600b14e8f --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/application-initialization/plugin-management/plugin-management.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class PluginManagementService { + constructor() {} + + async initPm() {} +} diff --git a/apps/server-nestjs/src/cpin-module/core/app/app.service.spec.ts b/apps/server-nestjs/src/cpin-module/core/app/app.service.spec.ts new file mode 100644 index 000000000..0106edf11 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/core/app/app.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { AppService } from './app.service'; + +describe('appService', () => { + let service: AppService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [AppService], + }).compile(); + + service = module.get(AppService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/core/app/app.service.ts b/apps/server-nestjs/src/cpin-module/core/app/app.service.ts new file mode 100644 index 000000000..7f5fa6b61 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/core/app/app.service.ts @@ -0,0 +1,175 @@ +import { ConfigurationService } from '@/cpin-module/infrastructure/configuration/configuration.service'; +import { + apiPrefix, + getContract, + serviceContract, + swaggerUiPath, + systemContract, + tokenHeaderName, +} from '@cpn-console/shared'; +import fastifyCookie from '@fastify/cookie'; +import helmet from '@fastify/helmet'; +import type { + FastifySessionObject, + FastifySessionOptions, +} from '@fastify/session'; +import fastifySession from '@fastify/session'; +import fastifySwagger from '@fastify/swagger'; +import fastifySwaggerUi from '@fastify/swagger-ui'; +import { Injectable, Logger } from '@nestjs/common'; +import { generateOpenApi } from '@ts-rest/open-api'; +import fastify from 'fastify'; +import type { FastifyRequest } from 'fastify'; +import type { KeycloakOptions } from 'fastify-keycloak-adapter'; +import keycloak from 'fastify-keycloak-adapter'; + +import { FastifyService } from '../fastify/fastify.service'; + +interface KeycloakPayload { + sub: string; + email: string; + given_name: string; + family_name: string; + groups: string[]; +} + +interface FastifySessionObjectWithUser extends FastifySessionObject { + user: { id: string }; +} + +function userPayloadMapper(userPayload: KeycloakPayload) { + return { + id: userPayload.sub, + email: userPayload.email, + firstName: userPayload.given_name, + lastName: userPayload.family_name, + groups: userPayload.groups || [], + }; +} + +function bypassFn(request: FastifyRequest) { + try { + return !!request.headers[tokenHeaderName]; + } catch (_e) {} + return false; +} + +@Injectable() +export class AppService { + private readonly loggerService = new Logger(AppService.name); + + constructor( + private readonly configurationService: ConfigurationService, + private readonly fastifyService: FastifyService, + ) { + this.keycloakConf = { + appOrigin: + this.configurationService.keycloakRedirectUri ?? + 'http://localhost:8080', + keycloakSubdomain: `${this.configurationService.keycloakDomain}/realms/${this.configurationService.keycloakRealm}`, + clientId: this.configurationService.keycloakClientId ?? '', + clientSecret: this.configurationService.keycloakClientSecret ?? '', + useHttps: this.configurationService.keycloakProtocol === 'https', + disableCookiePlugin: true, + disableSessionPlugin: true, + // @ts-ignore + userPayloadMapper, + retries: 5, + excludedPatterns: [ + systemContract.getVersion.path, + systemContract.getHealth.path, + serviceContract.getServiceHealth.path, + `${swaggerUiPath}/**`, + ], + bypassFn, + }; + + this.sessionConf = { + cookieName: 'sessionId', + secret: + this.configurationService.sessionSecret || + 'a-very-strong-secret-with-more-than-32-char', + cookie: { + httpOnly: true, + secure: true, + maxAge: 1_800_000, + }, + }; + } + + keycloakConf!: KeycloakOptions; + sessionConf!: FastifySessionOptions; + + async startApp() { + const openApiDocument = generateOpenApi( + await getContract(), + this.fastifyService.swaggerConf, + { setOperationId: true }, + ); + + const app = fastify(this.fastifyService.fastifyConf) + .register(helmet, () => ({ + contentSecurityPolicy: !( + this.configurationService.isInt || + this.configurationService.isDev || + this.configurationService.isTest + ), + })) + .register(fastifyCookie) + .register(fastifySession, this.sessionConf) + // @ts-ignore + .register(keycloak, this.keycloakConf) + .register(fastifySwagger, { + transformObject: () => openApiDocument, + }) + .register(fastifySwaggerUi, this.fastifyService.swaggerUiConf) + .addHook('onRoute', (opts) => { + if (opts.path === `${apiPrefix}/healthz`) { + opts.logLevel = 'silent'; + } + }) + .setErrorHandler((error: Error, req: { id: string }, reply) => { + const statusCode = 500; + // @ts-ignore vérifier l'objet + const message = error.description || error.message; + reply.status(statusCode).send({ + status: statusCode, + error: message, + stack: error.stack, + }); + this.loggerService.log('info', { reqId: req.id, error }); + }) + .addHook('onResponse', (req, res) => { + if (res.statusCode < 400) { + req.log.info({ + status: res.statusCode, + userId: ( + req.session as + | FastifySessionObjectWithUser + | undefined + )?.user?.id, + }); + } else if (res.statusCode < 500) { + req.log.warn({ + status: res.statusCode, + userId: ( + req.session as + | FastifySessionObjectWithUser + | undefined + )?.user?.id, + }); + } else { + req.log.error({ + status: res.statusCode, + userId: ( + req.session as + | FastifySessionObjectWithUser + | undefined + )?.user?.id, + }); + } + }); + + await app.ready(); + } +} diff --git a/apps/server-nestjs/src/cpin-module/core/core.module.ts b/apps/server-nestjs/src/cpin-module/core/core.module.ts new file mode 100644 index 000000000..a5e6617b0 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/core/core.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { ConfigurationModule } from '../infrastructure/configuration/configuration.module'; +import { InfrastructureModule } from '../infrastructure/infrastructure.module'; +import { AppService } from './app/app.service'; +import { FastifyService } from './fastify/fastify.service'; + +@Module({ + imports: [ConfigurationModule, InfrastructureModule], + providers: [AppService, FastifyService], +}) +export class CoreModule {} diff --git a/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.spec.ts b/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.spec.ts new file mode 100644 index 000000000..cd9cab9bf --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { FastifyService } from './fastify.service'; + +describe('fastifyService', () => { + let service: FastifyService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [FastifyService], + }).compile(); + + service = module.get(FastifyService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.ts b/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.ts new file mode 100644 index 000000000..4e98dc38b --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/core/fastify/fastify.service.ts @@ -0,0 +1,62 @@ +import { ConfigurationService } from '@/cpin-module/infrastructure/configuration/configuration.service'; +import { loggerConfiguration } from '@/cpin-module/infrastructure/logger/logger.module'; +import { swaggerUiPath } from '@cpn-console/shared'; +import type { FastifySwaggerUiOptions } from '@fastify/swagger-ui'; +import { Injectable } from '@nestjs/common'; +import type { generateOpenApi } from '@ts-rest/open-api'; +import type { FastifyServerOptions } from 'fastify'; +import { randomUUID } from 'node:crypto'; + +@Injectable() +export class FastifyService { + constructor(private readonly configurationService: ConfigurationService) { + this.fastifyConf = { + maxParamLength: 5000, + logger: + loggerConfiguration[this.configurationService.NODE_ENV] ?? + loggerConfiguration.production, + genReqId: () => randomUUID(), + }; + + this.swaggerConf = { + info: { + title: 'Console Cloud Pi Native', + description: 'API de gestion des ressources Cloud Pi Native.', + version: this.configurationService.appVersion, + }, + + externalDocs: this.externalDocs, + servers: [ + { + url: this.configurationService.keycloakRedirectUri, + }, + ], + }; + + this.swaggerUiConf = { + routePrefix: swaggerUiPath, + uiConfig: { + docExpansion: 'list', + deepLinking: false, + }, + initOAuth: { + clientId: this.configurationService.keycloakClientId, + clientSecret: this.configurationService.keycloakClientSecret, + realm: this.configurationService.keycloakRealm, + appName: 'Cloud Pi Native', + scopes: 'openid generic', + }, + }; + } + + fastifyConf!: FastifyServerOptions; + + externalDocs = { + description: 'External documentation.', + url: 'https://cloud-pi-native.fr', + }; + + swaggerConf: Parameters[1]; + + swaggerUiConf: FastifySwaggerUiOptions; +} diff --git a/apps/server-nestjs/src/cpin-module/cpin.module.ts b/apps/server-nestjs/src/cpin-module/cpin.module.ts new file mode 100644 index 000000000..2daee31d0 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/cpin.module.ts @@ -0,0 +1,17 @@ +import { Module } from '@nestjs/common'; + +import { ApplicationInitializationModule } from './application-initialization/application-initialization.module'; +import { CoreModule } from './core/core.module'; +import { InfrastructureModule } from './infrastructure/infrastructure.module'; + +// This module host the old "server code" of our backend. +// It it means to be empty in the future, by extracting from it +// as many modules as possible ! +@Module({ + imports: [ + ApplicationInitializationModule, + CoreModule, + InfrastructureModule, + ], +}) +export class CpinModule {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.module.ts b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.module.ts new file mode 100644 index 000000000..b2156ef75 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.module.ts @@ -0,0 +1,25 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; + +import { ConfigurationService } from './configuration.service'; + +const pathList: string[] = []; + +if (process.env.DOCKER !== 'true') { + pathList.push('.env'); +} + +if (process.env.INTEGRATION === 'true') { + pathList.push('.env.integ'); +} + +@Module({ + imports: [ + ConfigModule.forRoot({ + envFilePath: pathList, + }), + ], + providers: [ConfigurationService], + exports: [ConfigurationService], +}) +export class ConfigurationModule {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.spec.ts new file mode 100644 index 000000000..163446550 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { ConfigurationService } from './configuration.service'; + +describe('configurationService', () => { + let service: ConfigurationService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ConfigurationService], + }).compile(); + + service = module.get(ConfigurationService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.ts b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.ts new file mode 100644 index 000000000..0e9bf9363 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ConfigurationService { + // application mode + isDev = process.env.NODE_ENV === 'development'; + isTest = process.env.NODE_ENV === 'test'; + isProd = process.env.NODE_ENV === 'production'; + isInt = process.env.INTEGRATION === 'true'; + isCI = process.env.CI === 'true'; + isDevSetup = process.env.DEV_SETUP === 'true'; + + // app + port = process.env.SERVER_PORT; + appVersion = this.isProd ? (process.env.APP_VERSION ?? 'unknown') : 'dev'; + + // db + dbUrl = process.env.DB_URL; + + // keycloak + sessionSecret = process.env.SESSION_SECRET; + keycloakProtocol = process.env.KEYCLOAK_PROTOCOL; + keycloakDomain = process.env.KEYCLOAK_DOMAIN; + keycloakRealm = process.env.KEYCLOAK_REALM; + keycloakClientId = process.env.KEYCLOAK_CLIENT_ID; + keycloakClientSecret = process.env.KEYCLOAK_CLIENT_SECRET; + keycloakRedirectUri = process.env.KEYCLOAK_REDIRECT_URI; + adminsUserId = process.env.ADMIN_KC_USER_ID + ? process.env.ADMIN_KC_USER_ID.split(',') + : []; + + contactEmail = + process.env.CONTACT_EMAIL ?? + 'cloudpinative-relations@interieur.gouv.fr'; + + // plugins + mockPlugins = process.env.MOCK_PLUGINS === 'true'; + projectRootDir = process.env.PROJECTS_ROOT_DIR; + pluginsDir = process.env.PLUGINS_DIR ?? '/plugins'; + NODE_ENV = + process.env.NODE_ENV === 'test' + ? 'test' + : process.env.NODE_ENV === 'development' + ? 'development' + : 'production'; +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.spec.ts new file mode 100644 index 000000000..49cbd3698 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { DatabaseService } from './database.service'; + +describe('databaseService', () => { + let service: DatabaseService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DatabaseService], + }).compile(); + + service = module.get(DatabaseService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.ts b/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.ts new file mode 100644 index 000000000..29e981c30 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/database/database.service.ts @@ -0,0 +1,70 @@ +import prisma from '@/prisma'; +import { Injectable, Logger } from '@nestjs/common'; +import { setTimeout } from 'node:timers/promises'; + +import { ConfigurationService } from '../configuration/configuration.service'; + +@Injectable() +export class DatabaseService { + private readonly loggerService = new Logger(DatabaseService.name); + + constructor(private readonly configurationService: ConfigurationService) { + this.DELAY_BEFORE_RETRY = + this.configurationService.isTest || this.configurationService.isCI + ? 1000 + : 10000; + } + + DELAY_BEFORE_RETRY!: number; + closingConnections = false; + + async getConnection(triesLeft = 5): Promise { + if (this.closingConnections || triesLeft <= 0) { + throw new Error('Unable to connect to Postgres server'); + } + triesLeft--; + + try { + if ( + this.configurationService.isDev || + this.configurationService.isTest || + this.configurationService.isCI + ) { + this.loggerService.log( + `Trying to connect to Postgres with: ${this.configurationService.dbUrl}`, + ); + } + await prisma.$connect(); + + this.loggerService.log('Connected to Postgres!'); + } catch (error) { + if (triesLeft > 0) { + this.loggerService.error(error); + this.loggerService.log( + `Could not connect to Postgres: ${error.message}`, + ); + this.loggerService.log(`Retrying (${triesLeft} tries left)`); + await setTimeout(this.DELAY_BEFORE_RETRY); + return this.getConnection(triesLeft); + } + + this.loggerService.log( + `Could not connect to Postgres: ${error.message}`, + ); + this.loggerService.log('Out of retries'); + error.message = `Out of retries, last error: ${error.message}`; + throw error; + } + } + + async closeConnections() { + this.closingConnections = true; + try { + await prisma.$disconnect(); + } catch (error) { + this.loggerService.error(error); + } finally { + this.closingConnections = false; + } + } +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.spec.ts new file mode 100644 index 000000000..0c8a7cd5e --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { HttpClientService } from './http-client.service'; + +describe('httpClientService', () => { + let service: HttpClientService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [HttpClientService], + }).compile(); + + service = module.get(HttpClientService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.ts b/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.ts new file mode 100644 index 000000000..78dfa1769 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/http-client/http-client.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class HttpClientService {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts b/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts new file mode 100644 index 000000000..00348b26b --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; + +import { ConfigurationModule } from './configuration/configuration.module'; +import { DatabaseService } from './database/database.service'; +import { HttpClientService } from './http-client/http-client.service'; +import { LoggerModule } from './logger/logger.module'; +import { ServerService } from './server/server.service'; + +@Module({ + providers: [DatabaseService, HttpClientService, ServerService], + imports: [LoggerModule, ConfigurationModule], + exports: [DatabaseService, HttpClientService, ServerService], +}) +export class InfrastructureModule {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/logger/logger.module.ts b/apps/server-nestjs/src/cpin-module/infrastructure/logger/logger.module.ts new file mode 100644 index 000000000..fb8ab018f --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/logger/logger.module.ts @@ -0,0 +1,57 @@ +import { Module } from '@nestjs/common'; +import type { PinoLoggerOptions } from 'fastify/types/logger'; +import { LoggerModule as PinoLoggerModule } from 'nestjs-pino'; + +import { ConfigurationModule } from '../configuration/configuration.module'; +import { ConfigurationService } from '../configuration/configuration.service'; + +export const customLevels = { + audit: 25, +}; + +export const loggerConfiguration: Record = { + development: { + transport: { + target: 'pino-pretty', + options: { + translateTime: 'dd/mm/yyyy - HH:MM:ss Z', + ignore: 'pid,hostname', + colorize: true, + singleLine: true, + }, + }, + customLevels, + level: process.env.LOG_LEVEL ?? 'debug', + }, + production: { + customLevels, + level: process.env.LOG_LEVEL ?? 'audit', + }, + test: { + level: 'silent', + }, +}; + +@Module({ + imports: [ + PinoLoggerModule.forRootAsync({ + imports: [ConfigurationModule], + inject: [ConfigurationService], + useFactory: async (configService: ConfigurationService) => { + return { + pinoHttp: + loggerConfiguration[ + configService.isProd + ? 'production' + : configService.isTest + ? 'test' + : 'development' + ], + }; + }, + }), + ], + controllers: [], + providers: [], +}) +export class LoggerModule {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.spec.ts new file mode 100644 index 000000000..ef7ab7463 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.spec.ts @@ -0,0 +1,20 @@ +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + +import { ServerService } from './server.service'; + +describe('serverService', () => { + let service: ServerService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ServerService], + }).compile(); + + service = module.get(ServerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.ts b/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.ts new file mode 100644 index 000000000..7566c78d3 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/server/server.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@nestjs/common'; +import { initServer } from '@ts-rest/fastify'; + +@Injectable() +// @TODO is this still necessary ? +export class ServerService { + serverInstance!: any; + + constructor() { + this.serverInstance = initServer(); + } +} diff --git a/apps/server-nestjs/src/main.module.ts b/apps/server-nestjs/src/main.module.ts new file mode 100644 index 000000000..9f6f3ad8f --- /dev/null +++ b/apps/server-nestjs/src/main.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { CpinModule } from './cpin-module/cpin.module'; + +// This module only exists to import other module. +// « One module to rule them all, and in NestJs bind them » +@Module({ + imports: [CpinModule], + controllers: [], + providers: [], +}) +export class MainModule {} diff --git a/apps/server-nestjs/src/main.ts b/apps/server-nestjs/src/main.ts new file mode 100644 index 000000000..d455db402 --- /dev/null +++ b/apps/server-nestjs/src/main.ts @@ -0,0 +1,11 @@ +import { NestFactory } from '@nestjs/core'; +import { Logger } from 'nestjs-pino'; + +import { MainModule } from './main.module'; + +async function bootstrap() { + const app = await NestFactory.create(MainModule, { bufferLogs: true }); + app.useLogger(app.get(Logger)); + await app.listen(process.env.PORT ?? 0); +} +bootstrap(); diff --git a/apps/server-nestjs/src/prisma.ts b/apps/server-nestjs/src/prisma.ts new file mode 100644 index 000000000..4e54f7a77 --- /dev/null +++ b/apps/server-nestjs/src/prisma.ts @@ -0,0 +1,5 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +export default prisma; diff --git a/apps/server-nestjs/src/prisma/migrations/20230706084346_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20230706084346_dso/migration.sql new file mode 100644 index 000000000..f2f4e7b0b --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20230706084346_dso/migration.sql @@ -0,0 +1,151 @@ +-- CreateTable +CREATE TABLE "Environment" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "projectId" UUID NOT NULL, + "status" TEXT NOT NULL DEFAULT 'initializing', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Environment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Log" ( + "id" UUID NOT NULL, + "data" JSONB NOT NULL, + "action" TEXT NOT NULL DEFAULT '', + "userId" UUID NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Log_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Organization" ( + "id" UUID NOT NULL, + "source" TEXT NOT NULL, + "name" TEXT NOT NULL, + "label" TEXT NOT NULL, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Organization_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Permission" ( + "id" UUID NOT NULL, + "userId" UUID NOT NULL, + "environmentId" UUID NOT NULL, + "level" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Permission_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Project" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "organizationId" UUID NOT NULL, + "description" TEXT, + "status" TEXT NOT NULL, + "locked" BOOLEAN NOT NULL DEFAULT false, + "services" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Project_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Repository" ( + "id" UUID NOT NULL, + "projectId" UUID NOT NULL, + "internalRepoName" TEXT NOT NULL, + "externalRepoUrl" TEXT NOT NULL, + "externalUserName" TEXT, + "externalToken" TEXT, + "isInfra" BOOLEAN NOT NULL DEFAULT false, + "isPrivate" BOOLEAN NOT NULL DEFAULT false, + "status" TEXT NOT NULL DEFAULT 'initializing', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Repository_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" UUID NOT NULL, + "firstName" TEXT NOT NULL, + "lastName" TEXT NOT NULL, + "email" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Role" ( + "userId" UUID NOT NULL, + "projectId" UUID NOT NULL, + "role" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Role_pkey" PRIMARY KEY ("userId","projectId") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Organization_id_key" ON "Organization"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Organization_name_key" ON "Organization"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Organization_label_key" ON "Organization"("label"); + +-- CreateIndex +CREATE UNIQUE INDEX "Permission_id_key" ON "Permission"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Permission_userId_environmentId_key" ON "Permission"("userId", "environmentId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Project_id_key" ON "Project"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Role_userId_projectId_key" ON "Role"("userId", "projectId"); + +-- AddForeignKey +ALTER TABLE "Environment" ADD CONSTRAINT "Environment_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Log" ADD CONSTRAINT "Log_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Permission" ADD CONSTRAINT "Permission_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Permission" ADD CONSTRAINT "Permission_environmentId_fkey" FOREIGN KEY ("environmentId") REFERENCES "Environment"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Project" ADD CONSTRAINT "Project_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Repository" ADD CONSTRAINT "Repository_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Role" ADD CONSTRAINT "Role_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Role" ADD CONSTRAINT "Role_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20230710181052_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20230710181052_dso/migration.sql new file mode 100644 index 000000000..26e1ade3f --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20230710181052_dso/migration.sql @@ -0,0 +1,85 @@ +-- CreateEnum +CREATE TYPE "ClusterPrivacy" AS ENUM ('public', 'dedicated'); + +-- CreateTable +CREATE TABLE "Cluster" ( + "id" UUID NOT NULL, + "label" VARCHAR(50) NOT NULL, + "privacy" "ClusterPrivacy" NOT NULL DEFAULT 'dedicated', + "secretName" VARCHAR(50) NOT NULL, + "clusterResources" BOOLEAN NOT NULL DEFAULT false, + "kubeConfigId" UUID NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Cluster_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Kubeconfig" ( + "id" UUID NOT NULL, + "user" JSONB NOT NULL, + "cluster" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "parentClusterId" UUID, + + CONSTRAINT "Kubeconfig_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_ClusterToEnvironment" ( + "A" UUID NOT NULL, + "B" UUID NOT NULL +); + +-- CreateTable +CREATE TABLE "_ClusterToProject" ( + "A" UUID NOT NULL, + "B" UUID NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "Cluster_id_key" ON "Cluster"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Cluster_label_key" ON "Cluster"("label"); + +-- CreateIndex +CREATE UNIQUE INDEX "Cluster_secretName_key" ON "Cluster"("secretName"); + +-- CreateIndex +CREATE UNIQUE INDEX "Cluster_kubeConfigId_key" ON "Cluster"("kubeConfigId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Kubeconfig_id_key" ON "Kubeconfig"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Kubeconfig_parentClusterId_key" ON "Kubeconfig"("parentClusterId"); + +-- CreateIndex +CREATE UNIQUE INDEX "_ClusterToEnvironment_AB_unique" ON "_ClusterToEnvironment"("A", "B"); + +-- CreateIndex +CREATE INDEX "_ClusterToEnvironment_B_index" ON "_ClusterToEnvironment"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_ClusterToProject_AB_unique" ON "_ClusterToProject"("A", "B"); + +-- CreateIndex +CREATE INDEX "_ClusterToProject_B_index" ON "_ClusterToProject"("B"); + +-- AddForeignKey +ALTER TABLE "Cluster" ADD CONSTRAINT "Cluster_kubeConfigId_fkey" FOREIGN KEY ("kubeConfigId") REFERENCES "Kubeconfig"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_ClusterToEnvironment" ADD CONSTRAINT "_ClusterToEnvironment_A_fkey" FOREIGN KEY ("A") REFERENCES "Cluster"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_ClusterToEnvironment" ADD CONSTRAINT "_ClusterToEnvironment_B_fkey" FOREIGN KEY ("B") REFERENCES "Environment"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_ClusterToProject" ADD CONSTRAINT "_ClusterToProject_A_fkey" FOREIGN KEY ("A") REFERENCES "Cluster"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_ClusterToProject" ADD CONSTRAINT "_ClusterToProject_B_fkey" FOREIGN KEY ("B") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20230711132934_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20230711132934_dso/migration.sql new file mode 100644 index 000000000..8f3fb5ff9 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20230711132934_dso/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the column `parentClusterId` on the `Kubeconfig` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "Kubeconfig_parentClusterId_key"; + +-- AlterTable +ALTER TABLE "Kubeconfig" DROP COLUMN "parentClusterId"; diff --git a/apps/server-nestjs/src/prisma/migrations/20230802143822_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20230802143822_dso/migration.sql new file mode 100644 index 000000000..4eb37edc5 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20230802143822_dso/migration.sql @@ -0,0 +1,10 @@ +CREATE TYPE "ProjectStatus" AS ENUM ('initializing', 'created', 'failed', 'archived'); + +ALTER TABLE public."Project" ALTER COLUMN status TYPE "ProjectStatus" USING + case + when status = 'created' then 'created'::"ProjectStatus" + when status = 'failed' then 'failed'::"ProjectStatus" + when status = 'archived' then 'archived'::"ProjectStatus" + else 'initializing'::"ProjectStatus" + end; +ALTER TABLE public."Project" ALTER COLUMN status SET DEFAULT 'initializing'; diff --git a/apps/server-nestjs/src/prisma/migrations/20230912084459_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20230912084459_dso/migration.sql new file mode 100644 index 000000000..f402a0e3d --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20230912084459_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Cluster" ADD COLUMN "infos" VARCHAR(200); diff --git a/apps/server-nestjs/src/prisma/migrations/20231010111515_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231010111515_dso/migration.sql new file mode 100644 index 000000000..f553e7880 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231010111515_dso/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the column `externalToken` on the `Repository` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Repository" DROP COLUMN "externalToken"; diff --git a/apps/server-nestjs/src/prisma/migrations/20231011125838_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231011125838_dso/migration.sql new file mode 100644 index 000000000..394b650a5 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231011125838_dso/migration.sql @@ -0,0 +1,81 @@ +-- CreateEnum +CREATE TYPE "QuotaStageStatus" AS ENUM +('active', 'pendingDelete'); + +-- Create new tables +-- CreateTable +CREATE TABLE "Quota" +( + "id" UUID NOT NULL, + "memory" VARCHAR NOT NULL, + "cpu" REAL NOT NULL, + "name" VARCHAR NOT NULL, + "isPrivate" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "Quota_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Stage" +( + "id" UUID NOT NULL, + "name" VARCHAR NOT NULL, + + CONSTRAINT "Stage_pkey" PRIMARY KEY ("id") +); + +-- Associate Quotas and Stages +-- CreateTable +CREATE TABLE "QuotaStage" +( + "id" UUID NOT NULL, + "quotaId" UUID NOT NULL, + "stageId" UUID NOT NULL, + "status" "QuotaStageStatus" NOT NULL DEFAULT 'active', + + CONSTRAINT "QuotaStage_pkey" PRIMARY KEY ("id") +); +CREATE UNIQUE INDEX "Quota_id_key" ON "Quota"("id"); +CREATE UNIQUE INDEX "Quota_name_key" ON "Quota"("name"); +CREATE UNIQUE INDEX "Stage_id_key" ON "Stage"("id"); +CREATE UNIQUE INDEX "Stage_name_key" ON "Stage"("name"); +CREATE UNIQUE INDEX "QuotaStage_id_key" ON "QuotaStage"("id"); +CREATE UNIQUE INDEX "QuotaStage_quotaId_stageId_key" ON "QuotaStage"("quotaId", "stageId"); +ALTER TABLE "QuotaStage" ADD CONSTRAINT "QuotaStage_quotaId_fkey" FOREIGN KEY ("quotaId") REFERENCES "Quota"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "QuotaStage" ADD CONSTRAINT "QuotaStage_stageId_fkey" FOREIGN KEY ("stageId") REFERENCES "Stage"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Create default values for Quotas and Stages +-- Quota +INSERT INTO "Quota" + (id, cpu, memory, "name", "isPrivate") +VALUES + ('5a57b62f-2465-4fb6-a853-5a751d099199', 2, '4Gi', 'small', false), + ('08770663-3b76-4af6-8978-9f75eda4faa7', 4, '8Gi', 'medium', false), + ('b7b4d9bd-7a8f-4287-bb12-5ce2dadb4ff2', 6, '12Gi', 'large', false), + ('97b851e8-9067-4a3d-a0e8-c3a6820c49be', 8, '16Gi', 'xlarge', false); + +-- Stage +INSERT INTO "Stage" + (id, "name") +VALUES + ('4a9ad694-4c54-4a3c-9579-548bf4b7b1b9', 'dev'), + ('38fa869d-6267-441d-af7f-e0548fd06b7e', 'staging'), + ('d434310e-7850-4d59-b47f-0772edf50582', 'integration'), + ('9b3e9991-896d-4d90-bdc5-a34be8c06b8f', 'prod'); + +-- QuotaStage +INSERT INTO "QuotaStage" + (id, "quotaId", "stageId") +VALUES + ('0cb0c549-560e-4f26-8f4e-832dd722f68a', '5a57b62f-2465-4fb6-a853-5a751d099199', '4a9ad694-4c54-4a3c-9579-548bf4b7b1b9'), + ('0530e9c9-b37d-4dec-93e6-1895f700e61c', '5a57b62f-2465-4fb6-a853-5a751d099199', '38fa869d-6267-441d-af7f-e0548fd06b7e'), + ('8a99db49-b7b1-44bf-865d-5e709e8aa0fc', '5a57b62f-2465-4fb6-a853-5a751d099199', 'd434310e-7850-4d59-b47f-0772edf50582'), + ('67561f00-d219-4ca6-b94a-3ee83f09d2d6', '5a57b62f-2465-4fb6-a853-5a751d099199', '9b3e9991-896d-4d90-bdc5-a34be8c06b8f'), + ('8b3c201e-7518-4254-a94a-16c404e46936', '08770663-3b76-4af6-8978-9f75eda4faa7', '4a9ad694-4c54-4a3c-9579-548bf4b7b1b9'), + ('9157ae12-3e39-43f8-a24f-ae5d9c6b69b7', '08770663-3b76-4af6-8978-9f75eda4faa7', '38fa869d-6267-441d-af7f-e0548fd06b7e'), + ('c733a1dd-c9fd-4def-b29e-df49ef7b6698', '08770663-3b76-4af6-8978-9f75eda4faa7', 'd434310e-7850-4d59-b47f-0772edf50582'), + ('15a51f47-0ab2-4a94-a808-722639d8c092', '08770663-3b76-4af6-8978-9f75eda4faa7', '9b3e9991-896d-4d90-bdc5-a34be8c06b8f'), + ('cb66e80c-2304-472d-bc19-a411011674ca', 'b7b4d9bd-7a8f-4287-bb12-5ce2dadb4ff2', 'd434310e-7850-4d59-b47f-0772edf50582'), + ('59fb0e79-3a76-4b96-81d4-63f4caa98cfa', 'b7b4d9bd-7a8f-4287-bb12-5ce2dadb4ff2', '9b3e9991-896d-4d90-bdc5-a34be8c06b8f'), + ('4174b22c-2bee-4f4a-9d85-da7b5463f214', '97b851e8-9067-4a3d-a0e8-c3a6820c49be', 'd434310e-7850-4d59-b47f-0772edf50582'), + ('de0589b6-7cf5-4f1e-ab44-53e71a6cdb7a', '97b851e8-9067-4a3d-a0e8-c3a6820c49be', '9b3e9991-896d-4d90-bdc5-a34be8c06b8f'); diff --git a/apps/server-nestjs/src/prisma/migrations/20231011125839_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231011125839_dso/migration.sql new file mode 100644 index 000000000..8c98a7f74 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231011125839_dso/migration.sql @@ -0,0 +1,35 @@ +-- Multiplication des environnements par clusteurs +ALTER TABLE "Environment" ADD COLUMN "clusterId" UUID; + +DO +$$ +DECLARE + perm record; + cte record; + env_uuid UUID; +BEGIN + FOR cte IN SELECT "B" AS environmentId, "A" AS "clusterId", "name", "projectId", status, "updatedAt", "createdAt" + FROM public."_ClusterToEnvironment", public."Environment" + WHERE public."Environment".id = "B" + LOOP + env_uuid := gen_random_uuid(); + INSERT INTO public."Environment" (id, "name", "projectId", "clusterId", status, "createdAt", "updatedAt") VALUES + (env_uuid, cte."name", cte."projectId", cte."clusterId", cte.status, cte."createdAt", cte."updatedAt"); + + FOR perm in SELECT * FROM public."Permission" WHERE "environmentId" = cte.environmentId + LOOP + INSERT INTO public."Permission" (id, "level", "createdAt", "updatedAt", "environmentId", "userId") VALUES + (gen_random_uuid(), perm."level", perm."createdAt", perm."updatedAt", env_uuid, perm."userId"); + END LOOP; + END LOOP; +END; +$$ +; +DELETE FROM public."Environment" WHERE "clusterId" is null; +ALTER TABLE public."Environment" ALTER COLUMN "clusterId" SET NOT NULL; +ALTER TABLE "Environment" ADD CONSTRAINT "Environment_clusterId_fkey" FOREIGN KEY ("clusterId") REFERENCES "Cluster"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- Delete old _ClusterToEnvironment +ALTER TABLE "_ClusterToEnvironment" DROP CONSTRAINT "_ClusterToEnvironment_A_fkey"; +ALTER TABLE "_ClusterToEnvironment" DROP CONSTRAINT "_ClusterToEnvironment_B_fkey"; +DROP TABLE "_ClusterToEnvironment"; diff --git a/apps/server-nestjs/src/prisma/migrations/20231011125841_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231011125841_dso/migration.sql new file mode 100644 index 000000000..035cd1c85 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231011125841_dso/migration.sql @@ -0,0 +1,36 @@ +-- Associate cluster to Stages +-- CreateTable +CREATE TABLE "_ClusterToStage" ( + "A" UUID NOT NULL, + "B" UUID NOT NULL +); +-- AddForeignKey +ALTER TABLE "_ClusterToStage" ADD CONSTRAINT "_ClusterToStage_A_fkey" FOREIGN KEY ("A") REFERENCES "Cluster"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_ClusterToStage" ADD CONSTRAINT "_ClusterToStage_B_fkey" FOREIGN KEY ("B") REFERENCES "Stage"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- CreateIndex +CREATE UNIQUE INDEX "_ClusterToStage_AB_unique" ON "_ClusterToStage"("A", "B"); + +-- CreateIndex +CREATE INDEX "_ClusterToStage_B_index" ON "_ClusterToStage"("B"); + +DO +$$ +DECLARE + cluster record; + cte record; + env_uuid UUID; +BEGIN + FOR cluster IN SELECT id + FROM public."Cluster" + LOOP + INSERT INTO public."_ClusterToStage" ("A", "B") VALUES + (cluster.id, '4a9ad694-4c54-4a3c-9579-548bf4b7b1b9'), + (cluster.id, '38fa869d-6267-441d-af7f-e0548fd06b7e'), + (cluster.id, 'd434310e-7850-4d59-b47f-0772edf50582'), + (cluster.id, '9b3e9991-896d-4d90-bdc5-a34be8c06b8f'); + END LOOP; +END; +$$ diff --git a/apps/server-nestjs/src/prisma/migrations/20231012105520_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231012105520_dso/migration.sql new file mode 100644 index 000000000..43793bdb4 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231012105520_dso/migration.sql @@ -0,0 +1,11 @@ +-- AlterTable +ALTER TABLE "Environment" ADD COLUMN "quotaStageId" UUID; +UPDATE "Environment" SET "quotaStageId" = '8b3c201e-7518-4254-a94a-16c404e46936' WHERE "name" = 'dev'; +UPDATE "Environment" SET "quotaStageId" = '9157ae12-3e39-43f8-a24f-ae5d9c6b69b7' WHERE "name" = 'staging'; +UPDATE "Environment" SET "quotaStageId" = '4174b22c-2bee-4f4a-9d85-da7b5463f214' WHERE "name" = 'integration'; +UPDATE "Environment" SET "quotaStageId" = 'de0589b6-7cf5-4f1e-ab44-53e71a6cdb7a' WHERE "name" = 'prod'; +ALTER TABLE "Environment" ALTER COLUMN "name" SET DATA TYPE VARCHAR(11); +ALTER TABLE "Environment" ALTER COLUMN "quotaStageId" SET NOT NULL; + +-- AddForeignKey +ALTER TABLE "Environment" ADD CONSTRAINT "Environment_quotaStageId_fkey" FOREIGN KEY ("quotaStageId") REFERENCES "QuotaStage"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20231024155020_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231024155020_dso/migration.sql new file mode 100644 index 000000000..9af004b6a --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231024155020_dso/migration.sql @@ -0,0 +1,3 @@ +-- Please read 6.0.0 Release notes ! +-- lock all projects +UPDATE public."Project" SET "locked"=true \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20231026150220_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20231026150220_dso/migration.sql new file mode 100644 index 000000000..d970d3965 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20231026150220_dso/migration.sql @@ -0,0 +1,3 @@ +-- Please read 6.0.0 Release notes ! +-- set all projects to failed to avoid unlock them +UPDATE public."Project" SET "status" = 'failed' WHERE "status" != 'archived' \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20240112135751_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240112135751_dso/migration.sql new file mode 100644 index 000000000..c387d9885 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240112135751_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Log" ADD COLUMN "requestId" VARCHAR(21); diff --git a/apps/server-nestjs/src/prisma/migrations/20240321123436_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240321123436_dso/migration.sql new file mode 100644 index 000000000..18e20262c --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240321123436_dso/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - You are about to drop the column `status` on the `Environment` table. All the data in the column will be lost. + - You are about to drop the column `status` on the `Repository` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Environment" DROP COLUMN "status"; + +-- AlterTable +ALTER TABLE "Repository" DROP COLUMN "status"; diff --git a/apps/server-nestjs/src/prisma/migrations/20240329172938_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240329172938_dso/migration.sql new file mode 100644 index 000000000..f784b2156 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240329172938_dso/migration.sql @@ -0,0 +1,46 @@ +-- AlterTable +ALTER TABLE "Cluster" ADD COLUMN "zoneId" UUID; + +-- CreateTable +CREATE TABLE "Zone" +( + "id" UUID NOT NULL, + "slug" VARCHAR(10) NOT NULL, + "label" VARCHAR(50) NOT NULL, + "description" VARCHAR(200), + "createdAt" TIMESTAMP +(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP +(3) NOT NULL, + + CONSTRAINT "Zone_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Zone_id_key" ON "Zone"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Zone_slug_key" ON "Zone"("slug"); + +-- Create default zone +INSERT INTO "Zone" + (id, "slug", "label", "description", "updatedAt") +VALUES + ('a66c4230-eba6-41f1-aae5-bb1e4f90cce0', 'default', 'Zone Défaut', 'Zone par défaut, à changer', CURRENT_TIMESTAMP); + +-- Set default zoneId for current clusters +UPDATE "Cluster" +SET "zoneId" += 'a66c4230-eba6-41f1-aae5-bb1e4f90cce0' +WHERE "zoneId" +IS NULL; + +-- AlterTable +ALTER TABLE "Cluster" ALTER COLUMN "zoneId" +SET +NOT NULL; + +-- AddForeignKey +ALTER TABLE "Cluster" ADD CONSTRAINT "Cluster_zoneId_fkey" FOREIGN KEY ("zoneId") REFERENCES "Zone"("id") +ON DELETE RESTRICT ON +UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20240424093852_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240424093852_dso/migration.sql new file mode 100644 index 000000000..cb4f7ad96 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240424093852_dso/migration.sql @@ -0,0 +1,23 @@ +-- CreateTable +CREATE TABLE "ProjectPlugin" ( + "pluginName" TEXT NOT NULL, + "projectId" UUID NOT NULL, + "key" TEXT NOT NULL, + "value" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "AdminPlugin" ( + "pluginName" TEXT NOT NULL, + "key" TEXT NOT NULL, + "value" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProjectPlugin_projectId_pluginName_key_key" ON "ProjectPlugin"("projectId", "pluginName", "key"); + +-- CreateIndex +CREATE UNIQUE INDEX "AdminPlugin_pluginName_key_key" ON "AdminPlugin"("pluginName", "key"); + +-- AddForeignKey +ALTER TABLE "ProjectPlugin" ADD CONSTRAINT "ProjectPlugin_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20240427181037_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240427181037_dso/migration.sql new file mode 100644 index 000000000..11672324f --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240427181037_dso/migration.sql @@ -0,0 +1,19 @@ +DO $$ +DECLARE + project_row RECORD; + registry_id INT; +BEGIN + -- Début de la boucle sur chaque ligne de la table 'Project' + FOR project_row IN SELECT id, services FROM public."Project" LOOP + -- Extrait 'registry.id' de la colonne JSON 'services' + registry_id := (SELECT (project_row.services -> 'registry' ->> 'id')::TEXT); + -- Si 'registry.id' existe, insérer dans la table 'config' + IF registry_id IS NOT NULL THEN + INSERT INTO public."ProjectPlugin" ("projectId", "pluginName", "key", "value") + VALUES (project_row.id, 'registry', 'projectId', registry_id::TEXT); + END IF; + END LOOP; +END $$; + +-- AlterTable +ALTER TABLE "Project" DROP COLUMN "services"; diff --git a/apps/server-nestjs/src/prisma/migrations/20240605135052_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240605135052_dso/migration.sql new file mode 100644 index 000000000..9c7d5a8f8 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240605135052_dso/migration.sql @@ -0,0 +1,9 @@ +-- CreateEnum +CREATE TYPE "RoleList" AS ENUM ('owner', 'user'); + +-- AlterTable +ALTER TABLE public."Role" ALTER COLUMN "role" TYPE "RoleList" USING + case + when role = 'owner' then 'owner'::"RoleList" + else 'user'::"RoleList" + end; \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20240612123132_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240612123132_dso/migration.sql new file mode 100644 index 000000000..45a4a5d1e --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240612123132_dso/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "ProjectClusterHistory" ( + "projectId" UUID NOT NULL, + "clusterId" UUID NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProjectClusterHistory_projectId_clusterId_key" ON "ProjectClusterHistory"("projectId", "clusterId"); diff --git a/apps/server-nestjs/src/prisma/migrations/20240614222908_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240614222908_dso/migration.sql new file mode 100644 index 000000000..2b1641a65 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240614222908_dso/migration.sql @@ -0,0 +1,11 @@ +DO $$ +DECLARE + env_row RECORD; +BEGIN + -- Début de la boucle sur chaque ligne de la table 'Project' + FOR env_row IN SELECT "projectId", "clusterId" FROM public."Environment" LOOP + INSERT INTO public."ProjectClusterHistory" ("projectId", "clusterId") + VALUES (env_row."projectId", env_row."clusterId") + ON CONFLICT DO NOTHING; + END LOOP; +END $$; \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20240618112205_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240618112205_dso/migration.sql new file mode 100644 index 000000000..5e7ff03d4 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240618112205_dso/migration.sql @@ -0,0 +1,58 @@ +-- AlterTable +ALTER TABLE "Environment" ADD COLUMN "quotaId" UUID, +ADD COLUMN "stageId" UUID; + +-- AddForeignKey +ALTER TABLE "Environment" ADD CONSTRAINT "Environment_quotaId_fkey" FOREIGN KEY ("quotaId") REFERENCES "Quota"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Environment" ADD CONSTRAINT "Environment_stageId_fkey" FOREIGN KEY ("stageId") REFERENCES "Stage"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- CreateTable +CREATE TABLE "_QuotaToStage" ( + "A" UUID NOT NULL, + "B" UUID NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_QuotaToStage_AB_unique" ON "_QuotaToStage"("A", "B"); + +-- CreateIndex +CREATE INDEX "_QuotaToStage_B_index" ON "_QuotaToStage"("B"); + +-- AddForeignKey +ALTER TABLE "_QuotaToStage" ADD CONSTRAINT "_QuotaToStage_A_fkey" FOREIGN KEY ("A") REFERENCES "Quota"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_QuotaToStage" ADD CONSTRAINT "_QuotaToStage_B_fkey" FOREIGN KEY ("B") REFERENCES "Stage"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +DO $$ +DECLARE + quota_stage_row RECORD; +BEGIN + FOR quota_stage_row IN SELECT * FROM public."QuotaStage" loop + UPDATE public."Environment" SET "stageId" = quota_stage_row."stageId" WHERE "Environment"."quotaStageId" = quota_stage_row.id; + UPDATE public."Environment" SET "quotaId" = quota_stage_row."quotaId" WHERE "Environment"."quotaStageId" = quota_stage_row.id; + insert into public."_QuotaToStage" values (quota_stage_row."quotaId", quota_stage_row."stageId"); + END LOOP; +END $$; + +-- DropForeignKey +ALTER TABLE "Environment" DROP CONSTRAINT "Environment_quotaStageId_fkey"; + +-- AlterTable +ALTER TABLE "Environment" ALTER COLUMN "quotaId" SET NOT NULL, +ALTER COLUMN "stageId" SET NOT NULL, +DROP COLUMN "quotaStageId"; + +-- DropForeignKey +ALTER TABLE "QuotaStage" DROP CONSTRAINT "QuotaStage_quotaId_fkey"; + +-- DropForeignKey +ALTER TABLE "QuotaStage" DROP CONSTRAINT "QuotaStage_stageId_fkey"; + +-- DropTable +DROP TABLE "QuotaStage"; + +-- DropEnum +DROP TYPE "QuotaStageStatus"; diff --git a/apps/server-nestjs/src/prisma/migrations/20240717084709_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240717084709_dso/migration.sql new file mode 100644 index 000000000..0036da8a1 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240717084709_dso/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - Made the column `description` on table `Project` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +ALTER TABLE "Project" ALTER COLUMN "description" SET NOT NULL, +ALTER COLUMN "description" SET DEFAULT ''; diff --git a/apps/server-nestjs/src/prisma/migrations/20240723135420_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240723135420_dso/migration.sql new file mode 100644 index 000000000..ed6ae9b84 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240723135420_dso/migration.sql @@ -0,0 +1,198 @@ +-- DropForeignKey if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Permission_environmentId_fkey') THEN + ALTER TABLE "Permission" DROP CONSTRAINT "Permission_environmentId_fkey"; + END IF; +END $$; + +-- DropForeignKey if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Permission_userId_fkey') THEN + ALTER TABLE "Permission" DROP CONSTRAINT "Permission_userId_fkey"; + END IF; +END $$; + +-- DropForeignKey if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Role_projectId_fkey') THEN + ALTER TABLE "Role" DROP CONSTRAINT "Role_projectId_fkey"; + END IF; +END $$; + +-- DropForeignKey if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Role_userId_fkey') THEN + ALTER TABLE "Role" DROP CONSTRAINT "Role_userId_fkey"; + END IF; +END $$; + +-- CreateTable if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ProjectMembers') THEN + CREATE TABLE "ProjectMembers" ( + "projectId" UUID NOT NULL, + "userId" UUID NOT NULL, + "roleIds" TEXT[] + ); + END IF; +END $$; + +-- AlterTable +ALTER TABLE "Log" ADD COLUMN IF NOT EXISTS "projectId" UUID; + +INSERT INTO public."User" (id, "firstName", "lastName", email, "createdAt", "updatedAt") +VALUES('04ac168a-2c4f-4816-9cce-af6c612e5912'::uuid, 'Anonymous', 'User', 'anon@user', '2023-07-03 14:46:56.770', '2023-07-03 14:46:56.770') +ON CONFLICT (id) DO NOTHING; + +-- AlterTable +ALTER TABLE "Project" ADD COLUMN IF NOT EXISTS "everyonePerms" BIGINT NOT NULL DEFAULT 896, +ADD COLUMN IF NOT EXISTS "ownerId" UUID; + +DO $$ +DECLARE + role_row RECORD; +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'Role') THEN + -- Début de la boucle sur chaque ligne de la table 'Project' + FOR role_row IN SELECT "userId", "projectId", "role" FROM public."Role" LOOP + INSERT INTO public."ProjectMembers" ("userId", "projectId", "roleIds") VALUES (role_row."userId", role_row."projectId", '{}'); + IF role_row."role" = 'owner'::public."RoleList" THEN + UPDATE public."Project" + SET "ownerId"=role_row."userId" + WHERE id=role_row."projectId"::uuid; + END IF; + END LOOP; + END IF; +END $$; + +UPDATE public."Project" +SET "ownerId"='04ac168a-2c4f-4816-9cce-af6c612e5912' +WHERE "ownerId" IS NULL; + +ALTER TABLE public."Project" ALTER COLUMN "ownerId" SET NOT NULL; + +DELETE FROM public."ProjectMembers" pm +USING public."Project" p +WHERE pm."userId" = p."ownerId" +AND pm."projectId" = p."id"; + +-- DropTable if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'Permission') THEN + DROP TABLE "Permission"; + END IF; +END $$; + +-- DropTable if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'Role') THEN + DROP TABLE "Role"; + END IF; +END $$; + +-- DropEnum if exists +DO $$ BEGIN + IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'RoleList') THEN + DROP TYPE "RoleList"; + END IF; +END $$; + +-- CreateTable if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'AdminRole') THEN + CREATE TABLE "AdminRole" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "permissions" BIGINT NOT NULL, + "position" SMALLINT NOT NULL, + CONSTRAINT "AdminRole_pkey" PRIMARY KEY ("id") + ); + END IF; +END $$; + +-- CreateTable if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ProjectRole') THEN + CREATE TABLE "ProjectRole" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "permissions" BIGINT NOT NULL, + "projectId" UUID NOT NULL, + "position" SMALLINT NOT NULL, + CONSTRAINT "ProjectRole_pkey" PRIMARY KEY ("id") + ); + END IF; +END $$; + +-- CreateIndex if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'AdminRole_id_key') THEN + CREATE UNIQUE INDEX "AdminRole_id_key" ON "AdminRole"("id"); + END IF; +END $$; + +-- CreateIndex if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'AdminRole_name_key') THEN + CREATE UNIQUE INDEX "AdminRole_name_key" ON "AdminRole"("name"); + END IF; +END $$; + +-- CreateIndex if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'ProjectMembers_projectId_userId_key') THEN + CREATE UNIQUE INDEX "ProjectMembers_projectId_userId_key" ON "ProjectMembers"("projectId", "userId"); + END IF; +END $$; + +-- CreateIndex if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'ProjectRole_id_key') THEN + CREATE UNIQUE INDEX "ProjectRole_id_key" ON "ProjectRole"("id"); + END IF; +END $$; + +-- CreateIndex if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'Environment_projectId_name_key') THEN + CREATE UNIQUE INDEX "Environment_projectId_name_key" ON "Environment"("projectId", "name"); + END IF; +END $$; + +-- AddForeignKey if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Log_projectId_fkey') THEN + ALTER TABLE "Log" ADD CONSTRAINT "Log_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE SET NULL ON UPDATE CASCADE; + END IF; +END $$; + +-- AddForeignKey if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'Project_ownerId_fkey') THEN + ALTER TABLE "Project" ADD CONSTRAINT "Project_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +-- AddForeignKey if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'ProjectMembers_projectId_fkey') THEN + ALTER TABLE "ProjectMembers" ADD CONSTRAINT "ProjectMembers_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +-- AddForeignKey if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'ProjectMembers_userId_fkey') THEN + ALTER TABLE "ProjectMembers" ADD CONSTRAINT "ProjectMembers_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +-- AddForeignKey if not exists +DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'ProjectRole_projectId_fkey') THEN + ALTER TABLE "ProjectRole" ADD CONSTRAINT "ProjectRole_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +-- AlterTable +ALTER TABLE "User" ADD COLUMN IF NOT EXISTS "adminRoleIds" TEXT[]; diff --git a/apps/server-nestjs/src/prisma/migrations/20240725162050_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240725162050_dso/migration.sql new file mode 100644 index 000000000..c9b41827b --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240725162050_dso/migration.sql @@ -0,0 +1,5 @@ +-- DropIndex +DROP INDEX "AdminRole_name_key"; + +-- AlterTable +ALTER TABLE "AdminRole" ADD COLUMN "oidcGroup" TEXT; diff --git a/apps/server-nestjs/src/prisma/migrations/20240726210139_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240726210139_dso/migration.sql new file mode 100644 index 000000000..265f262ab --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240726210139_dso/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - Made the column `oidcGroup` on table `AdminRole` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable + +UPDATE public."AdminRole" +SET "oidcGroup"='' +WHERE "oidcGroup" IS NULL; + +ALTER TABLE "AdminRole" ALTER COLUMN "oidcGroup" SET NOT NULL, +ALTER COLUMN "oidcGroup" SET DEFAULT ''; diff --git a/apps/server-nestjs/src/prisma/migrations/20240808082632_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240808082632_dso/migration.sql new file mode 100644 index 000000000..4fc276860 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240808082632_dso/migration.sql @@ -0,0 +1,17 @@ +-- CreateTable +CREATE TABLE "SystemSetting" +( + "key" TEXT NOT NULL, + "value" TEXT NOT NULL, + + CONSTRAINT "SystemSetting_pkey" PRIMARY KEY ("key") +); + +-- CreateIndex +CREATE UNIQUE INDEX "SystemSetting_key_key" ON "SystemSetting"("key"); + +-- Create maintenance setting +INSERT INTO "SystemSetting" + ("key", "value") +VALUES + ('maintenance', 'off'); diff --git a/apps/server-nestjs/src/prisma/migrations/20240826143230_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240826143230_dso/migration.sql new file mode 100644 index 000000000..95ab54869 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240826143230_dso/migration.sql @@ -0,0 +1,3 @@ +INSERT INTO public."AdminRole" +(id, "name", permissions, "position", "oidcGroup") +VALUES('76229c96-4716-45bc-99da-00498ec9018c'::uuid, 'Admin', 2, 0, '/admin'); \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20240829085548_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240829085548_dso/migration.sql new file mode 100644 index 000000000..c11648218 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240829085548_dso/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - Made the column `externalUserName` on table `Repository` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +UPDATE "Repository" SET "externalUserName" = '' WHERE "externalUserName" IS NULL; + +ALTER TABLE "Repository" ALTER COLUMN "externalUserName" SET NOT NULL, +ALTER COLUMN "externalUserName" SET DEFAULT '', +ALTER COLUMN "externalRepoUrl" SET DEFAULT ''; diff --git a/apps/server-nestjs/src/prisma/migrations/20240916141253_token/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240916141253_token/migration.sql new file mode 100644 index 000000000..b0472cd80 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240916141253_token/migration.sql @@ -0,0 +1,23 @@ +-- CreateEnum +CREATE TYPE "TokenStatus" AS ENUM ('active', 'revoked'); + +-- CreateTable +CREATE TABLE "AdminToken" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "permissions" BIGINT NOT NULL, + "userId" UUID, + "expirationDate" TIMESTAMP(3), + "lastUse" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" "TokenStatus" NOT NULL DEFAULT 'active', + "hash" TEXT NOT NULL, + + CONSTRAINT "AdminToken_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "AdminToken_id_key" ON "AdminToken"("id"); + +-- AddForeignKey +ALTER TABLE "AdminToken" ADD CONSTRAINT "AdminToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20240919122331_optional_user_id/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240919122331_optional_user_id/migration.sql new file mode 100644 index 000000000..47488b00c --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240919122331_optional_user_id/migration.sql @@ -0,0 +1,8 @@ +-- DropForeignKey +ALTER TABLE "Log" DROP CONSTRAINT "Log_userId_fkey"; + +-- AlterTable +ALTER TABLE "Log" ALTER COLUMN "userId" DROP NOT NULL; + +-- AddForeignKey +ALTER TABLE "Log" ADD CONSTRAINT "Log_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/apps/server-nestjs/src/prisma/migrations/20240923142722_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240923142722_dso/migration.sql new file mode 100644 index 000000000..18eca3ead --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240923142722_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Log" ALTER COLUMN "requestId" SET DATA TYPE VARCHAR(36); diff --git a/apps/server-nestjs/src/prisma/migrations/20240923155416_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240923155416_dso/migration.sql new file mode 100644 index 000000000..74e0946f0 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240923155416_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Zone" ADD COLUMN "argocdUrl" TEXT NOT NULL DEFAULT 'https://example.com'; diff --git a/apps/server-nestjs/src/prisma/migrations/20240928002900_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20240928002900_dso/migration.sql new file mode 100644 index 000000000..41dac7535 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20240928002900_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "ProjectStatus" ADD VALUE 'warning'; diff --git a/apps/server-nestjs/src/prisma/migrations/20241008125724_enabling_maven/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241008125724_enabling_maven/migration.sql new file mode 100644 index 000000000..ef888d5e5 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241008125724_enabling_maven/migration.sql @@ -0,0 +1,12 @@ +DO $$ +DECLARE + project_row RECORD; + registry_id INT; +BEGIN + -- Début de la boucle sur chaque ligne de la table 'Project' + FOR project_row IN SELECT id FROM public."Project" WHERE status <> 'archived'::public."ProjectStatus" LOOP + INSERT INTO public."ProjectPlugin" ("projectId", "pluginName", "key", "value") + VALUES (project_row.id, 'nexus', 'activateMavenRepo', 'enabled') + ON CONFLICT DO NOTHING; + END LOOP; +END $$; \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/migrations/20241104232540_add_usertype/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241104232540_add_usertype/migration.sql new file mode 100644 index 000000000..a57e5956c --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241104232540_add_usertype/migration.sql @@ -0,0 +1,12 @@ +-- CreateEnum +CREATE TYPE "UserType" AS ENUM ('human', 'bot', 'ghost'); + +-- AlterEnum +ALTER TYPE "TokenStatus" ADD VALUE 'inactive'; + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "type" "UserType" NOT NULL DEFAULT 'human'; +UPDATE "User" SET type = 'ghost' WHERE id = '04ac168a-2c4f-4816-9cce-af6c612e5912'; + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "type" DROP DEFAULT; diff --git a/apps/server-nestjs/src/prisma/migrations/20241104232541_add_pat/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241104232541_add_pat/migration.sql new file mode 100644 index 000000000..71e15a312 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241104232541_add_pat/migration.sql @@ -0,0 +1,84 @@ +-- CreateTable (idempotent) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'PersonalAccessToken') THEN + CREATE TABLE "PersonalAccessToken" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "userId" UUID NOT NULL, + "expirationDate" TIMESTAMP(3) NOT NULL, + "lastUse" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" "TokenStatus" NOT NULL DEFAULT 'active', + "hash" TEXT NOT NULL, + + CONSTRAINT "PersonalAccessToken_pkey" PRIMARY KEY ("id") + ); + END IF; +END $$; + +-- CreateIndex (idempotent) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'PersonalAccessToken_id_key') THEN + CREATE UNIQUE INDEX "PersonalAccessToken_id_key" ON "PersonalAccessToken"("id"); + END IF; +END $$; + +-- AddForeignKey (idempotent) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'PersonalAccessToken_userId_fkey') THEN + ALTER TABLE "PersonalAccessToken" ADD CONSTRAINT "PersonalAccessToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + END IF; +END $$; + +-- Process AdminToken (idempotent) +DO $$ +DECLARE + admin_token record; + user_uuid UUID; +BEGIN + FOR admin_token IN SELECT "name", "id" + FROM public."AdminToken" + LOOP + -- Generate new UUID if user does not exist + user_uuid := COALESCE( + (SELECT id FROM public."User" WHERE email = concat(admin_token.name, '@bot.id')), + gen_random_uuid() + ); + + -- Insert user if not already exists + INSERT INTO public."User" (id, "firstName", "lastName", email, "createdAt", "updatedAt", "type") + VALUES(user_uuid, 'Bot Admin', admin_token.name, concat(admin_token.name, '@bot.id'), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'bot') + ON CONFLICT (id) DO NOTHING; + + -- Update AdminToken with the new user ID + UPDATE public."AdminToken" SET "userId" = user_uuid WHERE id = admin_token.id; + END LOOP; +END $$; + +-- Alter AdminToken userId column to NOT NULL (idempotent) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_name = 'AdminToken' AND column_name = 'userId' AND is_nullable = 'NO') THEN + ALTER TABLE public."AdminToken" ALTER COLUMN "userId" SET NOT NULL; + END IF; +END $$; + +-- DropForeignKey if exists (idempotent) +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'AdminToken_userId_fkey') THEN + ALTER TABLE "AdminToken" DROP CONSTRAINT "AdminToken_userId_fkey"; + END IF; +END $$; + +-- AddForeignKey (idempotent) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'AdminToken_userId_fkey') THEN + ALTER TABLE "AdminToken" ADD CONSTRAINT "AdminToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + END IF; +END $$; diff --git a/apps/server-nestjs/src/prisma/migrations/20241107142721_user_last_login/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241107142721_user_last_login/migration.sql new file mode 100644 index 000000000..521b2b10a --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241107142721_user_last_login/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "lastLogin" TIMESTAMP(3); diff --git a/apps/server-nestjs/src/prisma/migrations/20241112101945_add_slug/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241112101945_add_slug/migration.sql new file mode 100644 index 000000000..a7500833b --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241112101945_add_slug/migration.sql @@ -0,0 +1,14 @@ +-- AlterTable +ALTER TABLE "Project" ADD COLUMN "slug" TEXT; + +UPDATE public."Project" p +SET slug = ( + SELECT concat(org.name, '-', subp.name) FROM public."Project" subp + LEFT JOIN public."Organization" org on org."id" = subp."organizationId" + WHERE subp.id = p.id +); + +ALTER TABLE public."Project" ALTER COLUMN "slug" SET NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "Project_slug_key" ON "Project"("slug"); diff --git a/apps/server-nestjs/src/prisma/migrations/20241112102015_add_provisionning_version/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241112102015_add_provisionning_version/migration.sql new file mode 100644 index 000000000..b143cbeb9 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241112102015_add_provisionning_version/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Project" ADD COLUMN "lastSuccessProvisionningVersion" TEXT; diff --git a/apps/server-nestjs/src/prisma/migrations/20241216131342_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20241216131342_dso/migration.sql new file mode 100644 index 000000000..7a8868190 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20241216131342_dso/migration.sql @@ -0,0 +1,17 @@ +-- AlterTable +ALTER TABLE "_ClusterToProject" ADD CONSTRAINT "_ClusterToProject_AB_pkey" PRIMARY KEY ("A", "B"); + +-- DropIndex +DROP INDEX "_ClusterToProject_AB_unique"; + +-- AlterTable +ALTER TABLE "_ClusterToStage" ADD CONSTRAINT "_ClusterToStage_AB_pkey" PRIMARY KEY ("A", "B"); + +-- DropIndex +DROP INDEX "_ClusterToStage_AB_unique"; + +-- AlterTable +ALTER TABLE "_QuotaToStage" ADD CONSTRAINT "_QuotaToStage_AB_pkey" PRIMARY KEY ("A", "B"); + +-- DropIndex +DROP INDEX "_QuotaToStage_AB_unique"; diff --git a/apps/server-nestjs/src/prisma/migrations/20250107104749_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250107104749_dso/migration.sql new file mode 100644 index 000000000..21ce77b8d --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250107104749_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Cluster" ADD COLUMN "external" BOOLEAN NOT NULL DEFAULT false; diff --git a/apps/server-nestjs/src/prisma/migrations/20250121222953_prevent_upgrade/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250121222953_prevent_upgrade/migration.sql new file mode 100644 index 000000000..ac63cd639 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250121222953_prevent_upgrade/migration.sql @@ -0,0 +1,25 @@ +-- Vérifie les versions dans la table Project +DO $$ +DECLARE + project_id TEXT; + project_name TEXT; + last_version TEXT; +BEGIN + -- Boucle sur les projets non archivés + FOR project_id, project_name, last_version IN ( + SELECT id, name, "lastSuccessProvisionningVersion" + FROM "Project" + WHERE "status" != 'archived' + ) + LOOP + -- Vérifie si la version est NULL + IF last_version IS NULL THEN + RAISE EXCEPTION 'Le projet % (ID: %) a une version NULL.', project_name, project_id; + END IF; + + -- Vérifie si la version est inférieure à 8.23.0 selon SemVer + IF (string_to_array(last_version, '.')::int[] < ARRAY[8,23,0]) THEN + RAISE EXCEPTION 'Le projet % (ID: %) a une version (%), inférieure à 8.23.0.', project_name, project_id, last_version; + END IF; + END LOOP; +END $$; diff --git a/apps/server-nestjs/src/prisma/migrations/20250121222954_drop_organization/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250121222954_drop_organization/migration.sql new file mode 100644 index 000000000..54871c901 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250121222954_drop_organization/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - You are about to drop the column `organizationId` on the `Project` table. All the data in the column will be lost. + - You are about to drop the `Organization` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Project" DROP CONSTRAINT "Project_organizationId_fkey"; + +-- AlterTable +ALTER TABLE "Project" DROP COLUMN "organizationId"; + +-- DropTable +DROP TABLE "Organization"; diff --git a/apps/server-nestjs/src/prisma/migrations/20250723141246_dso/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250723141246_dso/migration.sql new file mode 100644 index 000000000..68ca0df2f --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250723141246_dso/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Cluster" ALTER COLUMN "infos" SET DATA TYPE VARCHAR(1000); diff --git a/apps/server-nestjs/src/prisma/migrations/20250818095032_remove_quota/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250818095032_remove_quota/migration.sql new file mode 100644 index 000000000..8364090d8 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250818095032_remove_quota/migration.sql @@ -0,0 +1,44 @@ +-- AlterTable +ALTER TABLE "Environment" +ADD COLUMN "cpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "gpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "memory" REAL NOT NULL DEFAULT 0; + +COMMENT ON COLUMN "Environment".cpu IS 'CPU share as float (1 and 0.01 are valid values)'; +COMMENT ON COLUMN "Environment".gpu IS 'GPU share as float (1 and 0.01 are valid values)'; +COMMENT ON COLUMN "Environment".memory IS 'Memory value as GigaBytes (1 and 0.01 are valid values)'; + +-- Use values from Quota. Memory is an extract of q.memory numeric value as it contains a unit (e.g. '2Gi'). +UPDATE "Environment" +SET cpu = q.cpu, memory = COALESCE(NULLIF(regexp_replace(q.memory, '\D', '','g'), ''), '0')::numeric +FROM "Quota" q +WHERE "quotaId" = q."id"; + +/* + Warnings: + + - You are about to drop the column `quotaId` on the `Environment` table. All the data in the column will be lost. + - You are about to drop the `Quota` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `_QuotaToStage` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Environment" DROP CONSTRAINT "Environment_quotaId_fkey"; + +-- DropForeignKey +ALTER TABLE "_QuotaToStage" DROP CONSTRAINT "_QuotaToStage_A_fkey"; + +-- DropForeignKey +ALTER TABLE "_QuotaToStage" DROP CONSTRAINT "_QuotaToStage_B_fkey"; + +-- AlterTable +ALTER TABLE "Environment" DROP COLUMN "quotaId", +ALTER COLUMN "cpu" DROP DEFAULT, +ALTER COLUMN "gpu" DROP DEFAULT, +ALTER COLUMN "memory" DROP DEFAULT; + +-- DropTable +DROP TABLE "Quota"; + +-- DropTable +DROP TABLE "_QuotaToStage"; diff --git a/apps/server-nestjs/src/prisma/migrations/20250825150622_add_cluster_resources/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250825150622_add_cluster_resources/migration.sql new file mode 100644 index 000000000..77f32b5ab --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250825150622_add_cluster_resources/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Cluster" +ADD COLUMN "cpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "gpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "memory" REAL NOT NULL DEFAULT 0; diff --git a/apps/server-nestjs/src/prisma/migrations/20250916134454_add_project_resources/migration.sql b/apps/server-nestjs/src/prisma/migrations/20250916134454_add_project_resources/migration.sql new file mode 100644 index 000000000..decca804a --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20250916134454_add_project_resources/migration.sql @@ -0,0 +1,9 @@ +-- AlterTable +ALTER TABLE "Project" +ADD COLUMN "limitless" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "hprodCpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "hprodGpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "hprodMemory" REAL NOT NULL DEFAULT 0, +ADD COLUMN "prodCpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "prodGpu" REAL NOT NULL DEFAULT 0, +ADD COLUMN "prodMemory" REAL NOT NULL DEFAULT 0; diff --git a/apps/server-nestjs/src/prisma/migrations/20251028150522_rename_default_zone/migration.sql b/apps/server-nestjs/src/prisma/migrations/20251028150522_rename_default_zone/migration.sql new file mode 100644 index 000000000..95f3a689d --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20251028150522_rename_default_zone/migration.sql @@ -0,0 +1,4 @@ +-- Rename default zone +UPDATE "Zone" +SET ("label", "description") = ('DSO', 'Zone par défaut') +WHERE slug = 'default'; diff --git a/apps/server-nestjs/src/prisma/migrations/20251208140951_add_argocd_inputs/migration.sql b/apps/server-nestjs/src/prisma/migrations/20251208140951_add_argocd_inputs/migration.sql new file mode 100644 index 000000000..aadb6cdba --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/20251208140951_add_argocd_inputs/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "Repository" ADD COLUMN "deployRevision" TEXT, +ADD COLUMN "deployPath" TEXT, +ADD COLUMN "helmValuesFiles" TEXT; diff --git a/apps/server-nestjs/src/prisma/migrations/migration_lock.toml b/apps/server-nestjs/src/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..648c57fd5 --- /dev/null +++ b/apps/server-nestjs/src/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" \ No newline at end of file diff --git a/apps/server-nestjs/src/prisma/schema/admin.prisma b/apps/server-nestjs/src/prisma/schema/admin.prisma new file mode 100644 index 000000000..71cfb1754 --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/admin.prisma @@ -0,0 +1,20 @@ +model AdminPlugin { + pluginName String + key String + value String + + @@unique([pluginName, key]) +} + +model AdminRole { + id String @id @unique @default(uuid()) @db.Uuid + name String + permissions BigInt + position Int @db.SmallInt + oidcGroup String @default("") +} + +model SystemSetting { + key String @id @unique + value String +} diff --git a/apps/server-nestjs/src/prisma/schema/project.prisma b/apps/server-nestjs/src/prisma/schema/project.prisma new file mode 100644 index 000000000..e76048675 --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/project.prisma @@ -0,0 +1,106 @@ +model Environment { + id String @id @default(uuid()) @db.Uuid + name String @db.VarChar(11) + projectId String @db.Uuid + memory Float @db.Real + cpu Float @db.Real + gpu Float @db.Real + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + clusterId String @db.Uuid + stageId String @db.Uuid + cluster Cluster @relation(fields: [clusterId], references: [id]) + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + stage Stage @relation(fields: [stageId], references: [id]) + + @@unique([projectId, name]) +} + +model Repository { + id String @id @default(uuid()) @db.Uuid + projectId String @db.Uuid + internalRepoName String + externalRepoUrl String @default("") + externalUserName String @default("") + isInfra Boolean @default(false) + isPrivate Boolean @default(false) + deployRevision String @default("") + deployPath String @default("") + helmValuesFiles String @default("") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) +} + +model ProjectClusterHistory { + projectId String @db.Uuid + clusterId String @db.Uuid + + @@unique([projectId, clusterId]) +} + +model ProjectMembers { + projectId String @db.Uuid + userId String @db.Uuid + roleIds String[] + project Project @relation(fields: [projectId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@unique([projectId, userId]) +} + +model ProjectPlugin { + pluginName String + projectId String @db.Uuid + key String + value String + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + + @@unique([projectId, pluginName, key]) +} + +model ProjectRole { + id String @id @unique @default(uuid()) @db.Uuid + name String + permissions BigInt + projectId String @db.Uuid + position Int @db.SmallInt + project Project @relation(fields: [projectId], references: [id]) +} + +model Project { + id String @id @unique @default(uuid()) @db.Uuid + name String + description String @default("") + status ProjectStatus @default(initializing) + locked Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + everyonePerms BigInt @default(896) + ownerId String @db.Uuid + environments Environment[] + logs Log[] + owner User @relation(fields: [ownerId], references: [id]) + members ProjectMembers[] + plugins ProjectPlugin[] + roles ProjectRole[] + repositories Repository[] + clusters Cluster[] @relation("ClusterToProject") + slug String @unique + limitless Boolean @default(true) + hprodCpu Float @db.Real + hprodGpu Float @db.Real + hprodMemory Float @db.Real + prodCpu Float @db.Real + prodGpu Float @db.Real + prodMemory Float @db.Real + lastSuccessProvisionningVersion String? +} + +enum ProjectStatus { + initializing + created + failed + archived + warning +} diff --git a/apps/server-nestjs/src/prisma/schema/schema.prisma b/apps/server-nestjs/src/prisma/schema/schema.prisma new file mode 100644 index 000000000..aadf7fea1 --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/schema.prisma @@ -0,0 +1,21 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DB_URL") +} + +model Log { + id String @id @default(uuid()) @db.Uuid + data Json + action String @default("") + userId String? @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + requestId String? @db.VarChar(36) + projectId String? @db.Uuid + project Project? @relation(fields: [projectId], references: [id]) + user User? @relation(fields: [userId], references: [id]) +} diff --git a/apps/server-nestjs/src/prisma/schema/token.prisma b/apps/server-nestjs/src/prisma/schema/token.prisma new file mode 100644 index 000000000..c0c55751c --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/token.prisma @@ -0,0 +1,30 @@ +model AdminToken { + id String @id @unique @default(uuid()) @db.Uuid + name String + permissions BigInt + userId String @db.Uuid + expirationDate DateTime? + lastUse DateTime? + createdAt DateTime @default(now()) + status TokenStatus @default(active) + hash String + owner User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade) +} + +model PersonalAccessToken { + id String @id @unique @default(uuid()) @db.Uuid + name String + userId String @db.Uuid + expirationDate DateTime + lastUse DateTime? + createdAt DateTime @default(now()) + status TokenStatus @default(active) + hash String + owner User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade) +} + +enum TokenStatus { + active + revoked + inactive +} diff --git a/apps/server-nestjs/src/prisma/schema/topography.prisma b/apps/server-nestjs/src/prisma/schema/topography.prisma new file mode 100644 index 000000000..ad8e3be22 --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/topography.prisma @@ -0,0 +1,53 @@ +model Cluster { + id String @id @unique @default(uuid()) @db.Uuid + label String @unique @db.VarChar(50) + privacy ClusterPrivacy @default(dedicated) + secretName String @unique @default(uuid()) @db.VarChar(50) + clusterResources Boolean @default(false) + kubeConfigId String @unique @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + infos String? @db.VarChar(1000) + external Boolean @default(false) + memory Float @db.Real + cpu Float @db.Real + gpu Float @db.Real + zoneId String @db.Uuid + kubeconfig Kubeconfig @relation(fields: [kubeConfigId], references: [id], onDelete: Cascade) + zone Zone @relation(fields: [zoneId], references: [id]) + environments Environment[] + projects Project[] @relation("ClusterToProject") + stages Stage[] @relation("ClusterToStage") +} + +model Kubeconfig { + id String @id @unique @default(uuid()) @db.Uuid + user Json + cluster Json + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + parentCluster Cluster? +} + +model Stage { + id String @id @unique @default(uuid()) @db.Uuid + name String @unique @db.VarChar + environments Environment[] + clusters Cluster[] @relation("ClusterToStage") +} + +model Zone { + id String @id @unique @default(uuid()) @db.Uuid + slug String @unique @db.VarChar(10) + label String @db.VarChar(50) + description String? @db.VarChar(200) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + argocdUrl String @default("https://example.com") + clusters Cluster[] +} + +enum ClusterPrivacy { + public + dedicated +} diff --git a/apps/server-nestjs/src/prisma/schema/user.prisma b/apps/server-nestjs/src/prisma/schema/user.prisma new file mode 100644 index 000000000..e90fb69f8 --- /dev/null +++ b/apps/server-nestjs/src/prisma/schema/user.prisma @@ -0,0 +1,23 @@ +model User { + id String @id @db.Uuid + firstName String + lastName String + email String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + lastLogin DateTime? + adminRoleIds String[] + type UserType + + logs Log[] + projectsOwned Project[] + adminTokens AdminToken[] + projectMembers ProjectMembers[] + personalAccessTokens PersonalAccessToken[] +} + +enum UserType { + human + bot + ghost +} diff --git a/apps/server-nestjs/test.backup/app.e2e-spec.ts b/apps/server-nestjs/test.backup/app.e2e-spec.ts new file mode 100644 index 000000000..4ec856c86 --- /dev/null +++ b/apps/server-nestjs/test.backup/app.e2e-spec.ts @@ -0,0 +1,26 @@ +import { INestApplication } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import request from 'supertest'; +import { App } from 'supertest/types'; + +import { MainModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [MainModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/apps/server-nestjs/test.backup/jest-e2e.json b/apps/server-nestjs/test.backup/jest-e2e.json new file mode 100644 index 000000000..e9d912f3e --- /dev/null +++ b/apps/server-nestjs/test.backup/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/server-nestjs/tsconfig.build.json b/apps/server-nestjs/tsconfig.build.json new file mode 100644 index 000000000..64f86c6bd --- /dev/null +++ b/apps/server-nestjs/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/server-nestjs/tsconfig.json b/apps/server-nestjs/tsconfig.json new file mode 100644 index 000000000..ac93f0c95 --- /dev/null +++ b/apps/server-nestjs/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "baseUrl": "./", + "declaration": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "incremental": true, + "isolatedModules": true, + "module": "nodenext", + "moduleResolution": "nodenext", + "noFallthroughCasesInSwitch": false, + "noImplicitAny": false, + "outDir": "./dist", + "paths": { + "@/*": ["src/*"] + }, + "removeComments": true, + "resolvePackageJsonExports": true, + "skipLibCheck": true, + "sourceMap": true, + "strictBindCallApply": false, + "strictNullChecks": true, + "target": "ES2023" + } +} diff --git a/plugins/gitlab/src/project.ts b/plugins/gitlab/src/project.ts index de0eb45c2..df3dc8e67 100644 --- a/plugins/gitlab/src/project.ts +++ b/plugins/gitlab/src/project.ts @@ -1,30 +1,37 @@ import * as fs from 'node:fs/promises' import path from 'node:path' -import { getApi } from './utils.js' -const baseDir = path.resolve(import.meta.url, '../../files/').split(':')[1] +import { getApi } from './utils.js' -const gitlabCiYml = (await fs.readFile(`${baseDir}/.gitlab-ci.yml`)).toString() -const mirrorSh = (await fs.readFile(`${baseDir}/mirror.sh`)).toString() +export async function provisionMirror(repoId: number) { + const baseDir = path.resolve(import.meta.url, '../../files/').split(':')[1] -const mirrorFirstActions: CommitAction[] = [ - { - action: 'create', - filePath: '.gitlab-ci.yml', - content: gitlabCiYml, - execute_filemode: false, - }, - { - action: 'create', - filePath: 'mirror.sh', - content: mirrorSh, - execute_filemode: true, - }, -] + const gitlabCiYml = ( + await fs.readFile(`${baseDir}/.gitlab-ci.yml`) + ).toString() + const mirrorSh = (await fs.readFile(`${baseDir}/mirror.sh`)).toString() -export async function provisionMirror(repoId: number) { + const mirrorFirstActions: CommitAction[] = [ + { + action: 'create', + filePath: '.gitlab-ci.yml', + content: gitlabCiYml, + execute_filemode: false, + }, + { + action: 'create', + filePath: 'mirror.sh', + content: mirrorSh, + execute_filemode: true, + }, + ] const api = getApi() - await api.Commits.create(repoId, 'main', 'ci: :construction_worker: first mirror', mirrorFirstActions) + await api.Commits.create( + repoId, + 'main', + 'ci: :construction_worker: first mirror', + mirrorFirstActions, + ) } interface CommitAction { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af807b2a1..0617cc818 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,7 +191,7 @@ importers: version: 2.1.9(@types/node@24.10.0)(terser@5.44.1) vite-plugin-pwa: specifier: ^1.1.0 - version: 1.1.0(vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0) + version: 1.1.0(vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vitest: specifier: ^2.1.8 version: 2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1) @@ -366,6 +366,247 @@ importers: specifier: ^2.1.8 version: 2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1) + apps/server-nestjs: + dependencies: + '@cpn-console/argocd-plugin': + specifier: workspace:^ + version: file:plugins/argocd(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: file:plugins/gitlab(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/harbor-plugin': + specifier: workspace:^ + version: file:plugins/harbor(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/hooks': + specifier: workspace:^ + version: file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: file:plugins/keycloak(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/kubernetes-plugin': + specifier: workspace:^ + version: file:plugins/kubernetes(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/nexus-plugin': + specifier: workspace:^ + version: file:plugins/nexus(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': + specifier: workspace:^ + version: file:packages/shared(@types/node@22.19.3) + '@cpn-console/sonarqube-plugin': + specifier: workspace:^ + version: file:plugins/sonarqube(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@fastify/cookie': + specifier: ^9.4.0 + version: 9.4.0 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/session': + specifier: ^10.9.0 + version: 10.9.0 + '@fastify/swagger': + specifier: ^8.15.0 + version: 8.15.0 + '@fastify/swagger-ui': + specifier: ^4.2.0 + version: 4.2.0 + '@gitbeaker/core': + specifier: ^40.6.0 + version: 40.6.0 + '@gitbeaker/rest': + specifier: ^40.6.0 + version: 40.6.0 + '@kubernetes-models/argo-cd': + specifier: ^2.6.2 + version: 2.7.2 + '@kubernetes/client-node': + specifier: ^0.22.3 + version: 0.22.3 + '@nestjs/common': + specifier: ^11.0.1 + version: 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^4.0.2 + version: 4.0.2(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^11.0.1 + version: 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.11)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/platform-express': + specifier: ^11.0.1 + version: 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11) + '@prisma/client': + specifier: ^6.0.1 + version: 6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@22.19.3)(zod@3.25.76) + '@ts-rest/fastify': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.3)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76) + '@ts-rest/open-api': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.3)(zod@3.25.76))(zod@3.25.76) + axios: + specifier: 1.12.2 + version: 1.12.2 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + dotenv: + specifier: ^16.4.7 + version: 16.6.1 + fastify: + specifier: ^4.29.1 + version: 4.29.1 + fastify-keycloak-adapter: + specifier: 2.3.2 + version: 2.3.2(patch_hash=6846b953fc520dd1ca6cb2e790cf190cbc3ed9fa9ff69739100458c520293447) + json-2-csv: + specifier: ^5.5.7 + version: 5.5.10 + mustache: + specifier: ^4.2.0 + version: 4.2.0 + nestjs-pino: + specifier: ^4.5.0 + version: 4.5.0(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.1.0)(rxjs@7.8.2) + pino-http: + specifier: ^11.0.0 + version: 11.0.0 + prisma: + specifier: ^6.0.1 + version: 6.19.0(magicast@0.3.5)(typescript@5.9.3) + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + rxjs: + specifier: ^7.8.1 + version: 7.8.2 + undici: + specifier: ^7.1.0 + version: 7.16.0 + vitest-mock-extended: + specifier: ^2.0.2 + version: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../packages/eslintconfig + '@cpn-console/test-utils': + specifier: workspace:^ + version: file:packages/test-utils(@types/node@22.19.3) + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../packages/tsconfig + '@eslint/eslintrc': + specifier: ^3.2.0 + version: 3.3.1 + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.1 + '@faker-js/faker': + specifier: ^9.3.0 + version: 9.9.0 + '@nestjs/cli': + specifier: ^11.0.0 + version: 11.0.14(@types/node@22.19.3) + '@nestjs/schematics': + specifier: ^11.0.0 + version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) + '@nestjs/testing': + specifier: ^11.0.1 + version: 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11)(@nestjs/platform-express@11.1.11) + '@trivago/prettier-plugin-sort-imports': + specifier: ^6.0.0 + version: 6.0.1(@vue/compiler-sfc@3.5.23)(prettier@3.7.4) + '@types/express': + specifier: ^5.0.0 + version: 5.0.6 + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^22.10.7 + version: 22.19.3 + '@types/supertest': + specifier: ^6.0.2 + version: 6.0.3 + '@vitest/coverage-v8': + specifier: ^2.1.8 + version: 2.1.9(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + eslint: + specifier: ^9.18.0 + version: 9.39.1(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-prettier: + specifier: ^5.2.2 + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4) + fastify-plugin: + specifier: ^5.0.1 + version: 5.1.0 + globals: + specifier: ^16.0.0 + version: 16.5.0 + jest: + specifier: ^30.0.0 + version: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + nodemon: + specifier: ^3.1.7 + version: 3.1.10 + pino-pretty: + specifier: ^13.0.0 + version: 13.1.2 + prettier: + specifier: ^3.4.2 + version: 3.7.4 + rimraf: + specifier: ^6.0.1 + version: 6.1.0 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: ^7.0.0 + version: 7.2.1 + ts-jest: + specifier: ^29.2.5 + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)))(typescript@5.9.3) + ts-loader: + specifier: ^9.5.2 + version: 9.5.4(typescript@5.9.3)(webpack@5.103.0) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.19.3)(typescript@5.9.3) + ts-patch: + specifier: ^3.3.0 + version: 3.3.0 + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.7.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.20.0 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + typescript-transform-paths: + specifier: ^3.5.2 + version: 3.5.5(typescript@5.9.3) + vite: + specifier: ^7.2.1 + version: 7.2.1(@types/node@22.19.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1) + vite-node: + specifier: ^2.1.8 + version: 2.1.9(@types/node@22.19.3)(terser@5.44.1) + vitest: + specifier: ^2.1.8 + version: 2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1) + packages/eslintconfig: devDependencies: '@antfu/eslint-config': @@ -964,6 +1205,37 @@ packages: openapi3-ts: ^2.0.0 || ^3.0.0 zod: ^3.20.0 + '@angular-devkit/core@19.2.17': + resolution: {integrity: sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==} + 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 + + '@angular-devkit/core@19.2.19': + resolution: {integrity: sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==} + 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 + + '@angular-devkit/schematics-cli@19.2.19': + resolution: {integrity: sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==} + 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'} + hasBin: true + + '@angular-devkit/schematics@19.2.17': + resolution: {integrity: sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==} + 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'} + + '@angular-devkit/schematics@19.2.19': + resolution: {integrity: sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==} + 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'} + '@antfu/eslint-config@3.16.0': resolution: {integrity: sha512-g6RAXUMeow9vexoOMYwCpByY2xSDpAD78q+rvQLvVpY6MFcxFD/zmdrZGYa/yt7LizK86m17kIYKOGLJ3L8P0w==} hasBin: true @@ -1177,6 +1449,27 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.27.1': resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} @@ -1189,6 +1482,70 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1552,6 +1909,9 @@ packages: '@biomejs/wasm-nodejs@2.2.6': resolution: {integrity: sha512-lUEcvW+2eyMTgCofknBT04AvY7KkQSqKe3Nv40+ZxWVlStsPB0v2RWLu7xks69Yxcb3TfNGsfq21OWkdrmO2NQ==} + '@borewit/text-codec@0.2.1': + resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} + '@cacheable/memoize@2.0.3': resolution: {integrity: sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==} @@ -1567,6 +1927,10 @@ packages: '@clack/prompts@0.9.1': resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@commitlint/cli@19.8.1': resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} engines: {node: '>=v18'} @@ -1636,6 +2000,43 @@ packages: resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} + '@cpn-console/argocd-plugin@file:plugins/argocd': + resolution: {directory: plugins/argocd, type: directory} + + '@cpn-console/gitlab-plugin@file:plugins/gitlab': + resolution: {directory: plugins/gitlab, type: directory} + + '@cpn-console/harbor-plugin@file:plugins/harbor': + resolution: {directory: plugins/harbor, type: directory} + + '@cpn-console/hooks@file:packages/hooks': + resolution: {directory: packages/hooks, type: directory} + + '@cpn-console/keycloak-plugin@file:plugins/keycloak': + resolution: {directory: plugins/keycloak, type: directory} + + '@cpn-console/kubernetes-plugin@file:plugins/kubernetes': + resolution: {directory: plugins/kubernetes, type: directory} + + '@cpn-console/nexus-plugin@file:plugins/nexus': + resolution: {directory: plugins/nexus, type: directory} + + '@cpn-console/shared@file:packages/shared': + resolution: {directory: packages/shared, type: directory} + + '@cpn-console/sonarqube-plugin@file:plugins/sonarqube': + resolution: {directory: plugins/sonarqube, type: directory} + + '@cpn-console/test-utils@file:packages/test-utils': + resolution: {directory: packages/test-utils, type: directory} + + '@cpn-console/vault-plugin@file:plugins/vault': + resolution: {directory: plugins/vault, type: directory} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -2189,31 +2590,260 @@ packages: peerDependencies: vue: '>=3' - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.3.2': + resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} @@ -2228,6 +2858,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jsep-plugin/assignment@1.3.0': resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} engines: {node: '>= 10.16.0'} @@ -2272,6 +2905,10 @@ packages: '@kubernetes/client-node@0.22.3': resolution: {integrity: sha512-dG8uah3+HDJLpJEESshLRZlAZ4PgDeV9mZXT0u1g7oy4KMRzdZ7n5g0JEIlL6QhK51/2ztcIqURAnjfjJt6Z+g==} + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} @@ -2279,6 +2916,84 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@nestjs/cli@11.0.14': + resolution: {integrity: sha512-YwP03zb5VETTwelXU+AIzMVbEZKk/uxJL+z9pw0mdG9ogAtqZ6/mpmIM4nEq/NU8D0a7CBRLcMYUmWW/55pfqw==} + engines: {node: '>= 20.11'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@11.1.11': + resolution: {integrity: sha512-R/+A8XFqLgN8zNs2twhrOaE7dJbRQhdPX3g46am4RT/x8xGLqDphrXkUIno4cGUZHxbczChBAaAPTdPv73wDZA==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/config@4.0.2': + resolution: {integrity: sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==} + peerDependencies: + '@nestjs/common': ^10.0.0 || ^11.0.0 + rxjs: ^7.1.0 + + '@nestjs/core@11.1.11': + resolution: {integrity: sha512-H9i+zT3RvHi7tDc+lCmWHJ3ustXveABCr+Vcpl96dNOxgmrx4elQSTC4W93Mlav2opfLV+p0UTHY6L+bpUA4zA==} + engines: {node: '>= 20'} + 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 + + '@nestjs/platform-express@11.1.11': + resolution: {integrity: sha512-kyABSskdMRIAMWL0SlbwtDy4yn59RL4HDdwHDz/fxWuv7/53YP8Y2DtV3/sHqY5Er0msMVTZrM38MjqXhYL7gw==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + + '@nestjs/schematics@11.0.9': + resolution: {integrity: sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/testing@11.1.11': + resolution: {integrity: sha512-Po2aZKXlxuySDEh3Gi05LJ7/BtfTAPRZ3KPTrbpNrTmgGr3rFgEGYpQwN50wXYw0pywoICiFLZSZ/qXsplf6NA==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2291,6 +3006,14 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nuxt/opencollective@0.4.1': + resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} + engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} + hasBin: true + + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -2505,6 +3228,15 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.34.46': + resolution: {integrity: sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -2520,6 +3252,32 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@trivago/prettier-plugin-sort-imports@6.0.1': + resolution: {integrity: sha512-6B13DCWDfAfh4AEJ43gRgeCSAQmlKG5LHqHzHc0lbUwgBy0rX7o41US+46Fd4XiXBx+JDGEz3NBadCbUls0dUQ==} + engines: {node: '>= 20'} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + prettier-plugin-ember-template-tag: '>= 2.0.0' + prettier-plugin-svelte: 3.x + svelte: 4.x || 5.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + prettier-plugin-ember-template-tag: + optional: true + prettier-plugin-svelte: + optional: true + svelte: + optional: true + '@ts-rest/core@3.52.1': resolution: {integrity: sha512-tAjz7Kxq/grJodcTA1Anop4AVRDlD40fkksEV5Mmal88VoZeRKAG8oMHsDwdwPZz+B/zgnz0q2sF+cm5M7Bc7g==} peerDependencies: @@ -2547,21 +3305,81 @@ packages: '@ts-rest/core': ~3.52.0 zod: ^3.22.3 + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/conventional-commits-parser@5.0.2': resolution: {integrity: sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -2577,24 +3395,51 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.19.3': + resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/node@24.10.0': resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} '@types/sizzle@2.3.10': resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} + '@types/swagger-schema-official@2.0.25': resolution: {integrity: sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==} @@ -2610,6 +3455,12 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -2672,6 +3523,9 @@ packages: resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unocss/astro@66.5.4': resolution: {integrity: sha512-6KsilC1SiTBmEJRMuPl+Mg8KDWB1+DaVoirGZR7BAEtMf2NzrfQcR4+O/3DHtzb38pfb0K1aHCfWwCozHxLlfA==} peerDependencies: @@ -2995,6 +3849,57 @@ packages: vue: optional: true + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -3002,11 +3907,25 @@ packages: abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -3046,6 +3965,16 @@ packages: peerDependencies: ajv: ^8.0.0-beta.0 + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3083,10 +4012,18 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + any-base@1.1.0: resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} @@ -3094,6 +4031,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} @@ -3101,6 +4041,12 @@ packages: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3111,6 +4057,9 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -3119,6 +4068,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} @@ -3176,6 +4128,20 @@ packages: axios@1.12.2: resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-polyfill-corejs2@0.4.14: resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: @@ -3191,6 +4157,17 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3200,10 +4177,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.25: - resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} - hasBin: true - baseline-browser-mapping@2.9.11: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true @@ -3215,6 +4188,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blob-util@2.0.2: resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} @@ -3224,6 +4200,10 @@ packages: bn.js@4.12.1: resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3240,18 +4220,20 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -3266,6 +4248,10 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + byline@5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} engines: {node: '>=0.10.0'} @@ -3320,6 +4306,14 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelize-ts@3.0.0: resolution: {integrity: sha512-cgRwKKavoDKLTjO4FQTs3dRBePZp/2Y9Xpud0FhuCOTE86M2cniKN4CCXgRnsyXNMmQMifVHcv6SPaMtTx6ofQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3349,9 +4343,16 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -3368,6 +4369,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@4.3.1: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} @@ -3379,6 +4384,9 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -3395,10 +4403,18 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-table3@0.6.1: resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==} engines: {node: 10.* || >= 12.*} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -3407,6 +4423,10 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + clipboard@2.0.11: resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} @@ -3414,6 +4434,17 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -3448,10 +4479,18 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + comment-json@4.4.1: + resolution: {integrity: sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==} + engines: {node: '>= 6'} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -3463,9 +4502,16 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -3480,6 +4526,14 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + conventional-changelog-angular@7.0.0: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} @@ -3504,6 +4558,9 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + core-js-compat@3.46.0: resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} @@ -3516,6 +4573,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig-typescript-loader@6.2.0: resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} engines: {node: '>=v18'} @@ -3524,6 +4585,15 @@ packages: cosmiconfig: '>=9' typescript: '>=5' + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -3533,6 +4603,9 @@ packages: typescript: optional: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cron-validator@1.4.0: resolution: {integrity: sha512-wGcJ9FCy65iaU6egSH8b5dZYJF7GU/3Jh06wzaT9lsa5dbqExjljmu+0cJ8cpKn+vUyZa/EM4WAxeLR6SypJXw==} @@ -3637,6 +4710,14 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deeks@3.1.0: resolution: {integrity: sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A==} engines: {node: '>= 16'} @@ -3656,6 +4737,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3685,13 +4769,24 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3720,6 +4815,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv-expand@12.0.1: + resolution: {integrity: sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==} + engines: {node: '>=12'} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -3748,6 +4847,9 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + effect@3.18.4: resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} @@ -3756,15 +4858,16 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.245: - resolution: {integrity: sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==} - electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -3778,6 +4881,10 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -3863,6 +4970,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -3888,6 +4999,12 @@ packages: peerDependencies: eslint: ^9.5.0 + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-flat-config-utils@1.1.0: resolution: {integrity: sha512-W49wz7yQJGRfg4QSV3nwdO/fYcWetiSKhLV5YykfQMcqnIATNpoS7EPdINhLB9P3fmdjNmFtOgZjiKnCndWAnw==} @@ -3981,6 +5098,20 @@ packages: peerDependencies: eslint: '>=8.45.0' + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-regexp@2.10.0: resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} engines: {node: ^18 || >=20} @@ -4026,6 +5157,10 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: ^8.50.0 || ^9.0.0 + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4060,6 +5195,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -4068,6 +5208,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4089,16 +5233,28 @@ packages: resolution: {integrity: sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==} engines: {node: '>=6.0.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + eventemitter2@6.4.7: resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -4107,10 +5263,22 @@ packages: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} @@ -4142,6 +5310,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4203,6 +5374,9 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -4226,6 +5400,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-type@21.2.0: + resolution: {integrity: sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg==} + engines: {node: '>=20'} + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -4233,6 +5411,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + find-my-way@8.2.2: resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} engines: {node: '>=14'} @@ -4288,6 +5470,13 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + fork-ts-checker-webpack-plugin@9.1.0: + resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -4296,10 +5485,18 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4307,10 +5504,21 @@ packages: fp-ts@2.16.9: resolution: {integrity: sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -4357,6 +5565,10 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4365,6 +5577,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -4399,6 +5615,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -4408,6 +5627,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -4448,6 +5671,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -4483,6 +5710,11 @@ packages: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} @@ -4568,6 +5800,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -4591,6 +5827,10 @@ packages: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -4604,6 +5844,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + engines: {node: '>=0.10.0'} + idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} @@ -4628,6 +5872,11 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -4745,6 +5994,10 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -4757,6 +6010,10 @@ packages: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -4795,6 +6052,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -4883,6 +6143,10 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -4895,6 +6159,10 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -4907,9 +6175,144 @@ packages: engines: {node: '>=10'} hasBin: true + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + javascript-time-ago@2.5.12: resolution: {integrity: sha512-s8PPq2HQ3HIbSU0SjhNvTitf5VoXbQWof9q6k3gIX7F2il0ptjD5lONTDccpuKt/2U7RjbCp/TCHPK7eDwO7zQ==} + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -4927,6 +6330,10 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -5008,6 +6415,9 @@ packages: resolution: {integrity: sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -5106,10 +6516,18 @@ packages: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} + engines: {node: '>=13.2.0'} + load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} @@ -5130,6 +6548,9 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.17.22: + resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -5142,6 +6563,9 @@ packages: lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -5203,6 +6627,9 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -5213,6 +6640,12 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -5262,6 +6695,18 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -5274,6 +6719,10 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5281,6 +6730,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -5376,10 +6829,23 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -5433,6 +6899,10 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -5452,10 +6922,18 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5487,9 +6965,31 @@ packages: resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} hasBin: true + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nestjs-pino@4.5.0: + resolution: {integrity: sha512-e54ChJMACSGF8gPYaHsuD07RW7l/OVoV6aI8Hqhpp0ZQ4WA8QY3eewL42JX7Z1U6rV7byNU7bGBV9l6d9V6PDQ==} + engines: {node: '>= 14'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + pino: ^7.5.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + rxjs: ^7.1.0 + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-fetch-h2@2.3.0: resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} engines: {node: 4.x || >=6.0.0} @@ -5506,6 +7006,9 @@ packages: encoding: optional: true + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} @@ -5570,6 +7073,10 @@ packages: oauth4webapi@3.8.2: resolution: {integrity: sha512-FzZZ+bht5X0FKe7Mwz3DAVAmlH1BV5blSak/lHMBKz0/EBMhX6B10GlQYI51+oRp8ObJaX0g6pXrAxZh5s8rjw==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -5595,6 +7102,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5623,6 +7134,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + ospath@1.2.2: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} @@ -5700,6 +7215,10 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -5738,6 +7257,9 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -5779,6 +7301,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -5813,6 +7339,9 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-http@11.0.0: + resolution: {integrity: sha512-wqg5XIAGRRIWtTk8qPGxkbrfiwEWz1lgedVLvhLALudKXvg1/L2lTFgTGPJ4Z2e3qcRmxoFxDuSdMdMGNM6I1g==} + pino-pretty@13.1.2: resolution: {integrity: sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ==} hasBin: true @@ -5820,10 +7349,22 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + pino@10.1.0: + resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==} + hasBin: true + pino@9.14.0: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -5886,6 +7427,15 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -5894,6 +7444,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + prisma@6.19.0: resolution: {integrity: sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==} engines: {node: '>=18.18'} @@ -5943,6 +7497,9 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + qified@0.5.1: resolution: {integrity: sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==} engines: {node: '>=20'} @@ -5951,6 +7508,10 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -5974,9 +7535,17 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + rate-limiter-flexible@4.0.1: resolution: {integrity: sha512-2/dGHpDFpeA0+755oUkW+EKyklqLS9lu0go9pDsbhqQjZcxfRyJ6LA4JI0+HAdZ2bemD/oOjUeZQB2lCZqXQfQ==} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -5984,6 +7553,9 @@ packages: resolution: {integrity: sha512-VXUdgSiUrE/WZXn6gUIVVIsg0+Hp6VPZPOaHCay+OuFKy6u/8ktmeNEf+U5qSA8jzGGFsg8jrDNu1BeHpz2pJA==} engines: {node: '>=10'} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -5999,6 +7571,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6015,6 +7591,9 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -6083,6 +7662,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6140,6 +7723,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} @@ -6149,6 +7736,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -6184,6 +7774,14 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + schemes@1.4.0: resolution: {integrity: sha512-ImFy9FbCsQlVgnE3TCWmLPCFnVzx0lHL/l+umHplDqAKd0dzFpnS6lFZIpagBlYhKwzVmlV36ec0Y1XTu8JBAQ==} @@ -6216,9 +7814,17 @@ packages: engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -6353,6 +7959,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -6360,6 +7969,14 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -6388,6 +8005,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -6397,6 +8017,10 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -6404,6 +8028,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} @@ -6418,10 +8046,18 @@ packages: resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} engines: {node: '>= 0.10.0'} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6473,6 +8109,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -6500,6 +8140,10 @@ packages: strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + stylelint-config-html@1.1.0: resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} engines: {node: ^12 || >=14} @@ -6537,6 +8181,14 @@ packages: engines: {node: '>=18.12.0'} hasBin: true + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} + + supertest@7.2.1: + resolution: {integrity: sha512-/OfhUL9WRLfoovZuWJ4l+2GVz3Eoo8Eo2TZVs9QxF2kmxdrmK7rCww4iJBstHevUH/M44aJ9TMN7yB+W+oWxlA==} + engines: {node: '>=14.18.0'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6572,6 +8224,10 @@ packages: resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} hasBin: true + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -6608,11 +8264,31 @@ packages: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + terser@5.44.1: resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} @@ -6670,6 +8346,9 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -6682,6 +8361,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + toml-eslint-parser@0.10.0: resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6742,10 +8425,66 @@ packages: typescript: optional: true + ts-jest@29.4.6: + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + ts-loader@9.5.4: + resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-patch@3.3.0: resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==} hasBin: true + tsconfig-paths-webpack-plugin@4.2.0: + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -6798,6 +8537,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -6818,6 +8561,18 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -6834,6 +8589,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript-eslint@8.46.3: resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6859,6 +8617,19 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -6869,6 +8640,9 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -6931,6 +8705,10 @@ packages: vite: optional: true + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + unplugin-auto-import@0.18.6: resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==} engines: {node: '>=14'} @@ -6975,12 +8753,6 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -7014,9 +8786,20 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -7197,6 +8980,16 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -7207,9 +9000,27 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.103.0: + resolution: {integrity: sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -7270,6 +9081,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workbox-background-sync@7.3.0: resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} @@ -7411,6 +9225,10 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -7419,6 +9237,10 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + zod-validation-error@3.5.4: resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} engines: {node: '>=18.0.0'} @@ -7444,6 +9266,60 @@ snapshots: ts-deepmerge: 6.2.1 zod: 3.25.76 + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/core@19.2.19(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics-cli@19.2.19(@types/node@22.19.3)(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) + '@inquirer/prompts': 7.3.2(@types/node@22.19.3) + ansi-colors: 4.1.3 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@types/node' + - chokidar + + '@angular-devkit/schematics@19.2.17(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/schematics@19.2.19(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.23)(eslint-import-resolver-node@0.3.9)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1))': dependencies: '@antfu/install-pkg': 1.1.0 @@ -7716,6 +9592,26 @@ snapshots: dependencies: '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -7726,6 +9622,66 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -8153,7 +10109,7 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.7 + '@babel/parser': 7.28.5 '@babel/types': 7.28.5 '@babel/traverse@7.27.7': @@ -8193,6 +10149,8 @@ snapshots: '@biomejs/wasm-nodejs@2.2.6': {} + '@borewit/text-codec@0.2.1': {} + '@cacheable/memoize@2.0.3': dependencies: '@cacheable/utils': 2.2.0 @@ -8219,6 +10177,9 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 + '@colors/colors@1.5.0': + optional: true + '@commitlint/cli@19.8.1(@types/node@24.10.0)(typescript@5.9.3)': dependencies: '@commitlint/format': 19.8.1 @@ -8329,27 +10290,191 @@ snapshots: '@types/conventional-commits-parser': 5.0.2 chalk: 5.6.2 - '@csstools/color-helpers@5.1.0': {} + '@cpn-console/argocd-plugin@file:plugins/argocd(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/gitlab-plugin': file:plugins/gitlab(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/keycloak-plugin': file:plugins/keycloak(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/kubernetes-plugin': file:plugins/kubernetes(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@cpn-console/vault-plugin': file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@himenon/argocd-typescript-openapi': 1.2.2 + '@kubernetes-models/argo-cd': 2.7.2 + '@kubernetes/client-node': 0.22.3 + '@types/js-yaml': 4.0.9 + axios: 1.12.2 + js-yaml: 4.1.0 + kubernetes-models: 4.5.1 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@cpn-console/gitlab-plugin@file:plugins/gitlab(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@cpn-console/vault-plugin': file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@gitbeaker/core': 40.6.0 + '@gitbeaker/requester-utils': 40.6.0 + '@gitbeaker/rest': 40.6.0 + axios: 1.12.2 + js-yaml: 4.1.0 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@cpn-console/harbor-plugin@file:plugins/harbor(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/keycloak-plugin': file:plugins/keycloak(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/kubernetes-plugin': file:plugins/kubernetes(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@cpn-console/vault-plugin': file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + axios: 1.12.2 + bytes: 3.1.2 + cron-validator: 1.4.0 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@cpn-console/hooks@file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': dependencies: - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/css-tokenizer@3.0.4': {} + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + json-schema: 0.4.0 + vitest-mock-extended: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + zod: 3.25.76 + transitivePeerDependencies: + - '@types/node' + - typescript + - vitest - '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@cpn-console/keycloak-plugin@file:plugins/keycloak(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@keycloak/keycloak-admin-client': 26.4.2 + axios: 1.12.2 + transitivePeerDependencies: + - '@types/node' + - debug + - typescript + - vitest + + '@cpn-console/kubernetes-plugin@file:plugins/kubernetes(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@kubernetes-models/argo-cd': 2.7.2 + '@kubernetes/client-node': 0.22.3 + axios: 1.12.2 + kubernetes-models: 4.5.1 + request: 2.88.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest + + '@cpn-console/nexus-plugin@file:plugins/nexus(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/gitlab-plugin': file:plugins/gitlab(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@cpn-console/vault-plugin': file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + axios: 1.12.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest + + '@cpn-console/shared@file:packages/shared(@types/node@22.19.3)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@22.19.3)(zod@3.25.76) + short-uuid: 5.2.0 + zod: 3.25.76 + zod-validation-error: 3.5.4(zod@3.25.76) + transitivePeerDependencies: + - '@types/node' + + '@cpn-console/sonarqube-plugin@file:plugins/sonarqube(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/gitlab-plugin': file:plugins/gitlab(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/keycloak-plugin': file:plugins/keycloak(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@cpn-console/vault-plugin': file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + axios: 1.12.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest + + '@cpn-console/test-utils@file:packages/test-utils(@types/node@22.19.3)': + dependencies: + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@faker-js/faker': 9.9.0 + transitivePeerDependencies: + - '@types/node' + + '@cpn-console/vault-plugin@file:plugins/vault(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@cpn-console/hooks': file:packages/hooks(@types/node@22.19.3)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)) + '@cpn-console/shared': file:packages/shared(@types/node@22.19.3) + '@kubernetes/client-node': 0.22.3 + axios: 1.12.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - typescript + - utf-8-validate + - vitest + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -8801,6 +10926,146 @@ snapshots: '@iconify/types': 2.0.0 vue: 3.5.23(typescript@5.9.3) + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@22.19.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/confirm@5.1.21(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/core@10.3.2(@types/node@22.19.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.3) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/editor@4.2.23(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/expand@4.0.23(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/external-editor@1.0.3(@types/node@22.19.3)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.1 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/number@3.0.23(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/password@4.0.23(@types/node@22.19.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/prompts@7.10.1(@types/node@22.19.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.3) + '@inquirer/confirm': 5.1.21(@types/node@22.19.3) + '@inquirer/editor': 4.2.23(@types/node@22.19.3) + '@inquirer/expand': 4.0.23(@types/node@22.19.3) + '@inquirer/input': 4.3.1(@types/node@22.19.3) + '@inquirer/number': 3.0.23(@types/node@22.19.3) + '@inquirer/password': 4.0.23(@types/node@22.19.3) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.3) + '@inquirer/search': 3.2.2(@types/node@22.19.3) + '@inquirer/select': 4.4.2(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/prompts@7.3.2(@types/node@22.19.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.3) + '@inquirer/confirm': 5.1.21(@types/node@22.19.3) + '@inquirer/editor': 4.2.23(@types/node@22.19.3) + '@inquirer/expand': 4.0.23(@types/node@22.19.3) + '@inquirer/input': 4.3.1(@types/node@22.19.3) + '@inquirer/number': 3.0.23(@types/node@22.19.3) + '@inquirer/password': 4.0.23(@types/node@22.19.3) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.3) + '@inquirer/search': 3.2.2(@types/node@22.19.3) + '@inquirer/select': 4.4.2(@types/node@22.19.3) + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/rawlist@4.1.11(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/type': 3.0.10(@types/node@22.19.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/search@3.2.2(@types/node@22.19.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/select@4.4.2(@types/node@22.19.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.3 + + '@inquirer/type@3.0.10(@types/node@22.19.3)': + optionalDependencies: + '@types/node': 22.19.3 + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -8820,8 +11085,195 @@ snapshots: dependencies: minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + '@istanbuljs/schema@0.1.3': {} + '@jest/console@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + chalk: 4.1.2 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + + '@jest/core@30.2.0(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3))': + dependencies: + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.2.0': + dependencies: + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + jest-mock: 30.2.0 + + '@jest/expect-utils@30.2.0': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/expect@30.2.0': + dependencies: + expect: 30.2.0 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 22.19.3 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.2.0': + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 22.19.3 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.2.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 22.19.3 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.46 + + '@jest/snapshot-utils@30.2.0': + dependencies: + '@jest/types': 30.2.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.2.0': + dependencies: + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + + '@jest/test-sequencer@30.2.0': + dependencies: + '@jest/test-result': 30.2.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + slash: 3.0.0 + + '@jest/transform@30.2.0': + dependencies: + '@babel/core': 7.28.5 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.3 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8846,6 +11298,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': dependencies: jsep: 1.4.0 @@ -8915,6 +11372,8 @@ snapshots: - bufferutil - utf-8-validate + '@lukeed/csprng@1.1.0': {} + '@lukeed/ms@2.0.2': {} '@napi-rs/wasm-runtime@0.2.12': @@ -8924,6 +11383,99 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@nestjs/cli@11.0.14(@types/node@22.19.3)': + dependencies: + '@angular-devkit/core': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) + '@angular-devkit/schematics-cli': 19.2.19(@types/node@22.19.3)(chokidar@4.0.3) + '@inquirer/prompts': 7.10.1(@types/node@22.19.3) + '@nestjs/schematics': 11.0.9(chokidar@4.0.3)(typescript@5.9.3) + ansis: 4.2.0 + chokidar: 4.0.3 + cli-table3: 0.6.5 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.103.0) + glob: 13.0.0 + node-emoji: 1.11.0 + ora: 5.4.1 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.9.3 + webpack: 5.103.0 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@types/node' + - esbuild + - uglify-js + - webpack-cli + + '@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + file-type: 21.2.0 + iterare: 1.2.1 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/config@4.0.2(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + dotenv: 16.4.7 + dotenv-expand: 12.0.1 + lodash: 4.17.21 + rxjs: 7.8.2 + + '@nestjs/core@11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.11)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nuxt/opencollective': 0.4.1 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.3.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11) + + '@nestjs/platform-express@11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11)': + dependencies: + '@nestjs/common': 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.11)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cors: 2.8.5 + express: 5.2.1 + multer: 2.0.2 + path-to-regexp: 8.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.9.3)': + dependencies: + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.9.3 + transitivePeerDependencies: + - chokidar + + '@nestjs/testing@11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11)(@nestjs/platform-express@11.1.11)': + dependencies: + '@nestjs/common': 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.11)(reflect-metadata@0.2.2)(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@nestjs/platform-express': 11.1.11(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.11) + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8936,6 +11488,14 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@nuxt/opencollective@0.4.1': + dependencies: + consola: 3.4.2 + + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -8990,12 +11550,14 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.28.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) rollup: 2.79.2 + optionalDependencies: + '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color @@ -9104,6 +11666,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true + '@sinclair/typebox@0.34.46': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + '@standard-schema/spec@1.0.0': {} '@stylistic/eslint-plugin@2.13.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': @@ -9129,11 +11701,48 @@ snapshots: dependencies: tslib: 2.8.1 + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3(supports-color@5.5.0) + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@trivago/prettier-plugin-sort-imports@6.0.1(@vue/compiler-sfc@3.5.23)(prettier@3.7.4)': + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + javascript-natural-sort: 0.7.1 + lodash-es: 4.17.22 + minimatch: 9.0.5 + parse-imports-exports: 0.2.4 + prettier: 3.7.4 + optionalDependencies: + '@vue/compiler-sfc': 3.5.23 + transitivePeerDependencies: + - supports-color + + '@ts-rest/core@3.52.1(@types/node@22.19.3)(zod@3.25.76)': + optionalDependencies: + '@types/node': 22.19.3 + zod: 3.25.76 + '@ts-rest/core@3.52.1(@types/node@24.10.0)(zod@3.25.76)': optionalDependencies: '@types/node': 24.10.0 zod: 3.25.76 + '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.3)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@22.19.3)(zod@3.25.76) + fastify: 4.29.1 + optionalDependencies: + zod: 3.25.76 + '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@24.10.0)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76)': dependencies: '@ts-rest/core': 3.52.1(@types/node@24.10.0)(zod@3.25.76) @@ -9141,6 +11750,13 @@ snapshots: optionalDependencies: zod: 3.25.76 + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.3)(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@3.25.76) + '@ts-rest/core': 3.52.1(@types/node@22.19.3)(zod@3.25.76) + openapi3-ts: 2.0.2 + zod: 3.25.76 + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@24.10.0)(zod@3.25.76))(zod@3.25.76)': dependencies: '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@3.25.76) @@ -9148,23 +11764,103 @@ snapshots: openapi3-ts: 2.0.2 zod: 3.25.76 + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.19.3 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.19.3 + '@types/conventional-commits-parser@5.0.2': dependencies: '@types/node': 24.10.0 + '@types/cookiejar@2.1.5': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree@0.0.39': {} '@types/estree@1.0.8': {} + '@types/express-serve-static-core@5.1.0': + dependencies: + '@types/node': 22.19.3 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 2.2.0 + + '@types/http-errors@2.0.5': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@30.0.0': + dependencies: + expect: 30.2.0 + pretty-format: 30.2.0 + '@types/js-yaml@4.0.9': {} '@types/jsdom@21.1.7': @@ -9181,22 +11877,55 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/methods@1.1.4': {} + '@types/ms@2.1.0': {} + '@types/node@22.19.3': + dependencies: + undici-types: 6.21.0 + '@types/node@24.10.0': dependencies: undici-types: 7.16.0 '@types/normalize-package-data@2.4.4': {} + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + '@types/resolve@1.20.2': {} + '@types/send@1.2.1': + dependencies: + '@types/node': 22.19.3 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.19.3 + '@types/sinonjs__fake-timers@8.1.1': optional: true '@types/sizzle@2.3.10': optional: true + '@types/stack-utils@2.0.3': {} + + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.19.3 + form-data: 4.0.4 + + '@types/supertest@6.0.3': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.9 + '@types/swagger-schema-official@2.0.25': {} '@types/tmp@0.2.6': @@ -9208,6 +11937,12 @@ snapshots: '@types/unist@3.0.3': {} + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@types/yauzl@2.10.3': dependencies: '@types/node': 24.10.0 @@ -9306,6 +12041,8 @@ snapshots: '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@unocss/astro@66.5.4(vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1))': dependencies: '@unocss/core': 66.5.4 @@ -9533,6 +12270,24 @@ snapshots: vite: 7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1) vue: 3.5.23(typescript@5.9.3) + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + std-env: 3.10.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1))': dependencies: '@ampproject/remapping': 2.3.0 @@ -9569,6 +12324,14 @@ snapshots: chai: 5.3.3 tinyrainbow: 1.2.0 + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.3)(terser@5.44.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@22.19.3)(terser@5.44.1) + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@24.10.0)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 @@ -9706,6 +12469,86 @@ snapshots: typescript: 5.9.3 vue: 3.5.23(typescript@5.9.3) + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -9713,10 +12556,23 @@ snapshots: abstract-logging@2.0.1: {} + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + acorn@8.15.0: {} agent-base@7.1.4: {} @@ -9747,6 +12603,15 @@ snapshots: dependencies: ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -9763,13 +12628,11 @@ snapshots: alien-signals@1.0.13: {} - ansi-colors@4.1.3: - optional: true + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - optional: true ansi-escapes@7.2.0: dependencies: @@ -9787,8 +12650,12 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + ansis@4.2.0: {} + any-base@1.1.0: {} anymatch@3.1.3: @@ -9796,11 +12663,19 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + append-field@1.0.0: {} + arch@2.2.0: optional: true are-docs-informative@0.0.2: {} + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} array-buffer-byte-length@1.0.2: @@ -9810,6 +12685,8 @@ snapshots: array-ify@1.0.0: {} + array-timsort@1.0.3: {} + array-union@2.1.0: {} arraybuffer.prototype.slice@1.0.4: @@ -9822,6 +12699,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asap@2.0.6: {} + asn1.js@5.4.1: dependencies: bn.js: 4.12.1 @@ -9875,6 +12754,33 @@ snapshots: transitivePeerDependencies: - debug + babel-jest@30.2.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.2.0: + dependencies: + '@types/babel__core': 7.20.5 + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: '@babel/compat-data': 7.28.5 @@ -9899,14 +12805,36 @@ snapshots: transitivePeerDependencies: - supports-color + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + + babel-preset-jest@30.2.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + balanced-match@1.0.2: {} balanced-match@2.0.0: {} - base64-js@1.5.1: - optional: true - - baseline-browser-mapping@2.8.25: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.9.11: {} @@ -9916,6 +12844,12 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blob-util@2.0.2: optional: true @@ -9924,6 +12858,20 @@ snapshots: bn.js@4.12.1: {} + body-parser@2.2.1: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3(supports-color@5.5.0) + http-errors: 2.0.0 + iconv-lite: 0.7.1 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} brace-expansion@1.1.12: @@ -9942,14 +12890,6 @@ snapshots: brorand@1.1.0: optional: true - browserslist@4.27.0: - dependencies: - baseline-browser-mapping: 2.8.25 - caniuse-lite: 1.0.30001762 - electron-to-chromium: 1.5.245 - node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.27.0) - browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.11 @@ -9958,6 +12898,14 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-crc32@0.2.13: optional: true @@ -9970,10 +12918,13 @@ snapshots: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - optional: true builtin-modules@3.3.0: {} + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + byline@5.0.0: {} bytes@3.1.2: {} @@ -10047,6 +12998,10 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + camelize-ts@3.0.0: {} caniuse-lite@1.0.30001762: {} @@ -10076,8 +13031,12 @@ snapshots: chalk@5.6.2: {} + char-regex@1.0.2: {} + character-entities@2.0.2: {} + chardet@2.1.1: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -10098,6 +13057,8 @@ snapshots: chownr@3.0.0: {} + chrome-trace-event@1.0.4: {} + ci-info@4.3.1: {} cidr-regex@3.1.1: @@ -10108,6 +13069,8 @@ snapshots: dependencies: consola: 3.4.2 + cjs-module-lexer@2.2.0: {} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -10118,12 +13081,13 @@ snapshots: cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - optional: true cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-table3@0.6.1: dependencies: string-width: 4.2.3 @@ -10131,6 +13095,12 @@ snapshots: colors: 1.4.0 optional: true + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 @@ -10142,6 +13112,8 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cli-width@4.1.0: {} + clipboard@2.0.11: dependencies: good-listener: 1.2.2 @@ -10154,6 +13126,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@1.0.4: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.3: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -10181,9 +13159,17 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + commander@6.2.1: optional: true + comment-json@4.4.1: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + comment-parser@1.4.1: {} common-tags@1.8.2: {} @@ -10193,8 +13179,17 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + component-emitter@1.3.1: {} + concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -10205,6 +13200,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.1: {} + + content-type@1.0.5: {} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 @@ -10226,9 +13225,11 @@ snapshots: cookie@0.7.2: {} + cookiejar@2.1.4: {} + core-js-compat@3.46.0: dependencies: - browserslist: 4.27.0 + browserslist: 4.28.1 core-js-compat@3.47.0: dependencies: @@ -10238,6 +13239,11 @@ snapshots: core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig-typescript-loader@6.2.0(@types/node@24.10.0)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 24.10.0 @@ -10245,6 +13251,15 @@ snapshots: jiti: 2.6.1 typescript: 5.9.3 + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -10254,6 +13269,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + create-require@1.1.1: {} + cron-validator@1.4.0: {} cross-spawn@6.0.6: @@ -10408,6 +13425,8 @@ snapshots: dependencies: character-entities: 2.0.2 + dedent@1.7.1: {} + deeks@3.1.0: {} deep-eql@5.0.2: {} @@ -10418,6 +13437,10 @@ snapshots: deepmerge@4.3.1: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -10442,12 +13465,21 @@ snapshots: destr@2.0.5: {} + detect-newline@3.1.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + diff-sequences@27.5.1: {} + diff@4.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -10478,6 +13510,10 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv-expand@12.0.1: + dependencies: + dotenv: 16.6.1 + dotenv@16.4.7: {} dotenv@16.6.1: {} @@ -10503,6 +13539,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + ee-first@1.1.1: {} + effect@3.18.4: dependencies: '@standard-schema/spec': 1.0.0 @@ -10512,8 +13550,6 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.245: {} - electron-to-chromium@1.5.267: {} elliptic@6.6.1: @@ -10527,6 +13563,8 @@ snapshots: minimalistic-crypto-utils: 1.0.1 optional: true + emittery@0.13.1: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -10535,6 +13573,8 @@ snapshots: empathic@2.0.0: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -10762,6 +13802,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -10781,6 +13823,10 @@ snapshots: '@eslint/compat': 1.4.1(eslint@9.39.1(jiti@2.6.1)) eslint: 9.39.1(jiti@2.6.1) + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + eslint-flat-config-utils@1.1.0: dependencies: pathe: 2.0.3 @@ -10909,6 +13955,16 @@ snapshots: - supports-color - typescript + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + prettier: 3.7.4 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.11 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-regexp@2.10.0(eslint@9.39.1(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -10987,6 +14043,11 @@ snapshots: '@vue/compiler-sfc': 3.5.23 eslint: 9.39.1(jiti@2.6.1) + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -11054,6 +14115,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -11062,6 +14125,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@1.0.1: {} @@ -11076,11 +14141,15 @@ snapshots: eta@3.5.0: {} + etag@1.8.1: {} + eventemitter2@6.4.7: optional: true eventemitter3@5.0.1: {} + events@3.3.0: {} + execa@4.1.0: dependencies: cross-spawn: 7.0.6 @@ -11094,6 +14163,18 @@ snapshots: strip-final-newline: 2.0.0 optional: true + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -11111,8 +14192,52 @@ snapshots: pify: 2.3.0 optional: true + exit-x@0.2.2: {} + expect-type@1.2.2: {} + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.1 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3(supports-color@5.5.0) + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.0.7: {} extend@3.0.2: {} @@ -11142,6 +14267,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -11244,6 +14371,10 @@ snapshots: dependencies: format: 0.2.2 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -11266,6 +14397,15 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-type@21.2.0: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.4 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -11274,6 +14414,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@2.1.1: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-my-way@8.2.2: dependencies: fast-deep-equal: 3.1.3 @@ -11331,6 +14482,23 @@ snapshots: forever-agent@0.6.1: {} + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.103.0): + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + chokidar: 4.0.3 + cosmiconfig: 8.3.6(typescript@5.9.3) + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.7.3 + tapable: 2.3.0 + typescript: 5.9.3 + webpack: 5.103.0 + form-data@2.3.3: dependencies: asynckit: 0.4.0 @@ -11345,12 +14513,34 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + format@0.2.2: {} + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + forwarded@0.2.0: {} fp-ts@2.16.9: {} + fresh@2.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -11358,6 +14548,8 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-monkey@1.1.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -11402,6 +14594,8 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} + get-package-type@0.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -11412,6 +14606,8 @@ snapshots: pump: 3.0.3 optional: true + get-stream@6.0.1: {} + get-stream@8.0.1: {} get-symbol-description@1.1.0: @@ -11453,6 +14649,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -11471,6 +14669,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -11515,6 +14719,8 @@ snapshots: globals@15.15.0: {} + globals@16.5.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -11558,6 +14764,15 @@ snapshots: dependencies: duplexer: 0.1.2 + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + har-schema@2.0.0: {} har-validator@5.1.5: @@ -11641,6 +14856,14 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -11673,6 +14896,8 @@ snapshots: human-signals@1.1.1: optional: true + human-signals@2.1.0: {} + human-signals@5.0.0: {} husky@9.1.7: {} @@ -11681,10 +14906,13 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.1: + dependencies: + safer-buffer: 2.1.2 + idb@7.1.1: {} - ieee754@1.2.1: - optional: true + ieee754@1.2.1: {} ignore-by-default@1.0.1: {} @@ -11699,6 +14927,11 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} @@ -11803,6 +15036,8 @@ snapshots: dependencies: get-east-asian-width: 1.4.0 + is-generator-fn@2.1.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -11821,6 +15056,8 @@ snapshots: is-path-inside: 3.0.3 optional: true + is-interactive@1.0.0: {} + is-map@2.0.3: {} is-module@1.0.0: {} @@ -11845,6 +15082,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -11887,8 +15126,7 @@ snapshots: is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: - optional: true + is-unicode-supported@0.1.0: {} is-weakmap@2.0.2: {} @@ -11917,6 +15155,16 @@ snapshots: istanbul-lib-coverage@3.2.2: {} + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -11936,6 +15184,8 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + iterare@1.2.1: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -11952,10 +15202,330 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 + javascript-natural-sort@0.7.1: {} + javascript-time-ago@2.5.12: dependencies: relative-time-format: 1.1.11 + jest-changed-files@30.2.0: + dependencies: + execa: 5.1.1 + jest-util: 30.2.0 + p-limit: 3.1.0 + + jest-circus@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.1 + is-generator-fn: 2.1.0 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + p-limit: 3.1.0 + pretty-format: 30.2.0 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + jest-util: 30.2.0 + jest-validate: 30.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.28.5 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) + chalk: 4.1.2 + ci-info: 4.3.1 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.2.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.19.3 + ts-node: 10.9.2(@types/node@22.19.3)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + + jest-docblock@30.2.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + jest-util: 30.2.0 + pretty-format: 30.2.0 + + jest-environment-node@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + + jest-haste-map@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + jest-worker: 30.2.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + pretty-format: 30.2.0 + + jest-matcher-utils@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 + + jest-message-util@30.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + jest-util: 30.2.0 + + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): + optionalDependencies: + jest-resolve: 30.2.0 + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.2.0: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.2.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 + slash: 3.0.0 + unrs-resolver: 1.11.1 + + jest-runner@30.2.0: + dependencies: + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + chalk: 4.1.2 + cjs-module-lexer: 2.2.0 + collect-v8-coverage: 1.0.3 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.2.0: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + chalk: 4.1.2 + expect: 30.2.0 + graceful-fs: 4.2.11 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 + synckit: 0.11.11 + transitivePeerDependencies: + - supports-color + + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + chalk: 4.1.2 + ci-info: 4.3.1 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-validate@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.2.0 + + jest-watcher@30.2.0: + dependencies: + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.2.0 + string-length: 4.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.19.3 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@30.2.0: + dependencies: + '@types/node': 22.19.3 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.2.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + '@jest/types': 30.2.0 + import-local: 3.2.0 + jest-cli: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + jiti@2.6.1: {} jose@6.1.0: @@ -11967,6 +15537,11 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -12053,6 +15628,8 @@ snapshots: espree: 9.6.1 semver: 7.7.3 + jsonc-parser@3.3.1: {} + jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -12193,6 +15770,8 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.2 + load-esm@1.0.3: {} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -12200,6 +15779,8 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + loader-runner@4.3.1: {} + local-pkg@0.5.1: dependencies: mlly: 1.8.0 @@ -12223,6 +15804,8 @@ snapshots: dependencies: p-locate: 6.0.0 + lodash-es@4.17.22: {} + lodash.camelcase@4.3.0: {} lodash.debounce@4.0.8: {} @@ -12231,6 +15814,8 @@ snapshots: lodash.kebabcase@4.1.1: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} lodash.mergewith@4.6.2: {} @@ -12256,7 +15841,6 @@ snapshots: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - optional: true log-update@4.0.0: dependencies: @@ -12290,6 +15874,10 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12304,6 +15892,12 @@ snapshots: dependencies: semver: 7.7.3 + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + markdown-table@3.0.4: {} math-intrinsics@1.1.0: {} @@ -12425,16 +16019,28 @@ snapshots: mdn-data@2.12.2: {} + media-typer@0.3.0: {} + + media-typer@1.1.0: {} + + memfs@3.5.3: + dependencies: + fs-monkey: 1.1.0 + memorystream@0.3.1: {} meow@12.1.1: {} meow@13.2.0: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} + methods@1.1.2: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -12640,14 +16246,21 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@2.6.0: {} + mime@3.0.0: {} - mimic-fn@2.1.0: - optional: true + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -12684,6 +16297,10 @@ snapshots: dependencies: minipass: 7.1.2 + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -12703,8 +16320,20 @@ snapshots: muggle-string@0.4.1: {} + multer@2.0.2: + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 2.0.0 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + mustache@4.2.0: {} + mute-stream@2.0.0: {} + nanoid@3.3.11: {} nanoid@5.0.9: {} @@ -12724,8 +16353,25 @@ snapshots: railroad-diagrams: 1.0.0 randexp: 0.4.6 + negotiator@1.0.0: {} + + neo-async@2.6.2: {} + + nestjs-pino@4.5.0(@nestjs/common@11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.1.0)(rxjs@7.8.2): + dependencies: + '@nestjs/common': 11.1.11(reflect-metadata@0.2.2)(rxjs@7.8.2) + pino: 10.1.0 + pino-http: 11.0.0 + rxjs: 7.8.2 + nice-try@1.0.5: {} + node-abort-controller@3.1.1: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + node-fetch-h2@2.3.0: dependencies: http2-client: 1.3.5 @@ -12736,6 +16382,8 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-int64@0.4.0: {} + node-readfiles@0.2.0: dependencies: es6-promise: 3.3.1 @@ -12779,7 +16427,6 @@ snapshots: npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - optional: true npm-run-path@5.3.0: dependencies: @@ -12835,6 +16482,8 @@ snapshots: oauth4webapi@3.8.2: optional: true + object-assign@4.1.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -12860,6 +16509,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -12867,7 +16520,6 @@ snapshots: onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - optional: true onetime@6.0.0: dependencies: @@ -12898,6 +16550,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + ospath@1.2.2: optional: true @@ -12974,6 +16638,8 @@ snapshots: dependencies: entities: 6.0.1 + parseurl@1.3.3: {} + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -13000,6 +16666,8 @@ snapshots: lru-cache: 11.2.2 minipass: 7.1.2 + path-to-regexp@8.3.0: {} + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -13027,6 +16695,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.3.1: {} @@ -13052,6 +16722,13 @@ snapshots: dependencies: split2: 4.2.0 + pino-http@11.0.0: + dependencies: + get-caller-file: 2.0.5 + pino: 10.1.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + pino-pretty@13.1.2: dependencies: colorette: 2.0.20 @@ -13070,6 +16747,20 @@ snapshots: pino-std-serializers@7.0.0: {} + pino@10.1.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pino@9.14.0: dependencies: '@pinojs/redact': 0.4.0 @@ -13084,6 +16775,12 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -13145,10 +16842,22 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.7.4: {} + pretty-bytes@5.6.0: {} pretty-bytes@6.1.1: {} + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3): dependencies: '@prisma/config': 6.19.0(magicast@0.3.5) @@ -13192,6 +16901,8 @@ snapshots: pure-rand@6.1.0: {} + pure-rand@7.0.1: {} + qified@0.5.1: dependencies: hookified: 1.12.2 @@ -13200,6 +16911,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.1: + dependencies: + side-channel: 1.1.0 + qs@6.5.3: {} quansync@0.2.11: {} @@ -13219,8 +16934,17 @@ snapshots: dependencies: safe-buffer: 5.2.1 + range-parser@1.2.1: {} + rate-limiter-flexible@4.0.1: {} + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.1 + unpipe: 1.0.0 + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -13229,6 +16953,8 @@ snapshots: re2-wasm@1.0.2: optional: true + react-is@18.3.1: {} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -13258,6 +16984,12 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -13270,6 +17002,8 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.2 + reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -13366,6 +17100,10 @@ snapshots: require-from-string@2.0.2: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -13382,7 +17120,6 @@ snapshots: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - optional: true restore-cursor@5.1.0: dependencies: @@ -13436,6 +17173,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + rrweb-cssom@0.7.1: {} rrweb-cssom@0.8.0: {} @@ -13444,10 +17191,13 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + rxjs@7.8.2: dependencies: tslib: 2.8.1 - optional: true safe-array-concat@1.1.3: dependencies: @@ -13484,6 +17234,19 @@ snapshots: dependencies: xmlchars: 2.2.0 + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + schemes@1.4.0: dependencies: extend: 3.0.2 @@ -13508,10 +17271,35 @@ snapshots: semver@7.7.3: {} + send@1.2.1: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -13615,8 +17403,7 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: - optional: true + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -13669,6 +17456,11 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -13676,6 +17468,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.4: {} + + source-map@0.7.6: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -13703,6 +17499,8 @@ snapshots: split2@4.2.0: {} + sprintf-js@1.0.3: {} + sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -13717,10 +17515,16 @@ snapshots: stable-hash-x@0.2.0: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.10.0: {} steed@1.1.3: @@ -13738,8 +17542,15 @@ snapshots: stream-buffers@3.0.3: {} + streamsearch@1.1.0: {} + string-argv@0.3.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -13824,10 +17635,11 @@ snapshots: strip-bom@3.0.0: {} + strip-bom@4.0.0: {} + strip-comments@2.0.1: {} - strip-final-newline@2.0.0: - optional: true + strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} @@ -13843,6 +17655,10 @@ snapshots: dependencies: js-tokens: 9.0.1 + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.25.0(typescript@5.9.3)): dependencies: postcss-html: 1.8.0 @@ -13913,6 +17729,28 @@ snapshots: - supports-color - typescript + superagent@10.3.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3(supports-color@5.5.0) + fast-safe-stringify: 2.1.1 + form-data: 4.0.5 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.14.1 + transitivePeerDependencies: + - supports-color + + supertest@7.2.1: + dependencies: + cookie-signature: 1.2.2 + methods: 1.1.2 + superagent: 10.3.0 + transitivePeerDependencies: + - supports-color + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -13924,7 +17762,6 @@ snapshots: supports-color@8.1.1: dependencies: has-flag: 4.0.0 - optional: true supports-hyperlinks@3.2.0: dependencies: @@ -13976,6 +17813,8 @@ snapshots: transitivePeerDependencies: - encoding + symbol-observable@4.0.0: {} + symbol-tree@3.2.4: {} synckit@0.11.11: @@ -14014,6 +17853,15 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 + terser-webpack-plugin@5.3.16(webpack@5.103.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.103.0 + terser@5.44.1: dependencies: '@jridgewell/source-map': 0.3.11 @@ -14021,6 +17869,12 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 @@ -14066,6 +17920,8 @@ snapshots: tmp@0.2.5: optional: true + tmpl@1.0.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -14074,6 +17930,12 @@ snapshots: toidentifier@1.0.1: {} + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + toml-eslint-parser@0.10.0: dependencies: eslint-visitor-keys: 3.4.3 @@ -14121,6 +17983,54 @@ snapshots: optionalDependencies: typescript: 5.9.3 + ts-jest@29.4.6(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)))(typescript@5.9.3): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 30.2.0(@types/node@22.19.3)(ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.3 + type-fest: 4.41.0 + typescript: 5.9.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) + jest-util: 30.2.0 + + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.103.0): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + micromatch: 4.0.8 + semver: 7.7.3 + source-map: 0.7.6 + typescript: 5.9.3 + webpack: 5.103.0 + + ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.19.3 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-patch@3.3.0: dependencies: chalk: 4.1.2 @@ -14130,6 +18040,19 @@ snapshots: semver: 7.7.3 strip-ansi: 6.0.1 + tsconfig-paths-webpack-plugin@4.2.0: + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + tapable: 2.3.0 + tsconfig-paths: 4.2.0 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} tsx@4.19.3: @@ -14177,17 +18100,31 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.16.0: {} type-fest@0.20.2: {} - type-fest@0.21.3: - optional: true + type-fest@0.21.3: {} type-fest@0.6.0: {} type-fest@0.8.1: {} + type-fest@4.41.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -14221,6 +18158,8 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typedarray@0.0.6: {} + typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) @@ -14243,6 +18182,15 @@ snapshots: ufo@1.6.1: {} + uglify-js@3.19.3: + optional: true + + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -14259,6 +18207,8 @@ snapshots: undefsafe@2.0.5: {} + undici-types@6.21.0: {} + undici-types@7.16.0: {} undici@7.16.0: {} @@ -14347,6 +18297,8 @@ snapshots: - postcss - supports-color + unpipe@1.0.0: {} + unplugin-auto-import@0.18.6(rollup@2.79.2): dependencies: '@antfu/utils': 0.7.10 @@ -14418,12 +18370,6 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.1.4(browserslist@4.27.0): - dependencies: - browserslist: 4.27.0 - escalade: 3.2.0 - picocolors: 1.1.1 - update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -14446,17 +18392,45 @@ snapshots: uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vary@1.1.2: {} + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 + vite-node@2.1.9(@types/node@22.19.3)(terser@5.44.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@5.5.0) + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.21(@types/node@22.19.3)(terser@5.44.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@2.1.9(@types/node@24.10.0)(terser@5.44.1): dependencies: cac: 6.7.14 @@ -14475,17 +18449,27 @@ snapshots: - supports-color - terser - vite-plugin-pwa@1.1.0(vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0): + vite-plugin-pwa@1.1.0(vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.3(supports-color@5.5.0) pretty-bytes: 6.1.1 tinyglobby: 0.2.15 vite: 7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1) - workbox-build: 7.3.0 + workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color + vite@5.4.21(@types/node@22.19.3)(terser@5.44.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.52.5 + optionalDependencies: + '@types/node': 22.19.3 + fsevents: 2.3.3 + terser: 5.44.1 + vite@5.4.21(@types/node@24.10.0)(terser@5.44.1): dependencies: esbuild: 0.21.5 @@ -14496,6 +18480,22 @@ snapshots: fsevents: 2.3.3 terser: 5.44.1 + vite@7.2.1(@types/node@22.19.3)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.3 + fsevents: 2.3.3 + jiti: 2.6.1 + terser: 5.44.1 + tsx: 4.19.3 + yaml: 2.8.1 + vite@7.2.1(@types/node@24.10.0)(jiti@2.6.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.1): dependencies: esbuild: 0.25.12 @@ -14512,12 +18512,54 @@ snapshots: tsx: 4.19.3 yaml: 2.8.1 + vitest-mock-extended@2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1)): + dependencies: + ts-essentials: 10.1.1(typescript@5.9.3) + typescript: 5.9.3 + vitest: 2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1) + vitest-mock-extended@2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1)): dependencies: ts-essentials: 10.1.1(typescript@5.9.3) typescript: 5.9.3 vitest: 2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1) + vitest@2.1.9(@types/node@22.19.3)(jsdom@25.0.1)(terser@5.44.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.3)(terser@5.44.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3(supports-color@5.5.0) + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.21(@types/node@22.19.3)(terser@5.44.1) + vite-node: 2.1.9(@types/node@22.19.3)(terser@5.44.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.3 + jsdom: 25.0.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@2.1.9(@types/node@24.10.0)(jsdom@25.0.1)(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 @@ -14617,14 +18659,63 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.5.0: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} + webpack-node-externals@3.0.0: {} + + webpack-sources@3.3.3: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.103.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(webpack@5.103.0) + watchpack: 2.5.0 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -14709,6 +18800,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + workbox-background-sync@7.3.0: dependencies: idb: 7.1.1 @@ -14718,13 +18811,13 @@ snapshots: dependencies: workbox-core: 7.3.0 - workbox-build@7.3.0: + workbox-build@7.3.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.28.5 '@babel/preset-env': 7.28.5(@babel/core@7.28.5) '@babel/runtime': 7.28.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.5)(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.2) '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) @@ -14827,7 +18920,6 @@ snapshots: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - optional: true wrap-ansi@7.0.0: dependencies: @@ -14901,10 +18993,14 @@ snapshots: fd-slicer: 1.1.0 optional: true + yn@3.1.1: {} + yocto-queue@0.1.0: {} yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.3: {} + zod-validation-error@3.5.4(zod@3.25.76): dependencies: zod: 3.25.76