From 4bec98e389639dcf8910c36044fd7308bee58a8d Mon Sep 17 00:00:00 2001 From: Krystof Date: Sat, 15 Jun 2024 22:56:51 -0600 Subject: [PATCH 1/8] feat(be): nest init --- backend-nest/.eslintrc.js | 25 + backend-nest/.gitignore | 56 + backend-nest/.prettierrc | 4 + backend-nest/README.md | 73 + backend-nest/nest-cli.json | 8 + backend-nest/package.json | 69 + backend-nest/src/app.controller.spec.ts | 22 + backend-nest/src/app.controller.ts | 12 + backend-nest/src/app.module.ts | 10 + backend-nest/src/app.service.ts | 8 + backend-nest/src/main.ts | 8 + backend-nest/test/app.e2e-spec.ts | 24 + backend-nest/test/jest-e2e.json | 9 + backend-nest/tsconfig.build.json | 4 + backend-nest/tsconfig.json | 21 + pnpm-lock.yaml | 1807 ++++++++++++++++++++++- pnpm-workspace.yaml | 1 + 17 files changed, 2160 insertions(+), 1 deletion(-) create mode 100644 backend-nest/.eslintrc.js create mode 100644 backend-nest/.gitignore create mode 100644 backend-nest/.prettierrc create mode 100644 backend-nest/README.md create mode 100644 backend-nest/nest-cli.json create mode 100644 backend-nest/package.json create mode 100644 backend-nest/src/app.controller.spec.ts create mode 100644 backend-nest/src/app.controller.ts create mode 100644 backend-nest/src/app.module.ts create mode 100644 backend-nest/src/app.service.ts create mode 100644 backend-nest/src/main.ts create mode 100644 backend-nest/test/app.e2e-spec.ts create mode 100644 backend-nest/test/jest-e2e.json create mode 100644 backend-nest/tsconfig.build.json create mode 100644 backend-nest/tsconfig.json diff --git a/backend-nest/.eslintrc.js b/backend-nest/.eslintrc.js new file mode 100644 index 00000000..259de13c --- /dev/null +++ b/backend-nest/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/backend-nest/.gitignore b/backend-nest/.gitignore new file mode 100644 index 00000000..4b56acfb --- /dev/null +++ b/backend-nest/.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/backend-nest/.prettierrc b/backend-nest/.prettierrc new file mode 100644 index 00000000..dcb72794 --- /dev/null +++ b/backend-nest/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/backend-nest/README.md b/backend-nest/README.md new file mode 100644 index 00000000..f5aa86c5 --- /dev/null +++ b/backend-nest/README.md @@ -0,0 +1,73 @@ +

+ Nest Logo +

