From 7923ba1b8de85e61d89a51d0a27fd8271a5f4bbf Mon Sep 17 00:00:00 2001 From: Marco Chan Date: Thu, 3 Sep 2026 10:13:02 +0800 Subject: [PATCH] feat: initialize ingest-api with Koa and telemetry handling - Create ingest-api with Koa framework for handling device telemetry. - Implement telemetry ingestion with MongoDB, Redis, and PostgreSQL. - Add API endpoints for telemetry and health checks. - Set up testing with Vitest for unit and end-to-end tests. - Configure Prettier and ESLint for code formatting and linting. - Create Docker Compose setup for PostgreSQL, MongoDB, and Redis services. - Establish contracts package for shared Zod schemas and TypeScript types. - Implement React frontend with device status and greeting functionalities. - Add VS Code setup documentation for onboarding developers. --- .env.example | 7 + .vscode/launch.json | 20 +- .vscode/tasks.json | 26 +- README.md | 39 +- apps/api/README.md | 114 - apps/api/nest-cli.json | 8 - apps/api/package.json | 48 - apps/api/src/app.controller.spec.ts | 22 - apps/api/src/app.controller.ts | 12 - apps/api/src/app.module.ts | 10 - apps/api/src/app.service.ts | 8 - apps/api/src/main.ts | 12 - apps/api/test/app.e2e-spec.ts | 29 - apps/api/vitest.config.ts | 13 - apps/crud-api/README.md | 3 + apps/{api => crud-api}/oxlint.json | 0 apps/crud-api/package.json | 36 + apps/crud-api/src/app.spec.ts | 52 + apps/crud-api/src/app.ts | 40 + apps/crud-api/src/db/schema.ts | 8 + apps/crud-api/src/env.ts | 6 + apps/crud-api/src/main.ts | 22 + apps/crud-api/src/status.ts | 49 + apps/crud-api/src/stores.ts | 86 + apps/crud-api/test/app.e2e-spec.ts | 15 + apps/{api => crud-api}/tsconfig.build.json | 3 +- apps/{api => crud-api}/tsconfig.json | 6 +- apps/{api => crud-api}/vitest.config.e2e.ts | 2 - apps/crud-api/vitest.config.ts | 9 + apps/{api => ingest-api}/.prettierrc | 0 apps/ingest-api/README.md | 3 + apps/ingest-api/oxlint.json | 10 + apps/ingest-api/package.json | 40 + apps/ingest-api/src/app.spec.ts | 38 + apps/ingest-api/src/app.ts | 39 + apps/ingest-api/src/env.ts | 7 + apps/ingest-api/src/main.ts | 22 + apps/ingest-api/src/stores.ts | 100 + apps/ingest-api/test/app.e2e-spec.ts | 18 + apps/ingest-api/tsconfig.build.json | 9 + apps/ingest-api/tsconfig.json | 20 + apps/ingest-api/vitest.config.e2e.ts | 9 + apps/ingest-api/vitest.config.ts | 9 + apps/web/package.json | 12 +- apps/web/src/App.tsx | 145 +- apps/web/src/api/client.ts | 17 + apps/web/src/index.css | 112 +- apps/web/src/main.tsx | 11 +- apps/web/src/pages/DevicesPage.tsx | 104 + apps/web/src/pages/GreetingPage.tsx | 48 + apps/web/src/store/device-slice.ts | 92 + apps/web/src/store/greeting-slice.ts | 92 + apps/web/src/store/hooks.ts | 5 + apps/web/src/store/index.ts | 13 + apps/web/vite.config.ts | 9 +- docker-compose.yml | 36 + docs/architecture.md | 93 + docs/express-sql-to-monorepo-guide.md | 41 +- docs/vscode-setup/README.md | 149 + docs/vscode-setup/fresh-grad-checklist.md | 33 + infra/postgres/init.sql | 6 + package.json | 14 +- packages/contracts/README.md | 5 + packages/contracts/package.json | 12 + packages/contracts/src/device-status.ts | 20 + packages/contracts/src/greeting.ts | 12 + packages/contracts/src/index.ts | 4 + packages/contracts/src/presence.ts | 4 + packages/contracts/src/telemetry.ts | 11 + yarn.lock | 4390 +++++++------------ 70 files changed, 3085 insertions(+), 3434 deletions(-) create mode 100644 .env.example delete mode 100644 apps/api/README.md delete mode 100644 apps/api/nest-cli.json delete mode 100644 apps/api/package.json delete mode 100644 apps/api/src/app.controller.spec.ts delete mode 100644 apps/api/src/app.controller.ts delete mode 100644 apps/api/src/app.module.ts delete mode 100644 apps/api/src/app.service.ts delete mode 100644 apps/api/src/main.ts delete mode 100644 apps/api/test/app.e2e-spec.ts delete mode 100644 apps/api/vitest.config.ts create mode 100644 apps/crud-api/README.md rename apps/{api => crud-api}/oxlint.json (100%) create mode 100644 apps/crud-api/package.json create mode 100644 apps/crud-api/src/app.spec.ts create mode 100644 apps/crud-api/src/app.ts create mode 100644 apps/crud-api/src/db/schema.ts create mode 100644 apps/crud-api/src/env.ts create mode 100644 apps/crud-api/src/main.ts create mode 100644 apps/crud-api/src/status.ts create mode 100644 apps/crud-api/src/stores.ts create mode 100644 apps/crud-api/test/app.e2e-spec.ts rename apps/{api => crud-api}/tsconfig.build.json (76%) rename apps/{api => crud-api}/tsconfig.json (79%) rename apps/{api => crud-api}/vitest.config.e2e.ts (67%) create mode 100644 apps/crud-api/vitest.config.ts rename apps/{api => ingest-api}/.prettierrc (100%) create mode 100644 apps/ingest-api/README.md create mode 100644 apps/ingest-api/oxlint.json create mode 100644 apps/ingest-api/package.json create mode 100644 apps/ingest-api/src/app.spec.ts create mode 100644 apps/ingest-api/src/app.ts create mode 100644 apps/ingest-api/src/env.ts create mode 100644 apps/ingest-api/src/main.ts create mode 100644 apps/ingest-api/src/stores.ts create mode 100644 apps/ingest-api/test/app.e2e-spec.ts create mode 100644 apps/ingest-api/tsconfig.build.json create mode 100644 apps/ingest-api/tsconfig.json create mode 100644 apps/ingest-api/vitest.config.e2e.ts create mode 100644 apps/ingest-api/vitest.config.ts create mode 100644 apps/web/src/api/client.ts create mode 100644 apps/web/src/pages/DevicesPage.tsx create mode 100644 apps/web/src/pages/GreetingPage.tsx create mode 100644 apps/web/src/store/device-slice.ts create mode 100644 apps/web/src/store/greeting-slice.ts create mode 100644 apps/web/src/store/hooks.ts create mode 100644 apps/web/src/store/index.ts create mode 100644 docker-compose.yml create mode 100644 docs/architecture.md create mode 100644 docs/vscode-setup/README.md create mode 100644 docs/vscode-setup/fresh-grad-checklist.md create mode 100644 infra/postgres/init.sql create mode 100644 packages/contracts/README.md create mode 100644 packages/contracts/package.json create mode 100644 packages/contracts/src/device-status.ts create mode 100644 packages/contracts/src/greeting.ts create mode 100644 packages/contracts/src/index.ts create mode 100644 packages/contracts/src/presence.ts create mode 100644 packages/contracts/src/telemetry.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..178638f --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +DATABASE_URL=postgres://app:app@127.0.0.1:5432/app +MONGO_URL=mongodb://127.0.0.1:27017/app +REDIS_URL=redis://127.0.0.1:6379 +CRUD_PORT=3000 +INGEST_PORT=3001 +VITE_API_BASE_URL=http://127.0.0.1:3000 +VITE_INGEST_BASE_URL=http://127.0.0.1:3001 diff --git a/.vscode/launch.json b/.vscode/launch.json index c6bd74d..98c53f4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,16 +2,24 @@ "version": "0.2.0", "configurations": [ { - "name": "API: Attach Nest (9229)", + "name": "CRUD: Attach Express (9229)", "type": "node", "request": "attach", "port": 9229, "restart": true, - "preLaunchTask": "api:debug", + "preLaunchTask": "crud:debug", "cwd": "${workspaceFolder}", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] + }, + { + "name": "Ingest: Attach Koa (9230)", + "type": "node", + "request": "attach", + "port": 9230, + "restart": true, + "preLaunchTask": "ingest:debug", + "cwd": "${workspaceFolder}", + "skipFiles": ["/**"] }, { "name": "Web: Chrome (Vite 5173)", @@ -26,7 +34,7 @@ { "name": "Full Stack Debug", "configurations": [ - "API: Attach Nest (9229)", + "CRUD: Attach Express (9229)", "Web: Chrome (Vite 5173)" ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 9d9da9a..8fafdda 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,9 +2,9 @@ "version": "2.0.0", "tasks": [ { - "label": "api:debug", + "label": "crud:debug", "type": "shell", - "command": "yarn workspace api start:debug", + "command": "yarn workspace crud-api start:debug", "isBackground": true, "problemMatcher": { "owner": "custom", @@ -14,8 +14,26 @@ }, "background": { "activeOnStart": true, - "beginsPattern": "Starting compilation in watch mode", - "endsPattern": "Watching for file changes" + "beginsPattern": "^.*$", + "endsPattern": "(Debugger listening|crud-api listening)" + } + } + }, + { + "label": "ingest:debug", + "type": "shell", + "command": "yarn workspace ingest-api start:debug", + "isBackground": true, + "problemMatcher": { + "owner": "custom", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(?!x)x$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "^.*$", + "endsPattern": "(Debugger listening|ingest-api listening)" } } }, diff --git a/README.md b/README.md index 96501d0..f90deca 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,35 @@ # marco-trest-test -Internal onboarding workspace for learning and testing the private `trest` package. +Onboarding template: device ingest (Koa) vs user CRUD (Express), shared Zod contracts, Compose for Postgres / Mongo / Redis. -## Start Here +## Layout -1. Read [docs/trest-onboarding.md](docs/trest-onboarding.md) for full setup instructions. -2. Follow [docs/trest-test-plan.md](docs/trest-test-plan.md) to validate installation and basic usage. -3. If you are new to Yarn, read [docs/yarn-basics-cheatsheet.md](docs/yarn-basics-cheatsheet.md). -4. If you come from Express + SQL background, read [docs/express-sql-to-monorepo-guide.md](docs/express-sql-to-monorepo-guide.md). +```text +packages/contracts Zod only +apps/ingest-api Koa POST /telemetry +apps/crud-api Express GET /greeting GET /devices/:id/status +apps/web React + Redux + axios + Tailwind +``` -## Goal +Read [docs/architecture.md](docs/architecture.md) for the mermaid diagrams and the dual-write warning. -By the end of this onboarding, you should be able to: +## Start -- Access the private repository in Gitea. -- Install `trest` in a local sandbox project. -- Run a small smoke test and a few behavior checks. -- Document what worked, what failed, and open questions for the team. +```bash +docker compose up -d +yarn install +yarn dev:crud +yarn dev:ingest +yarn dev:web +``` +- UI: http://127.0.0.1:5173/devices +- Greeting: http://127.0.0.1:5173/greeting +- Express: http://127.0.0.1:3000/greeting?name=Marco +- Ingest: `POST http://127.0.0.1:3001/telemetry` + +Frontend-only install (no Mongo/Koa): + +```bash +yarn workspaces focus web +``` diff --git a/apps/api/README.md b/apps/api/README.md deleted file mode 100644 index f9df83f..0000000 --- a/apps/api/README.md +++ /dev/null @@ -1,114 +0,0 @@ -

- 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 -Discord -Backers on Open Collective -Sponsors on Open Collective - Donate us - Support us - Follow us on Twitter -

- - -## Description - -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. - -## Project setup - -```bash -$ yarn install -``` - -## Compile and run the project - -```bash -# development -$ yarn run start - -# watch mode -$ yarn run start:dev - -# production mode -$ yarn run start:prod -``` - -## Run tests - -```bash -# unit tests -$ yarn run test - -# e2e tests -$ yarn run test:e2e - -# test coverage -$ yarn run test:cov -``` - -## Deployment - -When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information. - -If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps: - -```bash -$ yarn install -g @nestjs/mau -$ mau deploy -``` - -With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure. - -## Observability - -In production applications, observability is essential for understanding how your system behaves, detecting issues early, and maintaining reliable performance. - -[NestJS Observe](https://observe.nestjs.com) automatically instruments your NestJS application, giving you deep visibility into your system with minimal setup: - -- **Distributed tracing:** Follow requests across services and understand how they flow through your system. -- **Waterfall analysis:** Visualize request execution and identify slow operations, bottlenecks, and unexpected delays. -- **Performance analysis:** Analyze application performance in real time and quickly pinpoint areas that need optimization. -- **Metrics:** Track key application and infrastructure metrics to understand system health and performance trends. -- **Logging:** Centralize and correlate logs with traces and other telemetry to make debugging easier. -- **Error tracking:** Detect errors quickly and investigate their root causes with the surrounding context. -- **SLA monitoring:** Track service-level objectives and identify when your application is approaching or exceeding defined thresholds. -- **Alarms and alerts:** Set up alerts for critical errors, performance degradation, SLA violations, and other anomalies so your team can react quickly. - -## Resources - -Check out a few resources that may come in handy when working with NestJS: - -- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework. -- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy). -- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/). -- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks. -- Auto-instrument your application with [NestJS Observer](https://observer.nestjs.com). Distributed tracing, metrics, and logging made easy. Error tracking and performance monitoring for your NestJS applications. -- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com). -- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com). -- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs). -- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com). - -## 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://twitter.com/kammysliwiec) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE). diff --git a/apps/api/nest-cli.json b/apps/api/nest-cli.json deleted file mode 100644 index f9aa683..0000000 --- a/apps/api/nest-cli.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/nest-cli", - "collection": "@nestjs/schematics", - "sourceRoot": "src", - "compilerOptions": { - "deleteOutDir": true - } -} diff --git a/apps/api/package.json b/apps/api/package.json deleted file mode 100644 index ef6229b..0000000 --- a/apps/api/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "api", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "type": "module", - "scripts": { - "build": "nest build", - "deploy": "nest deploy", - "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": "oxlint src/ test/", - "test": "vitest run", - "test:watch": "vitest", - "test:cov": "vitest run --coverage", - "test:debug": "vitest --inspect-brk --no-file-parallelism", - "test:e2e": "vitest run --config ./vitest.config.e2e.ts" - }, - "dependencies": { - "@nestjs/common": "^12.0.1", - "@nestjs/core": "^12.0.1", - "@nestjs/platform-fastify": "^12.0.1", - "fastify": "^5.12.1", - "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.2" - }, - "devDependencies": { - "@nestjs/cli": "^12.0.0", - "@nestjs/mau": "^0.2.6", - "@nestjs/schematics": "^12.0.0", - "@nestjs/testing": "^12.0.1", - "@types/node": "^24.0.0", - "@types/supertest": "^7.0.0", - "@vitest/coverage-v8": "^4.1.2", - "oxlint": "^1.58.0", - "prettier": "^3.4.2", - "source-map-support": "^0.5.21", - "supertest": "^7.0.0", - "typescript": "^6.0.2", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^4.1.2" - } -} diff --git a/apps/api/src/app.controller.spec.ts b/apps/api/src/app.controller.spec.ts deleted file mode 100644 index 82ef017..0000000 --- a/apps/api/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller.js'; -import { AppService } from './app.service.js'; - -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/apps/api/src/app.controller.ts b/apps/api/src/app.controller.ts deleted file mode 100644 index 22fbf4d..0000000 --- a/apps/api/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service.js'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts deleted file mode 100644 index b4ca839..0000000 --- a/apps/api/src/app.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller.js'; -import { AppService } from './app.service.js'; - -@Module({ - imports: [], - controllers: [AppController], - providers: [AppService], -}) -export class AppModule {} diff --git a/apps/api/src/app.service.ts b/apps/api/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/apps/api/src/app.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts deleted file mode 100644 index 0977273..0000000 --- a/apps/api/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NestFactory } from '@nestjs/core'; -import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; -import { AppModule } from './app.module.js'; - -async function bootstrap() { -const app = await NestFactory.create( -AppModule, -new FastifyAdapter(), -); -await app.listen(process.env.PORT ?? 3000, '0.0.0.0'); -} -await bootstrap(); diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts deleted file mode 100644 index fd20981..0000000 --- a/apps/api/test/app.e2e-spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import request from 'supertest'; -import { App } from 'supertest/types'; -import { AppModule } from './../src/app.module.js'; - -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!'); - }); - - afterEach(async () => { - await app.close(); - }); -}); diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts deleted file mode 100644 index 9384f47..0000000 --- a/apps/api/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'vitest/config'; -import tsconfigPaths from 'vite-tsconfig-paths'; - -export default defineConfig({ - // Resolves the path aliases declared in tsconfig.json, including the ones - // added by `nest g library`. - plugins: [tsconfigPaths()], - test: { - globals: true, - root: './', - include: ['**/*.spec.ts'], - }, -}); diff --git a/apps/crud-api/README.md b/apps/crud-api/README.md new file mode 100644 index 0000000..073cdb2 --- /dev/null +++ b/apps/crud-api/README.md @@ -0,0 +1,3 @@ +# crud-api + +Express + Drizzle. User-facing HTTP. Reads `device_current_state` from Postgres and optional Redis presence. Does not accept device telemetry. diff --git a/apps/api/oxlint.json b/apps/crud-api/oxlint.json similarity index 100% rename from apps/api/oxlint.json rename to apps/crud-api/oxlint.json diff --git a/apps/crud-api/package.json b/apps/crud-api/package.json new file mode 100644 index 0000000..dc8480c --- /dev/null +++ b/apps/crud-api/package.json @@ -0,0 +1,36 @@ +{ + "name": "crud-api", + "version": "0.0.1", + "private": true, + "license": "UNLICENSED", + "type": "module", + "scripts": { + "build": "tsc -p tsconfig.build.json", + "start": "tsx src/main.ts", + "start:dev": "tsx watch src/main.ts", + "start:debug": "tsx watch --inspect=9229 src/main.ts", + "lint": "oxlint src/ test/", + "test": "vitest run", + "test:e2e": "vitest run --config ./vitest.config.e2e.ts" + }, + "dependencies": { + "contracts": "workspace:*", + "cors": "^2", + "drizzle-orm": "^0.44.5", + "express": "^4", + "ioredis": "^5", + "pg": "^8" + }, + "devDependencies": { + "@types/cors": "^2", + "@types/express": "^4", + "@types/node": "^24.0.0", + "@types/pg": "^8", + "@types/supertest": "^7.0.0", + "oxlint": "^1.58.0", + "supertest": "^7.0.0", + "tsx": "^4", + "typescript": "^6.0.2", + "vitest": "^4.1.2" + } +} diff --git a/apps/crud-api/src/app.spec.ts b/apps/crud-api/src/app.spec.ts new file mode 100644 index 0000000..af7931f --- /dev/null +++ b/apps/crud-api/src/app.spec.ts @@ -0,0 +1,52 @@ +import request from 'supertest'; +import { emptyStatus, toDeviceStatus } from './status.js'; +import { createApp } from './app.js'; +import { createMemoryStores } from './stores.js'; + +describe('crud-api', () => { + const app = createApp(createMemoryStores()); + + it('returns Hello World on GET /', async () => { + await request(app).get('/').expect(200).expect('Hello World!'); + }); + + it('returns a greeting on GET /greeting', async () => { + await request(app) + .get('/greeting') + .query({ name: 'Marco' }) + .expect(200) + .expect({ message: 'Hello, Marco' }); + }); + + it('rejects an empty greeting name', async () => { + await request(app).get('/greeting').query({ name: '' }).expect(400); + }); + + it('returns missing status when the device is unknown', async () => { + const response = await request(app).get('/devices/dev-1/status').expect(200); + expect(response.body.postgres.source).toBe('missing'); + expect(response.body.redis.online).toBe(false); + }); + + it('returns postgres snapshot from the store', async () => { + const lastSeen = new Date(); + const appWithSeed = createApp( + createMemoryStores({ + 'dev-1': { + postgres: toDeviceStatus({ + deviceId: 'dev-1', + lastSeen, + payload: { temp: 21 }, + source: 'postgres', + }), + redis: emptyStatus('dev-1').redis, + }, + }), + ); + + const response = await request(appWithSeed).get('/devices/dev-1/status').expect(200); + expect(response.body.postgres.online).toBe(true); + expect(response.body.postgres.payload).toEqual({ temp: 21 }); + expect(response.body.postgres.source).toBe('postgres'); + }); +}); diff --git a/apps/crud-api/src/app.ts b/apps/crud-api/src/app.ts new file mode 100644 index 0000000..1c2f5ed --- /dev/null +++ b/apps/crud-api/src/app.ts @@ -0,0 +1,40 @@ +import cors from 'cors'; +import { + deviceStatusPairSchema, + greetingOutputSchema, + greetingQuerySchema, +} from 'contracts'; +import express from 'express'; +import { createDeviceStores, type DeviceStores } from './stores.js'; + +export function createApp(stores: DeviceStores = createDeviceStores()): express.Express { + const app = express(); + + app.use(cors()); + app.use(express.json()); + + app.get('/', (_req, res) => { + res.type('text/plain').send('Hello World!'); + }); + + app.get('/greeting', (req, res) => { + const parsed = greetingQuerySchema.safeParse({ + name: typeof req.query.name === 'string' ? req.query.name : '', + }); + + if (!parsed.success) { + res.status(400).json({ error: parsed.error.flatten() }); + return; + } + + res.json(greetingOutputSchema.parse({ message: `Hello, ${parsed.data.name}` })); + }); + + app.get('/devices/:id/status', async (req, res) => { + const deviceId = req.params.id; + const pair = deviceStatusPairSchema.parse(await stores.readStatus(deviceId)); + res.json(pair); + }); + + return app; +} diff --git a/apps/crud-api/src/db/schema.ts b/apps/crud-api/src/db/schema.ts new file mode 100644 index 0000000..d6fcfbf --- /dev/null +++ b/apps/crud-api/src/db/schema.ts @@ -0,0 +1,8 @@ +import { jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core'; + +export const deviceCurrentState = pgTable('device_current_state', { + deviceId: text('device_id').primaryKey(), + payload: jsonb('payload').$type>().notNull(), + lastSeen: timestamp('last_seen', { withTimezone: true }).notNull(), + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull(), +}); diff --git a/apps/crud-api/src/env.ts b/apps/crud-api/src/env.ts new file mode 100644 index 0000000..58b20cb --- /dev/null +++ b/apps/crud-api/src/env.ts @@ -0,0 +1,6 @@ +export const env = { + databaseUrl: process.env.DATABASE_URL ?? 'postgres://app:app@127.0.0.1:5432/app', + redisUrl: process.env.REDIS_URL ?? 'redis://127.0.0.1:6379', + port: Number(process.env.CRUD_PORT ?? process.env.PORT ?? 3000), + host: process.env.HOST ?? '0.0.0.0', +}; diff --git a/apps/crud-api/src/main.ts b/apps/crud-api/src/main.ts new file mode 100644 index 0000000..d4e9e8b --- /dev/null +++ b/apps/crud-api/src/main.ts @@ -0,0 +1,22 @@ +import { createApp } from './app.js'; +import { env } from './env.js'; +import { createDeviceStores } from './stores.js'; + +const stores = createDeviceStores(); +const app = createApp(stores); + +const server = app.listen(env.port, env.host, () => { + console.log(`crud-api listening on http://${env.host}:${env.port}`); +}); + +async function shutdown() { + server.close(); + await stores.close(); +} + +process.on('SIGINT', () => { + void shutdown().then(() => process.exit(0)); +}); +process.on('SIGTERM', () => { + void shutdown().then(() => process.exit(0)); +}); diff --git a/apps/crud-api/src/status.ts b/apps/crud-api/src/status.ts new file mode 100644 index 0000000..f5fa794 --- /dev/null +++ b/apps/crud-api/src/status.ts @@ -0,0 +1,49 @@ +import { + PRESENCE_TTL_SECONDS, + type DeviceStatus, + type DeviceStatusPair, +} from 'contracts'; + +export function redisKey(deviceId: string): string { + return `device:${deviceId}`; +} + +export function toDeviceStatus(input: { + deviceId: string; + lastSeen: Date | null; + payload: Record; + source: DeviceStatus['source']; + now?: Date; +}): DeviceStatus { + const now = input.now ?? new Date(); + const ageMs = + input.lastSeen === null ? null : Math.max(0, now.getTime() - input.lastSeen.getTime()); + const withinTtl = ageMs !== null && ageMs <= PRESENCE_TTL_SECONDS * 1000; + const missing = input.lastSeen === null; + + return { + deviceId: input.deviceId, + lastSeen: input.lastSeen?.toISOString() ?? null, + payload: input.payload, + online: !missing && withinTtl, + source: missing ? 'missing' : input.source, + ageMs, + }; +} + +export function emptyStatus(deviceId: string): DeviceStatusPair { + return { + postgres: toDeviceStatus({ + deviceId, + lastSeen: null, + payload: {}, + source: 'postgres', + }), + redis: toDeviceStatus({ + deviceId, + lastSeen: null, + payload: {}, + source: 'redis', + }), + }; +} diff --git a/apps/crud-api/src/stores.ts b/apps/crud-api/src/stores.ts new file mode 100644 index 0000000..7595e4f --- /dev/null +++ b/apps/crud-api/src/stores.ts @@ -0,0 +1,86 @@ +import { eq } from 'drizzle-orm'; +import { drizzle } from 'drizzle-orm/node-postgres'; +import Redis from 'ioredis'; +import pg from 'pg'; +import type { DeviceStatusPair } from 'contracts'; +import { env } from './env.js'; +import { deviceCurrentState } from './db/schema.js'; +import { emptyStatus, redisKey, toDeviceStatus } from './status.js'; + +export type DeviceStores = { + readStatus(deviceId: string): Promise; + close(): Promise; +}; + +type RedisSnapshot = { + lastSeen: string; + payload: Record; +}; + +export function createDeviceStores(): DeviceStores { + const pool = new pg.Pool({ connectionString: env.databaseUrl }); + const db = drizzle(pool); + const redis = new Redis(env.redisUrl, { maxRetriesPerRequest: 1, lazyConnect: true }); + + return { + async readStatus(deviceId: string): Promise { + const pair = emptyStatus(deviceId); + + try { + const rows = await db + .select() + .from(deviceCurrentState) + .where(eq(deviceCurrentState.deviceId, deviceId)) + .limit(1); + const row = rows[0]; + if (row) { + pair.postgres = toDeviceStatus({ + deviceId, + lastSeen: row.lastSeen, + payload: row.payload, + source: 'postgres', + }); + } + } catch (error) { + console.error('postgres status read failed', error); + } + + try { + if (redis.status === 'wait') { + await redis.connect(); + } + const raw = await redis.get(redisKey(deviceId)); + if (raw) { + const snapshot = JSON.parse(raw) as RedisSnapshot; + pair.redis = toDeviceStatus({ + deviceId, + lastSeen: new Date(snapshot.lastSeen), + payload: snapshot.payload ?? {}, + source: 'redis', + }); + } + } catch (error) { + console.error('redis status read failed', error); + } + + return pair; + }, + + async close() { + await Promise.allSettled([pool.end(), redis.quit()]); + }, + }; +} + +export function createMemoryStores( + seed: Partial> = {}, +): DeviceStores { + return { + async readStatus(deviceId: string) { + return seed[deviceId] ?? emptyStatus(deviceId); + }, + async close() { + return; + }, + }; +} diff --git a/apps/crud-api/test/app.e2e-spec.ts b/apps/crud-api/test/app.e2e-spec.ts new file mode 100644 index 0000000..ff38ab6 --- /dev/null +++ b/apps/crud-api/test/app.e2e-spec.ts @@ -0,0 +1,15 @@ +import request from 'supertest'; +import { createApp } from '../src/app.js'; +import { createMemoryStores } from '../src/stores.js'; + +describe('crud-api (e2e)', () => { + const app = createApp(createMemoryStores()); + + it('GET /greeting', async () => { + await request(app) + .get('/greeting') + .query({ name: 'Marco' }) + .expect(200) + .expect({ message: 'Hello, Marco' }); + }); +}); diff --git a/apps/api/tsconfig.build.json b/apps/crud-api/tsconfig.build.json similarity index 76% rename from apps/api/tsconfig.build.json rename to apps/crud-api/tsconfig.build.json index 2eafee0..1908675 100644 --- a/apps/api/tsconfig.build.json +++ b/apps/crud-api/tsconfig.build.json @@ -1,7 +1,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "rootDir": "./src" + "rootDir": "./src", + "types": ["node"] }, "include": ["src"], "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] diff --git a/apps/api/tsconfig.json b/apps/crud-api/tsconfig.json similarity index 79% rename from apps/api/tsconfig.json rename to apps/crud-api/tsconfig.json index 8109c41..ddd2ba7 100644 --- a/apps/api/tsconfig.json +++ b/apps/crud-api/tsconfig.json @@ -7,8 +7,6 @@ "isolatedModules": true, "declaration": true, "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2023", "sourceMap": true, @@ -16,7 +14,7 @@ "incremental": true, "skipLibCheck": true, "strict": true, - "strictPropertyInitialization": false, "types": ["vitest/globals", "node"] - } + }, + "include": ["src", "test"] } diff --git a/apps/api/vitest.config.e2e.ts b/apps/crud-api/vitest.config.e2e.ts similarity index 67% rename from apps/api/vitest.config.e2e.ts rename to apps/crud-api/vitest.config.e2e.ts index b5b532c..fcfd7ce 100644 --- a/apps/api/vitest.config.e2e.ts +++ b/apps/crud-api/vitest.config.e2e.ts @@ -1,8 +1,6 @@ import { defineConfig } from 'vitest/config'; -import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [tsconfigPaths()], test: { globals: true, root: './', diff --git a/apps/crud-api/vitest.config.ts b/apps/crud-api/vitest.config.ts new file mode 100644 index 0000000..fc0a1b0 --- /dev/null +++ b/apps/crud-api/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + root: './', + include: ['**/*.spec.ts'], + }, +}); diff --git a/apps/api/.prettierrc b/apps/ingest-api/.prettierrc similarity index 100% rename from apps/api/.prettierrc rename to apps/ingest-api/.prettierrc diff --git a/apps/ingest-api/README.md b/apps/ingest-api/README.md new file mode 100644 index 0000000..7d4b219 --- /dev/null +++ b/apps/ingest-api/README.md @@ -0,0 +1,3 @@ +# ingest-api + +Koa device ingest. `POST /telemetry` writes raw events to Mongo, a TTL key to Redis, and upserts `device_current_state` in Postgres. Dual-write is a demo shortcut — production should derive Redis/Postgres from a queue. diff --git a/apps/ingest-api/oxlint.json b/apps/ingest-api/oxlint.json new file mode 100644 index 0000000..07ec3bd --- /dev/null +++ b/apps/ingest-api/oxlint.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/crates/oxc_linter/src/rules.rs", + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-floating-promises": "warn" + }, + "env": { + "node": true + } +} diff --git a/apps/ingest-api/package.json b/apps/ingest-api/package.json new file mode 100644 index 0000000..522f232 --- /dev/null +++ b/apps/ingest-api/package.json @@ -0,0 +1,40 @@ +{ + "name": "ingest-api", + "version": "0.0.1", + "description": "Koa device ingest API", + "private": true, + "license": "UNLICENSED", + "type": "module", + "scripts": { + "build": "tsc -p tsconfig.build.json", + "start": "tsx src/main.ts", + "start:dev": "tsx watch src/main.ts", + "start:debug": "tsx watch --inspect=9230 src/main.ts", + "lint": "oxlint src/ test/", + "test": "vitest run", + "test:e2e": "vitest run --config ./vitest.config.e2e.ts" + }, + "dependencies": { + "@koa/cors": "^5.0.0", + "@koa/router": "^12", + "contracts": "workspace:*", + "ioredis": "^5", + "koa": "^2", + "koa-body": "^6", + "mongodb": "^6", + "pg": "^8" + }, + "devDependencies": { + "@types/koa": "^2", + "@types/koa__cors": "^5.0.1", + "@types/koa__router": "^12", + "@types/node": "^24.0.0", + "@types/pg": "^8", + "@types/supertest": "^7.0.0", + "oxlint": "^1.58.0", + "supertest": "^7.0.0", + "tsx": "^4", + "typescript": "^6.0.2", + "vitest": "^4.1.2" + } +} diff --git a/apps/ingest-api/src/app.spec.ts b/apps/ingest-api/src/app.spec.ts new file mode 100644 index 0000000..3d1d814 --- /dev/null +++ b/apps/ingest-api/src/app.spec.ts @@ -0,0 +1,38 @@ +import request from 'supertest'; +import type { TelemetryIngest } from 'contracts'; +import { createApp } from './app.js'; +import { createMemoryWriter } from './stores.js'; + +describe('ingest-api', () => { + const writes: TelemetryIngest[] = []; + const app = createApp(createMemoryWriter(writes)); + + it('GET /', async () => { + await request(app.callback()).get('/').expect(200).expect('ingest-api'); + }); + + it('accepts telemetry', async () => { + writes.length = 0; + const body = { + deviceId: 'dev-1', + sentAt: new Date().toISOString(), + payload: { temp: 21 }, + }; + + await request(app.callback()) + .post('/telemetry') + .send(body) + .expect(200) + .expect({ + accepted: true, + writes: { mongo: true, redis: true, postgres: true }, + }); + + expect(writes).toHaveLength(1); + expect(writes[0]?.deviceId).toBe('dev-1'); + }); + + it('rejects invalid telemetry', async () => { + await request(app.callback()).post('/telemetry').send({ deviceId: '' }).expect(400); + }); +}); diff --git a/apps/ingest-api/src/app.ts b/apps/ingest-api/src/app.ts new file mode 100644 index 0000000..96a3e8a --- /dev/null +++ b/apps/ingest-api/src/app.ts @@ -0,0 +1,39 @@ +import cors from '@koa/cors'; +import Router from '@koa/router'; +import { telemetryIngestSchema } from 'contracts'; +import Koa from 'koa'; +import { koaBody } from 'koa-body'; +import { createTelemetryWriter, type TelemetryWriter } from './stores.js'; + +export function createApp(writer: TelemetryWriter = createTelemetryWriter()): Koa { + const app = new Koa(); + const router = new Router(); + + app.use(cors()); + app.use(koaBody()); + + router.get('/', (ctx) => { + ctx.body = 'ingest-api'; + }); + + router.get('/health', (ctx) => { + ctx.body = { ok: true }; + }); + + router.post('/telemetry', async (ctx) => { + const parsed = telemetryIngestSchema.safeParse(ctx.request.body); + if (!parsed.success) { + ctx.status = 400; + ctx.body = { error: parsed.error.flatten() }; + return; + } + + const writes = await writer.write(parsed.data); + ctx.body = { accepted: true, writes }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + return app; +} diff --git a/apps/ingest-api/src/env.ts b/apps/ingest-api/src/env.ts new file mode 100644 index 0000000..6ebfc46 --- /dev/null +++ b/apps/ingest-api/src/env.ts @@ -0,0 +1,7 @@ +export const env = { + databaseUrl: process.env.DATABASE_URL ?? 'postgres://app:app@127.0.0.1:5432/app', + mongoUrl: process.env.MONGO_URL ?? 'mongodb://127.0.0.1:27017/app', + redisUrl: process.env.REDIS_URL ?? 'redis://127.0.0.1:6379', + port: Number(process.env.INGEST_PORT ?? process.env.PORT ?? 3001), + host: process.env.HOST ?? '0.0.0.0', +}; diff --git a/apps/ingest-api/src/main.ts b/apps/ingest-api/src/main.ts new file mode 100644 index 0000000..7246bf0 --- /dev/null +++ b/apps/ingest-api/src/main.ts @@ -0,0 +1,22 @@ +import { createApp } from './app.js'; +import { env } from './env.js'; +import { createTelemetryWriter } from './stores.js'; + +const writer = createTelemetryWriter(); +const app = createApp(writer); + +const server = app.listen(env.port, env.host, () => { + console.log(`ingest-api listening on http://${env.host}:${env.port}`); +}); + +async function shutdown() { + server.close(); + await writer.close(); +} + +process.on('SIGINT', () => { + void shutdown().then(() => process.exit(0)); +}); +process.on('SIGTERM', () => { + void shutdown().then(() => process.exit(0)); +}); diff --git a/apps/ingest-api/src/stores.ts b/apps/ingest-api/src/stores.ts new file mode 100644 index 0000000..41dec26 --- /dev/null +++ b/apps/ingest-api/src/stores.ts @@ -0,0 +1,100 @@ +import { PRESENCE_TTL_SECONDS, type TelemetryIngest } from 'contracts'; +import Redis from 'ioredis'; +import { MongoClient } from 'mongodb'; +import pg from 'pg'; +import { env } from './env.js'; + +export type WriteReport = { + mongo: boolean; + redis: boolean; + postgres: boolean; +}; + +export type TelemetryWriter = { + write(event: TelemetryIngest): Promise; + close(): Promise; +}; + +function redisKey(deviceId: string): string { + return `device:${deviceId}`; +} + +export function createTelemetryWriter(): TelemetryWriter { + const mongo = new MongoClient(env.mongoUrl); + const redis = new Redis(env.redisUrl, { maxRetriesPerRequest: 1, lazyConnect: true }); + const pool = new pg.Pool({ connectionString: env.databaseUrl }); + let mongoReady: Promise | null = null; + + function mongoClient(): Promise { + mongoReady ??= mongo.connect(); + return mongoReady; + } + + return { + async write(event: TelemetryIngest): Promise { + const report: WriteReport = { mongo: false, redis: false, postgres: false }; + const lastSeen = new Date(event.sentAt); + + try { + const client = await mongoClient(); + await client.db().collection('telemetry').insertOne({ + deviceId: event.deviceId, + sentAt: lastSeen, + payload: event.payload, + ingestedAt: new Date(), + }); + report.mongo = true; + } catch (error) { + console.error('mongo ingest write failed', error); + } + + try { + if (redis.status === 'wait') { + await redis.connect(); + } + await redis.set( + redisKey(event.deviceId), + JSON.stringify({ lastSeen: lastSeen.toISOString(), payload: event.payload }), + 'EX', + PRESENCE_TTL_SECONDS, + ); + report.redis = true; + } catch (error) { + console.error('redis ingest write failed', error); + } + + try { + await pool.query( + `INSERT INTO device_current_state (device_id, payload, last_seen, updated_at) + VALUES ($1, $2::jsonb, $3, NOW()) + ON CONFLICT (device_id) DO UPDATE SET + payload = EXCLUDED.payload, + last_seen = EXCLUDED.last_seen, + updated_at = NOW()`, + [event.deviceId, JSON.stringify(event.payload), lastSeen], + ); + report.postgres = true; + } catch (error) { + console.error('postgres ingest write failed', error); + } + + return report; + }, + + async close() { + await Promise.allSettled([mongo.close(), redis.quit(), pool.end()]); + }, + }; +} + +export function createMemoryWriter(writes: TelemetryIngest[] = []): TelemetryWriter { + return { + async write(event: TelemetryIngest) { + writes.push(event); + return { mongo: true, redis: true, postgres: true }; + }, + async close() { + return; + }, + }; +} diff --git a/apps/ingest-api/test/app.e2e-spec.ts b/apps/ingest-api/test/app.e2e-spec.ts new file mode 100644 index 0000000..cd2b529 --- /dev/null +++ b/apps/ingest-api/test/app.e2e-spec.ts @@ -0,0 +1,18 @@ +import request from 'supertest'; +import { createApp } from '../src/app.js'; +import { createMemoryWriter } from '../src/stores.js'; + +describe('ingest-api (e2e)', () => { + const app = createApp(createMemoryWriter()); + + it('POST /telemetry', async () => { + await request(app.callback()) + .post('/telemetry') + .send({ + deviceId: 'dev-1', + sentAt: new Date().toISOString(), + payload: { temp: 21 }, + }) + .expect(200); + }); +}); diff --git a/apps/ingest-api/tsconfig.build.json b/apps/ingest-api/tsconfig.build.json new file mode 100644 index 0000000..1908675 --- /dev/null +++ b/apps/ingest-api/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"], + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/ingest-api/tsconfig.json b/apps/ingest-api/tsconfig.json new file mode 100644 index 0000000..ddd2ba7 --- /dev/null +++ b/apps/ingest-api/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "nodenext", + "moduleResolution": "nodenext", + "resolvePackageJsonExports": true, + "esModuleInterop": true, + "isolatedModules": true, + "declaration": true, + "removeComments": true, + "allowSyntheticDefaultImports": true, + "target": "ES2023", + "sourceMap": true, + "outDir": "./dist", + "incremental": true, + "skipLibCheck": true, + "strict": true, + "types": ["vitest/globals", "node"] + }, + "include": ["src", "test"] +} diff --git a/apps/ingest-api/vitest.config.e2e.ts b/apps/ingest-api/vitest.config.e2e.ts new file mode 100644 index 0000000..fcfd7ce --- /dev/null +++ b/apps/ingest-api/vitest.config.e2e.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + root: './', + include: ['**/*.e2e-spec.ts'], + }, +}); diff --git a/apps/ingest-api/vitest.config.ts b/apps/ingest-api/vitest.config.ts new file mode 100644 index 0000000..fc0a1b0 --- /dev/null +++ b/apps/ingest-api/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + root: './', + include: ['**/*.spec.ts'], + }, +}); diff --git a/apps/web/package.json b/apps/web/package.json index 7e76e51..d6dece1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,13 +10,18 @@ "preview": "vite preview" }, "dependencies": { - "@ant-design/icons": "^6.3.4", - "antd": "^6.6.2", + "@reduxjs/toolkit": "^2.12.0", + "axios": "^1.20.0", + "contracts": "workspace:*", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-redux": "^9.3.0", + "react-router-dom": "^7.18.3", + "zod": "^3" }, "devDependencies": { "@eslint/js": "^10.0.1", + "@tailwindcss/vite": "^4", "@types/node": "^24.13.3", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", @@ -25,6 +30,7 @@ "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.4", "globals": "^17.11.0", + "tailwindcss": "^4", "typescript": "~6.0.2", "typescript-eslint": "^8.67.0", "vite": "^8.2.2" diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 9ca8e8d..a712c5c 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,122 +1,35 @@ -import { useState } from 'react' -import heroImg from './assets/hero.png' -import reactLogo from './assets/react.svg' -import viteLogo from './assets/vite.svg' -import './App.css' +import { NavLink, Navigate, Route, Routes } from 'react-router-dom' +import { DevicesPage } from './pages/DevicesPage' +import { GreetingPage } from './pages/GreetingPage' -function App() { - const [count, setCount] = useState(0) +const linkClass = ({ isActive }: { isActive: boolean }) => + `rounded-md px-3 py-1.5 text-sm ${ + isActive ? 'bg-slate-900 text-white' : 'text-slate-600 hover:bg-slate-200' + }` +export default function App() { return ( - <> -
-
- - React logo - Vite logo +
+
+
+ marco-trest-test +
-
-