+ +[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 +[circleci-url]: https://circleci.com/gh/nestjs/nest + +

A progressive Node.js framework for building efficient and scalable server-side applications.

+

+NPM Version +Package License +NPM Downloads +CircleCI +Coverage +Discord +Backers on Open Collective +Sponsors on Open Collective + + Support us + +

+ + +## Description + +[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. + +## Installation + +```bash +$ pnpm install +``` + +## Running the app + +```bash +# development +$ pnpm run start + +# watch mode +$ pnpm run start:dev + +# production mode +$ pnpm run start:prod +``` + +## Test + +```bash +# unit tests +$ pnpm run test + +# e2e tests +$ pnpm run test:e2e + +# test coverage +$ pnpm run test:cov +``` + +## Support + +Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). + +## Stay in touch + +- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) +- Website - [https://nestjs.com](https://nestjs.com/) +- Twitter - [@nestframework](https://twitter.com/nestframework) + +## License + +Nest is [MIT licensed](LICENSE). diff --git a/backend-nest/nest-cli.json b/backend-nest/nest-cli.json new file mode 100644 index 00000000..f9aa683b --- /dev/null +++ b/backend-nest/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/backend-nest/package.json b/backend-nest/package.json new file mode 100644 index 00000000..a9fe0e26 --- /dev/null +++ b/backend-nest/package.json @@ -0,0 +1,69 @@ +{ + "name": "backend-nest", + "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", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "reflect-metadata": "^0.2.0", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@nestjs/cli": "^10.0.0", + "@nestjs/schematics": "^10.0.0", + "@nestjs/testing": "^10.0.0", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@types/supertest": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.42.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "jest": "^29.5.0", + "prettier": "^3.0.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.3" + }, + "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/backend-nest/src/app.controller.spec.ts b/backend-nest/src/app.controller.spec.ts new file mode 100644 index 00000000..d22f3890 --- /dev/null +++ b/backend-nest/src/app.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +describe('AppController', () => { + let appController: AppController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/backend-nest/src/app.controller.ts b/backend-nest/src/app.controller.ts new file mode 100644 index 00000000..cce879ee --- /dev/null +++ b/backend-nest/src/app.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + getHello(): string { + return this.appService.getHello(); + } +} diff --git a/backend-nest/src/app.module.ts b/backend-nest/src/app.module.ts new file mode 100644 index 00000000..86628031 --- /dev/null +++ b/backend-nest/src/app.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +@Module({ + imports: [], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} diff --git a/backend-nest/src/app.service.ts b/backend-nest/src/app.service.ts new file mode 100644 index 00000000..927d7cca --- /dev/null +++ b/backend-nest/src/app.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class AppService { + getHello(): string { + return 'Hello World!'; + } +} diff --git a/backend-nest/src/main.ts b/backend-nest/src/main.ts new file mode 100644 index 00000000..13cad38c --- /dev/null +++ b/backend-nest/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + await app.listen(3000); +} +bootstrap(); diff --git a/backend-nest/test/app.e2e-spec.ts b/backend-nest/test/app.e2e-spec.ts new file mode 100644 index 00000000..50cda623 --- /dev/null +++ b/backend-nest/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/backend-nest/test/jest-e2e.json b/backend-nest/test/jest-e2e.json new file mode 100644 index 00000000..e9d912f3 --- /dev/null +++ b/backend-nest/test/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/backend-nest/tsconfig.build.json b/backend-nest/tsconfig.build.json new file mode 100644 index 00000000..64f86c6b --- /dev/null +++ b/backend-nest/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/backend-nest/tsconfig.json b/backend-nest/tsconfig.json new file mode 100644 index 00000000..95f5641c --- /dev/null +++ b/backend-nest/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c46774a..d775ced0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,6 +134,88 @@ importers: specifier: ^5 version: 5.4.5 + backend-nest: + dependencies: + '@nestjs/common': + specifier: ^10.0.0 + version: 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^10.0.0 + version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^10.0.0 + version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9) + reflect-metadata: + specifier: ^0.2.0 + version: 0.2.2 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + devDependencies: + '@nestjs/cli': + specifier: ^10.0.0 + version: 10.3.2 + '@nestjs/schematics': + specifier: ^10.0.0 + version: 10.1.1(chokidar@3.6.0)(typescript@5.4.5) + '@nestjs/testing': + specifier: ^10.0.0 + version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9)) + '@types/express': + specifier: ^4.17.17 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.2 + version: 29.5.12 + '@types/node': + specifier: ^20.3.1 + version: 20.12.13 + '@types/supertest': + specifier: ^6.0.0 + version: 6.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.42.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + jest: + specifier: ^29.5.0 + version: 29.7.0(@types/node@20.12.13)(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)) + prettier: + specifier: ^3.0.0 + version: 3.2.5 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: ^6.3.3 + version: 6.3.4 + ts-jest: + specifier: ^29.1.0 + version: 29.1.4(@babel/core@7.24.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.6))(jest@29.7.0(@types/node@20.12.13)(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)))(typescript@5.4.5) + ts-loader: + specifier: ^9.4.3 + version: 9.5.1(typescript@5.4.5)(webpack@5.90.1) + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@20.12.13)(typescript@5.4.5) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.1.3 + version: 5.4.5 + packages/config: {} packages/data: {} @@ -164,6 +246,24 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@angular-devkit/core@17.1.2': + resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics-cli@17.1.2': + resolution: {integrity: sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/schematics@17.1.2': + resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@babel/code-frame@7.24.6': resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} @@ -338,6 +438,10 @@ packages: '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -468,6 +572,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -477,6 +584,14 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -555,6 +670,73 @@ packages: resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} engines: {node: '>= 10'} + '@nestjs/cli@10.3.2': + resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} + engines: {node: '>= 16.14'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 || ^0.3.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@10.3.9': + resolution: {integrity: sha512-JAQONPagMa+sy/fcIqh/Hn3rkYQ9pQM51vXCFNOM5ujefxUVqn3gwFRMN8Y1+MxdUHipV+8daEj2jEm0IqJzOA==} + peerDependencies: + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/core@10.3.9': + resolution: {integrity: sha512-NzZUfWAmaf8sqhhwoRA+CuqxQe+P4Rz8PZp5U7CdCbjyeB9ZVGcBkihcJC9wMdtiOWHRndB2J8zRfs5w06jK3w==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/platform-express@10.3.9': + resolution: {integrity: sha512-si/UzobP6YUtYtCT1cSyQYHHzU3yseqYT6l7OHSMVvfG1+TqxaAqI6nmrix02LO+l1YntHRXEs3p+v9a7EfrSQ==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + + '@nestjs/schematics@10.1.1': + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/testing@10.3.9': + resolution: {integrity: sha512-z24SdpZIRtYyM5s2vnu7rbBosXJY/KcAP7oJlwgFa/h/z/wg8gzyoKy5lhibH//OZNO+pYKajV5wczxuy5WeAg==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@next/env@14.2.2': resolution: {integrity: sha512-sk72qRfM1Q90XZWYRoJKu/UWlTgihrASiYw/scb15u+tyzcze3bOuJ/UV6TBOQEeUaxOkRqGeuGUdiiuxc5oqw==} @@ -638,10 +820,19 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -745,6 +936,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/d3-scale-chromatic@3.0.3': resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} @@ -757,6 +951,12 @@ packages: '@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@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -796,6 +996,9 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -811,6 +1014,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -835,6 +1041,9 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -844,6 +1053,12 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/superagent@8.1.7': + resolution: {integrity: sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==} + + '@types/supertest@6.0.2': + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -859,6 +1074,27 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@7.2.0': resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -869,14 +1105,41 @@ packages: typescript: optional: true + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@7.2.0': resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@7.2.0': resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@7.2.0': resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -886,6 +1149,16 @@ packages: typescript: optional: true + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@7.2.0': resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -893,10 +1166,66 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -911,9 +1240,29 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -952,6 +1301,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==} @@ -984,6 +1336,9 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + 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'} @@ -1014,6 +1369,9 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -1021,6 +1379,9 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1063,10 +1424,16 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -1096,6 +1463,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bun-types@1.1.9: resolution: {integrity: sha512-3YuLiH4Ne/ghk7K6mHiaqCqKOMrtB0Z5p1WAskHSVgi0iMZgsARV4yGkbfi565YsStvUq6GXTWB3ga7M8cznkA==} @@ -1145,6 +1515,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + 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'} @@ -1161,10 +1535,17 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1172,6 +1553,26 @@ packages: cjs-module-lexer@1.3.1: resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -1183,6 +1584,10 @@ 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'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1211,9 +1616,16 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + 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'} @@ -1226,12 +1638,26 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + compute-scroll-into-view@3.1.0: resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -1250,9 +1676,28 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + 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'} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + 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 + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1488,6 +1933,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'} @@ -1499,6 +1947,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1518,6 +1970,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1608,6 +2063,9 @@ packages: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -1655,6 +2113,12 @@ packages: typescript: optional: true + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -1702,6 +2166,20 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} @@ -1714,6 +2192,10 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + 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} @@ -1744,6 +2226,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'} @@ -1778,6 +2264,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@0.8.0: resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} engines: {node: '>=4'} @@ -1805,9 +2295,16 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + 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.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1818,12 +2315,23 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1864,6 +2372,20 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + fork-ts-checker-webpack-plugin@9.0.2: + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1872,6 +2394,13 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1942,6 +2471,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.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} @@ -1956,6 +2488,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -2000,6 +2536,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -2059,6 +2599,10 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2081,6 +2625,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -2111,6 +2658,14 @@ packages: inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -2122,6 +2677,10 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} @@ -2209,6 +2768,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + 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'} @@ -2279,6 +2842,14 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -2290,6 +2861,9 @@ packages: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2320,6 +2894,10 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -2446,6 +3024,10 @@ packages: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2489,6 +3071,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2501,9 +3086,15 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -2559,6 +3150,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2579,6 +3174,13 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -2596,6 +3198,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2677,6 +3283,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -2834,6 +3444,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2841,6 +3456,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2852,10 +3471,18 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2869,7 +3496,18 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: + multer@1.4.4-lts.1: + resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} + engines: {node: '>= 6.0.0'} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoid@3.3.7: @@ -2884,6 +3522,9 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-mdx-remote@4.4.1: resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} engines: {node: '>=14', npm: '>=7'} @@ -2939,6 +3580,21 @@ packages: react: '>=16.13.1' react-dom: '>=16.13.1' + 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@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -3023,6 +3679,14 @@ 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'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -3100,6 +3764,9 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3114,6 +3781,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -3126,6 +3797,10 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -3179,6 +3854,10 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + prettier@3.2.5: resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} @@ -3188,6 +3867,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3229,6 +3911,9 @@ packages: resolution: {integrity: sha512-b0Zcf09AhqKS83btmUeYBS8tFK7XL2e3RvLmZcm0sTdF1/UUlHSsjXdCcWNxe7yfmAlPve5ym0DmKGtTzP6kVQ==} engines: {node: '>=14.18.0'} + 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'} @@ -3255,6 +3940,13 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + 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'} @@ -3262,9 +3954,16 @@ packages: reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + redis@4.6.14: resolution: {integrity: sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -3309,10 +4008,18 @@ packages: remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + 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'} @@ -3340,6 +4047,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3349,15 +4060,31 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -3366,6 +4093,9 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3379,6 +4109,10 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -3399,6 +4133,9 @@ packages: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -3430,6 +4167,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + shiki@0.14.7: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} @@ -3466,6 +4208,9 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3519,6 +4264,12 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -3578,6 +4329,15 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + + supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} + engines: {node: '>=6.4.0'} + supports-color@4.5.0: resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} engines: {node: '>=4'} @@ -3598,6 +4358,14 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + tailwindcss@3.4.3: resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} @@ -3607,6 +4375,27 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + 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.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3621,6 +4410,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + title@3.5.3: resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} hasBin: true @@ -3629,6 +4421,10 @@ packages: resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} engines: {node: '>=0.10.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3648,6 +4444,13 @@ packages: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -3691,6 +4494,13 @@ packages: esbuild: optional: true + ts-loader@9.5.1: + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -3705,9 +4515,17 @@ packages: '@swc/wasm': optional: true + tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + engines: {node: '>=10.13.0'} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -3785,11 +4603,23 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -3856,6 +4686,10 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -3923,12 +4757,43 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} web-worker@1.3.0: resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -3957,6 +4822,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3972,6 +4841,10 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4021,6 +4894,38 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@angular-devkit/core@17.1.2(chokidar@3.6.0)': + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + jsonc-parser: 3.2.0 + picomatch: 3.0.1 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 + + '@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + ansi-colors: 4.1.3 + inquirer: 9.2.12 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/schematics@17.1.2(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + jsonc-parser: 3.2.0 + magic-string: 0.30.5 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 @@ -4224,6 +5129,9 @@ snapshots: '@braintree/sanitize-url@6.0.4': {} + '@colors/colors@1.5.0': + optional: true + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -4461,6 +5369,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.25': @@ -4473,6 +5386,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@ljharb/through@2.3.13': + dependencies: + call-bind: 1.0.7 + + '@lukeed/csprng@1.1.0': {} + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -4548,6 +5467,101 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 + '@nestjs/cli@10.3.2': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) + '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.3 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1) + glob: 10.3.10 + inquirer: 8.2.6 + node-emoji: 1.11.0 + ora: 5.4.1 + rimraf: 4.4.1 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.1.0 + typescript: 5.3.3 + webpack: 5.90.1 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - esbuild + - uglify-js + - webpack-cli + + '@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1)': + dependencies: + iterare: 1.2.1 + reflect-metadata: 0.2.2 + rxjs: 7.8.1 + tslib: 2.6.2 + uid: 2.0.2 + + '@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1)': + dependencies: + '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 3.2.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.1 + tslib: 2.6.2 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9) + transitivePeerDependencies: + - encoding + + '@nestjs/platform-express@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9)': + dependencies: + '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1) + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.19.2 + multer: 1.4.4-lts.1 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + comment-json: 4.2.3 + jsonc-parser: 3.2.1 + pluralize: 8.0.0 + typescript: 5.3.3 + transitivePeerDependencies: + - chokidar + + '@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.4.5)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + comment-json: 4.2.3 + jsonc-parser: 3.2.1 + pluralize: 8.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - chokidar + + '@nestjs/testing@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9))': + dependencies: + '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1) + tslib: 2.6.2 + optionalDependencies: + '@nestjs/platform-express': 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9) + '@next/env@14.2.2': {} '@next/eslint-plugin-next@14.2.2': @@ -4599,9 +5613,19 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nuxtjs/opencollective@0.3.2': + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@popperjs/core@2.11.8': {} '@redis/bloom@1.2.0(@redis/client@1.5.16)': @@ -4716,6 +5740,8 @@ snapshots: dependencies: '@types/node': 20.12.13 + '@types/cookiejar@2.1.5': {} + '@types/d3-scale-chromatic@3.0.3': {} '@types/d3-scale@4.0.8': @@ -4728,6 +5754,16 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.5 @@ -4779,6 +5815,8 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/katex@0.16.7': {} @@ -4793,6 +5831,8 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/methods@1.1.4': {} + '@types/mime@1.3.5': {} '@types/ms@0.7.34': {} @@ -4816,6 +5856,8 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/semver@7.5.8': {} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -4829,6 +5871,17 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/superagent@8.1.7': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 20.12.13 + + '@types/supertest@6.0.2': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.7 + '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} @@ -4843,6 +5896,39 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 @@ -4856,13 +5942,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@7.2.0': {} + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.2.0 @@ -4878,6 +5998,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 @@ -4885,11 +6024,95 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-import-assertions@1.9.0(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -4898,6 +6121,14 @@ snapshots: acorn@8.11.3: {} + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: + ajv: 8.12.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4905,6 +6136,15 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -4934,6 +6174,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + append-field@1.0.0: {} + arch@2.2.0: {} arg@1.0.0: {} @@ -4968,6 +6210,8 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 + array-timsort@1.0.3: {} + array-union@2.1.0: {} array.prototype.findlast@1.2.5: @@ -5028,10 +6272,14 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + asap@2.0.6: {} + ast-types-flow@0.0.8: {} astring@1.8.6: {} + asynckit@0.4.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -5098,8 +6346,16 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@1.20.2: dependencies: bytes: 3.1.2 @@ -5147,6 +6403,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bun-types@1.1.9: dependencies: '@types/node': 20.12.13 @@ -5195,6 +6456,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.3.0: {} + char-regex@1.0.2: {} character-entities-html4@2.1.0: {} @@ -5205,6 +6468,8 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5217,10 +6482,28 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chrome-trace-event@1.0.4: {} + ci-info@3.9.0: {} cjs-module-lexer@1.3.1: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-table3@0.6.3: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-width@3.0.0: {} + + cli-width@4.1.0: {} + client-only@0.0.1: {} clipboardy@1.2.2: @@ -5234,6 +6517,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@1.0.4: {} + clsx@2.1.1: {} cluster-key-slot@1.1.2: {} @@ -5254,18 +6539,43 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} + commander@4.1.1: {} commander@7.2.0: {} commander@8.3.0: {} + comment-json@4.2.3: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + + component-emitter@1.3.1: {} + compute-scroll-into-view@3.1.0: {} concat-map@0.0.1: {} + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + consola@2.15.3: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -5278,10 +6588,28 @@ snapshots: cookie@0.6.0: {} + cookiejar@2.1.4: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cose-base@1.0.3: dependencies: layout-base: 1.0.2 + cosmiconfig@8.3.6(typescript@5.3.3): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.3.3 + create-jest@29.7.0(@types/node@20.12.13)(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 @@ -5540,6 +6868,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.0 @@ -5556,6 +6888,8 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -5568,6 +6902,11 @@ snapshots: dependencies: dequal: 2.0.3 + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -5693,6 +7032,8 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + es-module-lexer@1.5.3: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -5743,6 +7084,10 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -5826,6 +7171,16 @@ snapshots: object.entries: 1.1.8 object.fromentries: 2.0.8 + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + dependencies: + eslint: 8.57.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -5852,6 +7207,11 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.11 + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -5918,6 +7278,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: @@ -5955,6 +7317,8 @@ snapshots: etag@1.8.1: {} + events@3.3.0: {} + execa@0.8.0: dependencies: cross-spawn: 5.1.0 @@ -6029,8 +7393,16 @@ snapshots: extend@3.0.2: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6043,6 +7415,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6051,6 +7425,15 @@ snapshots: dependencies: bser: 2.1.1 + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -6102,10 +7485,48 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): + dependencies: + '@babel/code-frame': 7.24.6 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 8.3.6(typescript@5.3.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.6.2 + tapable: 2.2.1 + typescript: 5.3.3 + webpack: 5.90.1 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formidable@2.1.2: + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.11.0 + forwarded@0.2.0: {} fresh@0.5.2: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-monkey@1.0.6: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -6171,6 +7592,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.3.10: dependencies: foreground-child: 3.1.1 @@ -6196,6 +7619,13 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 + globals@11.12.0: {} globals@13.24.0: @@ -6239,6 +7669,8 @@ snapshots: has-flag@4.0.0: {} + has-own-prop@2.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 @@ -6365,6 +7797,8 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + hexoid@1.0.0: {} + html-escaper@2.0.2: {} html-void-elements@3.0.0: {} @@ -6387,6 +7821,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} ignore@5.3.1: {} @@ -6412,6 +7848,42 @@ snapshots: inline-style-parser@0.1.1: {} + inquirer@8.2.6: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + + inquirer@9.2.12: + dependencies: + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -6422,6 +7894,8 @@ snapshots: internmap@2.0.3: {} + interpret@1.4.0: {} + intersection-observer@0.12.2: {} ipaddr.js@1.9.1: {} @@ -6497,6 +7971,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@1.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -6550,6 +8026,10 @@ snapshots: dependencies: which-typed-array: 1.1.15 + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -6561,6 +8041,8 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -6606,6 +8088,8 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + iterare@1.2.1: {} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -6916,6 +8400,12 @@ snapshots: jest-util: 29.7.0 string-length: 4.0.2 + jest-worker@27.5.1: + dependencies: + '@types/node': 20.12.13 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@29.7.0: dependencies: '@types/node': 20.12.13 @@ -6956,6 +8446,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -6964,8 +8456,16 @@ snapshots: json5@2.2.3: {} + jsonc-parser@3.2.0: {} + jsonc-parser@3.2.1: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -7010,6 +8510,8 @@ snapshots: lines-and-columns@1.2.4: {} + loader-runner@4.3.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -7026,6 +8528,13 @@ snapshots: lodash.merge@4.6.2: {} + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -7043,6 +8552,10 @@ snapshots: dependencies: yallist: 3.1.1 + magic-string@0.30.5: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + make-dir@4.0.0: dependencies: semver: 7.6.2 @@ -7234,6 +8747,10 @@ snapshots: media-typer@0.3.0: {} + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + merge-descriptors@1.0.1: {} merge-stream@2.0.0: {} @@ -7571,12 +9088,18 @@ snapshots: mime@1.6.0: {} + mime@2.6.0: {} + mimic-fn@2.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@8.0.4: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -7587,8 +9110,14 @@ snapshots: minimist@1.2.8: {} + minipass@4.2.8: {} + minipass@7.1.2: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mri@1.2.0: {} ms@2.0.0: {} @@ -7597,6 +9126,20 @@ snapshots: ms@2.1.3: {} + multer@1.4.4-lts.1: + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + + mute-stream@0.0.8: {} + + mute-stream@1.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -7609,6 +9152,8 @@ snapshots: negotiator@0.6.3: {} + neo-async@2.6.2: {} + next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@mdx-js/mdx': 2.3.0 @@ -7711,6 +9256,16 @@ snapshots: transitivePeerDependencies: - supports-color + node-abort-controller@3.1.1: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-int64@0.4.0: {} node-releases@2.0.14: {} @@ -7809,6 +9364,20 @@ 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 + + os-tmpdir@1.0.2: {} + p-finally@1.0.0: {} p-limit@2.3.0: @@ -7884,6 +9453,8 @@ snapshots: path-to-regexp@0.1.7: {} + path-to-regexp@3.2.0: {} + path-type@4.0.0: {} periscopic@3.1.0: @@ -7896,6 +9467,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@3.0.1: {} + pify@2.3.0: {} pirates@4.0.6: {} @@ -7904,6 +9477,8 @@ snapshots: dependencies: find-up: 4.1.0 + pluralize@8.0.0: {} + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.4.38): @@ -7952,6 +9527,10 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier@3.2.5: {} pretty-format@29.7.0: @@ -7960,6 +9539,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + process-nextick-args@2.0.1: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -7996,6 +9577,10 @@ snapshots: radash@12.1.0: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + range-parser@1.2.1: {} raw-body@2.5.2: @@ -8023,12 +9608,32 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 reading-time@1.5.0: {} + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + redis@4.6.14: dependencies: '@redis/bloom': 1.2.0(@redis/client@1.5.16) @@ -8038,6 +9643,8 @@ snapshots: '@redis/search': 1.1.6(@redis/client@1.5.16) '@redis/time-series': 1.0.5(@redis/client@1.5.16) + reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 @@ -8127,8 +9734,12 @@ snapshots: remove-accents@0.5.0: {} + repeat-string@1.6.1: {} + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -8153,20 +9764,37 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + reusify@1.0.4: {} rimraf@3.0.2: dependencies: glob: 7.2.3 + rimraf@4.4.1: + dependencies: + glob: 9.3.5 + robust-predicates@3.0.2: {} + run-async@2.4.1: {} + + run-async@3.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 rw@1.3.3: {} + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -8178,6 +9806,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.3: @@ -8192,6 +9822,12 @@ snapshots: dependencies: loose-envify: 1.4.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) + scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.0 @@ -8223,6 +9859,10 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 @@ -8262,6 +9902,12 @@ snapshots: shebang-regex@3.0.0: {} + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + shiki@0.14.7: dependencies: ansi-sequence-parser: 1.1.1 @@ -8299,6 +9945,11 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.6.1: {} source-map@0.7.4: {} @@ -8366,6 +10017,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -8412,6 +10071,28 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + superagent@8.1.2: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.4(supports-color@5.5.0) + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.1.2 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.11.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + supertest@6.3.4: + dependencies: + methods: 1.1.2 + superagent: 8.1.2 + transitivePeerDependencies: + - supports-color + supports-color@4.5.0: dependencies: has-flag: 2.0.0 @@ -8430,6 +10111,13 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-observable@4.0.0: {} + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -8459,6 +10147,22 @@ snapshots: tapable@2.2.1: {} + terser-webpack-plugin@5.3.10(webpack@5.90.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.90.1 + + terser@5.31.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -8475,6 +10179,8 @@ snapshots: dependencies: any-promise: 1.3.0 + through@2.3.8: {} + title@3.5.3: dependencies: arg: 1.0.0 @@ -8484,6 +10190,10 @@ snapshots: titleize@1.0.0: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + tmpl@1.0.5: {} to-fast-properties@2.0.0: {} @@ -8496,6 +10206,10 @@ snapshots: touch@3.1.1: {} + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -8526,6 +10240,16 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.6) + ts-loader@9.5.1(typescript@5.4.5)(webpack@5.90.1): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.16.1 + micromatch: 4.0.7 + semver: 7.6.2 + source-map: 0.7.4 + typescript: 5.4.5 + webpack: 5.90.1 + ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -8544,6 +10268,12 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tsconfig-paths-webpack-plugin@4.1.0: + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.16.1 + tsconfig-paths: 4.2.0 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -8551,6 +10281,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.6.2: {} turbo-darwin-64@1.13.3: @@ -8629,8 +10365,16 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typedarray@0.0.6: {} + + typescript@5.3.3: {} + typescript@5.4.5: {} + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -8736,6 +10480,8 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + universalify@2.0.1: {} + unpipe@1.0.0: {} update-browserslist-db@1.0.16(browserslist@4.23.0): @@ -8813,10 +10559,61 @@ snapshots: dependencies: makeerror: 1.0.12 + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} web-worker@1.3.0: {} + webidl-conversions@3.0.1: {} + + webpack-node-externals@3.0.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.90.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.3 + 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.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.90.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -8865,6 +10662,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -8884,6 +10687,8 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@2.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4af31626..6b013120 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - "apps/*" + - "backend-nest" - "packages/*" From 3c2c7b0b78da3e3e6e9c1e3ad8fd45ba7da998c4 Mon Sep 17 00:00:00 2001 From: Krystof Date: Sat, 15 Jun 2024 23:01:47 -0600 Subject: [PATCH 2/8] chore: move docs --- {apps/docs => docs}/.eslintrc.json | 0 {apps/docs => docs}/README.md | 0 {apps/docs => docs}/next.config.mjs | 0 {apps/docs => docs}/package.json | 0 {apps/docs => docs}/postcss.config.mjs | 0 {apps/docs => docs}/public/download-on-appstore.svg | 0 {apps/docs => docs}/public/favicon.ico | Bin {apps/docs => docs}/public/metro-now-watch.png | Bin {apps/docs => docs}/src/app/globals.css | 0 {apps/docs => docs}/src/app/layout.tsx | 0 {apps/docs => docs}/src/app/not-found.tsx | 0 {apps/docs => docs}/src/app/page.tsx | 0 {apps/docs => docs}/src/app/robots.ts | 0 {apps/docs => docs}/src/app/sitemap.ts | 0 {apps/docs => docs}/src/components/Button.tsx | 0 {apps/docs => docs}/src/pages/_meta.json | 0 {apps/docs => docs}/src/pages/docs/_meta.json | 0 {apps/docs => docs}/src/pages/docs/backend.mdx | 0 {apps/docs => docs}/src/pages/docs/index.mdx | 0 .../docs => docs}/src/pages/docs/privacy-policy.mdx | 0 {apps/docs => docs}/src/pages/docs/rest-api.mdx | 0 .../src/pages/docs/terms-and-conditions.mdx | 0 {apps/docs => docs}/src/utils/const.ts | 0 {apps/docs => docs}/tailwind.config.ts | 0 {apps/docs => docs}/theme.config.tsx | 0 {apps/docs => docs}/tsconfig.json | 0 pnpm-workspace.yaml | 1 + 27 files changed, 1 insertion(+) rename {apps/docs => docs}/.eslintrc.json (100%) rename {apps/docs => docs}/README.md (100%) rename {apps/docs => docs}/next.config.mjs (100%) rename {apps/docs => docs}/package.json (100%) rename {apps/docs => docs}/postcss.config.mjs (100%) rename {apps/docs => docs}/public/download-on-appstore.svg (100%) rename {apps/docs => docs}/public/favicon.ico (100%) rename {apps/docs => docs}/public/metro-now-watch.png (100%) rename {apps/docs => docs}/src/app/globals.css (100%) rename {apps/docs => docs}/src/app/layout.tsx (100%) rename {apps/docs => docs}/src/app/not-found.tsx (100%) rename {apps/docs => docs}/src/app/page.tsx (100%) rename {apps/docs => docs}/src/app/robots.ts (100%) rename {apps/docs => docs}/src/app/sitemap.ts (100%) rename {apps/docs => docs}/src/components/Button.tsx (100%) rename {apps/docs => docs}/src/pages/_meta.json (100%) rename {apps/docs => docs}/src/pages/docs/_meta.json (100%) rename {apps/docs => docs}/src/pages/docs/backend.mdx (100%) rename {apps/docs => docs}/src/pages/docs/index.mdx (100%) rename {apps/docs => docs}/src/pages/docs/privacy-policy.mdx (100%) rename {apps/docs => docs}/src/pages/docs/rest-api.mdx (100%) rename {apps/docs => docs}/src/pages/docs/terms-and-conditions.mdx (100%) rename {apps/docs => docs}/src/utils/const.ts (100%) rename {apps/docs => docs}/tailwind.config.ts (100%) rename {apps/docs => docs}/theme.config.tsx (100%) rename {apps/docs => docs}/tsconfig.json (100%) diff --git a/apps/docs/.eslintrc.json b/docs/.eslintrc.json similarity index 100% rename from apps/docs/.eslintrc.json rename to docs/.eslintrc.json diff --git a/apps/docs/README.md b/docs/README.md similarity index 100% rename from apps/docs/README.md rename to docs/README.md diff --git a/apps/docs/next.config.mjs b/docs/next.config.mjs similarity index 100% rename from apps/docs/next.config.mjs rename to docs/next.config.mjs diff --git a/apps/docs/package.json b/docs/package.json similarity index 100% rename from apps/docs/package.json rename to docs/package.json diff --git a/apps/docs/postcss.config.mjs b/docs/postcss.config.mjs similarity index 100% rename from apps/docs/postcss.config.mjs rename to docs/postcss.config.mjs diff --git a/apps/docs/public/download-on-appstore.svg b/docs/public/download-on-appstore.svg similarity index 100% rename from apps/docs/public/download-on-appstore.svg rename to docs/public/download-on-appstore.svg diff --git a/apps/docs/public/favicon.ico b/docs/public/favicon.ico similarity index 100% rename from apps/docs/public/favicon.ico rename to docs/public/favicon.ico diff --git a/apps/docs/public/metro-now-watch.png b/docs/public/metro-now-watch.png similarity index 100% rename from apps/docs/public/metro-now-watch.png rename to docs/public/metro-now-watch.png diff --git a/apps/docs/src/app/globals.css b/docs/src/app/globals.css similarity index 100% rename from apps/docs/src/app/globals.css rename to docs/src/app/globals.css diff --git a/apps/docs/src/app/layout.tsx b/docs/src/app/layout.tsx similarity index 100% rename from apps/docs/src/app/layout.tsx rename to docs/src/app/layout.tsx diff --git a/apps/docs/src/app/not-found.tsx b/docs/src/app/not-found.tsx similarity index 100% rename from apps/docs/src/app/not-found.tsx rename to docs/src/app/not-found.tsx diff --git a/apps/docs/src/app/page.tsx b/docs/src/app/page.tsx similarity index 100% rename from apps/docs/src/app/page.tsx rename to docs/src/app/page.tsx diff --git a/apps/docs/src/app/robots.ts b/docs/src/app/robots.ts similarity index 100% rename from apps/docs/src/app/robots.ts rename to docs/src/app/robots.ts diff --git a/apps/docs/src/app/sitemap.ts b/docs/src/app/sitemap.ts similarity index 100% rename from apps/docs/src/app/sitemap.ts rename to docs/src/app/sitemap.ts diff --git a/apps/docs/src/components/Button.tsx b/docs/src/components/Button.tsx similarity index 100% rename from apps/docs/src/components/Button.tsx rename to docs/src/components/Button.tsx diff --git a/apps/docs/src/pages/_meta.json b/docs/src/pages/_meta.json similarity index 100% rename from apps/docs/src/pages/_meta.json rename to docs/src/pages/_meta.json diff --git a/apps/docs/src/pages/docs/_meta.json b/docs/src/pages/docs/_meta.json similarity index 100% rename from apps/docs/src/pages/docs/_meta.json rename to docs/src/pages/docs/_meta.json diff --git a/apps/docs/src/pages/docs/backend.mdx b/docs/src/pages/docs/backend.mdx similarity index 100% rename from apps/docs/src/pages/docs/backend.mdx rename to docs/src/pages/docs/backend.mdx diff --git a/apps/docs/src/pages/docs/index.mdx b/docs/src/pages/docs/index.mdx similarity index 100% rename from apps/docs/src/pages/docs/index.mdx rename to docs/src/pages/docs/index.mdx diff --git a/apps/docs/src/pages/docs/privacy-policy.mdx b/docs/src/pages/docs/privacy-policy.mdx similarity index 100% rename from apps/docs/src/pages/docs/privacy-policy.mdx rename to docs/src/pages/docs/privacy-policy.mdx diff --git a/apps/docs/src/pages/docs/rest-api.mdx b/docs/src/pages/docs/rest-api.mdx similarity index 100% rename from apps/docs/src/pages/docs/rest-api.mdx rename to docs/src/pages/docs/rest-api.mdx diff --git a/apps/docs/src/pages/docs/terms-and-conditions.mdx b/docs/src/pages/docs/terms-and-conditions.mdx similarity index 100% rename from apps/docs/src/pages/docs/terms-and-conditions.mdx rename to docs/src/pages/docs/terms-and-conditions.mdx diff --git a/apps/docs/src/utils/const.ts b/docs/src/utils/const.ts similarity index 100% rename from apps/docs/src/utils/const.ts rename to docs/src/utils/const.ts diff --git a/apps/docs/tailwind.config.ts b/docs/tailwind.config.ts similarity index 100% rename from apps/docs/tailwind.config.ts rename to docs/tailwind.config.ts diff --git a/apps/docs/theme.config.tsx b/docs/theme.config.tsx similarity index 100% rename from apps/docs/theme.config.tsx rename to docs/theme.config.tsx diff --git a/apps/docs/tsconfig.json b/docs/tsconfig.json similarity index 100% rename from apps/docs/tsconfig.json rename to docs/tsconfig.json diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6b013120..8e04063d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: - "apps/*" - "backend-nest" + - "docs" - "packages/*" From 045794b2df67082db80ebd46f04641ecb535e956 Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 11:25:42 +0200 Subject: [PATCH 3/8] feat(be): departures from station --- backend-nest/.env.example | 2 + backend-nest/package.json | 11 +- backend-nest/src/app.module.ts | 7 +- backend-nest/src/data/metro-stations.ts | 126 ++++++++++ backend-nest/src/data/platforms.ts | 121 ++++++++++ backend-nest/src/main.ts | 2 +- .../src/metro/metro.controller.spec.ts | 18 ++ backend-nest/src/metro/metro.controller.ts | 60 +++++ backend-nest/src/utils/fetch-departures.ts | 69 ++++++ backend-nest/src/utils/remove-diacritics.ts | 3 + backend-nest/src/validation/metro-station.ts | 23 ++ pnpm-lock.yaml | 223 +++++++----------- 12 files changed, 523 insertions(+), 142 deletions(-) create mode 100644 backend-nest/.env.example create mode 100644 backend-nest/src/data/metro-stations.ts create mode 100644 backend-nest/src/data/platforms.ts create mode 100644 backend-nest/src/metro/metro.controller.spec.ts create mode 100644 backend-nest/src/metro/metro.controller.ts create mode 100644 backend-nest/src/utils/fetch-departures.ts create mode 100644 backend-nest/src/utils/remove-diacritics.ts create mode 100644 backend-nest/src/validation/metro-station.ts diff --git a/backend-nest/.env.example b/backend-nest/.env.example new file mode 100644 index 00000000..5c2fb685 --- /dev/null +++ b/backend-nest/.env.example @@ -0,0 +1,2 @@ +# get yours @ https://api.golemio.cz/api-keys/auth/sign-up +GOLEMIO_API_KEY= \ No newline at end of file diff --git a/backend-nest/package.json b/backend-nest/package.json index a9fe0e26..f44bcbc8 100644 --- a/backend-nest/package.json +++ b/backend-nest/package.json @@ -1,10 +1,6 @@ { - "name": "backend-nest", + "name": "@metro-now/backend-nest", "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", "scripts": { "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", @@ -21,10 +17,13 @@ }, "dependencies": { "@nestjs/common": "^10.0.0", + "@nestjs/config": "^3.2.2", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "radash": "^12.1.0", "reflect-metadata": "^0.2.0", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "zod": "^3.23.8" }, "devDependencies": { "@nestjs/cli": "^10.0.0", diff --git a/backend-nest/src/app.module.ts b/backend-nest/src/app.module.ts index 86628031..4ef17f6a 100644 --- a/backend-nest/src/app.module.ts +++ b/backend-nest/src/app.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; - +import { MetroController } from './metro/metro.controller'; +import { ConfigModule } from '@nestjs/config'; @Module({ - imports: [], - controllers: [AppController], + imports: [ConfigModule.forRoot()], + controllers: [AppController, MetroController], providers: [AppService], }) export class AppModule {} diff --git a/backend-nest/src/data/metro-stations.ts b/backend-nest/src/data/metro-stations.ts new file mode 100644 index 00000000..09ca5faf --- /dev/null +++ b/backend-nest/src/data/metro-stations.ts @@ -0,0 +1,126 @@ +import type { PlatformID } from './platforms'; + +export const titleByMetroStation = { + andel: 'Anděl', + borislavka: 'Bořislavka', + budejovicka: 'Budějovická', + 'cerny-most': 'Černý Most', + ceskomoravska: 'Českomoravská', + dejvicka: 'Dejvická', + 'depo-hostivar': 'Depo Hostivař', + flora: 'Flora', + florenc: 'Florenc', + haje: 'Háje', + 'hlavni-nadrazi': 'Hlavní nádraží', + hloubetin: 'Hloubětín', + hradcanska: 'Hradčanská', + hurka: 'Hůrka', + chodov: 'Chodov', + 'i-p-pavlova': 'I. P. Pavlova', + invalidovna: 'Invalidovna', + jinonice: 'Jinonice', + 'jiriho-z-podebrad': 'Jiřího z Poděbrad', + kacerov: 'Kačerov', + 'karlovo-namesti': 'Karlovo náměstí', + kobylisy: 'Kobylisy', + kolbenova: 'Kolbenova', + krizikova: 'Křižíkova', + ladvi: 'Ládví', + letnany: 'Letňany', + luka: 'Luka', + luziny: 'Lužiny', + malostranska: 'Malostranská', + mustek: 'Můstek', + muzeum: 'Muzeum', + 'nadrazi-holesovice': 'Nádraží Holešovice', + 'nadrazi-veleslavin': 'Nádraží Veleslavín', + 'namesti-miru': 'Náměstí Míru', + 'namesti-republiky': 'Náměstí Republiky', + 'narodni-trida': 'Národní třída', + 'nemocnice-motol': 'Nemocnice Motol', + 'nove-butovice': 'Nové Butovice', + opatov: 'Opatov', + palmovka: 'Palmovka', + pankrac: 'Pankrác', + petriny: 'Petřiny', + 'prazskeho-povstani': 'Pražského povstání', + prosek: 'Prosek', + radlicka: 'Radlická', + 'rajska-zahrada': 'Rajská zahrada', + roztyly: 'Roztyly', + skalka: 'Skalka', + 'smichovske-nadrazi': 'Smíchovské nádraží', + staromestska: 'Staroměstská', + stodulky: 'Stodůlky', + strasnicka: 'Strašnická', + strizkov: 'Střížkov', + vltavska: 'Vltavská', + vysocanska: 'Vysočanská', + vysehrad: 'Vyšehrad', + zlicin: 'Zličín', + zelivskeho: 'Želivského', +} as const; + +export type MetroStation = keyof typeof titleByMetroStation; +export type MetroStationName = (typeof titleByMetroStation)[MetroStation]; + +export const platformsByMetroStation = { + andel: ['U1040Z101P', 'U1040Z102P'], + borislavka: ['U157Z101P', 'U157Z102P'], + budejovicka: ['U50Z101P', 'U50Z102P'], + 'cerny-most': ['U897Z101P'], + ceskomoravska: ['U510Z101P', 'U510Z102P'], + dejvicka: ['U321Z101P', 'U321Z102P'], + 'depo-hostivar': ['U1071Z101P', 'U1071Z102P'], + flora: ['U118Z101P', 'U118Z102P'], + florenc: ['U689Z101P', 'U689Z102P', 'U689Z121P', 'U689Z122P'], + haje: ['U286Z101P'], + 'hlavni-nadrazi': ['U142Z101P', 'U142Z102P'], + hloubetin: ['U135Z101P', 'U135Z102P'], + hradcanska: ['U163Z101P', 'U163Z102P'], + hurka: ['U1154Z101P', 'U1154Z102P'], + chodov: ['U52Z102P', 'U52Z101P'], + 'i-p-pavlova': ['U190Z101P', 'U190Z102P'], + invalidovna: ['U655Z101P', 'U655Z102P'], + jinonice: ['U685Z101P', 'U685Z102P'], + 'jiriho-z-podebrad': ['U209Z101P', 'U209Z102P'], + kacerov: ['U228Z101P', 'U228Z102P'], + 'karlovo-namesti': ['U237Z101P', 'U237Z102P'], + kobylisy: ['U675Z101P', 'U675Z102P'], + kolbenova: ['U75Z101P', 'U75Z102P'], + krizikova: ['U758Z101P', 'U758Z102P'], + ladvi: ['U78Z101P', 'U78Z102P'], + letnany: ['U1000Z102P'], + luka: ['U1007Z101P', 'U1007Z102P'], + luziny: ['U258Z101P', 'U258Z102P'], + malostranska: ['U360Z101P', 'U360Z102P'], + mustek: ['U1072Z101P', 'U1072Z102P', 'U1072Z121P', 'U1072Z122P'], + muzeum: ['U400Z101P', 'U400Z102P', 'U400Z121P', 'U400Z122P'], + 'nadrazi-holesovice': ['U115Z101P', 'U115Z102P'], + 'nadrazi-veleslavin': ['U462Z101P', 'U462Z102P'], + 'namesti-miru': ['U476Z101P', 'U476Z102P'], + 'namesti-republiky': ['U480Z101P', 'U480Z102P'], + 'narodni-trida': ['U539Z101P', 'U539Z102P'], + 'nemocnice-motol': ['U306Z101P'], + 'nove-butovice': ['U602Z101P', 'U602Z102P'], + opatov: ['U106Z101P', 'U106Z102P'], + palmovka: ['U529Z101P', 'U529Z102P'], + pankrac: ['U385Z101P', 'U385Z102P'], + petriny: ['U507Z101P', 'U507Z102P'], + 'prazskeho-povstani': ['U597Z101P', 'U597Z102P'], + prosek: ['U603Z101P', 'U603Z102P'], + radlicka: ['U957Z101P', 'U957Z102P'], + 'rajska-zahrada': ['U818Z101P', 'U818Z102P'], + roztyly: ['U601Z101P', 'U601Z102P'], + skalka: ['U953Z101P', 'U953Z102P'], + 'smichovske-nadrazi': ['U458Z101P', 'U458Z102P'], + staromestska: ['U703Z101P', 'U703Z102P'], + stodulky: ['U1140Z101P', 'U1140Z102P'], + strasnicka: ['U713Z101P', 'U713Z102P'], + strizkov: ['U332Z101P', 'U332Z102P'], + vltavska: ['U100Z101P', 'U100Z102P'], + vysocanska: ['U474Z101P', 'U474Z102P'], + vysehrad: ['U527Z101P', 'U527Z102P'], + zlicin: ['U1141Z102P'], + zelivskeho: ['U921Z101P', 'U921Z102P'], +} satisfies Record; diff --git a/backend-nest/src/data/platforms.ts b/backend-nest/src/data/platforms.ts new file mode 100644 index 00000000..03f394fe --- /dev/null +++ b/backend-nest/src/data/platforms.ts @@ -0,0 +1,121 @@ +export const platformIDs = [ + 'U1040Z101P', + 'U1040Z102P', + 'U157Z101P', + 'U157Z102P', + 'U50Z101P', + 'U50Z102P', + 'U897Z101P', + 'U510Z101P', + 'U510Z102P', + 'U321Z101P', + 'U321Z102P', + 'U1071Z101P', + 'U1071Z102P', + 'U118Z101P', + 'U118Z102P', + 'U689Z101P', + 'U689Z102P', + 'U689Z121P', + 'U689Z122P', + 'U286Z101P', + 'U142Z101P', + 'U142Z102P', + 'U135Z101P', + 'U135Z102P', + 'U163Z101P', + 'U163Z102P', + 'U1154Z101P', + 'U1154Z102P', + 'U52Z102P', + 'U52Z101P', + 'U190Z101P', + 'U190Z102P', + 'U655Z101P', + 'U655Z102P', + 'U685Z101P', + 'U685Z102P', + 'U209Z101P', + 'U209Z102P', + 'U228Z101P', + 'U228Z102P', + 'U237Z101P', + 'U237Z102P', + 'U675Z101P', + 'U675Z102P', + 'U75Z101P', + 'U75Z102P', + 'U758Z101P', + 'U758Z102P', + 'U78Z101P', + 'U78Z102P', + 'U1000Z102P', + 'U1007Z101P', + 'U1007Z102P', + 'U258Z101P', + 'U258Z102P', + 'U360Z101P', + 'U360Z102P', + 'U1072Z101P', + 'U1072Z102P', + 'U1072Z121P', + 'U1072Z122P', + 'U400Z101P', + 'U400Z102P', + 'U400Z121P', + 'U400Z122P', + 'U115Z101P', + 'U115Z102P', + 'U462Z101P', + 'U462Z102P', + 'U476Z101P', + 'U476Z102P', + 'U480Z101P', + 'U480Z102P', + 'U539Z101P', + 'U539Z102P', + 'U306Z101P', + 'U602Z101P', + 'U602Z102P', + 'U106Z101P', + 'U106Z102P', + 'U529Z101P', + 'U529Z102P', + 'U385Z101P', + 'U385Z102P', + 'U507Z101P', + 'U507Z102P', + 'U597Z101P', + 'U597Z102P', + 'U603Z101P', + 'U603Z102P', + 'U957Z101P', + 'U957Z102P', + 'U818Z101P', + 'U818Z102P', + 'U601Z101P', + 'U601Z102P', + 'U953Z101P', + 'U953Z102P', + 'U458Z101P', + 'U458Z102P', + 'U703Z101P', + 'U703Z102P', + 'U1140Z101P', + 'U1140Z102P', + 'U713Z101P', + 'U713Z102P', + 'U332Z101P', + 'U332Z102P', + 'U100Z101P', + 'U100Z102P', + 'U474Z101P', + 'U474Z102P', + 'U527Z101P', + 'U527Z102P', + 'U1141Z102P', + 'U921Z101P', + 'U921Z102P', +] as const satisfies `U${number}Z${number}P`[]; + +export type PlatformID = (typeof platformIDs)[number]; diff --git a/backend-nest/src/main.ts b/backend-nest/src/main.ts index 13cad38c..7d4c1629 100644 --- a/backend-nest/src/main.ts +++ b/backend-nest/src/main.ts @@ -3,6 +3,6 @@ import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); - await app.listen(3000); + await app.listen(3001); } bootstrap(); diff --git a/backend-nest/src/metro/metro.controller.spec.ts b/backend-nest/src/metro/metro.controller.spec.ts new file mode 100644 index 00000000..95862f8c --- /dev/null +++ b/backend-nest/src/metro/metro.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MetroController } from './metro.controller'; + +describe('MetroController', () => { + let controller: MetroController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MetroController], + }).compile(); + + controller = module.get(MetroController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/backend-nest/src/metro/metro.controller.ts b/backend-nest/src/metro/metro.controller.ts new file mode 100644 index 00000000..68d3790c --- /dev/null +++ b/backend-nest/src/metro/metro.controller.ts @@ -0,0 +1,60 @@ +import { Controller, Get, Query } from '@nestjs/common'; +import { parseMetroStation } from '../validation/metro-station'; +import { + platformsByMetroStation, + titleByMetroStation, +} from '../data/metro-stations'; +import { getDepartures } from 'src/utils/fetch-departures'; + +const ERROR_MSG = `Invalid "station" parameter. Supported stations: ${Object.keys(titleByMetroStation).join(', ')}`; +const MAX_STATIONS = 10; + +const parseQueryParam = ( + param: string | string[] | undefined, +): string[] | null => { + if (!param) { + return null; + } + + if (param instanceof Array) { + return param.length === 0 ? null : param; + } + + if (param.startsWith('[') && param.endsWith(']')) { + try { + return JSON.parse(param); + } catch { + return param.slice(1, -1).split(','); + } + } + + return [param]; +}; + +@Controller('metro') +export class MetroController { + @Get() + async getMetroDepartures(@Query('station') station?: string | string[]) { + if (!station) { + return ERROR_MSG; + } + + const stations = parseQueryParam(station); + if (!stations.length) { + return ERROR_MSG; + } + + const parsedStations = stations.map(parseMetroStation); + if (parsedStations.includes(null)) { + return ERROR_MSG; + } else if (parsedStations.length > MAX_STATIONS) { + return `Too many stations. Maximum is ${MAX_STATIONS}.`; + } + + const res = await getDepartures( + parsedStations.flatMap((station) => platformsByMetroStation[station]), + ); + + return res; + } +} diff --git a/backend-nest/src/utils/fetch-departures.ts b/backend-nest/src/utils/fetch-departures.ts new file mode 100644 index 00000000..746d0114 --- /dev/null +++ b/backend-nest/src/utils/fetch-departures.ts @@ -0,0 +1,69 @@ +import { group, unique } from 'radash'; +import { MetroStationName } from 'src/data/metro-stations'; +import { PlatformID, platformIDs } from 'src/data/platforms'; + +type Timestamp = { + predicted: string; + scheduled: string; +}; + +type Res = { + stops: { + stop_id: PlatformID; + stop_name: MetroStationName; + }[]; + departures: { + arrival_timestamp: Timestamp; + route: { + short_name: 'A' | 'B' | 'C'; + }; + stop: { + id: string; + }; + delay: { + is_available: boolean; + minutes: number | undefined; + seconds: number | undefined; + }; + departure_timestamp: Timestamp; + trip: { + headsign: MetroStationName; + }; + }[]; +}; + +export const getDepartures = async (platforms: PlatformID[]) => { + const uniquePlatforms = unique(platforms); + if (!uniquePlatforms.every((id) => platformIDs.includes(id))) { + return null; + } + + const GOLEMIO_ENDPOINT = new URL( + '/v2/pid/departureboards', + 'https://api.golemio.cz', + ); + + const GOLEMIO_ENDPOINT_HEADERS = new Headers({ + 'Content-Type': 'application/json', + 'X-Access-Token': process.env.GOLEMIO_API_KEY, + }); + + const res = await fetch( + new URL( + `${GOLEMIO_ENDPOINT}?${/*includeMetroTrains=true&*/ ''}order=real&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, + ), + { + method: 'GET', + headers: GOLEMIO_ENDPOINT_HEADERS, + }, + ); + console.log( + `${GOLEMIO_ENDPOINT}?includeMetroTrains=true&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, + ); + + const parsed: Res = await res.json(); + + return group(parsed.departures, (d) => d.stop.id) as { + [key in PlatformID]?: Res['departures']; + }; +}; diff --git a/backend-nest/src/utils/remove-diacritics.ts b/backend-nest/src/utils/remove-diacritics.ts new file mode 100644 index 00000000..146834bb --- /dev/null +++ b/backend-nest/src/utils/remove-diacritics.ts @@ -0,0 +1,3 @@ +export const removeDiacritics = (str: string): string => { + return str.normalize('NFD').replace(/\p{Diacritic}/gu, ''); +}; diff --git a/backend-nest/src/validation/metro-station.ts b/backend-nest/src/validation/metro-station.ts new file mode 100644 index 00000000..6059d906 --- /dev/null +++ b/backend-nest/src/validation/metro-station.ts @@ -0,0 +1,23 @@ +import { + titleByMetroStation, + type MetroStation, +} from 'src/data/metro-stations'; +import { removeDiacritics } from 'src/utils/remove-diacritics'; + +export const parseMetroStation = ( + station: string | undefined, +): MetroStation | null => { + if (!station) { + return null; + } + + const parsed = removeDiacritics( + station.toLowerCase().replaceAll(' ', '-').replaceAll('.', ''), + ); + + if (parsed in titleByMetroStation) { + return parsed as MetroStation; + } + + return null; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d775ced0..6b133f8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,72 +85,32 @@ importers: specifier: ^5.4.5 version: 5.4.5 - apps/docs: - dependencies: - '@next/mdx': - specifier: ^14.2.2 - version: 14.2.3(@mdx-js/react@2.3.0(react@18.3.1)) - next: - specifier: 14.2.2 - version: 14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: - specifier: ^2.13.4 - version: 2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra-theme-docs: - specifier: ^2.13.4 - version: 2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - devDependencies: - '@metro-now/config': - specifier: workspace:* - version: link:../../packages/config - '@types/node': - specifier: ^20 - version: 20.12.13 - '@types/react': - specifier: ^18 - version: 18.3.3 - '@types/react-dom': - specifier: ^18 - version: 18.3.0 - eslint: - specifier: ^8 - version: 8.57.0 - eslint-config-next: - specifier: 14.2.2 - version: 14.2.2(eslint@8.57.0)(typescript@5.4.5) - postcss: - specifier: ^8 - version: 8.4.38 - tailwindcss: - specifier: ^3.4.1 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)) - typescript: - specifier: ^5 - version: 5.4.5 - backend-nest: dependencies: '@nestjs/common': specifier: ^10.0.0 version: 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^3.2.2 + version: 3.2.2(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1) '@nestjs/core': specifier: ^10.0.0 version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/platform-express': specifier: ^10.0.0 version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9) + radash: + specifier: ^12.1.0 + version: 12.1.0 reflect-metadata: specifier: ^0.2.0 version: 0.2.2 rxjs: specifier: ^7.8.1 version: 7.8.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@nestjs/cli': specifier: ^10.0.0 @@ -216,6 +176,55 @@ importers: specifier: ^5.1.3 version: 5.4.5 + docs: + dependencies: + '@next/mdx': + specifier: ^14.2.2 + version: 14.2.3(@mdx-js/react@2.3.0(react@18.3.1)) + next: + specifier: 14.2.2 + version: 14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: + specifier: ^2.13.4 + version: 2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra-theme-docs: + specifier: ^2.13.4 + version: 2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + devDependencies: + '@metro-now/config': + specifier: workspace:* + version: link:../packages/config + '@types/node': + specifier: ^20 + version: 20.12.13 + '@types/react': + specifier: ^18 + version: 18.3.3 + '@types/react-dom': + specifier: ^18 + version: 18.3.0 + eslint: + specifier: ^8 + version: 8.57.0 + eslint-config-next: + specifier: 14.2.2 + version: 14.2.2(eslint@8.57.0)(typescript@5.4.5) + postcss: + specifier: ^8 + version: 8.4.38 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.13)(typescript@5.4.5)) + typescript: + specifier: ^5 + version: 5.4.5 + packages/config: {} packages/data: {} @@ -696,6 +705,12 @@ packages: class-validator: optional: true + '@nestjs/config@3.2.2': + resolution: {integrity: sha512-vGICPOui5vE6kPz1iwQ7oCnp3qWgqxldPmBQ9onkVoKlBtyc83KJCr7CjuVtf4OdovMAVcux1d8Q6jglU2ZphA==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + rxjs: ^7.1.0 + '@nestjs/core@10.3.9': resolution: {integrity: sha512-NzZUfWAmaf8sqhhwoRA+CuqxQe+P4Rz8PZp5U7CdCbjyeB9ZVGcBkihcJC9wMdtiOWHRndB2J8zRfs5w06jK3w==} peerDependencies: @@ -1095,24 +1110,10 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.2.0': - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@7.2.0': - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@6.21.0': resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1127,10 +1128,6 @@ packages: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@7.2.0': - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1140,15 +1137,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.2.0': - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1159,10 +1147,6 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@7.2.0': - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2006,6 +1990,10 @@ packages: dompurify@3.1.4: resolution: {integrity: sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==} + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -5504,6 +5492,15 @@ snapshots: tslib: 2.6.2 uid: 2.0.2 + '@nestjs/config@3.2.2(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)': + dependencies: + '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) + dotenv: 16.4.5 + dotenv-expand: 10.0.0 + lodash: 4.17.21 + rxjs: 7.8.1 + uuid: 9.0.1 + '@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -5929,29 +5926,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@7.2.0': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) @@ -5966,8 +5945,6 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@7.2.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 6.21.0 @@ -5983,21 +5960,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -6017,11 +5979,6 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.2.0': - dependencies: - '@typescript-eslint/types': 7.2.0 - eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} '@webassemblyjs/ast@1.12.1': @@ -6931,6 +6888,8 @@ snapshots: dompurify@3.1.4: {} + dotenv-expand@10.0.0: {} + dotenv@16.4.5: {} eastasianwidth@0.2.0: {} @@ -7070,11 +7029,11 @@ snapshots: dependencies: '@next/eslint-plugin-next': 14.2.2 '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -7096,13 +7055,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -7113,18 +7072,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -7134,7 +7093,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -7145,7 +7104,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack From bbcc554d80c7e2d188a0e7a043607f53739d918e Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 23:18:05 +0200 Subject: [PATCH 4/8] fix(be): cleanup endpoint functions & tests --- .../{ => __test__}/metro.controller.spec.ts | 2 +- backend-nest/src/metro/metro.controller.ts | 129 ++++++++++++++---- backend-nest/src/types/types.ts | 12 ++ backend-nest/src/utils/__test__/fetch.spec.ts | 56 ++++++++ .../utils/__test__/remove-diacritics.spec.ts | 33 +++++ backend-nest/src/utils/fetch-departures.ts | 69 ---------- backend-nest/src/utils/fetch.ts | 30 ++++ backend-nest/src/utils/query-params.ts | 21 +++ backend-nest/src/validation/metro-station.ts | 7 +- 9 files changed, 258 insertions(+), 101 deletions(-) rename backend-nest/src/metro/{ => __test__}/metro.controller.spec.ts (88%) create mode 100644 backend-nest/src/types/types.ts create mode 100644 backend-nest/src/utils/__test__/fetch.spec.ts create mode 100644 backend-nest/src/utils/__test__/remove-diacritics.spec.ts delete mode 100644 backend-nest/src/utils/fetch-departures.ts create mode 100644 backend-nest/src/utils/fetch.ts create mode 100644 backend-nest/src/utils/query-params.ts diff --git a/backend-nest/src/metro/metro.controller.spec.ts b/backend-nest/src/metro/__test__/metro.controller.spec.ts similarity index 88% rename from backend-nest/src/metro/metro.controller.spec.ts rename to backend-nest/src/metro/__test__/metro.controller.spec.ts index 95862f8c..27fdf54a 100644 --- a/backend-nest/src/metro/metro.controller.spec.ts +++ b/backend-nest/src/metro/__test__/metro.controller.spec.ts @@ -1,5 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { MetroController } from './metro.controller'; +import { MetroController } from '../metro.controller'; describe('MetroController', () => { let controller: MetroController; diff --git a/backend-nest/src/metro/metro.controller.ts b/backend-nest/src/metro/metro.controller.ts index 68d3790c..8e8ddb36 100644 --- a/backend-nest/src/metro/metro.controller.ts +++ b/backend-nest/src/metro/metro.controller.ts @@ -1,60 +1,137 @@ -import { Controller, Get, Query } from '@nestjs/common'; +import { + Controller, + Get, + HttpException, + HttpStatus, + Query, +} from '@nestjs/common'; import { parseMetroStation } from '../validation/metro-station'; import { platformsByMetroStation, titleByMetroStation, } from '../data/metro-stations'; -import { getDepartures } from 'src/utils/fetch-departures'; +import { parseQueryParam } from '../utils/query-params'; +import { group, unique } from 'radash'; +import { platformIDs } from '../data/platforms'; +import type { MetroStationName } from '../data/metro-stations'; +import type { PlatformID } from '../data/platforms'; +import type { MetroLine, Timestamp } from '../types/types'; +import { + getDelayInSeconds, + getGolemioHeaders, + GOLEMIO_ENDPOINT, +} from '../utils/fetch'; const ERROR_MSG = `Invalid "station" parameter. Supported stations: ${Object.keys(titleByMetroStation).join(', ')}`; const MAX_STATIONS = 10; -const parseQueryParam = ( - param: string | string[] | undefined, -): string[] | null => { - if (!param) { - return null; - } - - if (param instanceof Array) { - return param.length === 0 ? null : param; - } - - if (param.startsWith('[') && param.endsWith(']')) { - try { - return JSON.parse(param); - } catch { - return param.slice(1, -1).split(','); - } - } +type DepartureResponse = { + heading: MetroStationName; + line: MetroLine; + departure: string; + delay: number | null; // seconds + platform: PlatformID; +}; - return [param]; +type GetMetroResponse = { + [key in PlatformID]?: DepartureResponse[]; }; @Controller('metro') export class MetroController { @Get() - async getMetroDepartures(@Query('station') station?: string | string[]) { + async getMetroDepartures( + @Query('station') station?: string | string[], + ): Promise { if (!station) { - return ERROR_MSG; + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); } const stations = parseQueryParam(station); if (!stations.length) { - return ERROR_MSG; + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); } const parsedStations = stations.map(parseMetroStation); if (parsedStations.includes(null)) { - return ERROR_MSG; + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); } else if (parsedStations.length > MAX_STATIONS) { - return `Too many stations. Maximum is ${MAX_STATIONS}.`; + throw new HttpException( + `Too many stations. Maximum is ${MAX_STATIONS}.`, + HttpStatus.BAD_REQUEST, + ); } const res = await getDepartures( parsedStations.flatMap((station) => platformsByMetroStation[station]), ); + if (!res) { + throw new HttpException( + 'Failed to fetch data.', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + return res; } } + +type GolemioResponse = { + stops: { + stop_id: PlatformID; + stop_name: MetroStationName; + }[]; + departures: { + arrival_timestamp: Timestamp; + route: { + short_name: MetroLine; + }; + stop: { + id: string; + }; + delay: { + is_available: boolean; + minutes: number | undefined; + seconds: number | undefined; + }; + departure_timestamp: Timestamp; + trip: { + headsign: MetroStationName; + }; + }[]; +}; + +const getDepartures = async ( + platforms: PlatformID[], +): Promise => { + const uniquePlatforms = unique(platforms); + if (!uniquePlatforms.every((id) => platformIDs.includes(id))) { + return null; + } + + const res = await fetch( + new URL( + `${GOLEMIO_ENDPOINT}?order=real&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, + ), + { + method: 'GET', + headers: getGolemioHeaders(), + }, + ); + + const parsedRes: GolemioResponse = await res.json(); + const parsedDepartures = parsedRes.departures.map((departure) => { + const { delay, departure_timestamp, trip, route, stop } = departure; + + return { + delay: getDelayInSeconds(delay), + departure: departure_timestamp.predicted, + heading: trip.headsign, + line: route.short_name, + platform: stop.id as PlatformID, + }; + }); + + return group(parsedDepartures, (departure) => departure.platform); +}; diff --git a/backend-nest/src/types/types.ts b/backend-nest/src/types/types.ts new file mode 100644 index 00000000..517980f0 --- /dev/null +++ b/backend-nest/src/types/types.ts @@ -0,0 +1,12 @@ +export type MetroLine = 'A' | 'B' | 'C'; + +export type Timestamp = { + predicted: string; + scheduled: string; +}; + +export type Delay = { + is_available?: unknown; + minutes?: unknown; + seconds?: unknown; +}; diff --git a/backend-nest/src/utils/__test__/fetch.spec.ts b/backend-nest/src/utils/__test__/fetch.spec.ts new file mode 100644 index 00000000..b015f207 --- /dev/null +++ b/backend-nest/src/utils/__test__/fetch.spec.ts @@ -0,0 +1,56 @@ +import { getDelayInSeconds } from '../fetch'; + +describe('getDelayInSeconds', () => { + it('should return 0 when delay is undefined', () => { + expect(getDelayInSeconds(undefined)).toBe(0); + }); + + it('should return 0 when delay is null', () => { + expect(getDelayInSeconds(null)).toBe(0); + }); + + it('should return seconds when delay contains seconds only', () => { + const delay = { seconds: 30 }; + expect(getDelayInSeconds(delay)).toBe(30); + }); + + it('should return minutes converted to seconds when delay contains minutes only', () => { + const delay = { minutes: 2 }; + expect(getDelayInSeconds(delay)).toBe(120); // 2 minutes = 120 seconds + }); + + it('should return combined seconds and minutes when both are present in delay', () => { + const delay = { seconds: 45, minutes: 1 }; + expect(getDelayInSeconds(delay)).toBe(105); // 1 minute + 45 seconds = 60 + 45 = 105 seconds + }); + + it('should return 0 when delay is an empty object', () => { + const delay = {}; + expect(getDelayInSeconds(delay)).toBe(0); + }); + + it('should return 0 when delay seconds and minutes are not numbers', () => { + const delay = { seconds: 'invalid', minutes: 'invalid' }; + expect(getDelayInSeconds(delay)).toBe(0); + }); + + it('should handle negative seconds correctly', () => { + const delay = { seconds: -15 }; + expect(getDelayInSeconds(delay)).toBe(-15); // Negative seconds should be returned as negative + }); + + it('should handle negative minutes correctly', () => { + const delay = { minutes: -1 }; + expect(getDelayInSeconds(delay)).toBe(-60); // Negative minutes should convert to negative seconds + }); + + it('should handle combined negative values correctly', () => { + const delay = { seconds: -30, minutes: -1 }; + expect(getDelayInSeconds(delay)).toBe(-90); // Combined negative values should sum as negative seconds + }); + + it('should handle negative seconds and positive minutes correctly', () => { + const delay = { seconds: -30, minutes: 2 }; + expect(getDelayInSeconds(delay)).toBe(90); // 2 minutes should override negative seconds + }); +}); diff --git a/backend-nest/src/utils/__test__/remove-diacritics.spec.ts b/backend-nest/src/utils/__test__/remove-diacritics.spec.ts new file mode 100644 index 00000000..3bbf43f9 --- /dev/null +++ b/backend-nest/src/utils/__test__/remove-diacritics.spec.ts @@ -0,0 +1,33 @@ +import { removeDiacritics } from '../remove-diacritics'; + +describe('removeDiacritics', () => { + it('should remove diacritics from a string', () => { + const input = 'áéíóúüñãç'; + const expected = 'aeiouunac'; + expect(removeDiacritics(input)).toBe(expected); + }); + + it('should handle empty string', () => { + const input = ''; + const expected = ''; + expect(removeDiacritics(input)).toBe(expected); + }); + + it('should handle string without diacritics', () => { + const input = 'abcdef'; + const expected = 'abcdef'; + expect(removeDiacritics(input)).toBe(expected); + }); + + it('should handle mixed string with and without diacritics', () => { + const input = 'áéí123óú456üñ789ãç'; + const expected = 'aei123ou456un789ac'; + expect(removeDiacritics(input)).toBe(expected); + }); + + it('should handle string with multiple occurrences of the same diacritic', () => { + const input = 'ááááá'; + const expected = 'aaaaa'; + expect(removeDiacritics(input)).toBe(expected); + }); +}); diff --git a/backend-nest/src/utils/fetch-departures.ts b/backend-nest/src/utils/fetch-departures.ts deleted file mode 100644 index 746d0114..00000000 --- a/backend-nest/src/utils/fetch-departures.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { group, unique } from 'radash'; -import { MetroStationName } from 'src/data/metro-stations'; -import { PlatformID, platformIDs } from 'src/data/platforms'; - -type Timestamp = { - predicted: string; - scheduled: string; -}; - -type Res = { - stops: { - stop_id: PlatformID; - stop_name: MetroStationName; - }[]; - departures: { - arrival_timestamp: Timestamp; - route: { - short_name: 'A' | 'B' | 'C'; - }; - stop: { - id: string; - }; - delay: { - is_available: boolean; - minutes: number | undefined; - seconds: number | undefined; - }; - departure_timestamp: Timestamp; - trip: { - headsign: MetroStationName; - }; - }[]; -}; - -export const getDepartures = async (platforms: PlatformID[]) => { - const uniquePlatforms = unique(platforms); - if (!uniquePlatforms.every((id) => platformIDs.includes(id))) { - return null; - } - - const GOLEMIO_ENDPOINT = new URL( - '/v2/pid/departureboards', - 'https://api.golemio.cz', - ); - - const GOLEMIO_ENDPOINT_HEADERS = new Headers({ - 'Content-Type': 'application/json', - 'X-Access-Token': process.env.GOLEMIO_API_KEY, - }); - - const res = await fetch( - new URL( - `${GOLEMIO_ENDPOINT}?${/*includeMetroTrains=true&*/ ''}order=real&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, - ), - { - method: 'GET', - headers: GOLEMIO_ENDPOINT_HEADERS, - }, - ); - console.log( - `${GOLEMIO_ENDPOINT}?includeMetroTrains=true&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, - ); - - const parsed: Res = await res.json(); - - return group(parsed.departures, (d) => d.stop.id) as { - [key in PlatformID]?: Res['departures']; - }; -}; diff --git a/backend-nest/src/utils/fetch.ts b/backend-nest/src/utils/fetch.ts new file mode 100644 index 00000000..2db6f018 --- /dev/null +++ b/backend-nest/src/utils/fetch.ts @@ -0,0 +1,30 @@ +import { Delay } from 'src/types/types'; + +export const GOLEMIO_ENDPOINT = new URL( + '/v2/pid/departureboards', + 'https://api.golemio.cz', +); + +export const getGolemioHeaders = () => { + return new Headers({ + 'Content-Type': 'application/json', + 'X-Access-Token': process.env.GOLEMIO_API_KEY, + }); +}; + +export const getDelayInSeconds = (delay?: Delay | null): number => { + if (!delay) { + return 0; + } + + let seconds = 0; + + if (typeof delay?.seconds === 'number') { + seconds += delay.seconds; + } + if (typeof delay?.minutes === 'number') { + seconds += delay.minutes * 60; + } + + return seconds; +}; diff --git a/backend-nest/src/utils/query-params.ts b/backend-nest/src/utils/query-params.ts new file mode 100644 index 00000000..1e3588d4 --- /dev/null +++ b/backend-nest/src/utils/query-params.ts @@ -0,0 +1,21 @@ +export const parseQueryParam = ( + param: string | string[] | undefined, +): string[] | null => { + if (!param) { + return null; + } + + if (param instanceof Array) { + return param.length === 0 ? null : param; + } + + if (param.startsWith('[') && param.endsWith(']')) { + try { + return JSON.parse(param); + } catch { + return param.slice(1, -1).split(','); + } + } + + return [param]; +}; diff --git a/backend-nest/src/validation/metro-station.ts b/backend-nest/src/validation/metro-station.ts index 6059d906..a57dff4c 100644 --- a/backend-nest/src/validation/metro-station.ts +++ b/backend-nest/src/validation/metro-station.ts @@ -1,8 +1,5 @@ -import { - titleByMetroStation, - type MetroStation, -} from 'src/data/metro-stations'; -import { removeDiacritics } from 'src/utils/remove-diacritics'; +import { titleByMetroStation, MetroStation } from '../data/metro-stations'; +import { removeDiacritics } from '../utils/remove-diacritics'; export const parseMetroStation = ( station: string | undefined, From d9799f5a959386e1fe91b076cf4c13ecf3c1696e Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 23:20:33 +0200 Subject: [PATCH 5/8] refactor: remove package.json from app --- apps/app/package.json | 11 ----------- apps/backend-v2/package.json | 3 +-- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 apps/app/package.json diff --git a/apps/app/package.json b/apps/app/package.json deleted file mode 100644 index 081fd737..00000000 --- a/apps/app/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "scripts": { - "test": "xcodebuild -workspace app/metro-now.xcodeproj/project.xcworkspace -scheme metro-now test | xcbeautify" - }, - "keywords": [], - "author": "", - "license": "ISC" -} diff --git a/apps/backend-v2/package.json b/apps/backend-v2/package.json index bc7e8186..73050d67 100644 --- a/apps/backend-v2/package.json +++ b/apps/backend-v2/package.json @@ -6,8 +6,7 @@ "scripts": { "build": "npx tsc", "start": "node build/src/server.js", - "dev": "nodemon src/server.ts", - "test": "jest", + "dev": "nodemon src/server.ts", "typecheck": "tsc --pretty" }, "dependencies": { From a228dc26c693bea31e6e10b0751c8b0f313b2164 Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 23:25:38 +0200 Subject: [PATCH 6/8] refactor: format --- backend-nest/.prettierrc | 4 ---- backend-nest/package.json | 1 - 2 files changed, 5 deletions(-) delete mode 100644 backend-nest/.prettierrc diff --git a/backend-nest/.prettierrc b/backend-nest/.prettierrc deleted file mode 100644 index dcb72794..00000000 --- a/backend-nest/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all" -} \ No newline at end of file diff --git a/backend-nest/package.json b/backend-nest/package.json index f44bcbc8..633c8dae 100644 --- a/backend-nest/package.json +++ b/backend-nest/package.json @@ -3,7 +3,6 @@ "version": "0.0.1", "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", From 13b81589e166b222177e0f7794351de2ecc10390 Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 23:26:41 +0200 Subject: [PATCH 7/8] chore: ignore move docs commit --- .git-blame-ignore-revs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 589f6b85..e906e4c5 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -9,4 +9,6 @@ ed24de82d9190fd08bbd1e5be416b62d3a186e9d # app/metro-now/ -> app/ 197279f1e91b65577c7fdc96e292d99081c95e14 # backend/, docs/, app/ -> apps/ -de8b1061cb14a08c54f812ad9e3e36c08342c67f \ No newline at end of file +de8b1061cb14a08c54f812ad9e3e36c08342c67f +# apps/docs -> docs +3c2c7b0b78da3e3e6e9c1e3ad8fd45ba7da998c4 \ No newline at end of file From d3af0287dffcc1c10fd47ec95f787b88518b7857 Mon Sep 17 00:00:00 2001 From: Krystof Date: Mon, 17 Jun 2024 23:28:27 +0200 Subject: [PATCH 8/8] chore: format --- apps/backend-v2/package.json | 2 +- backend-nest/.eslintrc.js | 46 ++-- backend-nest/README.md | 6 +- backend-nest/nest-cli.json | 12 +- backend-nest/package.json | 128 +++++----- backend-nest/src/app.controller.spec.ts | 32 +-- backend-nest/src/app.controller.ts | 14 +- backend-nest/src/app.module.ts | 16 +- backend-nest/src/app.service.ts | 8 +- backend-nest/src/data/metro-stations.ts | 234 +++++++++--------- backend-nest/src/data/platforms.ts | 234 +++++++++--------- backend-nest/src/main.ts | 8 +- .../metro/__test__/metro.controller.spec.ts | 26 +- backend-nest/src/metro/metro.controller.ts | 216 ++++++++-------- backend-nest/src/types/types.ts | 12 +- backend-nest/src/utils/__test__/fetch.spec.ts | 110 ++++---- .../utils/__test__/remove-diacritics.spec.ts | 54 ++-- backend-nest/src/utils/fetch.ts | 36 +-- backend-nest/src/utils/query-params.ts | 28 +-- backend-nest/src/utils/remove-diacritics.ts | 2 +- backend-nest/src/validation/metro-station.ts | 26 +- backend-nest/test/app.e2e-spec.ts | 38 +-- backend-nest/test/jest-e2e.json | 14 +- backend-nest/tsconfig.build.json | 4 +- backend-nest/tsconfig.json | 38 +-- turbo.json | 13 +- 26 files changed, 679 insertions(+), 678 deletions(-) diff --git a/apps/backend-v2/package.json b/apps/backend-v2/package.json index 73050d67..9a606340 100644 --- a/apps/backend-v2/package.json +++ b/apps/backend-v2/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "npx tsc", "start": "node build/src/server.js", - "dev": "nodemon src/server.ts", + "dev": "nodemon src/server.ts", "typecheck": "tsc --pretty" }, "dependencies": { diff --git a/backend-nest/.eslintrc.js b/backend-nest/.eslintrc.js index 259de13c..791ca93b 100644 --- a/backend-nest/.eslintrc.js +++ b/backend-nest/.eslintrc.js @@ -1,25 +1,25 @@ module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - tsconfigRootDir: __dirname, - sourceType: 'module', - }, - plugins: ['@typescript-eslint/eslint-plugin'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - root: true, - env: { - node: true, - jest: true, - }, - ignorePatterns: ['.eslintrc.js'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, + parser: "@typescript-eslint/parser", + parserOptions: { + project: "tsconfig.json", + tsconfigRootDir: __dirname, + sourceType: "module", + }, + plugins: ["@typescript-eslint/eslint-plugin"], + extends: [ + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: [".eslintrc.js"], + rules: { + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + }, }; diff --git a/backend-nest/README.md b/backend-nest/README.md index f5aa86c5..f3fc94cf 100644 --- a/backend-nest/README.md +++ b/backend-nest/README.md @@ -64,9 +64,9 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors ## Stay in touch -- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) +- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) +- Website - [https://nestjs.com](https://nestjs.com/) +- Twitter - [@nestframework](https://twitter.com/nestframework) ## License diff --git a/backend-nest/nest-cli.json b/backend-nest/nest-cli.json index f9aa683b..363961e6 100644 --- a/backend-nest/nest-cli.json +++ b/backend-nest/nest-cli.json @@ -1,8 +1,8 @@ { - "$schema": "https://json.schemastore.org/nest-cli", - "collection": "@nestjs/schematics", - "sourceRoot": "src", - "compilerOptions": { - "deleteOutDir": true - } + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } } diff --git a/backend-nest/package.json b/backend-nest/package.json index 633c8dae..ed7ee325 100644 --- a/backend-nest/package.json +++ b/backend-nest/package.json @@ -1,67 +1,67 @@ { - "name": "@metro-now/backend-nest", - "version": "0.0.1", - "scripts": { - "build": "nest build", - "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", - "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" - }, - "dependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/config": "^3.2.2", - "@nestjs/core": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "radash": "^12.1.0", - "reflect-metadata": "^0.2.0", - "rxjs": "^7.8.1", - "zod": "^3.23.8" - }, - "devDependencies": { - "@nestjs/cli": "^10.0.0", - "@nestjs/schematics": "^10.0.0", - "@nestjs/testing": "^10.0.0", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", - "@types/node": "^20.3.1", - "@types/supertest": "^6.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.42.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", - "jest": "^29.5.0", - "prettier": "^3.0.0", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.3", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "name": "@metro-now/backend-nest", + "version": "0.0.1", + "scripts": { + "build": "nest build", + "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", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } + "dependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/config": "^3.2.2", + "@nestjs/core": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "radash": "^12.1.0", + "reflect-metadata": "^0.2.0", + "rxjs": "^7.8.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@nestjs/cli": "^10.0.0", + "@nestjs/schematics": "^10.0.0", + "@nestjs/testing": "^10.0.0", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@types/supertest": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.42.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "jest": "^29.5.0", + "prettier": "^3.0.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.3" + }, + "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/backend-nest/src/app.controller.spec.ts b/backend-nest/src/app.controller.spec.ts index d22f3890..d9d81e1b 100644 --- a/backend-nest/src/app.controller.spec.ts +++ b/backend-nest/src/app.controller.spec.ts @@ -1,22 +1,22 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import { Test, TestingModule } from "@nestjs/testing"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; -describe('AppController', () => { - let appController: AppController; +describe("AppController", () => { + let appController: AppController; - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); - appController = app.get(AppController); - }); + appController = app.get(AppController); + }); - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); + describe("root", () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe("Hello World!"); + }); }); - }); }); diff --git a/backend-nest/src/app.controller.ts b/backend-nest/src/app.controller.ts index cce879ee..00e6336b 100644 --- a/backend-nest/src/app.controller.ts +++ b/backend-nest/src/app.controller.ts @@ -1,12 +1,12 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; +import { Controller, Get } from "@nestjs/common"; +import { AppService } from "./app.service"; @Controller() export class AppController { - constructor(private readonly appService: AppService) {} + constructor(private readonly appService: AppService) {} - @Get() - getHello(): string { - return this.appService.getHello(); - } + @Get() + getHello(): string { + return this.appService.getHello(); + } } diff --git a/backend-nest/src/app.module.ts b/backend-nest/src/app.module.ts index 4ef17f6a..f857c25b 100644 --- a/backend-nest/src/app.module.ts +++ b/backend-nest/src/app.module.ts @@ -1,11 +1,11 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; -import { MetroController } from './metro/metro.controller'; -import { ConfigModule } from '@nestjs/config'; +import { Module } from "@nestjs/common"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; +import { MetroController } from "./metro/metro.controller"; +import { ConfigModule } from "@nestjs/config"; @Module({ - imports: [ConfigModule.forRoot()], - controllers: [AppController, MetroController], - providers: [AppService], + imports: [ConfigModule.forRoot()], + controllers: [AppController, MetroController], + providers: [AppService], }) export class AppModule {} diff --git a/backend-nest/src/app.service.ts b/backend-nest/src/app.service.ts index 927d7cca..07de6b45 100644 --- a/backend-nest/src/app.service.ts +++ b/backend-nest/src/app.service.ts @@ -1,8 +1,8 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable } from "@nestjs/common"; @Injectable() export class AppService { - getHello(): string { - return 'Hello World!'; - } + getHello(): string { + return "Hello World!"; + } } diff --git a/backend-nest/src/data/metro-stations.ts b/backend-nest/src/data/metro-stations.ts index 09ca5faf..7a21faad 100644 --- a/backend-nest/src/data/metro-stations.ts +++ b/backend-nest/src/data/metro-stations.ts @@ -1,126 +1,126 @@ -import type { PlatformID } from './platforms'; +import type { PlatformID } from "./platforms"; export const titleByMetroStation = { - andel: 'Anděl', - borislavka: 'Bořislavka', - budejovicka: 'Budějovická', - 'cerny-most': 'Černý Most', - ceskomoravska: 'Českomoravská', - dejvicka: 'Dejvická', - 'depo-hostivar': 'Depo Hostivař', - flora: 'Flora', - florenc: 'Florenc', - haje: 'Háje', - 'hlavni-nadrazi': 'Hlavní nádraží', - hloubetin: 'Hloubětín', - hradcanska: 'Hradčanská', - hurka: 'Hůrka', - chodov: 'Chodov', - 'i-p-pavlova': 'I. P. Pavlova', - invalidovna: 'Invalidovna', - jinonice: 'Jinonice', - 'jiriho-z-podebrad': 'Jiřího z Poděbrad', - kacerov: 'Kačerov', - 'karlovo-namesti': 'Karlovo náměstí', - kobylisy: 'Kobylisy', - kolbenova: 'Kolbenova', - krizikova: 'Křižíkova', - ladvi: 'Ládví', - letnany: 'Letňany', - luka: 'Luka', - luziny: 'Lužiny', - malostranska: 'Malostranská', - mustek: 'Můstek', - muzeum: 'Muzeum', - 'nadrazi-holesovice': 'Nádraží Holešovice', - 'nadrazi-veleslavin': 'Nádraží Veleslavín', - 'namesti-miru': 'Náměstí Míru', - 'namesti-republiky': 'Náměstí Republiky', - 'narodni-trida': 'Národní třída', - 'nemocnice-motol': 'Nemocnice Motol', - 'nove-butovice': 'Nové Butovice', - opatov: 'Opatov', - palmovka: 'Palmovka', - pankrac: 'Pankrác', - petriny: 'Petřiny', - 'prazskeho-povstani': 'Pražského povstání', - prosek: 'Prosek', - radlicka: 'Radlická', - 'rajska-zahrada': 'Rajská zahrada', - roztyly: 'Roztyly', - skalka: 'Skalka', - 'smichovske-nadrazi': 'Smíchovské nádraží', - staromestska: 'Staroměstská', - stodulky: 'Stodůlky', - strasnicka: 'Strašnická', - strizkov: 'Střížkov', - vltavska: 'Vltavská', - vysocanska: 'Vysočanská', - vysehrad: 'Vyšehrad', - zlicin: 'Zličín', - zelivskeho: 'Želivského', + andel: "Anděl", + borislavka: "Bořislavka", + budejovicka: "Budějovická", + "cerny-most": "Černý Most", + ceskomoravska: "Českomoravská", + dejvicka: "Dejvická", + "depo-hostivar": "Depo Hostivař", + flora: "Flora", + florenc: "Florenc", + haje: "Háje", + "hlavni-nadrazi": "Hlavní nádraží", + hloubetin: "Hloubětín", + hradcanska: "Hradčanská", + hurka: "Hůrka", + chodov: "Chodov", + "i-p-pavlova": "I. P. Pavlova", + invalidovna: "Invalidovna", + jinonice: "Jinonice", + "jiriho-z-podebrad": "Jiřího z Poděbrad", + kacerov: "Kačerov", + "karlovo-namesti": "Karlovo náměstí", + kobylisy: "Kobylisy", + kolbenova: "Kolbenova", + krizikova: "Křižíkova", + ladvi: "Ládví", + letnany: "Letňany", + luka: "Luka", + luziny: "Lužiny", + malostranska: "Malostranská", + mustek: "Můstek", + muzeum: "Muzeum", + "nadrazi-holesovice": "Nádraží Holešovice", + "nadrazi-veleslavin": "Nádraží Veleslavín", + "namesti-miru": "Náměstí Míru", + "namesti-republiky": "Náměstí Republiky", + "narodni-trida": "Národní třída", + "nemocnice-motol": "Nemocnice Motol", + "nove-butovice": "Nové Butovice", + opatov: "Opatov", + palmovka: "Palmovka", + pankrac: "Pankrác", + petriny: "Petřiny", + "prazskeho-povstani": "Pražského povstání", + prosek: "Prosek", + radlicka: "Radlická", + "rajska-zahrada": "Rajská zahrada", + roztyly: "Roztyly", + skalka: "Skalka", + "smichovske-nadrazi": "Smíchovské nádraží", + staromestska: "Staroměstská", + stodulky: "Stodůlky", + strasnicka: "Strašnická", + strizkov: "Střížkov", + vltavska: "Vltavská", + vysocanska: "Vysočanská", + vysehrad: "Vyšehrad", + zlicin: "Zličín", + zelivskeho: "Želivského", } as const; export type MetroStation = keyof typeof titleByMetroStation; export type MetroStationName = (typeof titleByMetroStation)[MetroStation]; export const platformsByMetroStation = { - andel: ['U1040Z101P', 'U1040Z102P'], - borislavka: ['U157Z101P', 'U157Z102P'], - budejovicka: ['U50Z101P', 'U50Z102P'], - 'cerny-most': ['U897Z101P'], - ceskomoravska: ['U510Z101P', 'U510Z102P'], - dejvicka: ['U321Z101P', 'U321Z102P'], - 'depo-hostivar': ['U1071Z101P', 'U1071Z102P'], - flora: ['U118Z101P', 'U118Z102P'], - florenc: ['U689Z101P', 'U689Z102P', 'U689Z121P', 'U689Z122P'], - haje: ['U286Z101P'], - 'hlavni-nadrazi': ['U142Z101P', 'U142Z102P'], - hloubetin: ['U135Z101P', 'U135Z102P'], - hradcanska: ['U163Z101P', 'U163Z102P'], - hurka: ['U1154Z101P', 'U1154Z102P'], - chodov: ['U52Z102P', 'U52Z101P'], - 'i-p-pavlova': ['U190Z101P', 'U190Z102P'], - invalidovna: ['U655Z101P', 'U655Z102P'], - jinonice: ['U685Z101P', 'U685Z102P'], - 'jiriho-z-podebrad': ['U209Z101P', 'U209Z102P'], - kacerov: ['U228Z101P', 'U228Z102P'], - 'karlovo-namesti': ['U237Z101P', 'U237Z102P'], - kobylisy: ['U675Z101P', 'U675Z102P'], - kolbenova: ['U75Z101P', 'U75Z102P'], - krizikova: ['U758Z101P', 'U758Z102P'], - ladvi: ['U78Z101P', 'U78Z102P'], - letnany: ['U1000Z102P'], - luka: ['U1007Z101P', 'U1007Z102P'], - luziny: ['U258Z101P', 'U258Z102P'], - malostranska: ['U360Z101P', 'U360Z102P'], - mustek: ['U1072Z101P', 'U1072Z102P', 'U1072Z121P', 'U1072Z122P'], - muzeum: ['U400Z101P', 'U400Z102P', 'U400Z121P', 'U400Z122P'], - 'nadrazi-holesovice': ['U115Z101P', 'U115Z102P'], - 'nadrazi-veleslavin': ['U462Z101P', 'U462Z102P'], - 'namesti-miru': ['U476Z101P', 'U476Z102P'], - 'namesti-republiky': ['U480Z101P', 'U480Z102P'], - 'narodni-trida': ['U539Z101P', 'U539Z102P'], - 'nemocnice-motol': ['U306Z101P'], - 'nove-butovice': ['U602Z101P', 'U602Z102P'], - opatov: ['U106Z101P', 'U106Z102P'], - palmovka: ['U529Z101P', 'U529Z102P'], - pankrac: ['U385Z101P', 'U385Z102P'], - petriny: ['U507Z101P', 'U507Z102P'], - 'prazskeho-povstani': ['U597Z101P', 'U597Z102P'], - prosek: ['U603Z101P', 'U603Z102P'], - radlicka: ['U957Z101P', 'U957Z102P'], - 'rajska-zahrada': ['U818Z101P', 'U818Z102P'], - roztyly: ['U601Z101P', 'U601Z102P'], - skalka: ['U953Z101P', 'U953Z102P'], - 'smichovske-nadrazi': ['U458Z101P', 'U458Z102P'], - staromestska: ['U703Z101P', 'U703Z102P'], - stodulky: ['U1140Z101P', 'U1140Z102P'], - strasnicka: ['U713Z101P', 'U713Z102P'], - strizkov: ['U332Z101P', 'U332Z102P'], - vltavska: ['U100Z101P', 'U100Z102P'], - vysocanska: ['U474Z101P', 'U474Z102P'], - vysehrad: ['U527Z101P', 'U527Z102P'], - zlicin: ['U1141Z102P'], - zelivskeho: ['U921Z101P', 'U921Z102P'], + andel: ["U1040Z101P", "U1040Z102P"], + borislavka: ["U157Z101P", "U157Z102P"], + budejovicka: ["U50Z101P", "U50Z102P"], + "cerny-most": ["U897Z101P"], + ceskomoravska: ["U510Z101P", "U510Z102P"], + dejvicka: ["U321Z101P", "U321Z102P"], + "depo-hostivar": ["U1071Z101P", "U1071Z102P"], + flora: ["U118Z101P", "U118Z102P"], + florenc: ["U689Z101P", "U689Z102P", "U689Z121P", "U689Z122P"], + haje: ["U286Z101P"], + "hlavni-nadrazi": ["U142Z101P", "U142Z102P"], + hloubetin: ["U135Z101P", "U135Z102P"], + hradcanska: ["U163Z101P", "U163Z102P"], + hurka: ["U1154Z101P", "U1154Z102P"], + chodov: ["U52Z102P", "U52Z101P"], + "i-p-pavlova": ["U190Z101P", "U190Z102P"], + invalidovna: ["U655Z101P", "U655Z102P"], + jinonice: ["U685Z101P", "U685Z102P"], + "jiriho-z-podebrad": ["U209Z101P", "U209Z102P"], + kacerov: ["U228Z101P", "U228Z102P"], + "karlovo-namesti": ["U237Z101P", "U237Z102P"], + kobylisy: ["U675Z101P", "U675Z102P"], + kolbenova: ["U75Z101P", "U75Z102P"], + krizikova: ["U758Z101P", "U758Z102P"], + ladvi: ["U78Z101P", "U78Z102P"], + letnany: ["U1000Z102P"], + luka: ["U1007Z101P", "U1007Z102P"], + luziny: ["U258Z101P", "U258Z102P"], + malostranska: ["U360Z101P", "U360Z102P"], + mustek: ["U1072Z101P", "U1072Z102P", "U1072Z121P", "U1072Z122P"], + muzeum: ["U400Z101P", "U400Z102P", "U400Z121P", "U400Z122P"], + "nadrazi-holesovice": ["U115Z101P", "U115Z102P"], + "nadrazi-veleslavin": ["U462Z101P", "U462Z102P"], + "namesti-miru": ["U476Z101P", "U476Z102P"], + "namesti-republiky": ["U480Z101P", "U480Z102P"], + "narodni-trida": ["U539Z101P", "U539Z102P"], + "nemocnice-motol": ["U306Z101P"], + "nove-butovice": ["U602Z101P", "U602Z102P"], + opatov: ["U106Z101P", "U106Z102P"], + palmovka: ["U529Z101P", "U529Z102P"], + pankrac: ["U385Z101P", "U385Z102P"], + petriny: ["U507Z101P", "U507Z102P"], + "prazskeho-povstani": ["U597Z101P", "U597Z102P"], + prosek: ["U603Z101P", "U603Z102P"], + radlicka: ["U957Z101P", "U957Z102P"], + "rajska-zahrada": ["U818Z101P", "U818Z102P"], + roztyly: ["U601Z101P", "U601Z102P"], + skalka: ["U953Z101P", "U953Z102P"], + "smichovske-nadrazi": ["U458Z101P", "U458Z102P"], + staromestska: ["U703Z101P", "U703Z102P"], + stodulky: ["U1140Z101P", "U1140Z102P"], + strasnicka: ["U713Z101P", "U713Z102P"], + strizkov: ["U332Z101P", "U332Z102P"], + vltavska: ["U100Z101P", "U100Z102P"], + vysocanska: ["U474Z101P", "U474Z102P"], + vysehrad: ["U527Z101P", "U527Z102P"], + zlicin: ["U1141Z102P"], + zelivskeho: ["U921Z101P", "U921Z102P"], } satisfies Record; diff --git a/backend-nest/src/data/platforms.ts b/backend-nest/src/data/platforms.ts index 03f394fe..2500f69f 100644 --- a/backend-nest/src/data/platforms.ts +++ b/backend-nest/src/data/platforms.ts @@ -1,121 +1,121 @@ export const platformIDs = [ - 'U1040Z101P', - 'U1040Z102P', - 'U157Z101P', - 'U157Z102P', - 'U50Z101P', - 'U50Z102P', - 'U897Z101P', - 'U510Z101P', - 'U510Z102P', - 'U321Z101P', - 'U321Z102P', - 'U1071Z101P', - 'U1071Z102P', - 'U118Z101P', - 'U118Z102P', - 'U689Z101P', - 'U689Z102P', - 'U689Z121P', - 'U689Z122P', - 'U286Z101P', - 'U142Z101P', - 'U142Z102P', - 'U135Z101P', - 'U135Z102P', - 'U163Z101P', - 'U163Z102P', - 'U1154Z101P', - 'U1154Z102P', - 'U52Z102P', - 'U52Z101P', - 'U190Z101P', - 'U190Z102P', - 'U655Z101P', - 'U655Z102P', - 'U685Z101P', - 'U685Z102P', - 'U209Z101P', - 'U209Z102P', - 'U228Z101P', - 'U228Z102P', - 'U237Z101P', - 'U237Z102P', - 'U675Z101P', - 'U675Z102P', - 'U75Z101P', - 'U75Z102P', - 'U758Z101P', - 'U758Z102P', - 'U78Z101P', - 'U78Z102P', - 'U1000Z102P', - 'U1007Z101P', - 'U1007Z102P', - 'U258Z101P', - 'U258Z102P', - 'U360Z101P', - 'U360Z102P', - 'U1072Z101P', - 'U1072Z102P', - 'U1072Z121P', - 'U1072Z122P', - 'U400Z101P', - 'U400Z102P', - 'U400Z121P', - 'U400Z122P', - 'U115Z101P', - 'U115Z102P', - 'U462Z101P', - 'U462Z102P', - 'U476Z101P', - 'U476Z102P', - 'U480Z101P', - 'U480Z102P', - 'U539Z101P', - 'U539Z102P', - 'U306Z101P', - 'U602Z101P', - 'U602Z102P', - 'U106Z101P', - 'U106Z102P', - 'U529Z101P', - 'U529Z102P', - 'U385Z101P', - 'U385Z102P', - 'U507Z101P', - 'U507Z102P', - 'U597Z101P', - 'U597Z102P', - 'U603Z101P', - 'U603Z102P', - 'U957Z101P', - 'U957Z102P', - 'U818Z101P', - 'U818Z102P', - 'U601Z101P', - 'U601Z102P', - 'U953Z101P', - 'U953Z102P', - 'U458Z101P', - 'U458Z102P', - 'U703Z101P', - 'U703Z102P', - 'U1140Z101P', - 'U1140Z102P', - 'U713Z101P', - 'U713Z102P', - 'U332Z101P', - 'U332Z102P', - 'U100Z101P', - 'U100Z102P', - 'U474Z101P', - 'U474Z102P', - 'U527Z101P', - 'U527Z102P', - 'U1141Z102P', - 'U921Z101P', - 'U921Z102P', + "U1040Z101P", + "U1040Z102P", + "U157Z101P", + "U157Z102P", + "U50Z101P", + "U50Z102P", + "U897Z101P", + "U510Z101P", + "U510Z102P", + "U321Z101P", + "U321Z102P", + "U1071Z101P", + "U1071Z102P", + "U118Z101P", + "U118Z102P", + "U689Z101P", + "U689Z102P", + "U689Z121P", + "U689Z122P", + "U286Z101P", + "U142Z101P", + "U142Z102P", + "U135Z101P", + "U135Z102P", + "U163Z101P", + "U163Z102P", + "U1154Z101P", + "U1154Z102P", + "U52Z102P", + "U52Z101P", + "U190Z101P", + "U190Z102P", + "U655Z101P", + "U655Z102P", + "U685Z101P", + "U685Z102P", + "U209Z101P", + "U209Z102P", + "U228Z101P", + "U228Z102P", + "U237Z101P", + "U237Z102P", + "U675Z101P", + "U675Z102P", + "U75Z101P", + "U75Z102P", + "U758Z101P", + "U758Z102P", + "U78Z101P", + "U78Z102P", + "U1000Z102P", + "U1007Z101P", + "U1007Z102P", + "U258Z101P", + "U258Z102P", + "U360Z101P", + "U360Z102P", + "U1072Z101P", + "U1072Z102P", + "U1072Z121P", + "U1072Z122P", + "U400Z101P", + "U400Z102P", + "U400Z121P", + "U400Z122P", + "U115Z101P", + "U115Z102P", + "U462Z101P", + "U462Z102P", + "U476Z101P", + "U476Z102P", + "U480Z101P", + "U480Z102P", + "U539Z101P", + "U539Z102P", + "U306Z101P", + "U602Z101P", + "U602Z102P", + "U106Z101P", + "U106Z102P", + "U529Z101P", + "U529Z102P", + "U385Z101P", + "U385Z102P", + "U507Z101P", + "U507Z102P", + "U597Z101P", + "U597Z102P", + "U603Z101P", + "U603Z102P", + "U957Z101P", + "U957Z102P", + "U818Z101P", + "U818Z102P", + "U601Z101P", + "U601Z102P", + "U953Z101P", + "U953Z102P", + "U458Z101P", + "U458Z102P", + "U703Z101P", + "U703Z102P", + "U1140Z101P", + "U1140Z102P", + "U713Z101P", + "U713Z102P", + "U332Z101P", + "U332Z102P", + "U100Z101P", + "U100Z102P", + "U474Z101P", + "U474Z102P", + "U527Z101P", + "U527Z102P", + "U1141Z102P", + "U921Z101P", + "U921Z102P", ] as const satisfies `U${number}Z${number}P`[]; export type PlatformID = (typeof platformIDs)[number]; diff --git a/backend-nest/src/main.ts b/backend-nest/src/main.ts index 7d4c1629..00a0a454 100644 --- a/backend-nest/src/main.ts +++ b/backend-nest/src/main.ts @@ -1,8 +1,8 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; +import { NestFactory } from "@nestjs/core"; +import { AppModule } from "./app.module"; async function bootstrap() { - const app = await NestFactory.create(AppModule); - await app.listen(3001); + const app = await NestFactory.create(AppModule); + await app.listen(3001); } bootstrap(); diff --git a/backend-nest/src/metro/__test__/metro.controller.spec.ts b/backend-nest/src/metro/__test__/metro.controller.spec.ts index 27fdf54a..f645ed3d 100644 --- a/backend-nest/src/metro/__test__/metro.controller.spec.ts +++ b/backend-nest/src/metro/__test__/metro.controller.spec.ts @@ -1,18 +1,18 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { MetroController } from '../metro.controller'; +import { Test, TestingModule } from "@nestjs/testing"; +import { MetroController } from "../metro.controller"; -describe('MetroController', () => { - let controller: MetroController; +describe("MetroController", () => { + let controller: MetroController; - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [MetroController], - }).compile(); + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MetroController], + }).compile(); - controller = module.get(MetroController); - }); + controller = module.get(MetroController); + }); - it('should be defined', () => { - expect(controller).toBeDefined(); - }); + it("should be defined", () => { + expect(controller).toBeDefined(); + }); }); diff --git a/backend-nest/src/metro/metro.controller.ts b/backend-nest/src/metro/metro.controller.ts index 8e8ddb36..956b8483 100644 --- a/backend-nest/src/metro/metro.controller.ts +++ b/backend-nest/src/metro/metro.controller.ts @@ -1,137 +1,139 @@ import { - Controller, - Get, - HttpException, - HttpStatus, - Query, -} from '@nestjs/common'; -import { parseMetroStation } from '../validation/metro-station'; + Controller, + Get, + HttpException, + HttpStatus, + Query, +} from "@nestjs/common"; +import { parseMetroStation } from "../validation/metro-station"; import { - platformsByMetroStation, - titleByMetroStation, -} from '../data/metro-stations'; -import { parseQueryParam } from '../utils/query-params'; -import { group, unique } from 'radash'; -import { platformIDs } from '../data/platforms'; -import type { MetroStationName } from '../data/metro-stations'; -import type { PlatformID } from '../data/platforms'; -import type { MetroLine, Timestamp } from '../types/types'; + platformsByMetroStation, + titleByMetroStation, +} from "../data/metro-stations"; +import { parseQueryParam } from "../utils/query-params"; +import { group, unique } from "radash"; +import { platformIDs } from "../data/platforms"; +import type { MetroStationName } from "../data/metro-stations"; +import type { PlatformID } from "../data/platforms"; +import type { MetroLine, Timestamp } from "../types/types"; import { - getDelayInSeconds, - getGolemioHeaders, - GOLEMIO_ENDPOINT, -} from '../utils/fetch'; + getDelayInSeconds, + getGolemioHeaders, + GOLEMIO_ENDPOINT, +} from "../utils/fetch"; -const ERROR_MSG = `Invalid "station" parameter. Supported stations: ${Object.keys(titleByMetroStation).join(', ')}`; +const ERROR_MSG = `Invalid "station" parameter. Supported stations: ${Object.keys(titleByMetroStation).join(", ")}`; const MAX_STATIONS = 10; type DepartureResponse = { - heading: MetroStationName; - line: MetroLine; - departure: string; - delay: number | null; // seconds - platform: PlatformID; + heading: MetroStationName; + line: MetroLine; + departure: string; + delay: number | null; // seconds + platform: PlatformID; }; type GetMetroResponse = { - [key in PlatformID]?: DepartureResponse[]; + [key in PlatformID]?: DepartureResponse[]; }; -@Controller('metro') +@Controller("metro") export class MetroController { - @Get() - async getMetroDepartures( - @Query('station') station?: string | string[], - ): Promise { - if (!station) { - throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); - } + @Get() + async getMetroDepartures( + @Query("station") station?: string | string[], + ): Promise { + if (!station) { + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); + } - const stations = parseQueryParam(station); - if (!stations.length) { - throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); - } + const stations = parseQueryParam(station); + if (!stations.length) { + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); + } - const parsedStations = stations.map(parseMetroStation); - if (parsedStations.includes(null)) { - throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); - } else if (parsedStations.length > MAX_STATIONS) { - throw new HttpException( - `Too many stations. Maximum is ${MAX_STATIONS}.`, - HttpStatus.BAD_REQUEST, - ); - } + const parsedStations = stations.map(parseMetroStation); + if (parsedStations.includes(null)) { + throw new HttpException(ERROR_MSG, HttpStatus.BAD_REQUEST); + } else if (parsedStations.length > MAX_STATIONS) { + throw new HttpException( + `Too many stations. Maximum is ${MAX_STATIONS}.`, + HttpStatus.BAD_REQUEST, + ); + } - const res = await getDepartures( - parsedStations.flatMap((station) => platformsByMetroStation[station]), - ); + const res = await getDepartures( + parsedStations.flatMap( + (station) => platformsByMetroStation[station], + ), + ); - if (!res) { - throw new HttpException( - 'Failed to fetch data.', - HttpStatus.INTERNAL_SERVER_ERROR, - ); - } + if (!res) { + throw new HttpException( + "Failed to fetch data.", + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } - return res; - } + return res; + } } type GolemioResponse = { - stops: { - stop_id: PlatformID; - stop_name: MetroStationName; - }[]; - departures: { - arrival_timestamp: Timestamp; - route: { - short_name: MetroLine; - }; - stop: { - id: string; - }; - delay: { - is_available: boolean; - minutes: number | undefined; - seconds: number | undefined; - }; - departure_timestamp: Timestamp; - trip: { - headsign: MetroStationName; - }; - }[]; + stops: { + stop_id: PlatformID; + stop_name: MetroStationName; + }[]; + departures: { + arrival_timestamp: Timestamp; + route: { + short_name: MetroLine; + }; + stop: { + id: string; + }; + delay: { + is_available: boolean; + minutes: number | undefined; + seconds: number | undefined; + }; + departure_timestamp: Timestamp; + trip: { + headsign: MetroStationName; + }; + }[]; }; const getDepartures = async ( - platforms: PlatformID[], + platforms: PlatformID[], ): Promise => { - const uniquePlatforms = unique(platforms); - if (!uniquePlatforms.every((id) => platformIDs.includes(id))) { - return null; - } + const uniquePlatforms = unique(platforms); + if (!uniquePlatforms.every((id) => platformIDs.includes(id))) { + return null; + } - const res = await fetch( - new URL( - `${GOLEMIO_ENDPOINT}?order=real&${uniquePlatforms.map((id) => `ids[]=${id}`).join('&')}`, - ), - { - method: 'GET', - headers: getGolemioHeaders(), - }, - ); + const res = await fetch( + new URL( + `${GOLEMIO_ENDPOINT}?order=real&${uniquePlatforms.map((id) => `ids[]=${id}`).join("&")}`, + ), + { + method: "GET", + headers: getGolemioHeaders(), + }, + ); - const parsedRes: GolemioResponse = await res.json(); - const parsedDepartures = parsedRes.departures.map((departure) => { - const { delay, departure_timestamp, trip, route, stop } = departure; + const parsedRes: GolemioResponse = await res.json(); + const parsedDepartures = parsedRes.departures.map((departure) => { + const { delay, departure_timestamp, trip, route, stop } = departure; - return { - delay: getDelayInSeconds(delay), - departure: departure_timestamp.predicted, - heading: trip.headsign, - line: route.short_name, - platform: stop.id as PlatformID, - }; - }); + return { + delay: getDelayInSeconds(delay), + departure: departure_timestamp.predicted, + heading: trip.headsign, + line: route.short_name, + platform: stop.id as PlatformID, + }; + }); - return group(parsedDepartures, (departure) => departure.platform); + return group(parsedDepartures, (departure) => departure.platform); }; diff --git a/backend-nest/src/types/types.ts b/backend-nest/src/types/types.ts index 517980f0..48d42357 100644 --- a/backend-nest/src/types/types.ts +++ b/backend-nest/src/types/types.ts @@ -1,12 +1,12 @@ -export type MetroLine = 'A' | 'B' | 'C'; +export type MetroLine = "A" | "B" | "C"; export type Timestamp = { - predicted: string; - scheduled: string; + predicted: string; + scheduled: string; }; export type Delay = { - is_available?: unknown; - minutes?: unknown; - seconds?: unknown; + is_available?: unknown; + minutes?: unknown; + seconds?: unknown; }; diff --git a/backend-nest/src/utils/__test__/fetch.spec.ts b/backend-nest/src/utils/__test__/fetch.spec.ts index b015f207..6d64ccf1 100644 --- a/backend-nest/src/utils/__test__/fetch.spec.ts +++ b/backend-nest/src/utils/__test__/fetch.spec.ts @@ -1,56 +1,56 @@ -import { getDelayInSeconds } from '../fetch'; - -describe('getDelayInSeconds', () => { - it('should return 0 when delay is undefined', () => { - expect(getDelayInSeconds(undefined)).toBe(0); - }); - - it('should return 0 when delay is null', () => { - expect(getDelayInSeconds(null)).toBe(0); - }); - - it('should return seconds when delay contains seconds only', () => { - const delay = { seconds: 30 }; - expect(getDelayInSeconds(delay)).toBe(30); - }); - - it('should return minutes converted to seconds when delay contains minutes only', () => { - const delay = { minutes: 2 }; - expect(getDelayInSeconds(delay)).toBe(120); // 2 minutes = 120 seconds - }); - - it('should return combined seconds and minutes when both are present in delay', () => { - const delay = { seconds: 45, minutes: 1 }; - expect(getDelayInSeconds(delay)).toBe(105); // 1 minute + 45 seconds = 60 + 45 = 105 seconds - }); - - it('should return 0 when delay is an empty object', () => { - const delay = {}; - expect(getDelayInSeconds(delay)).toBe(0); - }); - - it('should return 0 when delay seconds and minutes are not numbers', () => { - const delay = { seconds: 'invalid', minutes: 'invalid' }; - expect(getDelayInSeconds(delay)).toBe(0); - }); - - it('should handle negative seconds correctly', () => { - const delay = { seconds: -15 }; - expect(getDelayInSeconds(delay)).toBe(-15); // Negative seconds should be returned as negative - }); - - it('should handle negative minutes correctly', () => { - const delay = { minutes: -1 }; - expect(getDelayInSeconds(delay)).toBe(-60); // Negative minutes should convert to negative seconds - }); - - it('should handle combined negative values correctly', () => { - const delay = { seconds: -30, minutes: -1 }; - expect(getDelayInSeconds(delay)).toBe(-90); // Combined negative values should sum as negative seconds - }); - - it('should handle negative seconds and positive minutes correctly', () => { - const delay = { seconds: -30, minutes: 2 }; - expect(getDelayInSeconds(delay)).toBe(90); // 2 minutes should override negative seconds - }); +import { getDelayInSeconds } from "../fetch"; + +describe("getDelayInSeconds", () => { + it("should return 0 when delay is undefined", () => { + expect(getDelayInSeconds(undefined)).toBe(0); + }); + + it("should return 0 when delay is null", () => { + expect(getDelayInSeconds(null)).toBe(0); + }); + + it("should return seconds when delay contains seconds only", () => { + const delay = { seconds: 30 }; + expect(getDelayInSeconds(delay)).toBe(30); + }); + + it("should return minutes converted to seconds when delay contains minutes only", () => { + const delay = { minutes: 2 }; + expect(getDelayInSeconds(delay)).toBe(120); // 2 minutes = 120 seconds + }); + + it("should return combined seconds and minutes when both are present in delay", () => { + const delay = { seconds: 45, minutes: 1 }; + expect(getDelayInSeconds(delay)).toBe(105); // 1 minute + 45 seconds = 60 + 45 = 105 seconds + }); + + it("should return 0 when delay is an empty object", () => { + const delay = {}; + expect(getDelayInSeconds(delay)).toBe(0); + }); + + it("should return 0 when delay seconds and minutes are not numbers", () => { + const delay = { seconds: "invalid", minutes: "invalid" }; + expect(getDelayInSeconds(delay)).toBe(0); + }); + + it("should handle negative seconds correctly", () => { + const delay = { seconds: -15 }; + expect(getDelayInSeconds(delay)).toBe(-15); // Negative seconds should be returned as negative + }); + + it("should handle negative minutes correctly", () => { + const delay = { minutes: -1 }; + expect(getDelayInSeconds(delay)).toBe(-60); // Negative minutes should convert to negative seconds + }); + + it("should handle combined negative values correctly", () => { + const delay = { seconds: -30, minutes: -1 }; + expect(getDelayInSeconds(delay)).toBe(-90); // Combined negative values should sum as negative seconds + }); + + it("should handle negative seconds and positive minutes correctly", () => { + const delay = { seconds: -30, minutes: 2 }; + expect(getDelayInSeconds(delay)).toBe(90); // 2 minutes should override negative seconds + }); }); diff --git a/backend-nest/src/utils/__test__/remove-diacritics.spec.ts b/backend-nest/src/utils/__test__/remove-diacritics.spec.ts index 3bbf43f9..c32f86cd 100644 --- a/backend-nest/src/utils/__test__/remove-diacritics.spec.ts +++ b/backend-nest/src/utils/__test__/remove-diacritics.spec.ts @@ -1,33 +1,33 @@ -import { removeDiacritics } from '../remove-diacritics'; +import { removeDiacritics } from "../remove-diacritics"; -describe('removeDiacritics', () => { - it('should remove diacritics from a string', () => { - const input = 'áéíóúüñãç'; - const expected = 'aeiouunac'; - expect(removeDiacritics(input)).toBe(expected); - }); +describe("removeDiacritics", () => { + it("should remove diacritics from a string", () => { + const input = "áéíóúüñãç"; + const expected = "aeiouunac"; + expect(removeDiacritics(input)).toBe(expected); + }); - it('should handle empty string', () => { - const input = ''; - const expected = ''; - expect(removeDiacritics(input)).toBe(expected); - }); + it("should handle empty string", () => { + const input = ""; + const expected = ""; + expect(removeDiacritics(input)).toBe(expected); + }); - it('should handle string without diacritics', () => { - const input = 'abcdef'; - const expected = 'abcdef'; - expect(removeDiacritics(input)).toBe(expected); - }); + it("should handle string without diacritics", () => { + const input = "abcdef"; + const expected = "abcdef"; + expect(removeDiacritics(input)).toBe(expected); + }); - it('should handle mixed string with and without diacritics', () => { - const input = 'áéí123óú456üñ789ãç'; - const expected = 'aei123ou456un789ac'; - expect(removeDiacritics(input)).toBe(expected); - }); + it("should handle mixed string with and without diacritics", () => { + const input = "áéí123óú456üñ789ãç"; + const expected = "aei123ou456un789ac"; + expect(removeDiacritics(input)).toBe(expected); + }); - it('should handle string with multiple occurrences of the same diacritic', () => { - const input = 'ááááá'; - const expected = 'aaaaa'; - expect(removeDiacritics(input)).toBe(expected); - }); + it("should handle string with multiple occurrences of the same diacritic", () => { + const input = "ááááá"; + const expected = "aaaaa"; + expect(removeDiacritics(input)).toBe(expected); + }); }); diff --git a/backend-nest/src/utils/fetch.ts b/backend-nest/src/utils/fetch.ts index 2db6f018..3d275f23 100644 --- a/backend-nest/src/utils/fetch.ts +++ b/backend-nest/src/utils/fetch.ts @@ -1,30 +1,30 @@ -import { Delay } from 'src/types/types'; +import { Delay } from "src/types/types"; export const GOLEMIO_ENDPOINT = new URL( - '/v2/pid/departureboards', - 'https://api.golemio.cz', + "/v2/pid/departureboards", + "https://api.golemio.cz", ); export const getGolemioHeaders = () => { - return new Headers({ - 'Content-Type': 'application/json', - 'X-Access-Token': process.env.GOLEMIO_API_KEY, - }); + return new Headers({ + "Content-Type": "application/json", + "X-Access-Token": process.env.GOLEMIO_API_KEY, + }); }; export const getDelayInSeconds = (delay?: Delay | null): number => { - if (!delay) { - return 0; - } + if (!delay) { + return 0; + } - let seconds = 0; + let seconds = 0; - if (typeof delay?.seconds === 'number') { - seconds += delay.seconds; - } - if (typeof delay?.minutes === 'number') { - seconds += delay.minutes * 60; - } + if (typeof delay?.seconds === "number") { + seconds += delay.seconds; + } + if (typeof delay?.minutes === "number") { + seconds += delay.minutes * 60; + } - return seconds; + return seconds; }; diff --git a/backend-nest/src/utils/query-params.ts b/backend-nest/src/utils/query-params.ts index 1e3588d4..e1881167 100644 --- a/backend-nest/src/utils/query-params.ts +++ b/backend-nest/src/utils/query-params.ts @@ -1,21 +1,21 @@ export const parseQueryParam = ( - param: string | string[] | undefined, + param: string | string[] | undefined, ): string[] | null => { - if (!param) { - return null; - } + if (!param) { + return null; + } - if (param instanceof Array) { - return param.length === 0 ? null : param; - } + if (param instanceof Array) { + return param.length === 0 ? null : param; + } - if (param.startsWith('[') && param.endsWith(']')) { - try { - return JSON.parse(param); - } catch { - return param.slice(1, -1).split(','); + if (param.startsWith("[") && param.endsWith("]")) { + try { + return JSON.parse(param); + } catch { + return param.slice(1, -1).split(","); + } } - } - return [param]; + return [param]; }; diff --git a/backend-nest/src/utils/remove-diacritics.ts b/backend-nest/src/utils/remove-diacritics.ts index 146834bb..07442e56 100644 --- a/backend-nest/src/utils/remove-diacritics.ts +++ b/backend-nest/src/utils/remove-diacritics.ts @@ -1,3 +1,3 @@ export const removeDiacritics = (str: string): string => { - return str.normalize('NFD').replace(/\p{Diacritic}/gu, ''); + return str.normalize("NFD").replace(/\p{Diacritic}/gu, ""); }; diff --git a/backend-nest/src/validation/metro-station.ts b/backend-nest/src/validation/metro-station.ts index a57dff4c..5ec6b3f1 100644 --- a/backend-nest/src/validation/metro-station.ts +++ b/backend-nest/src/validation/metro-station.ts @@ -1,20 +1,20 @@ -import { titleByMetroStation, MetroStation } from '../data/metro-stations'; -import { removeDiacritics } from '../utils/remove-diacritics'; +import { titleByMetroStation, MetroStation } from "../data/metro-stations"; +import { removeDiacritics } from "../utils/remove-diacritics"; export const parseMetroStation = ( - station: string | undefined, + station: string | undefined, ): MetroStation | null => { - if (!station) { - return null; - } + if (!station) { + return null; + } - const parsed = removeDiacritics( - station.toLowerCase().replaceAll(' ', '-').replaceAll('.', ''), - ); + const parsed = removeDiacritics( + station.toLowerCase().replaceAll(" ", "-").replaceAll(".", ""), + ); - if (parsed in titleByMetroStation) { - return parsed as MetroStation; - } + if (parsed in titleByMetroStation) { + return parsed as MetroStation; + } - return null; + return null; }; diff --git a/backend-nest/test/app.e2e-spec.ts b/backend-nest/test/app.e2e-spec.ts index 50cda623..bca77fda 100644 --- a/backend-nest/test/app.e2e-spec.ts +++ b/backend-nest/test/app.e2e-spec.ts @@ -1,24 +1,24 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; -import { AppModule } from './../src/app.module'; +import { Test, TestingModule } from "@nestjs/testing"; +import { INestApplication } from "@nestjs/common"; +import * as request from "supertest"; +import { AppModule } from "./../src/app.module"; -describe('AppController (e2e)', () => { - let app: INestApplication; +describe("AppController (e2e)", () => { + let app: INestApplication; - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); - app = moduleFixture.createNestApplication(); - await app.init(); - }); + app = moduleFixture.createNestApplication(); + await app.init(); + }); - it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); - }); + it("/ (GET)", () => { + return request(app.getHttpServer()) + .get("/") + .expect(200) + .expect("Hello World!"); + }); }); diff --git a/backend-nest/test/jest-e2e.json b/backend-nest/test/jest-e2e.json index e9d912f3..055b528d 100644 --- a/backend-nest/test/jest-e2e.json +++ b/backend-nest/test/jest-e2e.json @@ -1,9 +1,9 @@ { - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } } diff --git a/backend-nest/tsconfig.build.json b/backend-nest/tsconfig.build.json index 64f86c6b..aed3485a 100644 --- a/backend-nest/tsconfig.build.json +++ b/backend-nest/tsconfig.build.json @@ -1,4 +1,4 @@ { - "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] } diff --git a/backend-nest/tsconfig.json b/backend-nest/tsconfig.json index 95f5641c..dd264f7e 100644 --- a/backend-nest/tsconfig.json +++ b/backend-nest/tsconfig.json @@ -1,21 +1,21 @@ { - "compilerOptions": { - "module": "commonjs", - "declaration": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "target": "ES2021", - "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", - "incremental": true, - "skipLibCheck": true, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false - } + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } } diff --git a/turbo.json b/turbo.json index 9a35cb3b..7513079b 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,6 @@ { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env"], - "experimentalUI": true, "pipeline": { "build": { "outputs": [".next/**", "!.next/cache/**", "^build"], @@ -17,28 +16,28 @@ "persistent": true }, "//#format:swift": { - "cache": true, + "cache": false, "inputs": ["**/**.swift"] }, "//#format:prettier": { - "cache": true, + "cache": false, "inputs": ["!app/**", "!**/node_modules/**"] }, "//#format:swift:check": { - "cache": true, + "cache": false, "inputs": ["**/**.swift"] }, "//#format:prettier:check": { - "cache": true, + "cache": false, "inputs": ["!app/**", "!**/node_modules/**"] }, "format": { "dependsOn": ["//#format:swift", "//#format:prettier"], - "cache": true + "cache": false }, "format:check": { "dependsOn": ["//#format:swift:check", "//#format:prettier:check"], - "cache": true + "cache": false }, "precommit": { "dependsOn": ["format", "build", "typecheck"]