Get started

-

- Edit src/App.tsx and save to test HMR -

-
- -
- -
- -
-
- -

Documentation

-

Your questions, answered

- -
-
- -

Connect with us

-

Join the Vite community

- -
-
- -
-
- + +
+ + } /> + } /> + } /> + +
+ ) } - -export default App diff --git a/apps/web/src/api/client.ts b/apps/web/src/api/client.ts new file mode 100644 index 0000000..16d7294 --- /dev/null +++ b/apps/web/src/api/client.ts @@ -0,0 +1,17 @@ +import axios from 'axios' + +export const api = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL ?? 'http://127.0.0.1:3000', + headers: { + Accept: 'application/json', + }, +}) + +/** Demo only — production UI must not call ingest-api. */ +export const ingestApi = axios.create({ + baseURL: import.meta.env.VITE_INGEST_BASE_URL ?? 'http://127.0.0.1:3001', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, +}) diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 5fb3313..d4b5078 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -1,111 +1 @@ -:root { - --text: #6b6375; - --text-h: #08060d; - --bg: #fff; - --border: #e5e4e7; - --code-bg: #f4f3ec; - --accent: #aa3bff; - --accent-bg: rgba(170, 59, 255, 0.1); - --accent-border: rgba(170, 59, 255, 0.5); - --social-bg: rgba(244, 243, 236, 0.5); - --shadow: - rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - - --sans: system-ui, 'Segoe UI', Roboto, sans-serif; - --heading: system-ui, 'Segoe UI', Roboto, sans-serif; - --mono: ui-monospace, Consolas, monospace; - - font: 18px/145% var(--sans); - letter-spacing: 0.18px; - color-scheme: light dark; - color: var(--text); - background: var(--bg); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - @media (max-width: 1024px) { - font-size: 16px; - } -} - -@media (prefers-color-scheme: dark) { - :root { - --text: #9ca3af; - --text-h: #f3f4f6; - --bg: #16171d; - --border: #2e303a; - --code-bg: #1f2028; - --accent: #c084fc; - --accent-bg: rgba(192, 132, 252, 0.15); - --accent-border: rgba(192, 132, 252, 0.5); - --social-bg: rgba(47, 48, 58, 0.5); - --shadow: - rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; - } - - #social .button-icon { - filter: invert(1) brightness(2); - } -} - -#root { - width: 1126px; - max-width: 100%; - margin: 0 auto; - text-align: center; - border-inline: 1px solid var(--border); - min-height: 100svh; - display: flex; - flex-direction: column; - box-sizing: border-box; -} - -body { - margin: 0; -} - -h1, -h2 { - font-family: var(--heading); - font-weight: 500; - color: var(--text-h); -} - -h1 { - font-size: 56px; - letter-spacing: -1.68px; - margin: 32px 0; - @media (max-width: 1024px) { - font-size: 36px; - margin: 20px 0; - } -} -h2 { - font-size: 24px; - line-height: 118%; - letter-spacing: -0.24px; - margin: 0 0 8px; - @media (max-width: 1024px) { - font-size: 20px; - } -} -p { - margin: 0; -} - -code, -.counter { - font-family: var(--mono); - display: inline-flex; - border-radius: 4px; - color: var(--text-h); -} - -code { - font-size: 15px; - line-height: 135%; - padding: 4px 8px; - background: var(--code-bg); -} +@import 'tailwindcss'; diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index bef5202..95bf0de 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -1,10 +1,17 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import './index.css' +import { Provider } from 'react-redux' +import { BrowserRouter } from 'react-router-dom' import App from './App.tsx' +import { store } from './store' +import './index.css' createRoot(document.getElementById('root')!).render( - + + + + + , ) diff --git a/apps/web/src/pages/DevicesPage.tsx b/apps/web/src/pages/DevicesPage.tsx new file mode 100644 index 0000000..3acb45d --- /dev/null +++ b/apps/web/src/pages/DevicesPage.tsx @@ -0,0 +1,104 @@ +import { useEffect } from 'react' +import type { DeviceStatus } from 'contracts' +import { PRESENCE_TTL_SECONDS } from 'contracts' +import { fetchDeviceStatus, pingDevice } from '../store/device-slice' +import { useAppDispatch, useAppSelector } from '../store/hooks' + +function StatusCard({ title, status }: { title: string; status: DeviceStatus | undefined }) { + if (!status) { + return ( +
+

{title}

+

No data yet.

+
+ ) + } + + return ( +
+

{title}

+
+
+
online
+
+ {status.online ? 'yes' : 'no'} +
+
+
+
source
+
{status.source}
+
+
+
age
+
{status.ageMs === null ? '—' : `${status.ageMs} ms`}
+
+
+
lastSeen
+
{status.lastSeen ?? '—'}
+
+
+
payload
+
+ {JSON.stringify(status.payload)} +
+
+
+
+ ) +} + +export function DevicesPage() { + const dispatch = useAppDispatch() + const { deviceId, pair, pinging, error } = useAppSelector((state) => state.device) + + useEffect(() => { + void dispatch(fetchDeviceStatus(deviceId)) + const timer = window.setInterval(() => { + void dispatch(fetchDeviceStatus(deviceId)) + }, 1000) + return () => window.clearInterval(timer) + }, [dispatch, deviceId]) + + return ( +
+
+

Device status

+

+ Product UI reads Express → Postgres. Redis is only a TTL presence copy. After{' '} + {PRESENCE_TTL_SECONDS}s without a ping, Redis goes empty; Postgres keeps the last row. +

+

+ Ping device talks to ingest-api — demo only. Production UI never calls the device API. +

+ + {error ? ( +

{error}

+ ) : null} +
+ +
+

Data flow

+
{`Device ping → Koa ingest :3001
+  → Mongo (raw event)
+  → Redis SET device:id EX ${PRESENCE_TTL_SECONDS}s
+  → Postgres UPSERT device_current_state
+
+React poll 1s → Express crud :3000
+  → SELECT postgres snapshot   ← near-real-time product path
+  → GET redis key              ← optional presence`}
+
+ +
+ + +
+
+ ) +} diff --git a/apps/web/src/pages/GreetingPage.tsx b/apps/web/src/pages/GreetingPage.tsx new file mode 100644 index 0000000..7c6d684 --- /dev/null +++ b/apps/web/src/pages/GreetingPage.tsx @@ -0,0 +1,48 @@ +import { fetchGreeting, setName } from '../store/greeting-slice' +import { useAppDispatch, useAppSelector } from '../store/hooks' + +export function GreetingPage() { + const dispatch = useAppDispatch() + const { name, message, status, error } = useAppSelector((state) => state.greeting) + const loading = status === 'loading' + + return ( +
+

Greeting

+

+ User lane: axios → Express GET /greeting on crud-api. Schemas come from the contracts + package. +

+
{ + event.preventDefault() + void dispatch(fetchGreeting(name)) + }} + > + + +
+ {error ? ( +

{error}

+ ) : null} + {message ? ( +

{message}

+ ) : null} +
+ ) +} diff --git a/apps/web/src/store/device-slice.ts b/apps/web/src/store/device-slice.ts new file mode 100644 index 0000000..f5eb665 --- /dev/null +++ b/apps/web/src/store/device-slice.ts @@ -0,0 +1,92 @@ +import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' +import { + DEMO_DEVICE_ID, + deviceStatusPairSchema, + telemetryIngestSchema, + type DeviceStatusPair, +} from 'contracts' +import { api, ingestApi } from '../api/client' +import { toErrorMessage } from './greeting-slice' + +export type DeviceState = { + deviceId: string + pair: DeviceStatusPair | null + status: 'idle' | 'loading' | 'succeeded' | 'failed' + pinging: boolean + error: string | null + lastPingAt: string | null +} + +const initialState: DeviceState = { + deviceId: DEMO_DEVICE_ID, + pair: null, + status: 'idle', + pinging: false, + error: null, + lastPingAt: null, +} + +export const fetchDeviceStatus = createAsyncThunk< + DeviceStatusPair, + string, + { rejectValue: string } +>('device/fetchStatus', async (deviceId, { rejectWithValue }) => { + try { + const response = await api.get(`/devices/${deviceId}/status`) + return deviceStatusPairSchema.parse(response.data) + } catch (error) { + return rejectWithValue(toErrorMessage(error)) + } +}) + +export const pingDevice = createAsyncThunk( + 'device/ping', + async (deviceId, { rejectWithValue, dispatch }) => { + try { + const body = telemetryIngestSchema.parse({ + deviceId, + sentAt: new Date().toISOString(), + payload: { temp: 20 + Math.round(Math.random() * 5), demo: true }, + }) + await ingestApi.post('/telemetry', body) + await dispatch(fetchDeviceStatus(deviceId)).unwrap() + } catch (error) { + return rejectWithValue(toErrorMessage(error)) + } + }, +) + +const deviceSlice = createSlice({ + name: 'device', + initialState, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchDeviceStatus.pending, (state) => { + state.status = 'loading' + state.error = null + }) + .addCase(fetchDeviceStatus.fulfilled, (state, action) => { + state.status = 'succeeded' + state.pair = action.payload + }) + .addCase(fetchDeviceStatus.rejected, (state, action) => { + state.status = 'failed' + state.error = action.payload ?? action.error.message ?? 'Request failed' + }) + .addCase(pingDevice.pending, (state) => { + state.pinging = true + state.error = null + }) + .addCase(pingDevice.fulfilled, (state) => { + state.pinging = false + state.lastPingAt = new Date().toISOString() + }) + .addCase(pingDevice.rejected, (state, action) => { + state.pinging = false + state.error = action.payload ?? action.error.message ?? 'Ping failed' + }) + }, +}) + +export default deviceSlice.reducer diff --git a/apps/web/src/store/greeting-slice.ts b/apps/web/src/store/greeting-slice.ts new file mode 100644 index 0000000..546422a --- /dev/null +++ b/apps/web/src/store/greeting-slice.ts @@ -0,0 +1,92 @@ +import { createAsyncThunk, createSlice, type PayloadAction } from '@reduxjs/toolkit' +import { greetingOutputSchema, greetingQuerySchema, type GreetingOutput } from 'contracts' +import { isAxiosError } from 'axios' +import { ZodError } from 'zod' +import { api } from '../api/client' + +export type GreetingStatus = 'idle' | 'loading' | 'succeeded' | 'failed' + +export type GreetingState = { + name: string + message: string | null + status: GreetingStatus + error: string | null +} + +const initialState: GreetingState = { + name: 'Marco', + message: null, + status: 'idle', + error: null, +} + +export function toErrorMessage(error: unknown): string { + if (error instanceof ZodError) { + return error.issues.map((issue) => issue.message).join(', ') + } + + if (isAxiosError(error)) { + const data = error.response?.data + if (typeof data === 'string' && data.length > 0) { + return data + } + + if (data && typeof data === 'object' && 'message' in data) { + const message = (data as { message: unknown }).message + if (typeof message === 'string' && message.length > 0) { + return message + } + } + + return error.message + } + + if (error instanceof Error) { + return error.message + } + + return 'Request failed' +} + +export const fetchGreeting = createAsyncThunk( + 'greeting/fetch', + async (name, { rejectWithValue }) => { + try { + const query = greetingQuerySchema.parse({ name }) + const response = await api.get('/greeting', { params: query }) + return greetingOutputSchema.parse(response.data) + } catch (error) { + return rejectWithValue(toErrorMessage(error)) + } + }, +) + +const greetingSlice = createSlice({ + name: 'greeting', + initialState, + reducers: { + setName(state, action: PayloadAction) { + state.name = action.payload + }, + }, + extraReducers: (builder) => { + builder + .addCase(fetchGreeting.pending, (state) => { + state.status = 'loading' + state.error = null + }) + .addCase(fetchGreeting.fulfilled, (state, action) => { + state.status = 'succeeded' + state.message = action.payload.message + state.error = null + }) + .addCase(fetchGreeting.rejected, (state, action) => { + state.status = 'failed' + state.message = null + state.error = action.payload ?? action.error.message ?? 'Request failed' + }) + }, +}) + +export const { setName } = greetingSlice.actions +export default greetingSlice.reducer diff --git a/apps/web/src/store/hooks.ts b/apps/web/src/store/hooks.ts new file mode 100644 index 0000000..1762c73 --- /dev/null +++ b/apps/web/src/store/hooks.ts @@ -0,0 +1,5 @@ +import { useDispatch, useSelector } from 'react-redux' +import type { AppDispatch, RootState } from './index' + +export const useAppDispatch = useDispatch.withTypes() +export const useAppSelector = useSelector.withTypes() diff --git a/apps/web/src/store/index.ts b/apps/web/src/store/index.ts new file mode 100644 index 0000000..1acec9a --- /dev/null +++ b/apps/web/src/store/index.ts @@ -0,0 +1,13 @@ +import { configureStore } from '@reduxjs/toolkit' +import deviceReducer from './device-slice' +import greetingReducer from './greeting-slice' + +export const store = configureStore({ + reducer: { + greeting: greetingReducer, + device: deviceReducer, + }, +}) + +export type RootState = ReturnType +export type AppDispatch = typeof store.dispatch diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 9982072..4066bd1 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,7 +1,12 @@ +import tailwindcss from '@tailwindcss/vite' import react from '@vitejs/plugin-react' import { defineConfig } from 'vite' -// https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), tailwindcss()], + server: { + fs: { + allow: ['..'], + }, + }, }) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7fcee11 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,36 @@ +services: + postgres: + image: postgres:16-alpine + environment: + POSTGRES_USER: app + POSTGRES_PASSWORD: app + POSTGRES_DB: app + ports: + - '5432:5432' + volumes: + - ./infra/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U app -d app'] + interval: 3s + timeout: 5s + retries: 20 + + mongo: + image: mongo:7 + ports: + - '27017:27017' + healthcheck: + test: ['CMD', 'mongosh', '--quiet', '--eval', "db.adminCommand('ping').ok"] + interval: 5s + timeout: 5s + retries: 20 + + redis: + image: redis:7-alpine + ports: + - '6379:6379' + healthcheck: + test: ['CMD', 'redis-cli', 'ping'] + interval: 3s + timeout: 5s + retries: 20 diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..3f9b99f --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,93 @@ +# Architecture + +Copy this layout for later device + dashboard projects. + +## Lanes + +- **Device lane:** `apps/ingest-api` (Koa) — firmware / gateways POST JSON. +- **User lane:** `apps/crud-api` (Express) — React, humans, billing later. +- **Shared types:** `packages/contracts` (Zod only). No Koa, Express, Mongo, or trest. + +Frontend people can run `yarn workspaces focus web` and do not need the private trest registry. + +## Data flow + +```mermaid +flowchart LR + subgraph devices [Device lane] + D[Device / demo ping] + I[Koa ingest-api :3001] + D -->|POST /telemetry JSON| I + end + + subgraph stores [Stores] + M[(MongoDB raw telemetry)] + R[(Redis hot key TTL)] + P[(PostgreSQL device_current_state)] + A[(PostgreSQL analytics — not in this repo)] + end + + subgraph humans [User lane] + W[React web :5173] + C[Express crud-api :3000] + W -->|axios GET /greeting GET /devices/:id/status| C + end + + I -->|insert event| M + I -->|SET device:id EX 15s| R + I -->|UPSERT current row| P + M -.->|ETL cron later| A + C -->|SELECT snapshot| P + C -->|GET device:id| R +``` + +Near-real-time product path (Postgres + Express is enough at this scale): + +```mermaid +sequenceDiagram + participant D as Device + participant I as ingest-api Koa + participant PG as Postgres + participant C as crud-api Express + participant W as React + D->>I: POST /telemetry + I->>PG: UPSERT device_current_state + W->>C: GET /devices/dev-1/status poll 1s + C->>PG: SELECT by device_id + C->>W: lastSeen payload source postgres +``` + +Redis is compared on the Devices page. It is not required for the UI to look live. + +## Demo dual-write (do not copy blindly) + +Ingest writes Mongo first, then Redis and Postgres best-effort. A 200 can still mean Redis or Postgres missed. Production should derive those from a queue. This handler is a teaching shortcut. + +Redis TTL expiry means “no recent ping.” Redis restart looks like everyone is offline. Postgres still has `device_current_state`. + +Ingest may only upsert that snapshot table. CRUD owns greeting / future users and orgs. + +Hourly Mongo → Postgres analytics is the dotted ETL box. Not implemented. + +## Ports + +| Service | Port | +| ---------- | ----- | +| crud-api | 3000 | +| ingest-api | 3001 | +| web | 5173 | +| postgres | 5432 | +| mongo | 27017 | +| redis | 6379 | + +## Run + +```bash +docker compose up -d +yarn install +yarn dev:crud +yarn dev:ingest +yarn dev:web +``` + +Open `http://127.0.0.1:5173/devices`, click **Ping dev-1**, watch Postgres and Redis columns. Wait 15s without pinging: Redis goes offline, Postgres keeps the last row. diff --git a/docs/express-sql-to-monorepo-guide.md b/docs/express-sql-to-monorepo-guide.md index 0746500..1344a63 100644 --- a/docs/express-sql-to-monorepo-guide.md +++ b/docs/express-sql-to-monorepo-guide.md @@ -1,20 +1,18 @@ -# From Express + SQL to Monorepo with Nest Fastify, Vite React, and trest +# From Express + SQL to Monorepo with Koa, Vite React, and trest -This guide is for developers who already know Express APIs and SQL, and are new to Yarn workspaces, NestJS, and private package usage. +This guide is for developers who already know Express APIs and SQL, and are new to Yarn workspaces, Koa, and private package usage. ## 1) What You Are Building Target architecture: -- Backend API: NestJS on Fastify +- Backend API: Koa + trest - Frontend: Vite + React + Ant Design -- Shared/private integration: trest in an isolated adapter package - Monorepo manager: Yarn workspaces Why this shape: -- Keep your main backend on a scalable Fastify stack. -- Evaluate trest without coupling everything to Koa ecosystem packages. +- Keep the HTTP API on Koa so it matches trest's router. - Keep one repo and one lockfile for easier onboarding. ## 2) Mental Map (Old to New) @@ -159,32 +157,22 @@ Checkpoint: - Vite app runs and Ant Design components render. -### Step F: Introduce trest Safely +### Step F: Introduce trest on the API -Recommended approach: - -- Keep trest usage in a dedicated package, for example packages/trest-adapter. -- Expose only framework-agnostic functions from that adapter. -- Avoid leaking Koa-specific types into app-wide contracts. - -Starter commands: +Install trest and its Koa peers in `apps/api`: ```bash -mkdir -p packages/trest-adapter -cd packages/trest-adapter -yarn init -y -yarn add @jig-software/trest koa @koa/router koa-body path-to-regexp zod bson +yarn workspace api add @jig-software/trest koa @koa/router koa-body path-to-regexp zod bson ``` Checkpoint: -- Importing trest from adapter works. +- `GET /greeting?name=Marco` returns a JSON greeting from the Koa app. ### Step G: Wire API and Web -- Add one simple API endpoint in Nest. -- Call endpoint from React page. -- Render response using an Ant Design component. +- Call `/greeting` from a React page. +- Render the response using an Ant Design component. Checkpoint: @@ -197,8 +185,6 @@ marco-trest-test/ apps/ api/ web/ - packages/ - trest-adapter/ docs/ package.json yarn.lock @@ -209,11 +195,10 @@ marco-trest-test/ Use these rules to avoid confusion: -1. Put backend runtime dependencies in apps/api. +1. Put Koa, trest, and other backend runtime dependencies in apps/api. 2. Put frontend runtime dependencies in apps/web. -3. Put trest boundary dependencies in packages/trest-adapter. -4. Keep root dependencies minimal and mostly tooling. -5. Run installs from root unless targeting one workspace intentionally. +3. Keep root dependencies minimal and mostly tooling. +4. Run installs from root unless targeting one workspace intentionally. ## 8) Troubleshooting You Are Likely to Hit diff --git a/docs/vscode-setup/README.md b/docs/vscode-setup/README.md new file mode 100644 index 0000000..16e2971 --- /dev/null +++ b/docs/vscode-setup/README.md @@ -0,0 +1,149 @@ +# VS Code Setup Guide + +This guide is for developers onboarding to this monorepo with Yarn workspaces, Nest API, and Vite web. + +## Goals + +- Open the workspace with correct TypeScript resolution. +- Run API and web locally from VS Code. +- Use one-click debug profiles. +- Fix common red-squiggle and startup issues quickly. + +## 1) Prerequisites + +- Node.js installed +- Corepack enabled +- Yarn available + +Quick checks: + +```bash +node -v +corepack --version +yarn -v +``` + +## 2) Open the Correct Folder + +Open the repository root folder in VS Code, not a subfolder. + +Expected top-level folders: + +- apps +- packages +- docs +- .vscode + +## 3) Install Dependencies from Root + +Run in the root folder: + +```bash +yarn install +``` + +Why: workspace metadata and PnP dependency graph are generated at root. + +## 4) Configure Yarn SDK for VS Code + +Run: + +```bash +yarn dlx @yarnpkg/sdks vscode +``` + +Then in VS Code: + +1. Open Command Palette +2. Run TypeScript: Select TypeScript Version +3. Choose Use Workspace Version +4. Run TypeScript: Restart TS Server + +This fixes most false errors like cannot find module react or asset files. + +## 5) Verify Workspace Settings + +The workspace should contain these settings: + +- typescript.tsdk points to .yarn/sdks/typescript/lib +- typescript.enablePromptUseWorkspaceTsdk is true + +If missing, rerun the SDK command in section 4. + +## 6) Start and Debug from VS Code + +Use Run and Debug with these profiles: + +- API: Attach Nest (9229) +- Web: Chrome (Vite 5173) +- Full Stack Debug + +They rely on background tasks: + +- api:debug +- web:dev + +## 7) Manual Run Commands (Fallback) + +From repo root: + +```bash +yarn workspace api start:dev +yarn workspace web dev --host 0.0.0.0 --port 5173 +``` + +## 8) Common Issues and Fixes + +### A) Package for api not found + +Cause: workspace name changed but graph not refreshed. + +Fix: + +```bash +yarn install +yarn workspaces list --json +``` + +### B) Cannot find module react, css, svg in editor + +Cause: VS Code TypeScript server not using workspace SDK. + +Fix: + +1. Run yarn dlx @yarnpkg/sdks vscode +2. Select Use Workspace Version +3. Restart TS Server +4. Reload window if needed + +### C) Peer dependency warnings after installing trest stack + +Cause: trest and Koa peers installed in wrong workspace, usually web. + +Fix: + +- Keep trest and Koa in apps/api +- Keep web dependencies frontend-only + +### D) Nest scaffold fails with schematics resolution + +Use non-interactive fallback: + +```bash +CI=1 npx -y @nestjs/cli new apps/api --skip-git --package-manager yarn --strict +``` + +## 9) Workspace Dependency Rules + +- apps/api contains Koa, trest, and other backend runtime dependencies. +- apps/web contains frontend runtime dependencies. +- root should mostly contain workspace-level tooling. + +## 10) Day-1 Validation Checklist + +- yarn install completes from root +- yarn workspaces list shows root, api, web +- API starts locally +- Web starts locally +- Full Stack Debug launches successfully +- No persistent false TypeScript module errors in editor diff --git a/docs/vscode-setup/fresh-grad-checklist.md b/docs/vscode-setup/fresh-grad-checklist.md new file mode 100644 index 0000000..13731cc --- /dev/null +++ b/docs/vscode-setup/fresh-grad-checklist.md @@ -0,0 +1,33 @@ +# Fresh Grad Checklist for VS Code Setup + +Use this in order. Do not skip steps. + +## 10-Minute Quick Path + +1. Open repo root in VS Code +2. Run yarn install at root +3. Run yarn dlx @yarnpkg/sdks vscode +4. Select TypeScript workspace version +5. Restart TypeScript server +6. Run API debug profile +7. Run Web debug profile +8. Open Full Stack Debug + +## If Something Breaks + +1. Rerun yarn install +2. Check workspace names with yarn workspaces list --json +3. Ensure api name in apps/api/package.json is correct +4. Confirm .vscode settings include typescript.tsdk +5. Reload VS Code window + +## What to Ask for Help With + +- Private registry token access issues +- Workspace naming mismatches +- Dependency added to wrong workspace +- Debug profile not attaching on port 9229 + +## Golden Rule + +When in doubt, run commands from repo root first, then target a specific workspace. diff --git a/infra/postgres/init.sql b/infra/postgres/init.sql new file mode 100644 index 0000000..ce08bab --- /dev/null +++ b/infra/postgres/init.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS device_current_state ( + device_id TEXT PRIMARY KEY, + payload JSONB NOT NULL DEFAULT '{}'::jsonb, + last_seen TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); diff --git a/package.json b/package.json index 1deb6b8..3217391 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,12 @@ "apps/*", "packages/*" ], - "dependencies": { - "@jig-software/trest": "^2.0.0-beta", - "@koa/router": "^12", - "bson": "^5", - "koa": "^2", - "koa-body": "^6", - "path-to-regexp": "^6", - "zod": "^3" + "scripts": { + "compose:up": "docker compose up -d", + "compose:down": "docker compose down", + "dev:crud": "yarn workspace crud-api start:dev", + "dev:ingest": "yarn workspace ingest-api start:dev", + "dev:web": "yarn workspace web dev --host 127.0.0.1 --port 5173" }, "devDependencies": { "typescript": "5.9.2" diff --git a/packages/contracts/README.md b/packages/contracts/README.md new file mode 100644 index 0000000..e80dd5d --- /dev/null +++ b/packages/contracts/README.md @@ -0,0 +1,5 @@ +# contracts + +Zod schemas and TypeScript types shared by ingest-api, crud-api, and web. + +This package depends on **zod only**. Do not add Koa, Express, Mongo, or trest here — the frontend workspace should stay installable with `yarn workspaces focus web`. diff --git a/packages/contracts/package.json b/packages/contracts/package.json new file mode 100644 index 0000000..0d8dcf9 --- /dev/null +++ b/packages/contracts/package.json @@ -0,0 +1,12 @@ +{ + "name": "contracts", + "private": true, + "version": "0.0.1", + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "zod": "^3" + } +} diff --git a/packages/contracts/src/device-status.ts b/packages/contracts/src/device-status.ts new file mode 100644 index 0000000..c3c4cc4 --- /dev/null +++ b/packages/contracts/src/device-status.ts @@ -0,0 +1,20 @@ +import { z } from 'zod'; + +export const deviceStatusSourceSchema = z.enum(['postgres', 'redis', 'missing']); + +export const deviceStatusSchema = z.object({ + deviceId: z.string().min(1), + lastSeen: z.string().datetime().nullable(), + payload: z.record(z.unknown()), + online: z.boolean(), + source: deviceStatusSourceSchema, + ageMs: z.number().int().nonnegative().nullable(), +}); + +export const deviceStatusPairSchema = z.object({ + postgres: deviceStatusSchema, + redis: deviceStatusSchema, +}); + +export type DeviceStatus = z.infer; +export type DeviceStatusPair = z.infer; diff --git a/packages/contracts/src/greeting.ts b/packages/contracts/src/greeting.ts new file mode 100644 index 0000000..e3a6bcc --- /dev/null +++ b/packages/contracts/src/greeting.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; + +export const greetingQuerySchema = z.object({ + name: z.string().min(1), +}); + +export const greetingOutputSchema = z.object({ + message: z.string(), +}); + +export type GreetingQuery = z.infer; +export type GreetingOutput = z.infer; diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts new file mode 100644 index 0000000..7703d2b --- /dev/null +++ b/packages/contracts/src/index.ts @@ -0,0 +1,4 @@ +export * from './device-status.js'; +export * from './greeting.js'; +export * from './presence.js'; +export * from './telemetry.js'; diff --git a/packages/contracts/src/presence.ts b/packages/contracts/src/presence.ts new file mode 100644 index 0000000..83a4129 --- /dev/null +++ b/packages/contracts/src/presence.ts @@ -0,0 +1,4 @@ +/** Redis TTL and Postgres "online" window for the demo. */ +export const PRESENCE_TTL_SECONDS = 15; + +export const DEMO_DEVICE_ID = 'dev-1'; diff --git a/packages/contracts/src/telemetry.ts b/packages/contracts/src/telemetry.ts new file mode 100644 index 0000000..7b772d0 --- /dev/null +++ b/packages/contracts/src/telemetry.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +export const telemetryPayloadSchema = z.record(z.unknown()); + +export const telemetryIngestSchema = z.object({ + deviceId: z.string().min(1), + sentAt: z.string().datetime(), + payload: telemetryPayloadSchema, +}); + +export type TelemetryIngest = z.infer; diff --git a/yarn.lock b/yarn.lock index 421e0e8..ce8c387 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,136 +5,6 @@ __metadata: version: 8 cacheKey: 10c0 -"@angular-devkit/core@npm:22.1.5": - version: 22.1.5 - resolution: "@angular-devkit/core@npm:22.1.5" - dependencies: - ajv: "npm:8.20.0" - ajv-formats: "npm:3.0.1" - jsonc-parser: "npm:3.3.1" - picomatch: "npm:4.0.5" - rxjs: "npm:7.8.2" - source-map: "npm:0.7.6" - peerDependencies: - chokidar: ^5.0.0 - peerDependenciesMeta: - chokidar: - optional: true - checksum: 10c0/fc32c22e06eb1602bc4248862690c8bc4a71aa23d204ac24c2ba7ee377a7659c7c15209b21ecf3087fa9c9f48966a866228e4cad7dcf7b7c7e6c79759455351a - languageName: node - linkType: hard - -"@angular-devkit/schematics-cli@npm:22.1.5": - version: 22.1.5 - resolution: "@angular-devkit/schematics-cli@npm:22.1.5" - dependencies: - "@angular-devkit/core": "npm:22.1.5" - "@angular-devkit/schematics": "npm:22.1.5" - "@inquirer/prompts": "npm:8.5.2" - bin: - schematics: bin/schematics.js - checksum: 10c0/9c96c7ed681d1cd64020cc097d326710348635b5310c18ee9b7198a6aabed28153b3499e09286a9016dd719349c60cadb11025cc305893805cbf80bf5199c136 - languageName: node - linkType: hard - -"@angular-devkit/schematics@npm:22.1.5": - version: 22.1.5 - resolution: "@angular-devkit/schematics@npm:22.1.5" - dependencies: - "@angular-devkit/core": "npm:22.1.5" - jsonc-parser: "npm:3.3.1" - magic-string: "npm:1.0.0" - ora: "npm:9.4.1" - rxjs: "npm:7.8.2" - checksum: 10c0/049a190d5cbd80ae152d2bfc17f80c1eb808571e36bb67fa9ec912c2936acd43e5270f88b8ddf3c688e397cbd1665ee5f9f2607f5cd6a27acd0837b4d86f1145 - languageName: node - linkType: hard - -"@ant-design/colors@npm:^8.0.1": - version: 8.0.1 - resolution: "@ant-design/colors@npm:8.0.1" - dependencies: - "@ant-design/fast-color": "npm:^3.0.0" - checksum: 10c0/6108c2204ce98dbf68682fcd04c3cba087f5316f01c6a28928eb8d7b291c23b6a5fcc9cd74af6211f7984d3ccc7e26be16ec664a9380737b46ee24fc78222e30 - languageName: node - linkType: hard - -"@ant-design/cssinjs-utils@npm:^2.1.2": - version: 2.1.2 - resolution: "@ant-design/cssinjs-utils@npm:2.1.2" - dependencies: - "@ant-design/cssinjs": "npm:^2.1.2" - "@babel/runtime": "npm:^7.23.2" - "@rc-component/util": "npm:^1.4.0" - peerDependencies: - react: ">=18" - react-dom: ">=18" - checksum: 10c0/46663c8c92e23f2fbc61682099b5ec03aa26e9bffab96be6889b310d2a58adf46758c5f9f977aa13d46ba3606cf4c64ea0bb76985bc1f4b5619b81be5849b172 - languageName: node - linkType: hard - -"@ant-design/cssinjs@npm:^2.1.2": - version: 2.1.2 - resolution: "@ant-design/cssinjs@npm:2.1.2" - dependencies: - "@babel/runtime": "npm:^7.11.1" - "@emotion/hash": "npm:^0.8.0" - "@emotion/unitless": "npm:^0.7.5" - "@rc-component/util": "npm:^1.4.0" - clsx: "npm:^2.1.1" - csstype: "npm:^3.1.3" - stylis: "npm:^4.3.4" - peerDependencies: - react: ">=16.0.0" - react-dom: ">=16.0.0" - checksum: 10c0/70d8169f1e2044bb44d6a51265a3123e8ac2018b1725ccda018b083a610afdf8e9a27e16df27ad0eaa67e85c827d5abcc8f47dd5ad448c0c8560dfcd0353aa68 - languageName: node - linkType: hard - -"@ant-design/fast-color@npm:^3.0.0, @ant-design/fast-color@npm:^3.0.1": - version: 3.0.1 - resolution: "@ant-design/fast-color@npm:3.0.1" - checksum: 10c0/bc6535351f855b1af777b9d18c5b5ca7eeb8769c1dc9cd8579408ed5284e4d6dd2d9cd192ff8110dc7a82e9dc9bc2e5c51ceeff3237c88c5464aca0e4d70eb9a - languageName: node - linkType: hard - -"@ant-design/icons-svg@npm:^4.6.0": - version: 4.6.0 - resolution: "@ant-design/icons-svg@npm:4.6.0" - checksum: 10c0/b9b8509a3fd507ee1627a9728a6ad8f86169cf640b4d07008b1c81518877198c55c74de184aeb1927e3cdd701f3cd24be80fa518f6469dda51fbace0674b3b17 - languageName: node - linkType: hard - -"@ant-design/icons@npm:^6.3.2, @ant-design/icons@npm:^6.3.4": - version: 6.3.4 - resolution: "@ant-design/icons@npm:6.3.4" - dependencies: - "@ant-design/colors": "npm:^8.0.1" - "@ant-design/icons-svg": "npm:^4.6.0" - "@rc-component/util": "npm:^1.11.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.0.0" - react-dom: ">=16.0.0" - checksum: 10c0/59343de3926bc6f3b8daa4c1022b0ff0a5774ba1d40f7a7f85ac77b338d0b3224fc028ee05d96af177bf951820249a25076c2a8cdd71baed6e228fc2e2a977b5 - languageName: node - linkType: hard - -"@ant-design/react-slick@npm:~2.0.0": - version: 2.0.0 - resolution: "@ant-design/react-slick@npm:2.0.0" - dependencies: - "@babel/runtime": "npm:^7.28.4" - clsx: "npm:^2.1.1" - json2mq: "npm:^0.2.0" - throttle-debounce: "npm:^5.0.0" - peerDependencies: - react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1aaa3aae2a9e7d06840bf620b0ac1d0de4088f969fec45ae1b1c7a16ab1e0d6d89809ec9c915fad07c8a719b447ebf5031bb53024d1a92f1ab75e3c6788ed42e - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.29.7": version: 7.29.7 resolution: "@babel/code-frame@npm:7.29.7" @@ -274,20 +144,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.24.7, @babel/runtime@npm:^7.28.4, @babel/runtime@npm:^7.29.2": - version: 7.29.7 - resolution: "@babel/runtime@npm:7.29.7" - checksum: 10c0/ca11572f7146b21e0bde6a9ed4bb6a89eafbee5f0944c7eb54d0d8a2dac962c33638a1d611e14faa71dfbb92b4b5f9236232208568a6b7d5c6f3f39ddb91771e - languageName: node - linkType: hard - -"@babel/runtime@npm:^8.0.0": - version: 8.0.0 - resolution: "@babel/runtime@npm:8.0.0" - checksum: 10c0/450857cf52b3a3935d4aad505277201361c86185dad3bdd2ae083d78b76c6265c7fc7610e170c80de1b825d5bfdcfb50697f0853fff922b2661c91cff1fbbd81 - languageName: node - linkType: hard - "@babel/template@npm:^7.29.7": version: 7.29.7 resolution: "@babel/template@npm:7.29.7" @@ -324,38 +180,213 @@ __metadata: languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^1.0.2": - version: 1.0.2 - resolution: "@bcoe/v8-coverage@npm:1.0.2" - checksum: 10c0/1eb1dc93cc17fb7abdcef21a6e7b867d6aa99a7ec88ec8207402b23d9083ab22a8011213f04b2cf26d535f1d22dc26139b7929e6c2134c254bd1e14ba5e678c3 +"@emnapi/core@npm:^1.11.1": + version: 1.11.3 + resolution: "@emnapi/core@npm:1.11.3" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.3" + tslib: "npm:^2.4.0" + checksum: 10c0/4ca08d349a82d5d2887ccc9e12df630877b0412ddcd59b9faee61e3c3947ccead27a18257a18bfe17abdf2b0709857808ad75d423ac49edd50c32fb140a7ed6e languageName: node linkType: hard -"@borewit/text-codec@npm:^0.2.1": - version: 0.2.2 - resolution: "@borewit/text-codec@npm:0.2.2" - checksum: 10c0/2d3fb132bc6a132914a8fbf8e9ff2fa1ead210ecc395b28bb7355bd7719548a5e351ffe39f21c3bee8048f6cabd99eabd404bb5cc809cad9cba25abed19d271f +"@emnapi/runtime@npm:^1.11.1": + version: 1.11.3 + resolution: "@emnapi/runtime@npm:1.11.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/a00f1020fefb9d4145c367f93a9fddb383a00da8ffd7871e20b19659890379b83aeecb9f84d7d0eda5456343f4a09eb05b0acb5153b0d3d889539dedb1ed87c3 languageName: node linkType: hard -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 +"@emnapi/wasi-threads@npm:1.2.3, @emnapi/wasi-threads@npm:^1.2.2": + version: 1.2.3 + resolution: "@emnapi/wasi-threads@npm:1.2.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/5aed84bc5dbe867973b20406ca1ed95661a4892ecaef80378fdf2d37424b3f7b9c428df8a3e1d82b783a3345a530032bf049e699e1f113ea52203c3e9b4e6ce5 languageName: node linkType: hard -"@emotion/hash@npm:^0.8.0": - version: 0.8.0 - resolution: "@emotion/hash@npm:0.8.0" - checksum: 10c0/706303d35d416217cd7eb0d36dbda4627bb8bdf4a32ea387e8dd99be11b8e0a998e10af21216e8a5fade518ad955ff06aa8890f20e694ce3a038ae7fc1000556 +"@esbuild/aix-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/aix-ppc64@npm:0.28.2" + conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@emotion/unitless@npm:^0.7.5": - version: 0.7.5 - resolution: "@emotion/unitless@npm:0.7.5" - checksum: 10c0/4d0d94f53cb97b4481bbfa394953e1899a0b877644642ba9dd7247c27eb8c48e14e22aeb11411d7d9874685ad85dd5fb5b50eb78c6d8840eb56a84b92dcef2f4 +"@esbuild/android-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm64@npm:0.28.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm@npm:0.28.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-x64@npm:0.28.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-arm64@npm:0.28.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-x64@npm:0.28.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-arm64@npm:0.28.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-x64@npm:0.28.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm64@npm:0.28.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm@npm:0.28.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ia32@npm:0.28.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-loong64@npm:0.28.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-mips64el@npm:0.28.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ppc64@npm:0.28.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-riscv64@npm:0.28.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-s390x@npm:0.28.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-x64@npm:0.28.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-arm64@npm:0.28.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-x64@npm:0.28.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-arm64@npm:0.28.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-x64@npm:0.28.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openharmony-arm64@npm:0.28.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/sunos-x64@npm:0.28.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-arm64@npm:0.28.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-ia32@npm:0.28.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-x64@npm:0.28.2" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -435,79 +466,6 @@ __metadata: languageName: node linkType: hard -"@fastify/ajv-compiler@npm:^4.0.5": - version: 4.0.6 - resolution: "@fastify/ajv-compiler@npm:4.0.6" - dependencies: - ajv: "npm:^8.12.0" - ajv-formats: "npm:^3.0.1" - fast-uri: "npm:^4.0.0" - checksum: 10c0/dfaa02348b07b2d245c2092ab96d606befe729710692852087287275eb2c67fa24eeb5561447cd16a91ec30c7ccbcb0df6c89bed63c09718c92cdfc7a322ce4b - languageName: node - linkType: hard - -"@fastify/cors@npm:11.3.0": - version: 11.3.0 - resolution: "@fastify/cors@npm:11.3.0" - dependencies: - fastify-plugin: "npm:^6.0.0" - toad-cache: "npm:^3.7.0" - checksum: 10c0/2b37bdf7f5a6c48dd329aeb1ab213514515f285969acd803c72a75a044cb2b6c30077c5d09f4c72bcf4dd5ade00adb4d34696ea9dcc0ffc39bf95e6b76a8d4b0 - languageName: node - linkType: hard - -"@fastify/error@npm:^4.0.0": - version: 4.2.0 - resolution: "@fastify/error@npm:4.2.0" - checksum: 10c0/8bdafe95b368a71dfc5644ef22e0a2412dfbb2f300cf4658fdbd9035c96d7c034c53fd7d38e1150437d9cf7a2d75e6bd05e458cf9ba5f2e47e527df8a5e0bd4e - languageName: node - linkType: hard - -"@fastify/fast-json-stringify-compiler@npm:^5.0.0": - version: 5.1.0 - resolution: "@fastify/fast-json-stringify-compiler@npm:5.1.0" - dependencies: - fast-json-stringify: "npm:^7.0.0" - checksum: 10c0/f322d262071cd6b449adcc7f3d637506f8fa274e42a98d6588efe5ea81bdf3f745f93d5e3c4101fe362608135b0ce40d9c12be3299d9f53e752c7b7fa704cbad - languageName: node - linkType: hard - -"@fastify/formbody@npm:9.0.0": - version: 9.0.0 - resolution: "@fastify/formbody@npm:9.0.0" - dependencies: - fast-querystring: "npm:^1.1.2" - fastify-plugin: "npm:^6.0.0" - checksum: 10c0/7b01d39a726219a30144af8bd4f1a21292ab6ee5716774d0c5845ca337e43a53564fbd5824d720f76db4424dec18836476e15888fc873bd39e600e80ef99a34c - languageName: node - linkType: hard - -"@fastify/forwarded@npm:^3.0.0": - version: 3.0.2 - resolution: "@fastify/forwarded@npm:3.0.2" - checksum: 10c0/7db2af5d1cc0ca2a8897be581ae790192ab6dd0abdbc93e64ea7800b4da6a01e7ffa8805d491ea1424ae1d6943eb5a5ac2b7409556bbb4bf630e7a434804192c - languageName: node - linkType: hard - -"@fastify/merge-json-schemas@npm:^0.2.0": - version: 0.2.1 - resolution: "@fastify/merge-json-schemas@npm:0.2.1" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/dfa884a8f62d53f71de273fdcd0e501b213367767a7d8c522ae87ba6fb571b3eea85175d6e019036d7c0c5419be60305abe54899b9459f76ed5333358699efcb - languageName: node - linkType: hard - -"@fastify/proxy-addr@npm:^5.0.0": - version: 5.1.0 - resolution: "@fastify/proxy-addr@npm:5.1.0" - dependencies: - "@fastify/forwarded": "npm:^3.0.0" - ipaddr.js: "npm:^2.1.0" - checksum: 10c0/d9167e848086cb66a0ae8b008eb6a79e9ae0e17c3e8697a3a22b23152376e22843bea6642a2c07eba5460faa786ebda6157dfa6537ac7b733f758428cd51988b - languageName: node - linkType: hard - "@hapi/bourne@npm:^3.0.0": version: 3.0.0 resolution: "@hapi/bourne@npm:3.0.0" @@ -556,267 +514,10 @@ __metadata: languageName: node linkType: hard -"@inquirer/ansi@npm:^2.0.7": - version: 2.0.7 - resolution: "@inquirer/ansi@npm:2.0.7" - checksum: 10c0/a574f97a899f0d9346fa26b528b3f4a9ba6dcb9172288efb6b4314d8486470ed53d2f538200f66a25b843c6e0cbf83688c6d5174a8dc6eca853b291b09609c5a - languageName: node - linkType: hard - -"@inquirer/checkbox@npm:^5.2.1, @inquirer/checkbox@npm:^5.2.3": - version: 5.2.3 - resolution: "@inquirer/checkbox@npm:5.2.3" - dependencies: - "@inquirer/ansi": "npm:^2.0.7" - "@inquirer/core": "npm:^12.0.1" - "@inquirer/figures": "npm:^2.0.8" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/30c67c95d4097b0782516c7bac74aedd330a4ec9ab2638496f6d8b08e0a0e9935103f8f66156fe9c51c18a0aaca77036e0badf964501e30b9de5c52f26196e22 - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^6.1.1, @inquirer/confirm@npm:^6.3.0": - version: 6.3.0 - resolution: "@inquirer/confirm@npm:6.3.0" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/4efebb84000ac085aac874f914fbcd130bdf3c12c68632c98a4f2793442d13e9b89f6c07976db7c6903a35495f4dbeda7c3107bb3ac27f9628ea9ff51ef05793 - languageName: node - linkType: hard - -"@inquirer/core@npm:^12.0.1": - version: 12.0.1 - resolution: "@inquirer/core@npm:12.0.1" - dependencies: - "@inquirer/ansi": "npm:^2.0.7" - "@inquirer/figures": "npm:^2.0.8" - "@inquirer/type": "npm:^4.1.0" - cli-width: "npm:^4.1.0" - fast-wrap-ansi: "npm:^0.2.0" - mute-stream: "npm:^3.0.0" - signal-exit: "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/425124870ddd7798ceea7edb4fe7ee3c76c79472b1e51249ed5b460e9ba56ec3a794d989ad0a8b3ec7b1bed0dacf847d7e22ead7d08027b44818bf5e6eda21ff - languageName: node - linkType: hard - -"@inquirer/editor@npm:^5.2.2, @inquirer/editor@npm:^5.3.1": - version: 5.3.1 - resolution: "@inquirer/editor@npm:5.3.1" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/external-editor": "npm:^3.0.4" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/7261667c9b4fa43bb230755188f3178c1afcac3fcb07ffedd5b4a326db390a79597a0844013d89163c03d0ca98b488872c6152ba020ff55914175cab9284da6c - languageName: node - linkType: hard - -"@inquirer/expand@npm:^5.1.1, @inquirer/expand@npm:^5.1.3": - version: 5.1.3 - resolution: "@inquirer/expand@npm:5.1.3" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/da585217cfa6f042c89b5c5d82040a598c8a2b54d3f02f8385d95293ef324d993bb7c306fd4b414496c2763e178f9178d45767ac6d598c687bf76382e748a670 - languageName: node - linkType: hard - -"@inquirer/external-editor@npm:^3.0.4": - version: 3.0.4 - resolution: "@inquirer/external-editor@npm:3.0.4" - dependencies: - chardet: "npm:^2.1.1" - iconv-lite: "npm:^0.7.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/ec50397f0132aca03e026690466dfb1a63203744926513eb26e0d950004e4c2359bfab24405ea7afa50d3cb1620707b81b1c2751bd5dbee2f8f7d1905be61f05 - languageName: node - linkType: hard - -"@inquirer/figures@npm:^2.0.8": - version: 2.0.8 - resolution: "@inquirer/figures@npm:2.0.8" - checksum: 10c0/49fd3b196c783c09d64c9f5692f9c26d0740169b99b55c97adc00e0f4e5665ec4097ab9bff40360c29c4b6b348b315b4eaadbab6cdeb5cb8335a8ac44ec62168 - languageName: node - linkType: hard - -"@inquirer/input@npm:^5.1.2, @inquirer/input@npm:^5.1.4": - version: 5.1.4 - resolution: "@inquirer/input@npm:5.1.4" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/35856a48c2134e1fcfc0391af65854e75895c19bc098d59b274743655e55cf3d9bc6b682e25515fa8a6acdbc267c8e85ce7ae4791809a3d3f6f72538c1740417 - languageName: node - linkType: hard - -"@inquirer/number@npm:^4.1.1, @inquirer/number@npm:^4.2.1": - version: 4.2.1 - resolution: "@inquirer/number@npm:4.2.1" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/06f23b36bf325c32ca218a669106c7e43422fd01e92b26caec6adc7eeeedef965275a029626fb0b9751f32a8d2d18c60347d141ba5a71872560b64332f977068 - languageName: node - linkType: hard - -"@inquirer/password@npm:^5.1.1, @inquirer/password@npm:^5.2.0": - version: 5.2.0 - resolution: "@inquirer/password@npm:5.2.0" - dependencies: - "@inquirer/ansi": "npm:^2.0.7" - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/1ead60a0c7a752a69cf7723aef03054fbdc43958b6ce75c1d02eee06596cdc0aef9f363b04dc2590c70d179083058f9715a865f29854b6d0d0e1541794f1f827 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:8.5.2": - version: 8.5.2 - resolution: "@inquirer/prompts@npm:8.5.2" - dependencies: - "@inquirer/checkbox": "npm:^5.2.1" - "@inquirer/confirm": "npm:^6.1.1" - "@inquirer/editor": "npm:^5.2.2" - "@inquirer/expand": "npm:^5.1.1" - "@inquirer/input": "npm:^5.1.2" - "@inquirer/number": "npm:^4.1.1" - "@inquirer/password": "npm:^5.1.1" - "@inquirer/rawlist": "npm:^5.3.1" - "@inquirer/search": "npm:^4.2.1" - "@inquirer/select": "npm:^5.2.1" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/253b92e31c6a1f8f00a778eda8196bb53fc931723f7db4a03937f38ccd4d07c987766d4f60b9250b5d90bfe30b04747dfa73927a9f6fb886bd48091ccb202535 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:8.7.0": - version: 8.7.0 - resolution: "@inquirer/prompts@npm:8.7.0" - dependencies: - "@inquirer/checkbox": "npm:^5.2.3" - "@inquirer/confirm": "npm:^6.3.0" - "@inquirer/editor": "npm:^5.3.1" - "@inquirer/expand": "npm:^5.1.3" - "@inquirer/input": "npm:^5.1.4" - "@inquirer/number": "npm:^4.2.1" - "@inquirer/password": "npm:^5.2.0" - "@inquirer/rawlist": "npm:^5.3.3" - "@inquirer/search": "npm:^4.3.1" - "@inquirer/select": "npm:^5.2.3" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/0d373c37c8c2f405f964976fac381746bc28d8d1879e01b2f58400cc7f6338c77c0a6163ea938399a5e85e7d67d09060a50fbc7b5bcd77d38327299bdbe9ea74 - languageName: node - linkType: hard - -"@inquirer/rawlist@npm:^5.3.1, @inquirer/rawlist@npm:^5.3.3": - version: 5.3.3 - resolution: "@inquirer/rawlist@npm:5.3.3" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/41a5268328b75081fc46b2b7a26fbf0ecc0dbd40f151dc8d87c4b6c6c4e0cac0dffe8e91d1df76b07ee366e3bad72767163fcc9ab6cc2225aeb387cdde27ca36 - languageName: node - linkType: hard - -"@inquirer/search@npm:^4.2.1, @inquirer/search@npm:^4.3.1": - version: 4.3.1 - resolution: "@inquirer/search@npm:4.3.1" - dependencies: - "@inquirer/core": "npm:^12.0.1" - "@inquirer/figures": "npm:^2.0.8" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/1e0d150c7930c5bfc6baf85fbda629d9020307fb9453fe2b64efc7f808ae62ada4eb79a0e0356b7472d1279eee02f47a89710121af7afc9b63fbbb2f14495c97 - languageName: node - linkType: hard - -"@inquirer/select@npm:^5.2.1, @inquirer/select@npm:^5.2.3": - version: 5.2.3 - resolution: "@inquirer/select@npm:5.2.3" - dependencies: - "@inquirer/ansi": "npm:^2.0.7" - "@inquirer/core": "npm:^12.0.1" - "@inquirer/figures": "npm:^2.0.8" - "@inquirer/type": "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/f714eb669f0d63178d011f0658943c15537a57344152fdefabed74cf38cdbdaae5c98099a49e6d5c03c68255570a6da16818986fdb775017b40cdbce3cbd41b7 - languageName: node - linkType: hard - -"@inquirer/type@npm:^4.1.0": - version: 4.1.0 - resolution: "@inquirer/type@npm:4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/70460dfbf0afcaa435799be786454fb8454c96f1392af0fe4e10298ee586c62d079c443a605f8de9d8ece4098c9099eaf328b0e34a1b57826a761beab3d895f3 +"@ioredis/commands@npm:1.10.0": + version: 1.10.0 + resolution: "@ioredis/commands@npm:1.10.0" + checksum: 10c0/baf91e62d0e64ef2b5f7ca4413dc2456fe250e87483beac4a1c8ef1fe5ad0d2fcdeb9b89d4556d8ef6c7455c64a964359d729601fdb06b2f4c76c35dd59afa99 languageName: node linkType: hard @@ -829,22 +530,6 @@ __metadata: languageName: node linkType: hard -"@jig-software/trest@npm:^2.0.0-beta": - version: 2.0.0-beta - resolution: "@jig-software/trest@npm:2.0.0-beta::__archiveUrl=https%3A%2F%2Fgitea.jig.com.hk%2Fapi%2Fpackages%2Fjig-software%2Fnpm%2F%2540jig-software%252Ftrest%2F-%2F2.0.0-beta%2Ftrest-2.0.0-beta.tgz" - dependencies: - lodash: "npm:^4.17.21" - peerDependencies: - "@koa/router": 12.x - bson: 5.x - koa: 2.x - koa-body: 6.x - path-to-regexp: 6.x - zod: 3.x - checksum: 10c0/15c93dca3b71b741a63c12250da4fd1621523525f4272d5d5b92719db96eca95fa913f27e89ac68f3744acbf15f5546f05d572530c9a4924028fee90f61b70f7 - languageName: node - linkType: hard - "@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.13 resolution: "@jridgewell/gen-mapping@npm:0.3.13" @@ -879,7 +564,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -889,6 +574,15 @@ __metadata: languageName: node linkType: hard +"@koa/cors@npm:^5.0.0": + version: 5.0.0 + resolution: "@koa/cors@npm:5.0.0" + dependencies: + vary: "npm:^1.1.2" + checksum: 10c0/49e5f3b861590bd81aa3663a2f0658234a9b378840bb54a2947b3c5f2067f9d966b6fa2e9049fdc7c74c787456d1885bacd0b7ee1f134274d28282c7df99c3fd + languageName: node + linkType: hard + "@koa/router@npm:^12": version: 12.0.2 resolution: "@koa/router@npm:12.0.2" @@ -902,194 +596,24 @@ __metadata: languageName: node linkType: hard -"@lukeed/csprng@npm:^1.0.0": - version: 1.1.0 - resolution: "@lukeed/csprng@npm:1.1.0" - checksum: 10c0/5d6dcf478af732972083ab2889c294b57f1028fa13c2c240d7a4aaa079c2c75df7ef0dcbdda5419147fc6704b4adf96b2de92f1a9a72ac21c6350c4014fffe6c +"@mongodb-js/saslprep@npm:^1.3.0": + version: 1.5.0 + resolution: "@mongodb-js/saslprep@npm:1.5.0" + dependencies: + sparse-bitfield: "npm:^3.0.3" + checksum: 10c0/4ec18504e567f494159b9649c5b30c0be88380cfee3a3c4e1ef33bd70a070adf3bbb8ab9946d4aab52e929b07322257621d139205300c78cd9da1e9d021008e6 languageName: node linkType: hard -"@nestjs/cli@npm:^12.0.0": - version: 12.0.0 - resolution: "@nestjs/cli@npm:12.0.0" +"@napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.2.3 + resolution: "@napi-rs/wasm-runtime@npm:1.2.3" dependencies: - "@angular-devkit/core": "npm:22.1.5" - "@angular-devkit/schematics": "npm:22.1.5" - "@angular-devkit/schematics-cli": "npm:22.1.5" - "@inquirer/prompts": "npm:8.7.0" - "@nestjs/schematics": "npm:^12.0.0" - ansis: "npm:4.3.1" - chokidar: "npm:5.0.0" - cli-table3: "npm:0.6.5" - commander: "npm:15.0.0" - minimatch: "npm:10.2.6" - node-emoji: "npm:2.2.0" - ora: "npm:9.4.1" - tsconfig-paths: "npm:4.2.0" - typescript: "npm:~6.0.2" + "@tybys/wasm-util": "npm:^0.10.3" peerDependencies: - "@rspack/core": ^1.7.7 || ^2.1.10 - "@swc/cli": ^0.8.0 - "@swc/core": ^1.15.18 - fork-ts-checker-webpack-plugin: ^9.1.0 - ts-loader: ^9.5.4 - tsconfig-paths-webpack-plugin: ^4.2.0 - webpack: ^5.105.4 - webpack-node-externals: ^3.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - "@swc/cli": - optional: true - "@swc/core": - optional: true - fork-ts-checker-webpack-plugin: - optional: true - ts-loader: - optional: true - tsconfig-paths-webpack-plugin: - optional: true - webpack: - optional: true - webpack-node-externals: - optional: true - bin: - nest: bin/nest.js - checksum: 10c0/3378ba9186571d1d81bdf582db52fcaef32622694bdeff74e165163be9f9dc153ea2ef5027790fb1fcc3d8b4531c17521ba2d112398b99de94d64b0a1f795d12 - languageName: node - linkType: hard - -"@nestjs/common@npm:^12.0.1": - version: 12.0.1 - resolution: "@nestjs/common@npm:12.0.1" - dependencies: - "@standard-schema/spec": "npm:1.1.0" - file-type: "npm:22.0.2" - iterare: "npm:1.2.1" - load-esm: "npm:1.0.3" - tslib: "npm:2.8.1" - uid: "npm:2.0.2" - peerDependencies: - class-transformer: ">=0.4.1" - class-validator: ">=0.13.2" - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - checksum: 10c0/5a4c18372b0ebc4974e3e1032fa3e860702a28621e49d04634af7664752f5d71ae5794e97cf0efc9b6a48ba8886a077dc4f340bea4f323d3109ae84060d3952b - languageName: node - linkType: hard - -"@nestjs/core@npm:^12.0.1": - version: 12.0.1 - resolution: "@nestjs/core@npm:12.0.1" - dependencies: - fast-safe-stringify: "npm:2.1.1" - iterare: "npm:1.2.1" - path-to-regexp: "npm:8.4.2" - tslib: "npm:2.8.1" - uid: "npm:2.0.2" - peerDependencies: - "@nestjs/common": ^12.0.0 - "@nestjs/microservices": ^12.0.0 - "@nestjs/platform-express": ^12.0.0 - "@nestjs/websockets": ^12.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 - checksum: 10c0/ccf18a31ce5d1409466f722805cc8bd1f1525ce13ea4a19dfad83a930a35c9de602b9e8e55a6837a46856ee107966763db2bb79b4e2e691bc29f22d2728fd897 - languageName: node - linkType: hard - -"@nestjs/mau@npm:^0.2.6": - version: 0.2.6 - resolution: "@nestjs/mau@npm:0.2.6" - dependencies: - chalk: "npm:4.1.2" - cli-progress: "npm:3.12.0" - commander: "npm:4.1.1" - inquirer: "npm:8.2.6" - node-emoji: "npm:2.1.3" - ora: "npm:5.4.1" - undici: "npm:6.20.1" - bin: - mau: bin/mau.js - checksum: 10c0/d537c531ee84b65a8d9d3457b15c77786e73837246fdb1b6773842ecc56238d3406e14dac6b90485a7e618e9af8d50b46bc7fc93151abc056d56c4dec40d61a4 - languageName: node - linkType: hard - -"@nestjs/platform-fastify@npm:^12.0.1": - version: 12.0.1 - resolution: "@nestjs/platform-fastify@npm:12.0.1" - dependencies: - "@fastify/cors": "npm:11.3.0" - "@fastify/formbody": "npm:9.0.0" - fast-querystring: "npm:1.1.2" - fastify: "npm:5.12.1" - fastify-plugin: "npm:6.0.0" - find-my-way: "npm:9.9.0" - light-my-request: "npm:6.6.0" - path-to-regexp: "npm:8.4.2" - reusify: "npm:1.1.0" - tslib: "npm:2.8.1" - peerDependencies: - "@fastify/static": ^10.1.2 - "@fastify/view": ^10.0.0 || ^11.0.0 || ^12.0.0 - "@nestjs/common": ^12.0.0 - "@nestjs/core": ^12.0.0 - peerDependenciesMeta: - "@fastify/static": - optional: true - "@fastify/view": - optional: true - checksum: 10c0/a84821325db3456c9cd2ad184eca1f562141ba7242f5dbc5257d904c1c30a882c34caebab88972c4b051cf5694e8513be365d7c919e323983e81b42dcc9db862 - languageName: node - linkType: hard - -"@nestjs/schematics@npm:^12.0.0": - version: 12.0.0 - resolution: "@nestjs/schematics@npm:12.0.0" - dependencies: - "@angular-devkit/core": "npm:22.1.5" - "@angular-devkit/schematics": "npm:22.1.5" - comment-json: "npm:5.0.0" - jsonc-parser: "npm:3.3.1" - pluralize: "npm:8.0.0" - peerDependencies: - prettier: ^3.0.0 - typescript: ">=6.0.0" - peerDependenciesMeta: - prettier: - optional: true - checksum: 10c0/df0027bfc7dc450a25a103f8d924e45b936fc7c793664acc91acbbe9aede194310dd95d501742c0c80aae01786ff56e74302e064c00ec06ea83059ec5f515f32 - languageName: node - linkType: hard - -"@nestjs/testing@npm:^12.0.1": - version: 12.0.1 - resolution: "@nestjs/testing@npm:12.0.1" - dependencies: - tslib: "npm:2.8.1" - peerDependencies: - "@nestjs/common": ^12.0.0 - "@nestjs/core": ^12.0.0 - "@nestjs/microservices": ^12.0.0 - "@nestjs/platform-express": ^12.0.0 - peerDependenciesMeta: - "@nestjs/microservices": - optional: true - "@nestjs/platform-express": - optional: true - checksum: 10c0/79efea430bd359b4d98ad20b81d9f2b589a3dbcb680dbe6e105622395ef953574e2ec6d92b4ce02e64ee45b5873efa1f16d94a27b03da72e5051accf16837711 + "@emnapi/core": ^1.7.1 || ^2.0.0-alpha.4 + "@emnapi/runtime": ^1.7.1 || ^2.0.0-alpha.4 + checksum: 10c0/6da0a4bf9df79e9abfb3e3d462f6a5d42889be39426040038c9dd5925865585d7dbd06dd439c2ffc20f49ef2751412da5bd748cfb3c5b049142d72c0550f6f79 languageName: node linkType: hard @@ -1249,625 +773,25 @@ __metadata: languageName: node linkType: hard -"@pinojs/redact@npm:^0.4.0": - version: 0.4.0 - resolution: "@pinojs/redact@npm:0.4.0" - checksum: 10c0/4b311ba17ee0cf154ff9c39eb063ec04cd0d0017cb3750efcdf06c2d485df3e1095e13e872175993568c5568c23e4508dd877c981bbc9c5ae5e384d569efcdff - languageName: node - linkType: hard - -"@rc-component/async-validator@npm:^6.0.0": - version: 6.0.0 - resolution: "@rc-component/async-validator@npm:6.0.0" +"@reduxjs/toolkit@npm:^2.12.0": + version: 2.12.0 + resolution: "@reduxjs/toolkit@npm:2.12.0" dependencies: - "@babel/runtime": "npm:^7.24.4" - checksum: 10c0/9918b080cfd2c59b48da548f58050514627b71f83823bfa0fcfdd6d7bb43f63c8c99abe0200791880139c9877bd335d5d26d91f74b21c9fadfa653673687752f - languageName: node - linkType: hard - -"@rc-component/cascader@npm:~1.22.0": - version: 1.22.0 - resolution: "@rc-component/cascader@npm:1.22.0" - dependencies: - "@rc-component/select": "npm:~1.10.0" - "@rc-component/tree": "npm:~1.4.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" + "@standard-schema/spec": "npm:^1.0.0" + "@standard-schema/utils": "npm:^0.3.0" + immer: "npm:^11.0.0" + redux: "npm:^5.0.1" + redux-thunk: "npm:^3.1.0" + reselect: "npm:^5.1.0" peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/2e768478843313005ad6b66b6ddc72572d83174c55486ad15fab86b47deb9b7d986948ca74ca660ebe3a894f08940f74bc4e8ee645942afd0acfe88f02cdfcb8 - languageName: node - linkType: hard - -"@rc-component/checkbox@npm:~2.0.0": - version: 2.0.0 - resolution: "@rc-component/checkbox@npm:2.0.0" - dependencies: - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/b31d072843d1961401fd4652108cca7d97597d26c521038c5cc1a9aed311b5a1e6c723cbfb7084cd0f1fb62f7fc2c6006d6638feb80f4291c9fc2e26ba1a26f9 - languageName: node - linkType: hard - -"@rc-component/collapse@npm:~1.2.0": - version: 1.2.0 - resolution: "@rc-component/collapse@npm:1.2.0" - dependencies: - "@babel/runtime": "npm:^7.10.1" - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/b8f954b21d0dada200a3dcec3ea7455b6c827ce358827dd50aa721953f4bac6224fcbb0f07546e6b9a5286c781819ebbe57ecaeb8fd898054ac276b8beb1945c - languageName: node - linkType: hard - -"@rc-component/color-picker@npm:~3.1.1": - version: 3.1.1 - resolution: "@rc-component/color-picker@npm:3.1.1" - dependencies: - "@ant-design/fast-color": "npm:^3.0.1" - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/7eb5308e20ecc4b164294642d5115b923aab7d282afbf555ed858eed2711ee65c3b204e6776e6accda1da352bd4e51e6302952dc7206f9f2d9796b068e550c32 - languageName: node - linkType: hard - -"@rc-component/context@npm:^2.0.1": - version: 2.0.2 - resolution: "@rc-component/context@npm:2.0.2" - dependencies: - "@rc-component/util": "npm:^1.11.0" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/64e8f332098502cef5dbb23a47ab566587b5a6d8d91d528868744449ce07dc4cf4c20fefa403bd153e9605921dcb48c057dcd5267a99c28e17ee467b69067ac8 - languageName: node - linkType: hard - -"@rc-component/dialog@npm:~1.10.0": - version: 1.10.0 - resolution: "@rc-component/dialog@npm:1.10.0" - dependencies: - "@rc-component/motion": "npm:^1.3.3" - "@rc-component/portal": "npm:^2.1.0" - "@rc-component/util": "npm:^1.9.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/0defdb60e7d147c22111442f7edbe61d5eaa732cd31bafb05d8f798119e418234270f0e48b515aaffd00d9158988f14f80d6fb95ec07cfc0dbbe29f103d367c9 - languageName: node - linkType: hard - -"@rc-component/drawer@npm:~1.4.2": - version: 1.4.2 - resolution: "@rc-component/drawer@npm:1.4.2" - dependencies: - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/portal": "npm:^2.1.3" - "@rc-component/util": "npm:^1.9.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/4d69581372ec7ce00f36a0a61010e0129f20b78ebece324df75b8107cd76d2590e94540cff95b48102c62d8e1042ffeb215e2a35a2175cdd3a40eb350470cefd - languageName: node - linkType: hard - -"@rc-component/dropdown@npm:~1.0.0, @rc-component/dropdown@npm:~1.0.3": - version: 1.0.3 - resolution: "@rc-component/dropdown@npm:1.0.3" - dependencies: - "@rc-component/trigger": "npm:^3.0.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.11.0" - react-dom: ">=16.11.0" - checksum: 10c0/b94641655106e4e356fec9a3850c411f3a7f88b163a1298ceec351f2c7788d5883ef149d9e0749adb0e1545da3debe7c1dde3c22fcc8c6960066d12ccb075b86 - languageName: node - linkType: hard - -"@rc-component/form@npm:~1.8.6": - version: 1.8.6 - resolution: "@rc-component/form@npm:1.8.6" - dependencies: - "@rc-component/async-validator": "npm:^6.0.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/dbedb4527642ae31cb478c69958af0ac20eefc3185e5809d36d5e681928876d5270f67da1d2ca1064e64954e08f676039f990311829c15d9d37da2e35f58d6c2 - languageName: node - linkType: hard - -"@rc-component/image@npm:~1.10.0": - version: 1.10.0 - resolution: "@rc-component/image@npm:1.10.0" - dependencies: - "@rc-component/motion": "npm:^1.0.0" - "@rc-component/portal": "npm:^2.1.2" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/4db2fdeb3d2176d18d18fdbe5da700540282c9c5c9dfd12f6405d687a233061fef2adde50c396363f1ac320d078d0eecaf6eefc2c4478a12efd83caec4b9b2af - languageName: node - linkType: hard - -"@rc-component/input-number@npm:~1.6.2": - version: 1.6.2 - resolution: "@rc-component/input-number@npm:1.6.2" - dependencies: - "@rc-component/mini-decimal": "npm:^1.0.1" - "@rc-component/util": "npm:^1.4.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/322a585d9e1a86b4e775de27cd9cbad94f38c4d21d1848148eb12e6114e74e4de148414d3ac89e24d312a471d482d4d6259a528b22b3e2ca3c44ab230284ba8f - languageName: node - linkType: hard - -"@rc-component/input@npm:~1.3.1": - version: 1.3.1 - resolution: "@rc-component/input@npm:1.3.1" - dependencies: - "@rc-component/resize-observer": "npm:^1.1.1" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.0.0" - react-dom: ">=16.0.0" - checksum: 10c0/8a61ab9dfef2dc5044f7cb51e5da81700a76f1dd586e63256563ad9f820ab8f226beb295b9ae12b676c079b016fe3551ab4d09768b44e2eee317885cfeda8499 - languageName: node - linkType: hard - -"@rc-component/listy@npm:~1.2.3": - version: 1.2.3 - resolution: "@rc-component/listy@npm:1.2.3" - dependencies: - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/portal": "npm:^2.0.0" - "@rc-component/resize-observer": "npm:^1.0.0" - "@rc-component/util": "npm:^1.3.1" - "@rc-component/virtual-list": "npm:^1.4.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/91856323c7c1084048f74683e46a42790778b143f59d1a3879d61163dc6f11262d38d6bd9df381889e47a40bbabda062dc777127fb5875498c27621e9e0911b1 - languageName: node - linkType: hard - -"@rc-component/mentions@npm:~1.12.0": - version: 1.12.0 - resolution: "@rc-component/mentions@npm:1.12.0" - dependencies: - "@rc-component/input": "npm:~1.3.1" - "@rc-component/menu": "npm:~1.5.0" - "@rc-component/trigger": "npm:^3.0.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/c8a1238c0f84ec23f30a75360110e04dae9d267d60ec90e93805106aef08e80c78bb963c5b20ed5e1f81177d5c79760ca800d08b3ef4a67ed13a38357ba842c5 - languageName: node - linkType: hard - -"@rc-component/menu@npm:~1.5.0": - version: 1.5.0 - resolution: "@rc-component/menu@npm:1.5.0" - dependencies: - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/overflow": "npm:^1.0.0" - "@rc-component/trigger": "npm:^3.0.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/2e372ccb46329d4431d816445d55f1600e64917aaed6cd801817000edcbd73521b3ec2dcf5d1e1b95dd8d951d9056923e134eff96849db70edbbc703eb99fe07 - languageName: node - linkType: hard - -"@rc-component/mini-decimal@npm:^1.0.1": - version: 1.1.4 - resolution: "@rc-component/mini-decimal@npm:1.1.4" - dependencies: - "@babel/runtime": "npm:^7.18.0" - checksum: 10c0/32215c6a71ea0dba03fd9a7769f0fd23008d40d3c0c494180acc3d50746f3f8cc122ab2c0e07664271f21123455d5f1552f951357b288f19f2e0a06d95a4174e - languageName: node - linkType: hard - -"@rc-component/motion@npm:^1.0.0, @rc-component/motion@npm:^1.1.3, @rc-component/motion@npm:^1.1.4, @rc-component/motion@npm:^1.3.3": - version: 1.3.3 - resolution: "@rc-component/motion@npm:1.3.3" - dependencies: - "@rc-component/util": "npm:^1.11.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/1731f51d3856f514ac1d36fe7d1747c722e13e1404a1df0b8000d9cded5321771d7079c1d1016705531c148c38cd9054c7de2e4fe08beb05e8e4d96956ed6c0c - languageName: node - linkType: hard - -"@rc-component/mutate-observer@npm:^2.0.1": - version: 2.0.1 - resolution: "@rc-component/mutate-observer@npm:2.0.1" - dependencies: - "@rc-component/util": "npm:^1.2.0" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/45b63795a818eba95ca67dd28aacd9f535ef652919a13bed692d077a818e0365dbae6acf1bac83952905064767e6b1b176da998e52bc00d0a35f89fe866b6884 - languageName: node - linkType: hard - -"@rc-component/notification@npm:~2.0.8": - version: 2.0.8 - resolution: "@rc-component/notification@npm:2.0.8" - dependencies: - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/util": "npm:^1.11.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/904694067e676eb81b30d7267856ca17d58957e874ece8e4385b939b241beee582a7c17b5503e07f9f913da37861b8153355d163aa07b1404a142a6882b49f76 - languageName: node - linkType: hard - -"@rc-component/overflow@npm:^1.0.0": - version: 1.0.1 - resolution: "@rc-component/overflow@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.11.1" - "@rc-component/resize-observer": "npm:^1.0.1" - "@rc-component/util": "npm:^1.4.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/710df9afcf06ea80a79a89bd7f92bf92d524ac6fa3c82cbd5e48e18e74bf60a4b56705dfcb2d9738c64091db87bd0f8336959a952e175d67eb63aad36395ba9a - languageName: node - linkType: hard - -"@rc-component/pagination@npm:~1.4.0": - version: 1.4.0 - resolution: "@rc-component/pagination@npm:1.4.0" - dependencies: - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/36a425c3fe7266c71969c27278bb01171fed92394f21f1a6da62213f925069415cfb2281f7c2a0d8346623b9e49750e92fa85191c63aa9f7241ead024c696f7c - languageName: node - linkType: hard - -"@rc-component/picker@npm:~1.12.0": - version: 1.12.0 - resolution: "@rc-component/picker@npm:1.12.0" - dependencies: - "@rc-component/overflow": "npm:^1.0.0" - "@rc-component/resize-observer": "npm:^1.0.0" - "@rc-component/trigger": "npm:^3.6.15" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - date-fns: ">= 2.x" - dayjs: ">= 1.x" - luxon: ">= 3.x" - moment: ">= 2.x" - react: ">=16.9.0" - react-dom: ">=16.9.0" + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 peerDependenciesMeta: - date-fns: + react: optional: true - dayjs: + react-redux: optional: true - luxon: - optional: true - moment: - optional: true - checksum: 10c0/6b2bd3f63be2b917d6a0425eae27f312685fefeab098f6e0a442d9b3b5d3ff090c335248f5fe47ce198095c2a19d2baf07273cbb5eb1b9a105d4696a03a8b32b - languageName: node - linkType: hard - -"@rc-component/portal@npm:^2.0.0, @rc-component/portal@npm:^2.1.0, @rc-component/portal@npm:^2.1.2, @rc-component/portal@npm:^2.1.3, @rc-component/portal@npm:^2.2.0, @rc-component/portal@npm:^2.2.1": - version: 2.2.1 - resolution: "@rc-component/portal@npm:2.2.1" - dependencies: - "@rc-component/util": "npm:^1.11.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/6576386bae88d139bc8b7e1699689bed38a14b7a555e6c185aa6e408a2c6eac421eb363fc9a7428b29ede0c1a526f227aeec239f4bbe8c8e05d569dd27faf8eb - languageName: node - linkType: hard - -"@rc-component/progress@npm:~1.0.3": - version: 1.0.3 - resolution: "@rc-component/progress@npm:1.0.3" - dependencies: - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/f52946d7cd12db078358e03f5d5f86425025a71fb3c78948215d05b8cbf387621f6d3e39c2015ba75ea52b2f28e493eaf7c10106ebb69da75bd2618fcf8e2909 - languageName: node - linkType: hard - -"@rc-component/qrcode@npm:~2.0.0": - version: 2.0.0 - resolution: "@rc-component/qrcode@npm:2.0.0" - dependencies: - "@babel/runtime": "npm:^7.24.7" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/b0b21e574719214bd30195df0dda2b29fa87394b40d6108f3d6f42b029d4d82de230a74338d72e1e04c0a61b90ae25e532cf366289c2b6deb6d92e4ef314562e - languageName: node - linkType: hard - -"@rc-component/rate@npm:~1.0.1": - version: 1.0.1 - resolution: "@rc-component/rate@npm:1.0.1" - dependencies: - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/34eba661e6d54286f8ef1934ccbab2d7a6269b26249f84393b77206151706c6cc56001a497a841abcc1ed1221f86134e4b7fd34f216287ef46e50869fdd9d99d - languageName: node - linkType: hard - -"@rc-component/resize-observer@npm:^1.0.0, @rc-component/resize-observer@npm:^1.0.1, @rc-component/resize-observer@npm:^1.1.1, @rc-component/resize-observer@npm:^1.1.2": - version: 1.1.2 - resolution: "@rc-component/resize-observer@npm:1.1.2" - dependencies: - "@rc-component/util": "npm:^1.2.0" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/059b6015adac38c1001940360308d44e47a0bd62992be4c0b6e566df6d5429a8b60428cd6d21289da48a393c8cd6ead4c61032b36315ca394e660d3261956c33 - languageName: node - linkType: hard - -"@rc-component/segmented@npm:~1.3.0": - version: 1.3.0 - resolution: "@rc-component/segmented@npm:1.3.0" - dependencies: - "@babel/runtime": "npm:^7.11.1" - "@rc-component/motion": "npm:^1.1.4" - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.0.0" - react-dom: ">=16.0.0" - checksum: 10c0/ef76db98618700439673670c4b6ea00a822e02c4e90ea6781b9f626ba5acbae861b2a7c8acc4985d8b5171fbe8bf4d81b31387bc26f3453f999e2d8348d7e792 - languageName: node - linkType: hard - -"@rc-component/select@npm:~1.10.0, @rc-component/select@npm:~1.10.1": - version: 1.10.1 - resolution: "@rc-component/select@npm:1.10.1" - dependencies: - "@rc-component/overflow": "npm:^1.0.0" - "@rc-component/trigger": "npm:^3.0.0" - "@rc-component/util": "npm:^1.11.1" - "@rc-component/virtual-list": "npm:^1.2.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/72f50aba0ed29e4c7acefe0690206649ebabc35268184f3c510ab83df929da3b04d0495750b9d23bb7e2512ea3efb3883ef8fac6e965f6a3c4c7558f7b65562e - languageName: node - linkType: hard - -"@rc-component/slider@npm:~1.1.1": - version: 1.1.1 - resolution: "@rc-component/slider@npm:1.1.1" - dependencies: - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/e68a1c8d36881291c3ba70482a4d28d3e8a532af0f094d358c63a16632aa79e8a16a652f302606b7ab0cbf128a132a904068740a660f9cc1ca62868bb0b68b16 - languageName: node - linkType: hard - -"@rc-component/steps@npm:~1.2.3": - version: 1.2.3 - resolution: "@rc-component/steps@npm:1.2.3" - dependencies: - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/e5c8435a78bb83557c9dea8a8842864be196a2d8981221c14837121c4ac105e3b33da27857675fa56d55216d2aa6fd837604b26dbb13e261ada74ea8d5f08903 - languageName: node - linkType: hard - -"@rc-component/switch@npm:~1.0.3": - version: 1.0.3 - resolution: "@rc-component/switch@npm:1.0.3" - dependencies: - "@rc-component/util": "npm:^1.3.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/6ef1746f056d63bae06a00fa09a4c437539f7e60821c479722dc9800a327564b5e749d7f5d3874236d9424e4eb56ddee4561b56f0ce8d1417d431e710b9789f9 - languageName: node - linkType: hard - -"@rc-component/table@npm:~1.11.1": - version: 1.11.1 - resolution: "@rc-component/table@npm:1.11.1" - dependencies: - "@rc-component/context": "npm:^2.0.1" - "@rc-component/resize-observer": "npm:^1.0.0" - "@rc-component/util": "npm:^1.11.1" - "@rc-component/virtual-list": "npm:^1.0.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/df50b7f7a09ac06677763870e89e0f1529d088f3771ffc2e940fb154b25f65d2a7028139de05464a62b81cd18bbab53800245ad0aedf227959648f65c9ff36cc - languageName: node - linkType: hard - -"@rc-component/tabs@npm:~1.13.0": - version: 1.13.0 - resolution: "@rc-component/tabs@npm:1.13.0" - dependencies: - "@rc-component/dropdown": "npm:~1.0.0" - "@rc-component/menu": "npm:~1.5.0" - "@rc-component/motion": "npm:^1.1.3" - "@rc-component/resize-observer": "npm:^1.0.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/f62d13f08e57e11307815cbbefaf3e1b5df843dcba9c7ce731b9b21b228436cb46923d6dca24cecd9d618d6a73a388512385ac68ce6eb92b77c319a10adcae70 - languageName: node - linkType: hard - -"@rc-component/tooltip@npm:~1.5.2": - version: 1.5.2 - resolution: "@rc-component/tooltip@npm:1.5.2" - dependencies: - "@rc-component/trigger": "npm:^3.10.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/1fa1dcd070182d917026827ec353ee78c8106acda099ab27066ad006b5116514f59e05f30a88b6aca631057789a3ca5c3a4a6c8b8135d226d353ba0f8606c007 - languageName: node - linkType: hard - -"@rc-component/tour@npm:~2.4.0": - version: 2.4.0 - resolution: "@rc-component/tour@npm:2.4.0" - dependencies: - "@rc-component/portal": "npm:^2.2.0" - "@rc-component/trigger": "npm:^3.0.0" - "@rc-component/util": "npm:^1.7.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/a65a88d81d04ea588f778ef19427db25f95f7827c2fb2b038dfeeccbbc025a885b96c63fbabf57f46d6a3c31d8be1fe029980bd444a7c02157cb9c40130d3c9d - languageName: node - linkType: hard - -"@rc-component/tree-select@npm:~1.16.1": - version: 1.16.1 - resolution: "@rc-component/tree-select@npm:1.16.1" - dependencies: - "@rc-component/select": "npm:~1.10.0" - "@rc-component/tree": "npm:~1.4.0" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/87d332868ece7ea91383c78b219b4b0c1cf9f4ab31748554fd897b063300464139a655d0888247d383059e551dd5f222853d526d6a8effb92526a847f866e7ae - languageName: node - linkType: hard - -"@rc-component/tree@npm:~1.4.0": - version: 1.4.0 - resolution: "@rc-component/tree@npm:1.4.0" - dependencies: - "@rc-component/motion": "npm:^1.0.0" - "@rc-component/util": "npm:^1.11.1" - "@rc-component/virtual-list": "npm:^1.2.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/64bf80e74fe5e0f842bd18af89f099af65331b4e5453608d55505301a15549f7ce104b31195ac66914c98f71cb72b7276d77fc5e120cc797712f81c9147ae48d - languageName: node - linkType: hard - -"@rc-component/trigger@npm:^3.0.0, @rc-component/trigger@npm:^3.10.0, @rc-component/trigger@npm:^3.10.1, @rc-component/trigger@npm:^3.6.15": - version: 3.10.1 - resolution: "@rc-component/trigger@npm:3.10.1" - dependencies: - "@rc-component/motion": "npm:^1.3.3" - "@rc-component/portal": "npm:^2.2.1" - "@rc-component/resize-observer": "npm:^1.1.2" - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/20f70f4de12d4077ba6dac9352e3cf7386e6c7e9092752a6951938fbe591acc7a511f7ecacfa534d1e7ee1a858077b91795ceec381ef34bff866699d3a57d549 - languageName: node - linkType: hard - -"@rc-component/upload@npm:~1.1.1": - version: 1.1.1 - resolution: "@rc-component/upload@npm:1.1.1" - dependencies: - "@rc-component/util": "npm:^1.11.1" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10c0/0bb37a2050df385aee1767231afcb6432201765c679141c6d0198eea83496e4d47975d0e7a403d40531c5916dd78003805a15feb4f6c8a128cf9c8d0a886ca84 - languageName: node - linkType: hard - -"@rc-component/util@npm:^1.11.0, @rc-component/util@npm:^1.11.1, @rc-component/util@npm:^1.12.0, @rc-component/util@npm:^1.2.0, @rc-component/util@npm:^1.3.0, @rc-component/util@npm:^1.3.1, @rc-component/util@npm:^1.4.0, @rc-component/util@npm:^1.7.0, @rc-component/util@npm:^1.9.0": - version: 1.13.0 - resolution: "@rc-component/util@npm:1.13.0" - dependencies: - is-mobile: "npm:^5.0.0" - react-is: "npm:^19.2.7" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/c1e9ee4f2be436b091bae18d4547818c43fbddad5a4e15b971cdcde3bf25f49c33eb4f51fac726a48f61fc254e4a5f719efc2882b7458fbe15c79ff77c337380 - languageName: node - linkType: hard - -"@rc-component/virtual-list@npm:^1.0.1, @rc-component/virtual-list@npm:^1.2.0, @rc-component/virtual-list@npm:^1.4.0": - version: 1.5.1 - resolution: "@rc-component/virtual-list@npm:1.5.1" - dependencies: - "@babel/runtime": "npm:^8.0.0" - "@rc-component/resize-observer": "npm:^1.0.1" - "@rc-component/util": "npm:^1.4.0" - clsx: "npm:^2.1.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/cda45e0ac82adf8c1b9f622dc79d05bd94f7808544884a4469e557671c4a16aed523b836d91faacf63ad74e37323726247fb2dc849a4a9601da53edd015dd3a1 + checksum: 10c0/2b85e31294a7139994fd78b08eb3ce706ce3b03b5081c13403b93ba4883a152d637171e4d9d969766238851f8915b1daa9f36b5a0a458aff0ff7600ee38795c9 languageName: node linkType: hard @@ -1983,34 +907,190 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.6.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e - languageName: node - linkType: hard - -"@standard-schema/spec@npm:1.1.0, @standard-schema/spec@npm:^1.1.0": +"@standard-schema/spec@npm:^1.0.0, @standard-schema/spec@npm:^1.1.0": version: 1.1.0 resolution: "@standard-schema/spec@npm:1.1.0" checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 languageName: node linkType: hard -"@tokenizer/inflate@npm:^0.4.1": - version: 0.4.1 - resolution: "@tokenizer/inflate@npm:0.4.1" - dependencies: - debug: "npm:^4.4.3" - token-types: "npm:^6.1.1" - checksum: 10c0/9817516efe21d1ce3bdfb80a1f94efc8981064ce3873448ba79f4d81d96c0694c484c289bd042d346ae5536cf77f5aa9a367d39c3df700eb610761b7c306b4de +"@standard-schema/utils@npm:^0.3.0": + version: 0.3.0 + resolution: "@standard-schema/utils@npm:0.3.0" + checksum: 10c0/6eb74cd13e52d5fc74054df51e37d947ef53f3ab9e02c085665dcca3c38c60ece8d735cebbdf18fbb13c775fbcb9becb3f53109b0e092a63f0f7389ce0993fd0 languageName: node linkType: hard -"@tokenizer/token@npm:^0.3.0": - version: 0.3.0 - resolution: "@tokenizer/token@npm:0.3.0" - checksum: 10c0/7ab9a822d4b5ff3f5bca7f7d14d46bdd8432528e028db4a52be7fbf90c7f495cc1af1324691dda2813c6af8dc4b8eb29de3107d4508165f9aa5b53e7d501f155 +"@tailwindcss/node@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/node@npm:4.3.3" + dependencies: + "@jridgewell/remapping": "npm:^2.3.5" + enhanced-resolve: "npm:^5.24.1" + jiti: "npm:^2.7.0" + lightningcss: "npm:1.32.0" + magic-string: "npm:^0.30.21" + source-map-js: "npm:^1.2.1" + tailwindcss: "npm:4.3.3" + checksum: 10c0/0123669be5b3e78d42b0e10cb34d547fb8574c8e7dc7a97a141c8a4ab4215852b5b1b99b97763e898e1da1493ee8424cb72e28225cc4876828c95156f94d7f0e + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.3.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.3.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.3.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.3.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.3.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.3.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.3.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.3.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.3.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-wasm32-wasi@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.3.3" + dependencies: + "@emnapi/core": "npm:^1.11.1" + "@emnapi/runtime": "npm:^1.11.1" + "@emnapi/wasi-threads": "npm:^1.2.2" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + "@tybys/wasm-util": "npm:^0.10.2" + tslib: "npm:^2.8.1" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.3.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.3.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:4.3.3": + version: 4.3.3 + resolution: "@tailwindcss/oxide@npm:4.3.3" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.3.3" + "@tailwindcss/oxide-darwin-arm64": "npm:4.3.3" + "@tailwindcss/oxide-darwin-x64": "npm:4.3.3" + "@tailwindcss/oxide-freebsd-x64": "npm:4.3.3" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.3.3" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.3.3" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.3.3" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.3.3" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.3.3" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.3.3" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.3.3" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.3.3" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-wasm32-wasi": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10c0/6c38b25226dad252347451ed8953a998432b51f1e068b25e021215b886ccf8bcf3af58faf5f4ab50368091e657ca2fa341df1deca6101651eddb567122f2acb5 + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4": + version: 4.3.3 + resolution: "@tailwindcss/vite@npm:4.3.3" + dependencies: + "@tailwindcss/node": "npm:4.3.3" + "@tailwindcss/oxide": "npm:4.3.3" + tailwindcss: "npm:4.3.3" + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + checksum: 10c0/bb1fe12f7a0bb8f6d6142f6bb2e96060ee853902314ef838e8d7f50cf30cc4b07adb7c2c86be2164e0d62eb581b8cc4df2d9aa13b4449f597a67f73c5772d549 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.10.2, @tybys/wasm-util@npm:^0.10.3": + version: 0.10.3 + resolution: "@tybys/wasm-util@npm:0.10.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/fd2bd2a79c6cd8c79ed1cf7a0fa375c64589264c88a27acaf9756d556b453ea222b62a4f68dd2fbb8b3a78b6bab3b1f4fb2431b6afc6aeda8344b53a521a1cd3 languageName: node linkType: hard @@ -2088,6 +1168,15 @@ __metadata: languageName: node linkType: hard +"@types/cors@npm:^2": + version: 2.8.19 + resolution: "@types/cors@npm:2.8.19" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/b5dd407040db7d8aa1bd36e79e5f3f32292f6b075abc287529e9f48df1a25fda3e3799ba30b4656667ffb931d3b75690c1d6ca71e39f7337ea6dfda8581916d0 + languageName: node + linkType: hard + "@types/deep-eql@npm:*": version: 4.0.2 resolution: "@types/deep-eql@npm:4.0.2" @@ -2109,6 +1198,18 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.9 + resolution: "@types/express-serve-static-core@npm:4.19.9" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/31d7afe63c4f0090159a869e4199aae38cbc222948bf9be5d7c257bfdc8e14c9dec46e9f50c08e0004565565acb7ecd95d5c0dbde6d9fdd45a5d0adfabbf00fe + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^5.0.0": version: 5.1.3 resolution: "@types/express-serve-static-core@npm:5.1.3" @@ -2132,6 +1233,18 @@ __metadata: languageName: node linkType: hard +"@types/express@npm:^4": + version: 4.17.25 + resolution: "@types/express@npm:4.17.25" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:^1" + checksum: 10c0/f42b616d2c9dbc50352c820db7de182f64ebbfa8dba6fb6c98e5f8f0e2ef3edde0131719d9dc6874803d25ad9ca2d53471d0fec2fbc60a6003a43d015bab72c4 + languageName: node + linkType: hard + "@types/formidable@npm:^2.0.5": version: 2.0.6 resolution: "@types/formidable@npm:2.0.6" @@ -2194,7 +1307,7 @@ __metadata: languageName: node linkType: hard -"@types/koa@npm:^2.13.5": +"@types/koa@npm:^2, @types/koa@npm:^2.13.5": version: 2.15.2 resolution: "@types/koa@npm:2.15.2" dependencies: @@ -2210,6 +1323,24 @@ __metadata: languageName: node linkType: hard +"@types/koa__cors@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/koa__cors@npm:5.0.1" + dependencies: + "@types/koa": "npm:*" + checksum: 10c0/0aaf9348629b9127436e12ec740dcf5ccf4f5c6ed2451ab14c722c0a49c9b8194f71106f74097948da6658917249001b9832b16c6f22e4bffda5cf4d9ce2b973 + languageName: node + linkType: hard + +"@types/koa__router@npm:^12": + version: 12.0.5 + resolution: "@types/koa__router@npm:12.0.5" + dependencies: + "@types/koa": "npm:*" + checksum: 10c0/7f994a809a5ab308a62b876a259cec49bcdd261d17c0a48d9eeda324bd655e25474ac534c7949dd5aefd4f391fa9ceb52c047e49bf7aa1bfa610d6a60e31ac32 + languageName: node + linkType: hard + "@types/methods@npm:^1.1.4": version: 1.1.4 resolution: "@types/methods@npm:1.1.4" @@ -2217,6 +1348,13 @@ __metadata: languageName: node linkType: hard +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc + languageName: node + linkType: hard + "@types/node@npm:*": version: 26.4.1 resolution: "@types/node@npm:26.4.1" @@ -2235,6 +1373,17 @@ __metadata: languageName: node linkType: hard +"@types/pg@npm:^8": + version: 8.23.1 + resolution: "@types/pg@npm:8.23.1" + dependencies: + "@types/node": "npm:*" + pg-protocol: "npm:*" + pg-types: "npm:^2.2.0" + checksum: 10c0/0e39ff7dbe233e1e50b172d87fe84cca086a52e255adb104ef1d60619cded356c4414427ffbea58e70a5a985c3036603c8e544ca2937fc1cf4050185109973be + languageName: node + linkType: hard + "@types/qs@npm:*": version: 6.15.1 resolution: "@types/qs@npm:6.15.1" @@ -2276,6 +1425,27 @@ __metadata: languageName: node linkType: hard +"@types/send@npm:<1": + version: 0.17.6 + resolution: "@types/send@npm:0.17.6" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/a9d76797f0637738062f1b974e0fcf3d396a28c5dc18c3f95ecec5dabda82e223afbc2d56a0bca46b6326fd7bb229979916cea40de2270a98128fd94441b87c2 + languageName: node + linkType: hard + +"@types/serve-static@npm:^1": + version: 1.15.10 + resolution: "@types/serve-static@npm:1.15.10" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:<1" + checksum: 10c0/842fca14c9e80468f89b6cea361773f2dcd685d4616a9f59013b55e1e83f536e4c93d6d8e3ba5072d40c4e7e64085210edd6646b15d538ded94512940a23021f + languageName: node + linkType: hard + "@types/serve-static@npm:^2": version: 2.2.0 resolution: "@types/serve-static@npm:2.2.0" @@ -2308,6 +1478,29 @@ __metadata: languageName: node linkType: hard +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: 10c0/77c045a98f57488201f678b181cccd042279aff3da34540ad242f893acc52b358bd0a8207a321b8ac09adbcef36e3236944390e2df4fcedb556ce7bb2a88f2a8 + languageName: node + linkType: hard + +"@types/webidl-conversions@npm:*": + version: 7.0.3 + resolution: "@types/webidl-conversions@npm:7.0.3" + checksum: 10c0/ac2ccff93b95ac7c8ca73dc6064403181691bba7ea144296f462dc9108a07be16cbad7b9c704b3df706dcc5a117e1f7bf7fb27aeb75b09c0f3148de8aee11aff + languageName: node + linkType: hard + +"@types/whatwg-url@npm:^11.0.2": + version: 11.0.5 + resolution: "@types/whatwg-url@npm:11.0.5" + dependencies: + "@types/webidl-conversions": "npm:*" + checksum: 10c0/7a9b9252dee98df6db1ad62337daca7f59ae50d7a3406d14ac6b57168d406004359994f3371155e24f3cf12002c4cb8bbb0883bd4cefb9d7ee8e2b510bdd7f5e + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.69.0": version: 8.69.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.69.0" @@ -2464,30 +1657,6 @@ __metadata: languageName: node linkType: hard -"@vitest/coverage-v8@npm:^4.1.2": - version: 4.1.11 - resolution: "@vitest/coverage-v8@npm:4.1.11" - dependencies: - "@bcoe/v8-coverage": "npm:^1.0.2" - "@vitest/utils": "npm:4.1.11" - ast-v8-to-istanbul: "npm:^1.0.0" - istanbul-lib-coverage: "npm:^3.2.2" - istanbul-lib-report: "npm:^3.0.1" - istanbul-reports: "npm:^3.2.0" - magicast: "npm:^0.5.2" - obug: "npm:^2.1.1" - std-env: "npm:^4.0.0-rc.1" - tinyrainbow: "npm:^3.1.0" - peerDependencies: - "@vitest/browser": 4.1.11 - vitest: 4.1.11 - peerDependenciesMeta: - "@vitest/browser": - optional: true - checksum: 10c0/91127fd40f445b506cc661c54e26defd75d970fa1983cb83442856dd7f295542f0378e0bca847036a7a5be871b3b17c27167d21f277e47368cf7409eafaa1b40 - languageName: node - linkType: hard - "@vitest/expect@npm:4.1.11": version: 4.1.11 resolution: "@vitest/expect@npm:4.1.11" @@ -2577,14 +1746,7 @@ __metadata: languageName: node linkType: hard -"abstract-logging@npm:^2.0.1": - version: 2.0.1 - resolution: "abstract-logging@npm:2.0.1" - checksum: 10c0/304879d9babcf6772260e5ddde632e6428e1f42f7a7a116d4689e97ad813a20e0ec2dd1e0a122f3617557f40091b9ca85735de4b48c17a2041268cb47b3f8ef1 - languageName: node - linkType: hard - -"accepts@npm:^1.3.5": +"accepts@npm:^1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -2612,29 +1774,12 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:3.0.1, ajv-formats@npm:^3.0.1": - version: 3.0.1 - resolution: "ajv-formats@npm:3.0.1" +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a - languageName: node - linkType: hard - -"ajv@npm:8.20.0, ajv@npm:^8.0.0, ajv@npm:^8.12.0": - version: 8.20.0 - resolution: "ajv@npm:8.20.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/5df9a1c8f83863cde1bd3a9ddb426f599718f88e3dc9153616c79fb28e0be455335830d7f21d745576519f057b371352daa31047b6a33d7036fe08777d60cf2a + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 languageName: node linkType: hard @@ -2650,135 +1795,10 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.2.2": - version: 6.3.0 - resolution: "ansi-regex@npm:6.3.0" - checksum: 10c0/bc047786d0531f1f22d1e22e9863e8554488a399f1ee5270b753efa6de938a788d27456f2b256770f11fdd8b1e847483bc1b55ddc2b3ffe82ec45c875292c651 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansis@npm:4.3.1": - version: 4.3.1 - resolution: "ansis@npm:4.3.1" - checksum: 10c0/d1a48090f9c33b18f254a3496e5336a20391a51140b552a1c0bc38710ae7c8bc36a62658f28759797d7bce15e89b893e9ef1962ea1ea42a291d112263f6e593c - languageName: node - linkType: hard - -"antd@npm:^6.6.2": - version: 6.6.2 - resolution: "antd@npm:6.6.2" - dependencies: - "@ant-design/colors": "npm:^8.0.1" - "@ant-design/cssinjs": "npm:^2.1.2" - "@ant-design/cssinjs-utils": "npm:^2.1.2" - "@ant-design/fast-color": "npm:^3.0.1" - "@ant-design/icons": "npm:^6.3.2" - "@ant-design/react-slick": "npm:~2.0.0" - "@babel/runtime": "npm:^7.29.2" - "@rc-component/cascader": "npm:~1.22.0" - "@rc-component/checkbox": "npm:~2.0.0" - "@rc-component/collapse": "npm:~1.2.0" - "@rc-component/color-picker": "npm:~3.1.1" - "@rc-component/dialog": "npm:~1.10.0" - "@rc-component/drawer": "npm:~1.4.2" - "@rc-component/dropdown": "npm:~1.0.3" - "@rc-component/form": "npm:~1.8.6" - "@rc-component/image": "npm:~1.10.0" - "@rc-component/input": "npm:~1.3.1" - "@rc-component/input-number": "npm:~1.6.2" - "@rc-component/listy": "npm:~1.2.3" - "@rc-component/mentions": "npm:~1.12.0" - "@rc-component/menu": "npm:~1.5.0" - "@rc-component/motion": "npm:^1.3.3" - "@rc-component/mutate-observer": "npm:^2.0.1" - "@rc-component/notification": "npm:~2.0.8" - "@rc-component/pagination": "npm:~1.4.0" - "@rc-component/picker": "npm:~1.12.0" - "@rc-component/progress": "npm:~1.0.3" - "@rc-component/qrcode": "npm:~2.0.0" - "@rc-component/rate": "npm:~1.0.1" - "@rc-component/resize-observer": "npm:^1.1.2" - "@rc-component/segmented": "npm:~1.3.0" - "@rc-component/select": "npm:~1.10.1" - "@rc-component/slider": "npm:~1.1.1" - "@rc-component/steps": "npm:~1.2.3" - "@rc-component/switch": "npm:~1.0.3" - "@rc-component/table": "npm:~1.11.1" - "@rc-component/tabs": "npm:~1.13.0" - "@rc-component/tooltip": "npm:~1.5.2" - "@rc-component/tour": "npm:~2.4.0" - "@rc-component/tree": "npm:~1.4.0" - "@rc-component/tree-select": "npm:~1.16.1" - "@rc-component/trigger": "npm:^3.10.1" - "@rc-component/upload": "npm:~1.1.1" - "@rc-component/util": "npm:^1.12.0" - clsx: "npm:^2.1.1" - dayjs: "npm:^1.11.11" - scroll-into-view-if-needed: "npm:^3.1.0" - throttle-debounce: "npm:^5.0.2" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/c9beb8dc3bf43b1522cebd67ddfc851684aa8cbea7763f2413d00f0ef37cb593abd432ce4e3d73c8292f09e74654d38f71882d995097f5f557d845b12b0700ed - languageName: node - linkType: hard - -"api@workspace:apps/api": - version: 0.0.0-use.local - resolution: "api@workspace:apps/api" - dependencies: - "@nestjs/cli": "npm:^12.0.0" - "@nestjs/common": "npm:^12.0.1" - "@nestjs/core": "npm:^12.0.1" - "@nestjs/mau": "npm:^0.2.6" - "@nestjs/platform-fastify": "npm:^12.0.1" - "@nestjs/schematics": "npm:^12.0.0" - "@nestjs/testing": "npm:^12.0.1" - "@types/node": "npm:^24.0.0" - "@types/supertest": "npm:^7.0.0" - "@vitest/coverage-v8": "npm:^4.1.2" - fastify: "npm:^5.12.1" - oxlint: "npm:^1.58.0" - prettier: "npm:^3.4.2" - reflect-metadata: "npm:^0.2.2" - rxjs: "npm:^7.8.2" - source-map-support: "npm:^0.5.21" - supertest: "npm:^7.0.0" - typescript: "npm:^6.0.2" - vite-tsconfig-paths: "npm:^5.1.4" - vitest: "npm:^4.1.2" - languageName: unknown - linkType: soft - -"array-timsort@npm:^1.0.3": - version: 1.0.3 - resolution: "array-timsort@npm:1.0.3" - checksum: 10c0/bd3a1707b621947265c89867e67c9102b9b9f4c50f5b3974220112290d8b60d26ce60595edec5deed3325207b759d70b758bed3cd310b5ddadb835657ffb6d12 +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 languageName: node linkType: hard @@ -2796,17 +1816,6 @@ __metadata: languageName: node linkType: hard -"ast-v8-to-istanbul@npm:^1.0.0": - version: 1.0.5 - resolution: "ast-v8-to-istanbul@npm:1.0.5" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.31" - estree-walker: "npm:^3.0.3" - js-tokens: "npm:^10.0.0" - checksum: 10c0/546db141f60913846ea2e74fc163ec5b9b1b5aa4863a564ccb15fefe12988191fe029b1d91541aa2f236900c1447de53876460c179efc3dd15b1b9281d6205a6 - languageName: node - linkType: hard - "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -2828,20 +1837,15 @@ __metadata: languageName: node linkType: hard -"atomic-sleep@npm:^1.0.0": - version: 1.0.0 - resolution: "atomic-sleep@npm:1.0.0" - checksum: 10c0/e329a6665512736a9bbb073e1761b4ec102f7926cce35037753146a9db9c8104f5044c1662e4a863576ce544fb8be27cd2be6bc8c1a40147d03f31eb1cfb6e8a - languageName: node - linkType: hard - -"avvio@npm:^9.0.0": - version: 9.3.0 - resolution: "avvio@npm:9.3.0" +"axios@npm:^1.20.0": + version: 1.20.0 + resolution: "axios@npm:1.20.0" dependencies: - "@fastify/error": "npm:^4.0.0" - fastq: "npm:^1.17.1" - checksum: 10c0/faa7bfc0bae70d7c30d56252fbe4671ebbf1e0b8c1bdb3d1febcad6549d3521d7bd0e535f903310d5a6af357447fc9cf6407229c7d46b2f2502d40dca341f625 + follow-redirects: "npm:^1.16.0" + form-data: "npm:^4.0.6" + https-proxy-agent: "npm:^5.0.1" + proxy-from-env: "npm:^2.1.0" + checksum: 10c0/976088acf532286356f4c2e65df1ef47ba7da3936d83e928d0d64357bbf5370456abd3eb5826c15df322335fcb1fe200d4a84b4fcf20ffccdd63b40d80fa495c languageName: node linkType: hard @@ -2852,13 +1856,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - "baseline-browser-mapping@npm:^2.11.12": version: 2.11.20 resolution: "baseline-browser-mapping@npm:2.11.20" @@ -2868,14 +1865,23 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" +"body-parser@npm:~1.20.5": + version: 1.20.6 + resolution: "body-parser@npm:1.20.6" dependencies: - buffer: "npm:^5.5.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.4.0" - checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + bytes: "npm:~3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.15.1" + raw-body: "npm:~2.5.3" + type-is: "npm:~1.6.18" + unpipe: "npm:~1.0.0" + checksum: 10c0/ad477209f1e714c41fa892a7d2fe22e10b23262103cc25cc6492dd3e6f7869cd2d8b00928b543a1a14d3c3663432452a192efd00422fad6f3687b0e38f7e3b07 languageName: node linkType: hard @@ -2903,27 +1909,10 @@ __metadata: languageName: node linkType: hard -"bson@npm:^5": - version: 5.5.1 - resolution: "bson@npm:5.5.1" - checksum: 10c0/00fabdafe98d20609bd76f607cada03ec544b90225103f7ae859fba7674bd96cae56432b0516e30291af0c40634d306f8a45b63b706a034e95fe583c749ef5b3 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e +"bson@npm:^6.10.4": + version: 6.10.4 + resolution: "bson@npm:6.10.4" + checksum: 10c0/6c6819ce642516901349f42c5d9d131d5a4e84352a3859c814d4abf6b2b9249e3685b57fc4cf7b5737fb5c71252f65900a41826c1429815a93e43f0f5bb3c173 languageName: node linkType: hard @@ -2978,53 +1967,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chalk@npm:^5.6.2": - version: 5.6.2 - resolution: "chalk@npm:5.6.2" - checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d - languageName: node - linkType: hard - -"chardet@npm:^2.1.1": - version: 2.2.0 - resolution: "chardet@npm:2.2.0" - checksum: 10c0/8d43a1dd3ce535aa070d04139fae62f879b4388394eb1d857364ce416675a1f0f63974fba8208e9cd11b49e1a6da3e65ea6393d0fc654a8c4217c0d74c16b1b4 - languageName: node - linkType: hard - -"chokidar@npm:5.0.0": - version: 5.0.0 - resolution: "chokidar@npm:5.0.0" - dependencies: - readdirp: "npm:^5.0.0" - checksum: 10c0/42fc907cb2a7ff5c9e220f84dae75380a77997f851c2a5e7865a2cf9ae45dd407a23557208cdcdbf3ac8c93341135a1748e4c48c31855f3bfa095e5159b6bdec - languageName: node - linkType: hard - "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -3032,85 +1974,10 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 - languageName: node - linkType: hard - -"cli-cursor@npm:^5.0.0": - version: 5.0.0 - resolution: "cli-cursor@npm:5.0.0" - dependencies: - restore-cursor: "npm:^5.0.0" - checksum: 10c0/7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 - languageName: node - linkType: hard - -"cli-progress@npm:3.12.0": - version: 3.12.0 - resolution: "cli-progress@npm:3.12.0" - dependencies: - string-width: "npm:^4.2.3" - checksum: 10c0/f464cb19ebde2f3880620a2adfaeeefaec6cb15c8e610c8a659ca1047ee90d69f3bf2fdabbb1fe33ac408678e882e3e0eecdb84ab5df0edf930b269b8a72682d - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 - languageName: node - linkType: hard - -"cli-spinners@npm:^3.2.0": - version: 3.4.0 - resolution: "cli-spinners@npm:3.4.0" - checksum: 10c0/91296c32e147d5b973c9d439d1512306499215437b92f0c0d8be44ec850b555acb8795c19c606b2f6747f31d50c4e41fdde7dcef653f18f0ae7cdd58e99a4764 - languageName: node - linkType: hard - -"cli-table3@npm:0.6.5": - version: 0.6.5 - resolution: "cli-table3@npm:0.6.5" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 10c0/d7cc9ed12212ae68241cc7a3133c52b844113b17856e11f4f81308acc3febcea7cc9fd298e70933e294dd642866b29fd5d113c2c098948701d0c35f09455de78 - languageName: node - linkType: hard - -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 10c0/125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a - languageName: node - linkType: hard - -"cli-width@npm:^4.1.0": - version: 4.1.0 - resolution: "cli-width@npm:4.1.0" - checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"clsx@npm:^2.1.1": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 +"cluster-key-slot@npm:1.1.1": + version: 1.1.1 + resolution: "cluster-key-slot@npm:1.1.1" + checksum: 10c0/079b1ae86b20e2d53308a877b08de5e830722a45c07810569d0dab4955bed569da33ac9f79998289d014adf02cca7223a0647cb0ee6548a12ab3c4f9beac1377 languageName: node linkType: hard @@ -3134,22 +2001,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -3159,30 +2010,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:15.0.0": - version: 15.0.0 - resolution: "commander@npm:15.0.0" - checksum: 10c0/539229c171914ea1ccd45ee5f10d924289a12a684ea3a7a44147abe54003c35ed6de9ae4ad198d88c29fdf403dca0428451a388234e6dc01b6faa978fb207206 - languageName: node - linkType: hard - -"commander@npm:4.1.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab - languageName: node - linkType: hard - -"comment-json@npm:5.0.0": - version: 5.0.0 - resolution: "comment-json@npm:5.0.0" - dependencies: - array-timsort: "npm:^1.0.3" - esprima: "npm:^4.0.1" - checksum: 10c0/86172bcdfc33e3f3da23819151a11a0a30e0d632c255c66541e511b6d41e549a10f1011c1467ded5ea5fe08096769cacfeb84107bbab2347f506aab926ad9082 - languageName: node - linkType: hard - "component-emitter@npm:^1.3.1": version: 1.3.1 resolution: "component-emitter@npm:1.3.1" @@ -3190,14 +2017,7 @@ __metadata: languageName: node linkType: hard -"compute-scroll-into-view@npm:^3.0.2": - version: 3.1.1 - resolution: "compute-scroll-into-view@npm:3.1.1" - checksum: 10c0/59761ed62304a9599b52ad75d0d6fbf0669ee2ab7dd472fdb0ad9da36628414c014dea7b5810046560180ad30ffec52a953d19297f66a1d4f3aa0999b9d2521d - languageName: node - linkType: hard - -"content-disposition@npm:~0.5.2": +"content-disposition@npm:~0.5.2, content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -3206,13 +2026,21 @@ __metadata: languageName: node linkType: hard -"content-type@npm:^1.0.4": +"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af languageName: node linkType: hard +"contracts@workspace:*, contracts@workspace:packages/contracts": + version: 0.0.0-use.local + resolution: "contracts@workspace:packages/contracts" + dependencies: + zod: "npm:^3" + languageName: unknown + linkType: soft + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -3227,6 +2055,13 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10c0/e7731ad2995ae2efeed6435ec1e22cdd21afef29d300c27281438b1eab2bae04ef0d1a203928c0afec2cee72aa36540b8747406ebe308ad23c8e8cc3c26c9c51 + languageName: node + linkType: hard + "cookie@npm:^1.0.1": version: 1.1.1 resolution: "cookie@npm:1.1.1" @@ -3234,6 +2069,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + "cookiejar@npm:^2.1.4": version: 2.1.4 resolution: "cookiejar@npm:2.1.4" @@ -3251,6 +2093,16 @@ __metadata: languageName: node linkType: hard +"cors@npm:^2": + version: 2.8.6 + resolution: "cors@npm:2.8.6" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 10c0/ab2bc57b8af8ef8476682a59647f7c55c1a7d406b559ac06119aa1c5f70b96d35036864d197b24cf86e228e4547231088f1f94ca05061dbb14d89cc0bc9d4cab + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -3262,21 +2114,46 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.1.3, csstype@npm:^3.2.2": +"crud-api@workspace:apps/crud-api": + version: 0.0.0-use.local + resolution: "crud-api@workspace:apps/crud-api" + dependencies: + "@types/cors": "npm:^2" + "@types/express": "npm:^4" + "@types/node": "npm:^24.0.0" + "@types/pg": "npm:^8" + "@types/supertest": "npm:^7.0.0" + contracts: "workspace:*" + cors: "npm:^2" + drizzle-orm: "npm:^0.44.5" + express: "npm:^4" + ioredis: "npm:^5" + oxlint: "npm:^1.58.0" + pg: "npm:^8" + supertest: "npm:^7.0.0" + tsx: "npm:^4" + typescript: "npm:^6.0.2" + vitest: "npm:^4.1.2" + languageName: unknown + linkType: soft + +"csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce languageName: node linkType: hard -"dayjs@npm:^1.11.11": - version: 1.11.23 - resolution: "dayjs@npm:1.11.23" - checksum: 10c0/69ab04bf19c676e44ab50cc2fca223d265f3dafd107151ef3b0f3ad74d360c37caa602abe62f87cb25d90bd9f6bee003698af47df5b0dbf10a998b7b5f3bb3f1 +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 languageName: node linkType: hard -"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:4.4.3, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -3302,15 +2179,6 @@ __metadata: languageName: node linkType: hard -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: "npm:^1.0.2" - checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a - languageName: node - linkType: hard - "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -3325,7 +2193,14 @@ __metadata: languageName: node linkType: hard -"depd@npm:^2.0.0, depd@npm:~2.0.0": +"denque@npm:2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 10c0/f9ef81aa0af9c6c614a727cb3bd13c5d7db2af1abf9e6352045b86e85873e629690f6222f4edd49d10e4ccf8f078bbeec0794fafaf61b659c0589d0c511ec363 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c @@ -3339,14 +2214,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.3": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 - languageName: node - linkType: hard - -"destroy@npm:^1.0.4": +"destroy@npm:1.2.0, destroy@npm:^1.0.4, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 @@ -3370,6 +2238,101 @@ __metadata: languageName: node linkType: hard +"drizzle-orm@npm:^0.44.5": + version: 0.44.7 + resolution: "drizzle-orm@npm:0.44.7" + peerDependencies: + "@aws-sdk/client-rds-data": ">=3" + "@cloudflare/workers-types": ">=4" + "@electric-sql/pglite": ">=0.2.0" + "@libsql/client": ">=0.10.0" + "@libsql/client-wasm": ">=0.10.0" + "@neondatabase/serverless": ">=0.10.0" + "@op-engineering/op-sqlite": ">=2" + "@opentelemetry/api": ^1.4.1 + "@planetscale/database": ">=1.13" + "@prisma/client": "*" + "@tidbcloud/serverless": "*" + "@types/better-sqlite3": "*" + "@types/pg": "*" + "@types/sql.js": "*" + "@upstash/redis": ">=1.34.7" + "@vercel/postgres": ">=0.8.0" + "@xata.io/client": "*" + better-sqlite3: ">=7" + bun-types: "*" + expo-sqlite: ">=14.0.0" + gel: ">=2" + knex: "*" + kysely: "*" + mysql2: ">=2" + pg: ">=8" + postgres: ">=3" + sql.js: ">=1" + sqlite3: ">=5" + peerDependenciesMeta: + "@aws-sdk/client-rds-data": + optional: true + "@cloudflare/workers-types": + optional: true + "@electric-sql/pglite": + optional: true + "@libsql/client": + optional: true + "@libsql/client-wasm": + optional: true + "@neondatabase/serverless": + optional: true + "@op-engineering/op-sqlite": + optional: true + "@opentelemetry/api": + optional: true + "@planetscale/database": + optional: true + "@prisma/client": + optional: true + "@tidbcloud/serverless": + optional: true + "@types/better-sqlite3": + optional: true + "@types/pg": + optional: true + "@types/sql.js": + optional: true + "@upstash/redis": + optional: true + "@vercel/postgres": + optional: true + "@xata.io/client": + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + checksum: 10c0/6adfe19179c83be397490c21573433e38ed7eff890bbb1c3b39157ec57d6b7420e9dcfebb8fe0e6ea534b29a53a33b2ec75c77dd2ac6b474b7055965ee7df00d + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -3395,20 +2358,6 @@ __metadata: languageName: node linkType: hard -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emojilib@npm:^2.4.0": - version: 2.4.0 - resolution: "emojilib@npm:2.4.0" - checksum: 10c0/6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f - languageName: node - linkType: hard - "encodeurl@npm:^1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -3416,6 +2365,23 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.24.1": + version: 5.24.5 + resolution: "enhanced-resolve@npm:5.24.5" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.3.3" + checksum: 10c0/76c32ce5485ecea0ef808c9289bc6f7c49ce85142943598d89a23a846f2909556d3dc6db97a007442a48c185baad5514c1c76d20a2656497f9511d13ccfab73b + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -3465,6 +2431,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.28.0": + version: 0.28.2 + resolution: "esbuild@npm:0.28.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.28.2" + "@esbuild/android-arm": "npm:0.28.2" + "@esbuild/android-arm64": "npm:0.28.2" + "@esbuild/android-x64": "npm:0.28.2" + "@esbuild/darwin-arm64": "npm:0.28.2" + "@esbuild/darwin-x64": "npm:0.28.2" + "@esbuild/freebsd-arm64": "npm:0.28.2" + "@esbuild/freebsd-x64": "npm:0.28.2" + "@esbuild/linux-arm": "npm:0.28.2" + "@esbuild/linux-arm64": "npm:0.28.2" + "@esbuild/linux-ia32": "npm:0.28.2" + "@esbuild/linux-loong64": "npm:0.28.2" + "@esbuild/linux-mips64el": "npm:0.28.2" + "@esbuild/linux-ppc64": "npm:0.28.2" + "@esbuild/linux-riscv64": "npm:0.28.2" + "@esbuild/linux-s390x": "npm:0.28.2" + "@esbuild/linux-x64": "npm:0.28.2" + "@esbuild/netbsd-arm64": "npm:0.28.2" + "@esbuild/netbsd-x64": "npm:0.28.2" + "@esbuild/openbsd-arm64": "npm:0.28.2" + "@esbuild/openbsd-x64": "npm:0.28.2" + "@esbuild/openharmony-arm64": "npm:0.28.2" + "@esbuild/sunos-x64": "npm:0.28.2" + "@esbuild/win32-arm64": "npm:0.28.2" + "@esbuild/win32-ia32": "npm:0.28.2" + "@esbuild/win32-x64": "npm:0.28.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/9b19edb63bd7780fd2e8e65a1394a0e8a05a17d697f73f0647ffe3c134709d8dbe744ab3fd57b35c9470db268cae7678fafd3dcd3ce1f34fc590568c2433f5d2 + languageName: node + linkType: hard + "escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -3472,20 +2527,13 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:^1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -3599,16 +2647,6 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.1": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - "esquery@npm:^1.7.0": version: 1.7.0 resolution: "esquery@npm:1.7.0" @@ -3650,6 +2688,13 @@ __metadata: languageName: node linkType: hard +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + "expect-type@npm:^1.3.0": version: 1.4.0 resolution: "expect-type@npm:1.4.0" @@ -3664,21 +2709,42 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" +"express@npm:^4": + version: 4.22.2 + resolution: "express@npm:4.22.2" dependencies: - chardet: "npm:^0.7.0" - iconv-lite: "npm:^0.4.24" - tmp: "npm:^0.0.33" - checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 - languageName: node - linkType: hard - -"fast-decode-uri-component@npm:^1.0.1": - version: 1.0.1 - resolution: "fast-decode-uri-component@npm:1.0.1" - checksum: 10c0/039d50c2e99d64f999c3f2126c23fbf75a04a4117e218a149ca0b1d2aeb8c834b7b19d643b9d35d4eabce357189a6a94085f78cf48869e6e26cc59b036284bc3 + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:~1.20.5" + content-disposition: "npm:~0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:~0.1.12" + proxy-addr: "npm:~2.0.7" + qs: "npm:~6.15.1" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:~2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/d06dd4379fd217440b30f8abbe45f0e74931114c1395034f03e7d635196ecdab530d4835a1962a6aa34838d61967dc6f1f77846999bba3032373e9e714222c44 languageName: node linkType: hard @@ -3696,20 +2762,6 @@ __metadata: languageName: node linkType: hard -"fast-json-stringify@npm:^7.0.0": - version: 7.0.1 - resolution: "fast-json-stringify@npm:7.0.1" - dependencies: - "@fastify/merge-json-schemas": "npm:^0.2.0" - ajv: "npm:^8.12.0" - ajv-formats: "npm:^3.0.1" - fast-uri: "npm:^4.0.0" - json-schema-ref-resolver: "npm:^3.0.0" - rfdc: "npm:^1.2.0" - checksum: 10c0/02da1a456a13bd36aecf50255f04514719d77c295a9fbfac53f7d17f6d8e0bc574b2457a899384fc243637e73b047f8f375d9b2fb3c2c265c6e53dad464b40e0 - languageName: node - linkType: hard - "fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" @@ -3717,100 +2769,13 @@ __metadata: languageName: node linkType: hard -"fast-querystring@npm:1.1.2, fast-querystring@npm:^1.0.0, fast-querystring@npm:^1.1.2": - version: 1.1.2 - resolution: "fast-querystring@npm:1.1.2" - dependencies: - fast-decode-uri-component: "npm:^1.0.1" - checksum: 10c0/e8223273a9b199722f760f5a047a77ad049a14bd444b821502cb8218f5925e3a5fffb56b64389bca73ab2ac6f1aa7aebbe4e203e5f6e53ff5978de97c0fde4e3 - languageName: node - linkType: hard - -"fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.1.1": +"fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d languageName: node linkType: hard -"fast-string-truncated-width@npm:^3.0.2": - version: 3.0.3 - resolution: "fast-string-truncated-width@npm:3.0.3" - checksum: 10c0/043b8663397d14a3880ce4f3407bcda60b40db9bbeafe62863a35d1f9c69ea17c8da3fcd72de235553e6c9cd053128cde9e24ca0d4a7463208f48db3cd23d981 - languageName: node - linkType: hard - -"fast-string-width@npm:^3.0.2": - version: 3.0.2 - resolution: "fast-string-width@npm:3.0.2" - dependencies: - fast-string-truncated-width: "npm:^3.0.2" - checksum: 10c0/c8822d175315bb353ebe782b65214ac53b13e3bf704e03b132ea7bdfa8de6a636375b3ab7a4097545393d109381c37c4f387c72a462c90b61412dbc4632f39a7 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.1.6 - resolution: "fast-uri@npm:3.1.6" - checksum: 10c0/77fa4f966f7d2cf83c34af2d3eb88882872fe90634f27a6bd309551db65377d3ca55616467c7cb4dcc57e33523d149e2fec1952d51cc2f00bfce68a66c3711ea - languageName: node - linkType: hard - -"fast-uri@npm:^4.0.0": - version: 4.1.3 - resolution: "fast-uri@npm:4.1.3" - checksum: 10c0/6fc13d8731757ab6ba419a38044dece1b0757f086c57e75627218d66a0085ae3cff501aaa9840fffb4c83ecccd9806e7f8ebce985cd6e3fb589cffec3d86b9b1 - languageName: node - linkType: hard - -"fast-wrap-ansi@npm:^0.2.0": - version: 0.2.2 - resolution: "fast-wrap-ansi@npm:0.2.2" - dependencies: - fast-string-width: "npm:^3.0.2" - checksum: 10c0/1aa7be4f7cb86f4bdb14691cb6bcc0b8df8b3b89df142ade3ae1602332dcf6f990cd750a923cd581ca0847808cb4ec1aa5afaafa7a72f849e87a2a62c98fa370 - languageName: node - linkType: hard - -"fastify-plugin@npm:6.0.0, fastify-plugin@npm:^6.0.0": - version: 6.0.0 - resolution: "fastify-plugin@npm:6.0.0" - checksum: 10c0/4d9207efcbb0e6e8bd849eb8e00b097ae2d73590b1499f51d0bed135d08664e19d9428f2e8fc1a126b55ec4d2ac011dbcc72e753c255c46a751d6d34b57e5d4f - languageName: node - linkType: hard - -"fastify@npm:5.12.1, fastify@npm:^5.12.1": - version: 5.12.1 - resolution: "fastify@npm:5.12.1" - dependencies: - "@fastify/ajv-compiler": "npm:^4.0.5" - "@fastify/error": "npm:^4.0.0" - "@fastify/fast-json-stringify-compiler": "npm:^5.0.0" - "@fastify/proxy-addr": "npm:^5.0.0" - abstract-logging: "npm:^2.0.1" - avvio: "npm:^9.0.0" - fast-json-stringify: "npm:^7.0.0" - find-my-way: "npm:^9.6.0" - light-my-request: "npm:^6.0.0" - pino: "npm:^9.14.0 || ^10.1.0" - process-warning: "npm:^5.1.0" - rfdc: "npm:^1.3.1" - secure-json-parse: "npm:^4.0.0" - semver: "npm:^7.6.0" - toad-cache: "npm:^3.7.0" - checksum: 10c0/07e2219db3d7d522519fe16bfefa1768d3bbcb80a161762131db7315812af3f7a4cd131358985a9aeb84ab24c069a362ec3ef592a3a29eb4fa3446e77bbf6678 - languageName: node - linkType: hard - -"fastq@npm:^1.17.1": - version: 1.20.3 - resolution: "fastq@npm:1.20.3" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/ad055a1b50f7ec9142d2e13699ad6c4d1fa9fea1d947fff89de1b5ea3825223e9a626c359b3a0f21aefbe093cc2a9e92a91e068f982a2b176af16b9ea430ffc5 - languageName: node - linkType: hard - "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -3823,15 +2788,6 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 - languageName: node - linkType: hard - "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -3841,26 +2797,18 @@ __metadata: languageName: node linkType: hard -"file-type@npm:22.0.2": - version: 22.0.2 - resolution: "file-type@npm:22.0.2" +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" dependencies: - "@tokenizer/inflate": "npm:^0.4.1" - strtok3: "npm:^10.3.5" - token-types: "npm:^6.1.2" - uint8array-extras: "npm:^1.5.0" - checksum: 10c0/1ad23ecb6afd60ea59046b213ac834c51ab0706e185c9509c5a2adce290db05cc4672b197390268a145ea489d489768e10cfd7df802da2b492a45a0aa0231be8 - languageName: node - linkType: hard - -"find-my-way@npm:9.9.0, find-my-way@npm:^9.6.0": - version: 9.9.0 - resolution: "find-my-way@npm:9.9.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-querystring: "npm:^1.0.0" - safe-regex2: "npm:^5.0.0" - checksum: 10c0/fbcf02bbc6cb8f739167074f664a8a08721e89b7f5e4a9ff67b42f36e2c692369d520a14f7a9ed9b5bb6e47d7714e1cd885ac9049ddeb81077be4edcfecfdcad + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:~2.0.2" + unpipe: "npm:~1.0.0" + checksum: 10c0/435a4fd65e4e4e4c71bb5474980090b73c353a123dd415583f67836bdd6516e528cf07298e219a82b94631dee7830eae5eece38d3c178073cf7df4e8c182f413 languageName: node linkType: hard @@ -3891,7 +2839,17 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0, form-data@npm:^4.0.5": +"follow-redirects@npm:^1.16.0": + version: 1.16.0 + resolution: "follow-redirects@npm:1.16.0" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/a1e2900163e6f1b4d1ed5c221b607f41decbab65534c63fe7e287e40a5d552a6496e7d9d7d976fa4ba77b4c51c11e5e9f683f10b43011ea11e442ff128d0e181 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0, form-data@npm:^4.0.5, form-data@npm:^4.0.6": version: 4.0.6 resolution: "form-data@npm:4.0.6" dependencies: @@ -3927,6 +2885,13 @@ __metadata: languageName: node linkType: hard +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + "fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -3974,13 +2939,6 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.5.0": - version: 1.6.0 - resolution: "get-east-asian-width@npm:1.6.0" - checksum: 10c0/7e72e9550fd49ca5b246f9af6bb2afc129c96412845ff6556b3274fd44817a381702ca17028efe9866b261a3d44254cbf21e6c90cf05b4b61675630af776d431 - languageName: node - linkType: hard - "get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" @@ -4028,13 +2986,6 @@ __metadata: languageName: node linkType: hard -"globrex@npm:^0.1.2": - version: 0.1.2 - resolution: "globrex@npm:0.1.2" - checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 - languageName: node - linkType: hard - "gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -4042,20 +2993,13 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - "has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": version: 1.1.0 resolution: "has-symbols@npm:1.1.0" @@ -4097,13 +3041,6 @@ __metadata: languageName: node linkType: hard -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 - languageName: node - linkType: hard - "http-assert@npm:^1.3.0": version: 1.5.0 resolution: "http-assert@npm:1.5.0" @@ -4127,7 +3064,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^2.0.0, http-errors@npm:~2.0.1": +"http-errors@npm:^2.0.0, http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": version: 2.0.1 resolution: "http-errors@npm:2.0.1" dependencies: @@ -4140,7 +3077,17 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.4.24, iconv-lite@npm:~0.4.24": +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"iconv-lite@npm:~0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -4149,22 +3096,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.7.2": - version: 0.7.3 - resolution: "iconv-lite@npm:0.7.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/be2fd2414f7e94be3a63063fa0ad5919c16bc7b6e00c77eea0765ced6db405739f38dd51016583058fba25cc1d0106ba30b83fbb7a7e32f824d4db76f23d8d33 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - "ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -4179,6 +3110,13 @@ __metadata: languageName: node linkType: hard +"immer@npm:^11.0.0": + version: 11.1.18 + resolution: "immer@npm:11.1.18" + checksum: 10c0/afe02fcd154134eb2b3bea5a06051ef2e220677dbbc9c0b17ea2ce1c22bfc3690ac16f916922c12ad9c074617a02148ac5d94cbf0886d76e7ebac726806679d0 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -4193,40 +3131,58 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.4": +"ingest-api@workspace:apps/ingest-api": + version: 0.0.0-use.local + resolution: "ingest-api@workspace:apps/ingest-api" + dependencies: + "@koa/cors": "npm:^5.0.0" + "@koa/router": "npm:^12" + "@types/koa": "npm:^2" + "@types/koa__cors": "npm:^5.0.1" + "@types/koa__router": "npm:^12" + "@types/node": "npm:^24.0.0" + "@types/pg": "npm:^8" + "@types/supertest": "npm:^7.0.0" + contracts: "workspace:*" + ioredis: "npm:^5" + koa: "npm:^2" + koa-body: "npm:^6" + mongodb: "npm:^6" + oxlint: "npm:^1.58.0" + pg: "npm:^8" + supertest: "npm:^7.0.0" + tsx: "npm:^4" + typescript: "npm:^6.0.2" + vitest: "npm:^4.1.2" + languageName: unknown + linkType: soft + +"inherits@npm:2.0.4, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"inquirer@npm:8.2.6": - version: 8.2.6 - resolution: "inquirer@npm:8.2.6" +"ioredis@npm:^5": + version: 5.11.1 + resolution: "ioredis@npm:5.11.1" dependencies: - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.1.1" - cli-cursor: "npm:^3.1.0" - cli-width: "npm:^3.0.0" - external-editor: "npm:^3.0.3" - figures: "npm:^3.0.0" - lodash: "npm:^4.17.21" - mute-stream: "npm:0.0.8" - ora: "npm:^5.4.1" - run-async: "npm:^2.4.0" - rxjs: "npm:^7.5.5" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - through: "npm:^2.3.6" - wrap-ansi: "npm:^6.0.1" - checksum: 10c0/eb5724de1778265323f3a68c80acfa899378cb43c24cdcb58661386500e5696b6b0b6c700e046b7aa767fe7b4823c6f04e6ddc268173e3f84116112529016296 + "@ioredis/commands": "npm:1.10.0" + cluster-key-slot: "npm:1.1.1" + debug: "npm:4.4.3" + denque: "npm:2.1.0" + redis-errors: "npm:1.2.0" + redis-parser: "npm:3.0.0" + standard-as-callback: "npm:2.1.0" + checksum: 10c0/a8b27043cf2c045dfc93f40a32ce24cf9f8b57799a37f4234c4b925c365ccf131629590f94a512f546fda2ba8ed034009c94c4933ecd44c50bc166636d929fd6 languageName: node linkType: hard -"ipaddr.js@npm:^2.1.0": - version: 2.5.0 - resolution: "ipaddr.js@npm:2.5.0" - checksum: 10c0/5cef50d91a14f6388c3b5df3568ee7f8b18e07fa18896debc84d3393b78c1096e1b8e3a4f9fa9020c5ca5b556efc28550432f92a34d23c0cd643bd3194eb439d +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a languageName: node linkType: hard @@ -4237,13 +3193,6 @@ __metadata: languageName: node linkType: hard -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - "is-generator-function@npm:^1.0.7": version: 1.1.2 resolution: "is-generator-function@npm:1.1.2" @@ -4266,27 +3215,6 @@ __metadata: languageName: node linkType: hard -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d - languageName: node - linkType: hard - -"is-interactive@npm:^2.0.0": - version: 2.0.0 - resolution: "is-interactive@npm:2.0.0" - checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 - languageName: node - linkType: hard - -"is-mobile@npm:^5.0.0": - version: 5.0.0 - resolution: "is-mobile@npm:5.0.0" - checksum: 10c0/70b31c3e4489109e02deb9b590e74858aeec7ef775a882d89ec030cb7dbaeb2be1173d7faee495049629e49822d0aba9b20e6653b1e25dd7c9121247cb8829d7 - languageName: node - linkType: hard - "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -4299,20 +3227,6 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^2.0.0, is-unicode-supported@npm:^2.1.0": - version: 2.1.0 - resolution: "is-unicode-supported@npm:2.1.0" - checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -4327,45 +3241,12 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-reports@npm:3.2.0" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc - languageName: node - linkType: hard - -"iterare@npm:1.2.1": - version: 1.2.1 - resolution: "iterare@npm:1.2.1" - checksum: 10c0/02667d486e3e83ead028ba8484d927498c2ceab7e8c6a69dd881fd02abc4114f00b13abb36b592252fbb578b6e6f99ca1dfc2835408b9158c9a112a9964f453f - languageName: node - linkType: hard - -"js-tokens@npm:^10.0.0": - version: 10.0.0 - resolution: "js-tokens@npm:10.0.0" - checksum: 10c0/a93498747812ba3e0c8626f95f75ab29319f2a13613a0de9e610700405760931624433a0de59eb7c27ff8836e526768fb20783861b86ef89be96676f2c996b64 +"jiti@npm:^2.7.0": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/1b1e2310a490dce1aeea3da5f5dfe18273516c20ce48be2e98eb8ea452d5f3dcc8fd0cfd6d28b4052a24c5dbab6e3089b2d7e79f0bce7915b10d750929563c42 languageName: node linkType: hard @@ -4392,15 +3273,6 @@ __metadata: languageName: node linkType: hard -"json-schema-ref-resolver@npm:^3.0.0": - version: 3.0.0 - resolution: "json-schema-ref-resolver@npm:3.0.0" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/0b6f4b66951ac0f6864949c08317cf0b7f7ae94e8da0b94e40df3561dc1a0b77a69b669d60aa1511b06aa18469203886eb2e89fd6bb3dcf0be46c329d69b0115 - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -4408,13 +3280,6 @@ __metadata: languageName: node linkType: hard -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -4422,16 +3287,7 @@ __metadata: languageName: node linkType: hard -"json2mq@npm:^0.2.0": - version: 0.2.0 - resolution: "json2mq@npm:0.2.0" - dependencies: - string-convert: "npm:^0.2.0" - checksum: 10c0/fc9e2f2306572522d3e61d246afdf70b56ca9ea32f4ad5924c30949867851ab59c926bd0ffc821ebb54d32f3e82e95225f3906eacdb3e54c1ad49acdadf7e0c7 - languageName: node - linkType: hard - -"json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -4440,13 +3296,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:3.3.1": - version: 3.3.1 - resolution: "jsonc-parser@npm:3.3.1" - checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 - languageName: node - linkType: hard - "keygrip@npm:~1.1.0": version: 1.1.0 resolution: "keygrip@npm:1.1.0" @@ -4537,14 +3386,10 @@ __metadata: languageName: node linkType: hard -"light-my-request@npm:6.6.0, light-my-request@npm:^6.0.0": - version: 6.6.0 - resolution: "light-my-request@npm:6.6.0" - dependencies: - cookie: "npm:^1.0.1" - process-warning: "npm:^4.0.0" - set-cookie-parser: "npm:^2.6.0" - checksum: 10c0/1440853cd3822ab83fbb1be4456099082dec8e9e3a4ea35c9d8d7d17a7ab98c83ad0a4c39a73a8c2b31b9ca70c57506e5b7a929495c149463ca0daca0d90dc6f +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -4555,6 +3400,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "lightningcss-darwin-arm64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-darwin-arm64@npm:1.33.0" @@ -4562,6 +3414,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "lightningcss-darwin-x64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-darwin-x64@npm:1.33.0" @@ -4569,6 +3428,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "lightningcss-freebsd-x64@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-freebsd-x64@npm:1.33.0" @@ -4576,6 +3442,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "lightningcss-linux-arm-gnueabihf@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm-gnueabihf@npm:1.33.0" @@ -4583,6 +3456,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "lightningcss-linux-arm64-gnu@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm64-gnu@npm:1.33.0" @@ -4590,6 +3470,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "lightningcss-linux-arm64-musl@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-arm64-musl@npm:1.33.0" @@ -4597,6 +3484,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "lightningcss-linux-x64-gnu@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-x64-gnu@npm:1.33.0" @@ -4604,6 +3498,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "lightningcss-linux-x64-musl@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-linux-x64-musl@npm:1.33.0" @@ -4611,6 +3512,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "lightningcss-win32-arm64-msvc@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-win32-arm64-msvc@npm:1.33.0" @@ -4618,6 +3526,13 @@ __metadata: languageName: node linkType: hard +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "lightningcss-win32-x64-msvc@npm:1.33.0": version: 1.33.0 resolution: "lightningcss-win32-x64-msvc@npm:1.33.0" @@ -4625,6 +3540,49 @@ __metadata: languageName: node linkType: hard +"lightningcss@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 + languageName: node + linkType: hard + "lightningcss@npm:^1.33.0": version: 1.33.0 resolution: "lightningcss@npm:1.33.0" @@ -4668,13 +3626,6 @@ __metadata: languageName: node linkType: hard -"load-esm@npm:1.0.3": - version: 1.0.3 - resolution: "load-esm@npm:1.0.3" - checksum: 10c0/285a3666a29c11f7b466bb70ee3582af32893d03ed91b68be939c656a15afd27f3683f5f8d56b52834ce2911ecf1c84e515e6048248fb5268a89b724a8ddbf65 - languageName: node - linkType: hard - "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -4684,33 +3635,6 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": - version: 4.18.1 - resolution: "lodash@npm:4.18.1" - checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 - languageName: node - linkType: hard - -"log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 - languageName: node - linkType: hard - -"log-symbols@npm:^7.0.1": - version: 7.0.1 - resolution: "log-symbols@npm:7.0.1" - dependencies: - is-unicode-supported: "npm:^2.0.0" - yoctocolors: "npm:^2.1.1" - checksum: 10c0/71d30f9a44b8604b14df5e7c9b579d739997253db7385339d493ece41ee2cc74c1f96c5b4c0b2c1e0829b05348d4f287e68faab495b7a094a80f51351c816075 - languageName: node - linkType: hard - "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -4720,15 +3644,6 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:1.0.0": - version: 1.0.0 - resolution: "magic-string@npm:1.0.0" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.5" - checksum: 10c0/89a21967ce44f0a81136eb57d42449731262e300bab5442ccf9c61e054e90dbd1a1895ad5b9cf8a82d8945463b53cdbafc43db6bca0551b635a4942e0866e60f - languageName: node - linkType: hard - "magic-string@npm:^0.30.21": version: 0.30.21 resolution: "magic-string@npm:0.30.21" @@ -4738,38 +3653,11 @@ __metadata: languageName: node linkType: hard -"magicast@npm:^0.5.2": - version: 0.5.4 - resolution: "magicast@npm:0.5.4" - dependencies: - "@babel/parser": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - source-map-js: "npm:^1.2.1" - checksum: 10c0/f6a3b33d1c994cace3999fc96876a9fd06429deff8266563ccdc1d731c9edc4e1fb59d724128d7d4f3382eb457cd5a39ae1ec7b1e1864e068297ee2a30c12a3d - languageName: node - linkType: hard - -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 - languageName: node - linkType: hard - "marco-trest-test@workspace:.": version: 0.0.0-use.local resolution: "marco-trest-test@workspace:." dependencies: - "@jig-software/trest": "npm:^2.0.0-beta" - "@koa/router": "npm:^12" - bson: "npm:^5" - koa: "npm:^2" - koa-body: "npm:^6" - path-to-regexp: "npm:^6" typescript: "npm:5.9.2" - zod: "npm:^3" languageName: unknown linkType: soft @@ -4787,7 +3675,21 @@ __metadata: languageName: node linkType: hard -"methods@npm:^1.1.2": +"memory-pager@npm:^1.0.2": + version: 1.5.0 + resolution: "memory-pager@npm:1.5.0" + checksum: 10c0/2596e80c99fee24f05bd8a20cde2ee899012c996f4ec361ac76ed6f009f34149d733ac6f76880106ccd6a66d062ad439357578d383d429df66ba1278f68806e9 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + +"methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 @@ -4810,6 +3712,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + "mime@npm:2.6.0": version: 2.6.0 resolution: "mime@npm:2.6.0" @@ -4819,21 +3730,7 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 - languageName: node - linkType: hard - -"mimic-function@npm:^5.0.0": - version: 5.0.1 - resolution: "mimic-function@npm:5.0.1" - checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d - languageName: node - linkType: hard - -"minimatch@npm:10.2.6, minimatch@npm:^10.2.2, minimatch@npm:^10.2.4, minimatch@npm:^10.2.5": +"minimatch@npm:^10.2.2, minimatch@npm:^10.2.4, minimatch@npm:^10.2.5": version: 10.2.6 resolution: "minimatch@npm:10.2.6" dependencies: @@ -4842,13 +3739,6 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - "minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.3 resolution: "minipass@npm:7.1.3" @@ -4865,27 +3755,64 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.3": +"mongodb-connection-string-url@npm:^3.0.2": + version: 3.0.2 + resolution: "mongodb-connection-string-url@npm:3.0.2" + dependencies: + "@types/whatwg-url": "npm:^11.0.2" + whatwg-url: "npm:^14.1.0 || ^13.0.0" + checksum: 10c0/8b7ac99634f167dbe690e90fa10528e3ffc029faf2feabf36efb84299a04831130b3dba114dbe132f05a8a38022976904b625976996a4534bca4368e8fa5ba33 + languageName: node + linkType: hard + +"mongodb@npm:^6": + version: 6.21.0 + resolution: "mongodb@npm:6.21.0" + dependencies: + "@mongodb-js/saslprep": "npm:^1.3.0" + bson: "npm:^6.10.4" + mongodb-connection-string-url: "npm:^3.0.2" + peerDependencies: + "@aws-sdk/credential-providers": ^3.188.0 + "@mongodb-js/zstd": ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: ">=6.0.0 <7" + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + "@aws-sdk/credential-providers": + optional: true + "@mongodb-js/zstd": + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + checksum: 10c0/3269316bdba174139e10cb25a1f22a8445beb14f26987d61dba922ddd5784b35b4bec563554da4d1ab180a3c1ff77f092ba858cd3ae3da45e3aaf706ef27a460 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 - languageName: node - linkType: hard - -"mute-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "mute-stream@npm:3.0.0" - checksum: 10c0/12cdb36a101694c7a6b296632e6d93a30b74401873cf7507c88861441a090c71c77a58f213acadad03bc0c8fa186639dec99d68a14497773a8744320c136e701 - languageName: node - linkType: hard - "nanoid@npm:^3.3.17": version: 3.3.18 resolution: "nanoid@npm:3.3.18" @@ -4909,30 +3836,6 @@ __metadata: languageName: node linkType: hard -"node-emoji@npm:2.1.3": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" - dependencies: - "@sindresorhus/is": "npm:^4.6.0" - char-regex: "npm:^1.0.2" - emojilib: "npm:^2.4.0" - skin-tone: "npm:^2.0.0" - checksum: 10c0/e688333373563aa8308df16111eee2b5837b53a51fb63bf8b7fbea2896327c5d24c9984eb0c8ca6ac155d4d9c194dcf1840d271033c1b588c7c45a3b65339ef7 - languageName: node - linkType: hard - -"node-emoji@npm:2.2.0": - version: 2.2.0 - resolution: "node-emoji@npm:2.2.0" - dependencies: - "@sindresorhus/is": "npm:^4.6.0" - char-regex: "npm:^1.0.2" - emojilib: "npm:^2.4.0" - skin-tone: "npm:^2.0.0" - checksum: 10c0/9525defbd90a82a2131758c2470203fa2a2faa8edd177147a8654a26307fe03594e52847ecbe2746d06cfc5c50acd12bd500f035350a7609e8217c9894c19aad - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 13.0.2 resolution: "node-gyp@npm:13.0.2" @@ -4971,6 +3874,13 @@ __metadata: languageName: node linkType: hard +"object-assign@npm:^4": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + "object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -4985,14 +3895,7 @@ __metadata: languageName: node linkType: hard -"on-exit-leak-free@npm:^2.1.0": - version: 2.1.2 - resolution: "on-exit-leak-free@npm:2.1.2" - checksum: 10c0/faea2e1c9d696ecee919026c32be8d6a633a7ac1240b3b87e944a380e8a11dc9c95c4a1f8fb0568de7ab8db3823e790f12bda45296b1d111e341aad3922a0570 - languageName: node - linkType: hard - -"on-finished@npm:^2.3.0": +"on-finished@npm:^2.3.0, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -5010,24 +3913,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f - languageName: node - linkType: hard - -"onetime@npm:^7.0.0": - version: 7.0.0 - resolution: "onetime@npm:7.0.0" - dependencies: - mimic-function: "npm:^5.0.0" - checksum: 10c0/5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 - languageName: node - linkType: hard - "only@npm:~0.0.2": version: 0.0.2 resolution: "only@npm:0.0.2" @@ -5049,46 +3934,6 @@ __metadata: languageName: node linkType: hard -"ora@npm:5.4.1, ora@npm:^5.4.1": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: "npm:^4.1.0" - chalk: "npm:^4.1.0" - cli-cursor: "npm:^3.1.0" - cli-spinners: "npm:^2.5.0" - is-interactive: "npm:^1.0.0" - is-unicode-supported: "npm:^0.1.0" - log-symbols: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - wcwidth: "npm:^1.0.1" - checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 - languageName: node - linkType: hard - -"ora@npm:9.4.1": - version: 9.4.1 - resolution: "ora@npm:9.4.1" - dependencies: - chalk: "npm:^5.6.2" - cli-cursor: "npm:^5.0.0" - cli-spinners: "npm:^3.2.0" - is-interactive: "npm:^2.0.0" - is-unicode-supported: "npm:^2.1.0" - log-symbols: "npm:^7.0.1" - stdin-discarder: "npm:^0.3.2" - string-width: "npm:^8.1.0" - checksum: 10c0/d58003408f3ddee46cd0a8d05e28c8a62e56cddd7ca4bc39adc4455c653d9d4c3d85b6f6b6c9ca78085f7ccbbb202ce8781505cdbebd357537a2b3f3eaa11ec2 - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 - languageName: node - linkType: hard - "oxlint@npm:^1.58.0": version: 1.81.0 resolution: "oxlint@npm:1.81.0" @@ -5183,7 +4028,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.2": +"parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 @@ -5204,20 +4049,20 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:8.4.2": - version: 8.4.2 - resolution: "path-to-regexp@npm:8.4.2" - checksum: 10c0/05b115c49b47ad252ce05faa32930f643f23769c68b8bcfe78ad833545140c48bbffb3266986d6c8d5db13a64cf12e07e0d72d9882cab830efeefa553533ebaf - languageName: node - linkType: hard - -"path-to-regexp@npm:^6, path-to-regexp@npm:^6.3.0": +"path-to-regexp@npm:^6.3.0": version: 6.3.0 resolution: "path-to-regexp@npm:6.3.0" checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 languageName: node linkType: hard +"path-to-regexp@npm:~0.1.12": + version: 0.1.13 + resolution: "path-to-regexp@npm:0.1.13" + checksum: 10c0/1cae3921739c154a8926e136185a10c916f79a249b9072a5001b266d96e193860ca03867e8e8cc808b786862d750f427ed93686bc259355442c3407a62deab1a + languageName: node + linkType: hard + "pathe@npm:^2.0.3": version: 2.0.3 resolution: "pathe@npm:2.0.3" @@ -5225,6 +4070,87 @@ __metadata: languageName: node linkType: hard +"pg-cloudflare@npm:^1.4.0": + version: 1.4.0 + resolution: "pg-cloudflare@npm:1.4.0" + checksum: 10c0/553764d00055052648393cda53c1feb065991d6f9fbfdeb56cf8396c5b33377ab2897aaf5dc9cd3933d09023a1f01e8b1ca755431dcf5fd71c92ea277e2888f1 + languageName: node + linkType: hard + +"pg-connection-string@npm:^2.14.0": + version: 2.14.0 + resolution: "pg-connection-string@npm:2.14.0" + checksum: 10c0/c26d85970f782de72b90aa45b4acfa34df90242fc08bc676e8827297164044dbfb40a2cf20b0646bd02662a6b14c5ed27f322db627e41e582f2b705bc41e8b47 + languageName: node + linkType: hard + +"pg-int8@npm:1.0.1": + version: 1.0.1 + resolution: "pg-int8@npm:1.0.1" + checksum: 10c0/be6a02d851fc2a4ae3e9de81710d861de3ba35ac927268973eb3cb618873a05b9424656df464dd43bd7dc3fc5295c3f5b3c8349494f87c7af50ec59ef14e0b98 + languageName: node + linkType: hard + +"pg-pool@npm:^3.14.0": + version: 3.14.0 + resolution: "pg-pool@npm:3.14.0" + peerDependencies: + pg: ">=8.0" + checksum: 10c0/3dd706e67e3b317e29409d9eb3bd44e960eabd86db2a9711a9391bbd43881f8ce7a5f7054a341509558ee05e9bf0a3cc7aef037039da0790ce1e16762ade3ba6 + languageName: node + linkType: hard + +"pg-protocol@npm:*, pg-protocol@npm:^1.16.0": + version: 1.16.0 + resolution: "pg-protocol@npm:1.16.0" + checksum: 10c0/8ea4a8f4970aa0ca1e5bf9a482da0a41a043d7470fbaf7592736971146b09a2a4003d953c0091b72fc30bf7a7994a0b7fdf897bf50cd219787bd22806b3ffb04 + languageName: node + linkType: hard + +"pg-types@npm:2.2.0, pg-types@npm:^2.2.0": + version: 2.2.0 + resolution: "pg-types@npm:2.2.0" + dependencies: + pg-int8: "npm:1.0.1" + postgres-array: "npm:~2.0.0" + postgres-bytea: "npm:~1.0.0" + postgres-date: "npm:~1.0.4" + postgres-interval: "npm:^1.1.0" + checksum: 10c0/ab3f8069a323f601cd2d2279ca8c425447dab3f9b61d933b0601d7ffc00d6200df25e26a4290b2b0783b59278198f7dd2ed03e94c4875797919605116a577c65 + languageName: node + linkType: hard + +"pg@npm:^8": + version: 8.23.0 + resolution: "pg@npm:8.23.0" + dependencies: + pg-cloudflare: "npm:^1.4.0" + pg-connection-string: "npm:^2.14.0" + pg-pool: "npm:^3.14.0" + pg-protocol: "npm:^1.16.0" + pg-types: "npm:2.2.0" + pgpass: "npm:1.0.5" + peerDependencies: + pg-native: ">=3.0.1" + dependenciesMeta: + pg-cloudflare: + optional: true + peerDependenciesMeta: + pg-native: + optional: true + checksum: 10c0/11ce12a71b4239588c18f078531c378d5bcdbcb9ea892e080a6e71f91aaece2b4b8fd93ee5777f94210f9258ff56161f8ed1a45050c32d295aaca037bba12ee8 + languageName: node + linkType: hard + +"pgpass@npm:1.0.5": + version: 1.0.5 + resolution: "pgpass@npm:1.0.5" + dependencies: + split2: "npm:^4.1.0" + checksum: 10c0/5ea6c9b2de04c33abb08d33a2dded303c4a3c7162a9264519cbe85c0a9857d712463140ba42fad0c7cd4b21f644dd870b45bb2e02fcbe505b4de0744fd802c1d + languageName: node + linkType: hard + "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -5232,13 +4158,6 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:4.0.5": - version: 4.0.5 - resolution: "picomatch@npm:4.0.5" - checksum: 10c0/947bc6b6e1ff1e6c5aaf95b107a0839d12802f4f7b867663f67d47accba939ca1cb582cf99dfc30438efa1c4648ac5990967e783e8929c36b03e8440704ef1bd - languageName: node - linkType: hard - "picomatch@npm:^4.0.3, picomatch@npm:^4.0.4, picomatch@npm:^4.0.5": version: 4.0.7 resolution: "picomatch@npm:4.0.7" @@ -5246,50 +4165,6 @@ __metadata: languageName: node linkType: hard -"pino-abstract-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "pino-abstract-transport@npm:3.0.0" - dependencies: - split2: "npm:^4.0.0" - checksum: 10c0/4486e1b9508110aaf963d07741ac98d660b974dd51d8ad42077d215118e27cda20c64da46c07c926898d52540aab7c6b9c37dc0f5355c203bb1d6a72b5bd8d6c - languageName: node - linkType: hard - -"pino-std-serializers@npm:^7.0.0": - version: 7.1.0 - resolution: "pino-std-serializers@npm:7.1.0" - checksum: 10c0/d158615aa93ebdeac2d3912ad4227a23ef78cf14229e886214771f581e96eff312257f2d6368c75b2fbf53e5024eda475d81305014f4ed1a6d5eeab9107f6ef0 - languageName: node - linkType: hard - -"pino@npm:^9.14.0 || ^10.1.0": - version: 10.3.1 - resolution: "pino@npm:10.3.1" - dependencies: - "@pinojs/redact": "npm:^0.4.0" - atomic-sleep: "npm:^1.0.0" - on-exit-leak-free: "npm:^2.1.0" - pino-abstract-transport: "npm:^3.0.0" - pino-std-serializers: "npm:^7.0.0" - process-warning: "npm:^5.0.0" - quick-format-unescaped: "npm:^4.0.3" - real-require: "npm:^0.2.0" - safe-stable-stringify: "npm:^2.3.1" - sonic-boom: "npm:^4.0.1" - thread-stream: "npm:^4.0.0" - bin: - pino: bin.js - checksum: 10c0/ae1c57f2baac85dd5d63a3500746d5ea1cfc4bfcbf356eaec94d42a782eeb80caa4d4614de43a036cf48e2aed46d855a7ff21b126f55a63811def52a894ef937 - languageName: node - linkType: hard - -"pluralize@npm:8.0.0": - version: 8.0.0 - resolution: "pluralize@npm:8.0.0" - checksum: 10c0/2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 - languageName: node - linkType: hard - "postcss@npm:^8.5.26": version: 8.5.26 resolution: "postcss@npm:8.5.26" @@ -5301,6 +4176,36 @@ __metadata: languageName: node linkType: hard +"postgres-array@npm:~2.0.0": + version: 2.0.0 + resolution: "postgres-array@npm:2.0.0" + checksum: 10c0/cbd56207e4141d7fbf08c86f2aebf21fa7064943d3f808ec85f442ff94b48d891e7a144cc02665fb2de5dbcb9b8e3183a2ac749959e794b4a4cfd379d7a21d08 + languageName: node + linkType: hard + +"postgres-bytea@npm:~1.0.0": + version: 1.0.1 + resolution: "postgres-bytea@npm:1.0.1" + checksum: 10c0/10b28a27c9d703d5befd97c443e62b551096d1014bc59ab574c65bf0688de7f3f068003b2aea8dcff83cf0f6f9a35f9f74457c38856cf8eb81b00cf3fb44f164 + languageName: node + linkType: hard + +"postgres-date@npm:~1.0.4": + version: 1.0.7 + resolution: "postgres-date@npm:1.0.7" + checksum: 10c0/0ff91fccc64003e10b767fcfeefb5eaffbc522c93aa65d5051c49b3c4ce6cb93ab091a7d22877a90ad60b8874202c6f1d0f935f38a7235ed3b258efd54b97ca9 + languageName: node + linkType: hard + +"postgres-interval@npm:^1.1.0": + version: 1.2.0 + resolution: "postgres-interval@npm:1.2.0" + dependencies: + xtend: "npm:^4.0.0" + checksum: 10c0/c1734c3cb79e7f22579af0b268a463b1fa1d084e742a02a7a290c4f041e349456f3bee3b4ee0bb3f226828597f7b76deb615c1b857db9a742c45520100456272 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -5308,15 +4213,6 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.4.2": - version: 3.9.6 - resolution: "prettier@npm:3.9.6" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/9f7ddae234035868f3daab3dc34e6de7e54622185afb017378029f0c09a9c023248ccf6f34def0b17a0538e18c47aa1b3188bab72965d1bf735919baa0747e99 - languageName: node - linkType: hard - "proc-log@npm:^7.0.0": version: 7.0.0 resolution: "proc-log@npm:7.0.0" @@ -5324,21 +4220,24 @@ __metadata: languageName: node linkType: hard -"process-warning@npm:^4.0.0": - version: 4.0.1 - resolution: "process-warning@npm:4.0.1" - checksum: 10c0/577a268b9fd5c3d9f6dbb4348220099391d830905642845d591e7ee8b1e45043d98b7b9826a3c1379bdd1686cdfe0f6cf349cb812affc5853b662e6a9896579e +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 languageName: node linkType: hard -"process-warning@npm:^5.0.0, process-warning@npm:^5.1.0": - version: 5.1.0 - resolution: "process-warning@npm:5.1.0" - checksum: 10c0/2a48d48b575f4e7888fd4735a6604acd89914efa909f3db5dd20ae56e8a8cdd3c32a3c738bba539b46d1c5096630e15286bcb7c7fca18dfbf04cc7d00fe34a0f +"proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10c0/ed01729fd4d094eab619cd7e17ce3698b3413b31eb102c4904f9875e677cd207392795d5b4adee9cec359dfd31c44d5ad7595a3a3ad51c40250e141512281c58 languageName: node linkType: hard -"punycode@npm:^2.1.0": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 @@ -5355,14 +4254,24 @@ __metadata: languageName: node linkType: hard -"quick-format-unescaped@npm:^4.0.3": - version: 4.0.4 - resolution: "quick-format-unescaped@npm:4.0.4" - checksum: 10c0/fe5acc6f775b172ca5b4373df26f7e4fd347975578199e7d74b2ae4077f0af05baa27d231de1e80e8f72d88275ccc6028568a7a8c9ee5e7368ace0e18eff93a4 +"qs@npm:~6.15.1": + version: 6.15.3 + resolution: "qs@npm:6.15.3" + dependencies: + es-define-property: "npm:^1.0.1" + side-channel: "npm:^1.1.1" + checksum: 10c0/8f3f6e45ece255347d57696628401cde29e9ec649fff698b53bd3150dea7cefdf33036e1bc1826b9f110bfa7cb0ec4ab9f5297eca628ce216c55af82c304e08e languageName: node linkType: hard -"raw-body@npm:^2.3.3": +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:^2.3.3, raw-body@npm:~2.5.3": version: 2.5.3 resolution: "raw-body@npm:2.5.3" dependencies: @@ -5385,10 +4294,50 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^19.2.7": - version: 19.2.8 - resolution: "react-is@npm:19.2.8" - checksum: 10c0/ed5322c84efe035c8fc814b1614ff5ca7fb8c2872a7c045197daf99f9b1bd68f32a2c79ffcbcfcff2fc5d93924ff9f9447400898f5b1534e6302bb0736a257f0 +"react-redux@npm:^9.3.0": + version: 9.3.0 + resolution: "react-redux@npm:9.3.0" + dependencies: + "@types/use-sync-external-store": "npm:^0.0.6" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + redux: + optional: true + checksum: 10c0/b9f4efcfbfbc90cac9d1709ab3affb1e18a9dc9bd3cceda43bd2e1d9d2394ee0c29df36ec2202d52b566db774888b594c8c5aa86b64f27ef34fca607c687c9e3 + languageName: node + linkType: hard + +"react-router-dom@npm:^7.18.3": + version: 7.18.3 + resolution: "react-router-dom@npm:7.18.3" + dependencies: + react-router: "npm:7.18.3" + peerDependencies: + react: ">=18" + react-dom: ">=18" + checksum: 10c0/1d04bb38f64e9c429d4f162ca6c5ffc163a02c0a5c08748440a58fc0e9b1e8c8edc2bc4509e9966dcd0873e57fc6a090fd356244d581567737aac1ae6236e799 + languageName: node + linkType: hard + +"react-router@npm:7.18.3": + version: 7.18.3 + resolution: "react-router@npm:7.18.3" + dependencies: + cookie: "npm:^1.0.1" + set-cookie-parser: "npm:^2.6.0" + peerDependencies: + react: ">=18" + react-dom: ">=18" + peerDependenciesMeta: + react-dom: + optional: true + checksum: 10c0/77686cad916f8928e6c4aeafe5f8dc26384e84897849ff7d771ddee67af02b788c103503d029ffa442f7bf42aa47b3779440e70fc1aeae90532120fae4036b0f languageName: node linkType: hard @@ -5399,90 +4348,42 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.4.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" +"redis-errors@npm:1.2.0, redis-errors@npm:^1.0.0": + version: 1.2.0 + resolution: "redis-errors@npm:1.2.0" + checksum: 10c0/5b316736e9f532d91a35bff631335137a4f974927bb2fb42bf8c2f18879173a211787db8ac4c3fde8f75ed6233eb0888e55d52510b5620e30d69d7d719c8b8a7 + languageName: node + linkType: hard + +"redis-parser@npm:3.0.0": + version: 3.0.0 + resolution: "redis-parser@npm:3.0.0" dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + redis-errors: "npm:^1.0.0" + checksum: 10c0/ee16ac4c7b2a60b1f42a2cdaee22b005bd4453eb2d0588b8a4939718997ae269da717434da5d570fe0b05030466eeb3f902a58cf2e8e1ca058bf6c9c596f632f languageName: node linkType: hard -"readdirp@npm:^5.0.0": - version: 5.1.1 - resolution: "readdirp@npm:5.1.1" - checksum: 10c0/5e99755684b9104761e48801828f4d2614efa33b1698629929c5985184dc63a7f8233c827832c40dc7be16b00cc871d303cf9de396d2fb74b9465ee2aa2424a1 - languageName: node - linkType: hard - -"real-require@npm:^0.2.0": - version: 0.2.0 - resolution: "real-require@npm:0.2.0" - checksum: 10c0/23eea5623642f0477412ef8b91acd3969015a1501ed34992ada0e3af521d3c865bb2fe4cdbfec5fe4b505f6d1ef6a03e5c3652520837a8c3b53decff7e74b6a0 - languageName: node - linkType: hard - -"real-require@npm:^1.0.0": - version: 1.0.0 - resolution: "real-require@npm:1.0.0" - checksum: 10c0/74d44b360b8b662d29c646f4688da462c4b10243b11d22ff9635395e81951a9c1ed349393411c4911ca6f3474c3e10e812bf4767052706abb863ba59bde0813b - languageName: node - linkType: hard - -"reflect-metadata@npm:^0.2.2": - version: 0.2.2 - resolution: "reflect-metadata@npm:0.2.2" - checksum: 10c0/1cd93a15ea291e420204955544637c264c216e7aac527470e393d54b4bb075f10a17e60d8168ec96600c7e0b9fcc0cb0bb6e91c3fbf5b0d8c9056f04e6ac1ec2 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": +"redux-thunk@npm:^3.1.0": version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + resolution: "redux-thunk@npm:3.1.0" + peerDependencies: + redux: ^5.0.0 + checksum: 10c0/21557f6a30e1b2e3e470933247e51749be7f1d5a9620069a3125778675ce4d178d84bdee3e2a0903427a5c429e3aeec6d4df57897faf93eb83455bc1ef7b66fd languageName: node linkType: hard -"restore-cursor@npm:^5.0.0": - version: 5.1.0 - resolution: "restore-cursor@npm:5.1.0" - dependencies: - onetime: "npm:^7.0.0" - signal-exit: "npm:^4.1.0" - checksum: 10c0/c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: 10c0/b10c28357194f38e7d53b760ed5e64faa317cc63de1fb95bc5d9e127fab956392344368c357b8e7a9bedb0c35b111e7efa522210cfdc3b3c75e5074718e9069c languageName: node linkType: hard -"ret@npm:~0.5.0": - version: 0.5.0 - resolution: "ret@npm:0.5.0" - checksum: 10c0/220868b194f87bf1998e32e409086eec6b39e860c052bf267f8ad4d0131706a9773d45fd3f91acfb1a7c928fce002b694ab86fdba90bc8d4b8df68fa8645c5cc - languageName: node - linkType: hard - -"reusify@npm:1.1.0, reusify@npm:^1.0.4": - version: 1.1.0 - resolution: "reusify@npm:1.1.0" - checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa - languageName: node - linkType: hard - -"rfdc@npm:^1.2.0, rfdc@npm:^1.3.1": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 +"reselect@npm:^5.1.0": + version: 5.3.0 + resolution: "reselect@npm:5.3.0" + checksum: 10c0/c79728e4f315152bfb2d82456d35075b705392d9e72c485d7d9b1061bd80af628416216d80f02a42f24dbb24d738aec7fec45806930aaa1d17c32e9875fa1bd6 languageName: node linkType: hard @@ -5544,23 +4445,7 @@ __metadata: languageName: node linkType: hard -"run-async@npm:^2.4.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 - languageName: node - linkType: hard - -"rxjs@npm:7.8.2, rxjs@npm:^7.5.5, rxjs@npm:^7.8.2": - version: 7.8.2 - resolution: "rxjs@npm:7.8.2" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -5578,25 +4463,7 @@ __metadata: languageName: node linkType: hard -"safe-regex2@npm:^5.0.0": - version: 5.1.1 - resolution: "safe-regex2@npm:5.1.1" - dependencies: - ret: "npm:~0.5.0" - bin: - safe-regex2: bin/safe-regex2.js - checksum: 10c0/65c59fb33de8e500fa1d7254cc7f9b6b8b932f925bcfc8d92273ec024c259052a2b3c975bbf5a9f9dd49cd3b0fa394fb56f36d6b10e394404056edfd1223fd17 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.5.0 - resolution: "safe-stable-stringify@npm:2.5.0" - checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -5610,22 +4477,6 @@ __metadata: languageName: node linkType: hard -"scroll-into-view-if-needed@npm:^3.1.0": - version: 3.1.0 - resolution: "scroll-into-view-if-needed@npm:3.1.0" - dependencies: - compute-scroll-into-view: "npm:^3.0.2" - checksum: 10c0/1f46b090e1e04fcfdef1e384f6d7e615f9f84d4176faf4dbba7347cc0a6e491e5d578eaf4dbe9618dd3d8d38efafde58535b3e00f2a21ce4178c14be364850ff - languageName: node - linkType: hard - -"secure-json-parse@npm:^4.0.0": - version: 4.1.0 - resolution: "secure-json-parse@npm:4.1.0" - checksum: 10c0/52b3f8125ea974db1333a5b63e6a1df550c36c0d5f9a263911d6732812bd02e938b30be324dcbbb9da3ef9bf5a84849e0dd911f56544003d3c09e8eee12504de - languageName: node - linkType: hard - "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -5635,7 +4486,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.7.3": +"semver@npm:^7.3.5, semver@npm:^7.7.3": version: 7.8.5 resolution: "semver@npm:7.8.5" bin: @@ -5644,6 +4495,39 @@ __metadata: languageName: node linkType: hard +"send@npm:~0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.1" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:~2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:~2.0.2" + checksum: 10c0/20c2389fe0fdf3fc499938cac598bc32272287e993c4960717381a10de8550028feadfb9076f959a3a3ebdea42e1f690e116f0d16468fa56b9fd41866d3dc267 + languageName: node + linkType: hard + +"serve-static@npm:~1.16.2": + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:~0.19.1" + checksum: 10c0/36320397a073c71bedf58af48a4a100fe6d93f07459af4d6f08b9a7217c04ce2a4939e0effd842dc7bece93ffcd59eb52f58c4fff2a8e002dc29ae6b219cd42b + languageName: node + linkType: hard + "set-cookie-parser@npm:^2.6.0": version: 2.7.2 resolution: "set-cookie-parser@npm:2.7.2" @@ -5729,38 +4613,6 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.1.0": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"skin-tone@npm:^2.0.0": - version: 2.0.0 - resolution: "skin-tone@npm:2.0.0" - dependencies: - unicode-emoji-modifier-base: "npm:^1.0.0" - checksum: 10c0/82d4c2527864f9cbd6cb7f3c4abb31e2224752234d5013b881d3e34e9ab543545b05206df5a17d14b515459fcb265ce409f9cfe443903176b0360cd20e4e4ba5 - languageName: node - linkType: hard - -"sonic-boom@npm:^4.0.1": - version: 4.2.1 - resolution: "sonic-boom@npm:4.2.1" - dependencies: - atomic-sleep: "npm:^1.0.0" - checksum: 10c0/f374e9c3dfe194d706d8ef8aed4e28bc10638f9952fd19bcbddf2cef05d53334ad9e9dca3e01e24e88dd88fb278c6b8c5b2ae5002494b289c4914aaea3d9eae9 - languageName: node - linkType: hard - "source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -5768,31 +4620,16 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.21": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" +"sparse-bitfield@npm:^3.0.3": + version: 3.0.3 + resolution: "sparse-bitfield@npm:3.0.3" dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + memory-pager: "npm:^1.0.2" + checksum: 10c0/248c6ff7b5e354735e1daac4059222a29c9d291dfcf265daf675d13515eeaac454cfcccd687c8d134f86698b39abd7ad4d7434f7272dd6f8e41a00f21aae4194 languageName: node linkType: hard -"source-map@npm:0.7.6": - version: 0.7.6 - resolution: "source-map@npm:0.7.6" - checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"split2@npm:^4.0.0": +"split2@npm:^4.1.0": version: 4.2.0 resolution: "split2@npm:4.2.0" checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 @@ -5806,6 +4643,13 @@ __metadata: languageName: node linkType: hard +"standard-as-callback@npm:2.1.0": + version: 2.1.0 + resolution: "standard-as-callback@npm:2.1.0" + checksum: 10c0/012677236e3d3fdc5689d29e64ea8a599331c4babe86956bf92fc5e127d53f85411c5536ee0079c52c43beb0026b5ce7aa1d834dd35dd026e82a15d1bcaead1f + languageName: node + linkType: hard + "statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" @@ -5813,7 +4657,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:~2.0.2": +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": version: 2.0.2 resolution: "statuses@npm:2.0.2" checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f @@ -5827,91 +4671,6 @@ __metadata: languageName: node linkType: hard -"stdin-discarder@npm:^0.3.2": - version: 0.3.2 - resolution: "stdin-discarder@npm:0.3.2" - checksum: 10c0/5dbaba9efbcb447a4450d5ae19794641ea9166abe96dc4b5547a109db1bb6e8bdb17bbe1029e02ca8d9d8ee996b7c7cbcce12b12c18c121871cd4f574292381a - languageName: node - linkType: hard - -"string-convert@npm:^0.2.0": - version: 0.2.1 - resolution: "string-convert@npm:0.2.1" - checksum: 10c0/00673ed8a3106137395436537ace7d3672c91a3290da73466055daa0134331dc84bc58c54ba2d2ea40711adc5744426d3c8239dbfc30290438fa3e9ff65db528 - languageName: node - linkType: hard - -"string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^8.1.0": - version: 8.2.2 - resolution: "string-width@npm:8.2.2" - dependencies: - get-east-asian-width: "npm:^1.5.0" - strip-ansi: "npm:^7.1.2" - checksum: 10c0/895624534e4e2f229e880bbc30aa77bdeb758e1a0edce203e0a17b8b4f08b8d3c1156516efc50a35e3efd0052d938a73797692111250ac9f52ee384710a01714 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.1.2": - version: 7.2.0 - resolution: "strip-ansi@npm:7.2.0" - dependencies: - ansi-regex: "npm:^6.2.2" - checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strtok3@npm:^10.3.5": - version: 10.3.5 - resolution: "strtok3@npm:10.3.5" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - checksum: 10c0/8d2477b239054c9f1f5b14a65d531147ca158ab9887fdc2d0938e77b7ec8891fb683b58254c7643afd5d98a421a59207534d491762b111f58c795071ecbe9fd1 - languageName: node - linkType: hard - -"stylis@npm:^4.3.4": - version: 4.4.0 - resolution: "stylis@npm:4.4.0" - checksum: 10c0/259be096d90dfbfe903c8656dcb7591e52a421e577e950ef42ebd9ca02f387623a1165dd08761492fb6e92a7a562d62a53a694a10b0a2f6dcd7a0db107b4bf55 - languageName: node - linkType: hard - "superagent@npm:^10.3.0": version: 10.3.0 resolution: "superagent@npm:10.3.0" @@ -5940,12 +4699,17 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 +"tailwindcss@npm:4.3.3, tailwindcss@npm:^4": + version: 4.3.3 + resolution: "tailwindcss@npm:4.3.3" + checksum: 10c0/7e9cd7553cd890ffa5350efb0ca8971ba5435257d0f98bf0714994ac8f1fee5c7cdf9a9da47fe83e8ac995d728410837ac49d3ef5ea66b5afe1db312086ffae2 + languageName: node + linkType: hard + +"tapable@npm:^2.3.3": + version: 2.3.3 + resolution: "tapable@npm:2.3.3" + checksum: 10c0/47992e861053f861154e92fb4a98ac4ab47b6463717e60792dd1e8c755da0c4964cd8bb68c308a9066d6da89000b6310457b4d5d985c30de4ccc29066068cc17 languageName: node linkType: hard @@ -5962,29 +4726,6 @@ __metadata: languageName: node linkType: hard -"thread-stream@npm:^4.0.0": - version: 4.2.0 - resolution: "thread-stream@npm:4.2.0" - dependencies: - real-require: "npm:^1.0.0" - checksum: 10c0/2d55ace44785a2547b9b15c61c1d2db6d5b3712e21ddb1be23b1f5d19387ac8f153f24767bfae03b3f7c8651eb83758e1fcbb954e1077336b562d2d2cd723137 - languageName: node - linkType: hard - -"throttle-debounce@npm:^5.0.0, throttle-debounce@npm:^5.0.2": - version: 5.0.2 - resolution: "throttle-debounce@npm:5.0.2" - checksum: 10c0/9a10ac51400b353562770721718486847adb5d7287c94a0c0d47df5326e8d47e5d92fcb74dac53d6734efb9344a2d46d68c7f996c2d0aedfd11446522e4bb356 - languageName: node - linkType: hard - -"through@npm:^2.3.6": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - "tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -6016,22 +4757,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: "npm:~1.0.2" - checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 - languageName: node - linkType: hard - -"toad-cache@npm:^3.7.0": - version: 3.7.4 - resolution: "toad-cache@npm:3.7.4" - checksum: 10c0/4a33f9c1e9eea84d0fc019805fe346c8f69e9820f44745f65b77a282d60928c61ad851c258d74e77ad3d2651a28d3d9c8129d1e8c1647902042220f54e7dd026 - languageName: node - linkType: hard - "toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -6039,14 +4764,12 @@ __metadata: languageName: node linkType: hard -"token-types@npm:^6.1.1, token-types@npm:^6.1.2": - version: 6.1.2 - resolution: "token-types@npm:6.1.2" +"tr46@npm:^5.1.0": + version: 5.1.1 + resolution: "tr46@npm:5.1.1" dependencies: - "@borewit/text-codec": "npm:^0.2.1" - "@tokenizer/token": "npm:^0.3.0" - ieee754: "npm:^1.2.1" - checksum: 10c0/8786e28e3cb65b9e890bc3c38def98e6dfe4565538237f8c0e47dbe549ed8f5f00de8dc464717868308abb4729f1958f78f69e1c4c3deebbb685729113a6fee8 + punycode: "npm:^2.3.1" + checksum: 10c0/ae270e194d52ec67ebd695c1a42876e0f19b96e4aca2ab464ab1d9d17dc3acd3e18764f5034c93897db73421563be27c70c98359c4501136a497e46deda5d5ec languageName: node linkType: hard @@ -6059,32 +4782,7 @@ __metadata: languageName: node linkType: hard -"tsconfck@npm:^3.0.3": - version: 3.1.6 - resolution: "tsconfck@npm:3.1.6" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/269c3c513540be44844117bb9b9258fe6f8aeab026d32aeebf458d5299125f330711429dbb556dbf125a0bc25f4a81e6c24ac96de2740badd295c3fb400f66c4 - languageName: node - linkType: hard - -"tsconfig-paths@npm:4.2.0": - version: 4.2.0 - resolution: "tsconfig-paths@npm:4.2.0" - dependencies: - json5: "npm:^2.2.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea - languageName: node - linkType: hard - -"tslib@npm:2.8.1, tslib@npm:^2.1.0": +"tslib@npm:^2.4.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -6098,6 +4796,21 @@ __metadata: languageName: node linkType: hard +"tsx@npm:^4": + version: 4.23.13 + resolution: "tsx@npm:4.23.13" + dependencies: + esbuild: "npm:~0.28.0" + fsevents: "npm:~2.3.3" + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: 10c0/dc99c8988b42ec2443963a0b9051f42d068bc7e2a44e82f3b94b40539a991c5c01ea3ee049cf317d1040b2245711dd4c64ace9ac875f3b07edee29f610702e3c + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -6107,14 +4820,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 - languageName: node - linkType: hard - -"type-is@npm:^1.6.16": +"type-is@npm:^1.6.16, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -6179,22 +4885,6 @@ __metadata: languageName: node linkType: hard -"uid@npm:2.0.2": - version: 2.0.2 - resolution: "uid@npm:2.0.2" - dependencies: - "@lukeed/csprng": "npm:^1.0.0" - checksum: 10c0/e9d02d0562c74e74b5a2519e586db9d7f8204978e476cddd191ee1a9efb85efafdbab2dbf3fc3dde0f5da01fd9da161f37d604dabf513447fd2c03d008f1324c - languageName: node - linkType: hard - -"uint8array-extras@npm:^1.5.0": - version: 1.5.0 - resolution: "uint8array-extras@npm:1.5.0" - checksum: 10c0/0e74641ac7dadb02eadefc1ccdadba6010e007757bda824960de3c72bbe2b04e6d3af75648441f412148c4103261d54fcb60be45a2863beb76643a55fddba3bd - languageName: node - linkType: hard - "undici-types@npm:~7.18.0": version: 7.18.2 resolution: "undici-types@npm:7.18.2" @@ -6209,13 +4899,6 @@ __metadata: languageName: node linkType: hard -"undici@npm:6.20.1": - version: 6.20.1 - resolution: "undici@npm:6.20.1" - checksum: 10c0/b2c8d5adcd226c53d02f9270e4cac277256a7147cf310af319369ec6f87651ca46b2960366cb1339a6dac84d937e01e8cdbec5cb468f1f1ce5e9490e438d7222 - languageName: node - linkType: hard - "undici@npm:^8.4.1": version: 8.10.1 resolution: "undici@npm:8.10.1" @@ -6223,13 +4906,6 @@ __metadata: languageName: node linkType: hard -"unicode-emoji-modifier-base@npm:^1.0.0": - version: 1.0.0 - resolution: "unicode-emoji-modifier-base@npm:1.0.0" - checksum: 10c0/b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66 - languageName: node - linkType: hard - "unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -6260,36 +4936,29 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 +"use-sync-external-store@npm:^1.4.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b languageName: node linkType: hard -"vary@npm:^1.1.2": +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f languageName: node linkType: hard -"vite-tsconfig-paths@npm:^5.1.4": - version: 5.1.4 - resolution: "vite-tsconfig-paths@npm:5.1.4" - dependencies: - debug: "npm:^4.1.1" - globrex: "npm:^0.1.2" - tsconfck: "npm:^3.0.3" - peerDependencies: - vite: "*" - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/6228f23155ea25d92b1e1702284cf8dc52ad3c683c5ca691edd5a4c82d2913e7326d00708cef1cbfde9bb226261df0e0a12e03ef1d43b6a92d8f02b483ef37e3 - languageName: node - linkType: hard - "vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0, vite@npm:^8.2.2": version: 8.2.2 resolution: "vite@npm:8.2.2" @@ -6415,38 +5084,52 @@ __metadata: languageName: node linkType: hard -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: "npm:^1.0.3" - checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 - languageName: node - linkType: hard - "web@workspace:apps/web": version: 0.0.0-use.local resolution: "web@workspace:apps/web" dependencies: - "@ant-design/icons": "npm:^6.3.4" "@eslint/js": "npm:^10.0.1" + "@reduxjs/toolkit": "npm:^2.12.0" + "@tailwindcss/vite": "npm:^4" "@types/node": "npm:^24.13.3" "@types/react": "npm:^19.2.18" "@types/react-dom": "npm:^19.2.4" "@vitejs/plugin-react": "npm:^6.1.0" - antd: "npm:^6.6.2" + axios: "npm:^1.20.0" + contracts: "workspace:*" eslint: "npm:^10.9.0" eslint-plugin-react-hooks: "npm:^7.1.1" eslint-plugin-react-refresh: "npm:^0.5.4" globals: "npm:^17.11.0" react: "npm:^19.2.8" react-dom: "npm:^19.2.8" + react-redux: "npm:^9.3.0" + react-router-dom: "npm:^7.18.3" + tailwindcss: "npm:^4" typescript: "npm:~6.0.2" typescript-eslint: "npm:^8.67.0" vite: "npm:^8.2.2" + zod: "npm:^3" languageName: unknown linkType: soft +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"whatwg-url@npm:^14.1.0 || ^13.0.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" + dependencies: + tr46: "npm:^5.1.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -6488,17 +5171,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c - languageName: node - linkType: hard - "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -6506,6 +5178,13 @@ __metadata: languageName: node linkType: hard +"xtend@npm:^4.0.0": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -6534,13 +5213,6 @@ __metadata: languageName: node linkType: hard -"yoctocolors@npm:^2.1.1": - version: 2.2.0 - resolution: "yoctocolors@npm:2.2.0" - checksum: 10c0/ca179aa83401aa0711f268fda38145a44c828e612a5f5265439efb5796cd63c46ca6b786bae3b74c75440a48518c36b5b23cba7fbb76ea8af5a9f85f830a5754 - languageName: node - linkType: hard - "zod-validation-error@npm:^3.5.0 || ^4.0.0": version: 4.0.2 resolution: "zod-validation-error@npm:4.0.2"