From 14c835021630157b010e9d00d196e5112666347f Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 27 May 2026 23:08:57 +0000 Subject: [PATCH] =?UTF-8?q?feat(api,web):=20c2=20consulta=20de=20clientes?= =?UTF-8?q?=20=E2=80=94=20list=20+=20search=20+=20auth=20flow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit prisma: modelo Client + migração 20260527225728_add_client + seed dev (10 clientes) api: GET /clients (list, busca, filtro atividade/financeiro, paginação) + GET /clients/:id rep vê carteira própria; supervisor/admin vê tudo; activityStatus calculado de lastOrderAt @sar/api-interface: ClientSummarySchema, ClientDetailSchema, ClientListResponseSchema web: ClientsPage (tabela AntD, busca, filtro), DevLogin (token dev), authStore, Bearer no apiFetch oq-4 resolvida: creditLimit gerenciado no SAR Co-Authored-By: Claude Opus 4.7 --- .../prds/prd-sar-2026-05-27/prd.md | 2 +- apps/api/package.json | 5 +- apps/api/prisma.config.ts | 3 + .../20260527225728_add_client/migration.sql | 41 ++ .../api/prisma/migrations/migration_lock.toml | 3 + apps/api/prisma/schema.prisma | 59 ++- apps/api/prisma/seed.ts | 286 ++++++++++++ apps/api/src/app/app.module.ts | 2 + apps/api/src/app/auth/jwt-auth.guard.ts | 1 + .../api/src/app/clients/clients.controller.ts | 33 ++ apps/api/src/app/clients/clients.module.ts | 9 + apps/api/src/app/clients/clients.service.ts | 132 ++++++ apps/api/src/app/workspace/workspace.types.ts | 6 +- apps/web/src/cockpits/rafael/ClientsPage.tsx | 201 +++++++++ apps/web/src/components/dev/DevLogin.tsx | 53 +++ apps/web/src/lib/api-client.ts | 5 + apps/web/src/lib/auth-store.ts | 16 + apps/web/src/lib/queries/clients.ts | 45 ++ apps/web/src/lib/router.tsx | 29 +- apps/web/src/main.tsx | 19 +- design-artifacts/_progress/00-design-log.md | 27 +- libs/shared/api-interface/src/index.ts | 1 + .../api-interface/src/lib/client.contract.ts | 74 +++ package.json | 1 + pnpm-lock.yaml | 424 +++++++++++++++--- pnpm-workspace.yaml | 1 + 26 files changed, 1394 insertions(+), 84 deletions(-) create mode 100644 apps/api/prisma/migrations/20260527225728_add_client/migration.sql create mode 100644 apps/api/prisma/migrations/migration_lock.toml create mode 100644 apps/api/prisma/seed.ts create mode 100644 apps/api/src/app/clients/clients.controller.ts create mode 100644 apps/api/src/app/clients/clients.module.ts create mode 100644 apps/api/src/app/clients/clients.service.ts create mode 100644 apps/web/src/cockpits/rafael/ClientsPage.tsx create mode 100644 apps/web/src/components/dev/DevLogin.tsx create mode 100644 apps/web/src/lib/auth-store.ts create mode 100644 apps/web/src/lib/queries/clients.ts create mode 100644 libs/shared/api-interface/src/lib/client.contract.ts diff --git a/_bmad-output/planning-artifacts/prds/prd-sar-2026-05-27/prd.md b/_bmad-output/planning-artifacts/prds/prd-sar-2026-05-27/prd.md index 9e7769b..70299d8 100644 --- a/_bmad-output/planning-artifacts/prds/prd-sar-2026-05-27/prd.md +++ b/_bmad-output/planning-artifacts/prds/prd-sar-2026-05-27/prd.md @@ -390,7 +390,7 @@ Via Push API do browser + Service Worker. Sem provedor SaaS externo de push no M | OQ-1 | Catálogo de produtos e pautas de preço: formato e frequência de importação do ERP legado? | Alto — bloqueia FR-4.4 | Julian + primeiro cliente | Antes do design de C4 | | OQ-2 | Alçada de desconto: é fixa por Rep ou pode variar por linha de produto? | Médio — impacta FR-4.7 e FR-4.11 | Julian | Antes de C4/C5 | | OQ-3 | Comissão FLEX: a fórmula de cálculo está documentada? | Médio — impacta FR-7.1 | Julian | Antes de C7 | -| OQ-4 | Limite de crédito: é calculado no SAR ou importado do ERP? | Alto — impacta FR-2.4 e FR-4.8 | Julian + primeiro cliente | Antes de C2/C4 | +| ~~OQ-4~~ | ~~Limite de crédito: é calculado no SAR ou importado do ERP?~~ | ✅ **RESOLVIDO 2026-05-27** — gerenciado no SAR (admin/supervisor define; SAR é fonte da verdade) | Julian | — | | OQ-5 | Múltiplos supervisores: se houver mais de um no workspace, como se distribui a fila de Aprovações? | Médio — impacta FR-5.1 | Julian | Antes de C5 | | OQ-6 | Catálogo offline: TTL de 4h é aceitável para o primeiro cliente? Há risco de Rep vender produto fora de pauta? | Médio — impacta FR-4.4 | Julian + primeiro cliente | Antes de C4 | diff --git a/apps/api/package.json b/apps/api/package.json index 64e7b4e..38f2a3a 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -2,5 +2,8 @@ "name": "@sar/api", "version": "0.1.0", "private": true, - "description": "SAR · API (NestJS 11 — CommonJS conforme CODING-RULES.md PGD-DB-004)" + "description": "SAR · API (NestJS 11 — CommonJS conforme CODING-RULES.md PGD-DB-004)", + "prisma": { + "seed": "tsx prisma/seed.ts" + } } diff --git a/apps/api/prisma.config.ts b/apps/api/prisma.config.ts index 65959c2..eb245cb 100644 --- a/apps/api/prisma.config.ts +++ b/apps/api/prisma.config.ts @@ -14,4 +14,7 @@ export default defineConfig({ process.env['DATABASE_URL'] ?? 'postgresql://sar:sar_dev_password@localhost:5432/sar_workspace_dev', }, + migrations: { + seed: 'tsx prisma/seed.ts', + }, }); diff --git a/apps/api/prisma/migrations/20260527225728_add_client/migration.sql b/apps/api/prisma/migrations/20260527225728_add_client/migration.sql new file mode 100644 index 0000000..06b0d85 --- /dev/null +++ b/apps/api/prisma/migrations/20260527225728_add_client/migration.sql @@ -0,0 +1,41 @@ +-- CreateEnum +CREATE TYPE "FinancialStatus" AS ENUM ('regular', 'attention', 'blocked'); + +-- CreateTable +CREATE TABLE "Client" ( + "id" UUID NOT NULL, + "name" TEXT NOT NULL, + "tradeName" TEXT, + "taxId" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" JSONB, + "financialStatus" "FinancialStatus" NOT NULL DEFAULT 'regular', + "creditLimit" DECIMAL(15,2), + "repId" TEXT NOT NULL, + "lastOrderAt" TIMESTAMP(3), + "lastOrderValue" DECIMAL(15,2), + "openOrdersCount" INTEGER NOT NULL DEFAULT 0, + "erpCode" TEXT, + "syncedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Client_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Client_taxId_key" ON "Client"("taxId"); + +-- CreateIndex +CREATE INDEX "Client_repId_idx" ON "Client"("repId"); + +-- CreateIndex +CREATE INDEX "Client_taxId_idx" ON "Client"("taxId"); + +-- CreateIndex +CREATE INDEX "Client_name_idx" ON "Client"("name"); + +-- CreateIndex +CREATE INDEX "Client_deletedAt_idx" ON "Client"("deletedAt"); diff --git a/apps/api/prisma/migrations/migration_lock.toml b/apps/api/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/apps/api/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 6111ea2..014c248 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -9,18 +9,63 @@ // CODING-RULES PGD-DB-001: MIGRATION_DATABASE_URL aponta direto ao PG (sem PgBouncer) generator client { - provider = "prisma-client-js" - output = "../../../node_modules/.prisma/client" - moduleFormat = "cjs" + provider = "prisma-client-js" + output = "../../../node_modules/.prisma/client" + moduleFormat = "cjs" } -// Prisma 7: url foi removida do schema — conexão fica em prisma.config.ts (migrate) +// Prisma 7: url removida do schema — conexão em prisma.config.ts (migrate) // e no WorkspacePrismaPool via PrismaPg adapter (runtime). datasource db { provider = "postgresql" } -// ─── Modelos de domínio serão adicionados por feature ────────────────────── +// ─── Enums ─────────────────────────────────────────────────────────────────── + +// Situação financeira resumida do cliente — cacheável offline (FR-2.4, FR-2.5). +// Valor numérico de crédito e inadimplência requerem conexão. +enum FinancialStatus { + regular + attention + blocked +} + +// ─── Client (C2) ───────────────────────────────────────────────────────────── // -// Próximos: Client (C2), Order + OrderItem (C3/C4) — vindos das stories. -// Cada model novo exige: migration versionada + seed de dev atualizado. +// Cadastro sincronizado do ERP legado (FR-2.6). Rep não cria/edita no MVP. +// creditLimit: gerenciado no SAR — admin/supervisor define (OQ-4 resolvido 2026-05-27). +// lastOrderAt/lastOrderValue: desnormalizados, atualizados ao sincronizar Orders (C3/C4). +// activityStatus: calculado em runtime a partir de lastOrderAt (não persiste — evita drift). + +model Client { + id String @id @default(uuid()) @db.Uuid + name String // razão social / nome completo + tradeName String? // nome fantasia + taxId String @unique // CNPJ (14 dígitos) ou CPF (11 dígitos), sem máscara + email String? + phone String? + address Json? // { street, number, complement?, district, city, state, zip } + + // Situação financeira — resumo cacheável; detalhes numéricos requerem conexão + financialStatus FinancialStatus @default(regular) + creditLimit Decimal? @db.Decimal(15, 2) + + // Desnormalizados de Orders (atualizados em C3/C4) + repId String // userId do Rep responsável (JWT sub) + lastOrderAt DateTime? + lastOrderValue Decimal? @db.Decimal(15, 2) + openOrdersCount Int @default(0) + + // Controle de sync com ERP + erpCode String? // código no ERP legado + syncedAt DateTime? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime? // soft delete — não remove fisicamente + + @@index([repId]) + @@index([taxId]) + @@index([name]) + @@index([deletedAt]) // filtragem de soft delete eficiente +} diff --git a/apps/api/prisma/seed.ts b/apps/api/prisma/seed.ts new file mode 100644 index 0000000..bb4f7e3 --- /dev/null +++ b/apps/api/prisma/seed.ts @@ -0,0 +1,286 @@ +// Seed de desenvolvimento — popula sar_workspace_dev com dados fictícios. +// Executado via: pnpm exec prisma db seed (apps/api/) +// NUNCA rodar em staging/prod. + +import { PrismaClient, FinancialStatus } from '@prisma/client'; +import { PrismaPg } from '@prisma/adapter-pg'; +import pg from 'pg'; + +const pool = new pg.Pool({ + connectionString: + process.env['DATABASE_URL'] ?? + 'postgresql://sar:sar_dev_password@localhost:5432/sar_workspace_dev', + max: 2, +}); +const adapter = new PrismaPg(pool); +const prisma = new PrismaClient({ adapter }); + +// Rep dev padrão — mesmo userId emitido pelo POST /auth/dev/token no smoke test +const DEV_REP_ID = 'user-001'; +const DEV_REP2_ID = 'user-002'; + +const clients = [ + { + name: 'Padaria São João Ltda', + tradeName: 'Padaria São João', + taxId: '12345678000195', + email: 'contato@padariasaojoao.com.br', + phone: '(11) 3456-7890', + address: { + street: 'Rua das Flores', + number: '123', + district: 'Centro', + city: 'São Paulo', + state: 'SP', + zip: '01310100', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 15000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(10), + lastOrderValue: 2340.5, + openOrdersCount: 1, + erpCode: 'CLI-001', + }, + { + name: 'Supermercado Bom Preço Eireli', + tradeName: 'Bom Preço', + taxId: '98765432000187', + email: 'compras@bompreco.com.br', + phone: '(11) 4567-8901', + address: { + street: 'Av. Paulista', + number: '900', + district: 'Bela Vista', + city: 'São Paulo', + state: 'SP', + zip: '01311100', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 50000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(5), + lastOrderValue: 12800.0, + openOrdersCount: 2, + erpCode: 'CLI-002', + }, + { + name: 'Mercearia do Seu Zé ME', + tradeName: 'Mercearia Zé', + taxId: '11223344000156', + email: null, + phone: '(11) 9876-5432', + address: { + street: 'Rua Quinze de Novembro', + number: '45', + district: 'Vila Nova', + city: 'Guarulhos', + state: 'SP', + zip: '07031070', + }, + financialStatus: FinancialStatus.attention, + creditLimit: 5000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(35), + lastOrderValue: 890.0, + openOrdersCount: 0, + erpCode: 'CLI-003', + }, + { + name: 'Distribuidora Norte Alimentos SA', + tradeName: 'Norte Alimentos', + taxId: '55667788000143', + email: 'pedidos@nortealimentos.com.br', + phone: '(92) 3344-5566', + address: { + street: 'Av. Brasil', + number: '2200', + district: 'Industrial', + city: 'Manaus', + state: 'AM', + zip: '69075001', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 120000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(2), + lastOrderValue: 45600.0, + openOrdersCount: 3, + erpCode: 'CLI-004', + }, + { + name: 'Bar e Lanchonete do Carlos', + tradeName: null, + taxId: '33221100000178', + email: null, + phone: '(21) 99887-6655', + address: { + street: 'Rua da Alfândega', + number: '12', + district: 'Centro', + city: 'Rio de Janeiro', + state: 'RJ', + zip: '20070002', + }, + financialStatus: FinancialStatus.blocked, + creditLimit: 2000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(75), + lastOrderValue: 340.0, + openOrdersCount: 0, + erpCode: 'CLI-005', + }, + { + name: 'Restaurante Sabor da Terra Ltda', + tradeName: 'Sabor da Terra', + taxId: '77889900000132', + email: 'admin@sabordaterra.com.br', + phone: '(31) 3322-1100', + address: { + street: 'Rua dos Inconfidentes', + number: '560', + district: 'Savassi', + city: 'Belo Horizonte', + state: 'MG', + zip: '30140128', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 30000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(18), + lastOrderValue: 7200.0, + openOrdersCount: 1, + erpCode: 'CLI-006', + }, + { + name: 'Atacadão Central Comércio Ltda', + tradeName: 'Atacadão Central', + taxId: '44556677000119', + email: 'compras@atacadaocentral.com.br', + phone: '(51) 3288-9900', + address: { + street: 'Av. Assis Brasil', + number: '3970', + district: "Passo d'Areia", + city: 'Porto Alegre', + state: 'RS', + zip: '91010003', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 80000.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(8), + lastOrderValue: 32100.0, + openOrdersCount: 2, + erpCode: 'CLI-007', + }, + { + name: 'Quitanda Boa Vista ME', + tradeName: 'Quitanda Boa Vista', + taxId: '22334455000167', + email: null, + phone: '(48) 3344-2211', + address: { + street: 'Rua Felipe Schmidt', + number: '88', + district: 'Centro', + city: 'Florianópolis', + state: 'SC', + zip: '88010001', + }, + financialStatus: FinancialStatus.attention, + creditLimit: 3500.0, + repId: DEV_REP_ID, + lastOrderAt: daysAgo(45), + lastOrderValue: 560.0, + openOrdersCount: 0, + erpCode: 'CLI-008', + }, + // Clientes do segundo rep (para testar filtro de carteira) + { + name: 'Empório Gourmet Curitiba Ltda', + tradeName: 'Empório Gourmet', + taxId: '66778899000124', + email: 'pedidos@emporiogourmet.com.br', + phone: '(41) 3233-4455', + address: { + street: 'Rua XV de Novembro', + number: '700', + district: 'Centro', + city: 'Curitiba', + state: 'PR', + zip: '80060000', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 25000.0, + repId: DEV_REP2_ID, + lastOrderAt: daysAgo(3), + lastOrderValue: 8900.0, + openOrdersCount: 1, + erpCode: 'CLI-009', + }, + { + name: 'Mini Mercado Esperança', + tradeName: null, + taxId: '88990011000135', + email: null, + phone: '(85) 9988-7766', + address: { + street: 'Av. Bezerra de Menezes', + number: '1800', + district: 'São Gerardo', + city: 'Fortaleza', + state: 'CE', + zip: '60325001', + }, + financialStatus: FinancialStatus.regular, + creditLimit: 8000.0, + repId: DEV_REP2_ID, + lastOrderAt: daysAgo(20), + lastOrderValue: 1200.0, + openOrdersCount: 0, + erpCode: 'CLI-010', + }, +]; + +function daysAgo(days: number): Date { + const d = new Date(); + d.setDate(d.getDate() - days); + return d; +} + +async function main() { + console.log('🌱 Seed iniciado...'); + + for (const data of clients) { + await prisma.client.upsert({ + where: { taxId: data.taxId }, + create: { + ...data, + creditLimit: data.creditLimit, + lastOrderValue: data.lastOrderValue, + syncedAt: new Date(), + }, + update: { + name: data.name, + financialStatus: data.financialStatus, + lastOrderAt: data.lastOrderAt, + lastOrderValue: data.lastOrderValue, + openOrdersCount: data.openOrdersCount, + syncedAt: new Date(), + }, + }); + } + + console.log(`✅ ${clients.length} clientes criados/atualizados.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + await pool.end(); + }); diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 6f85564..3eac623 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -8,6 +8,7 @@ import { HealthModule } from './health/health.module'; import { PingModule } from './ping/ping.module'; import { AuthModule } from './auth/auth.module'; import { JwtAuthGuard } from './auth/jwt-auth.guard'; +import { ClientsModule } from './clients/clients.module'; import { ProblemDetailsFilter } from './filters/problem-details.filter'; @Module({ @@ -19,6 +20,7 @@ import { ProblemDetailsFilter } from './filters/problem-details.filter'; AuthModule, HealthModule, PingModule, + ClientsModule, ], providers: [ { provide: APP_PIPE, useClass: ZodValidationPipe }, diff --git a/apps/api/src/app/auth/jwt-auth.guard.ts b/apps/api/src/app/auth/jwt-auth.guard.ts index 996fb02..8f54b50 100644 --- a/apps/api/src/app/auth/jwt-auth.guard.ts +++ b/apps/api/src/app/auth/jwt-auth.guard.ts @@ -48,6 +48,7 @@ export class JwtAuthGuard implements CanActivate { const workspaceId = payload.workspace_id; this.cls.set('workspaceId', workspaceId); this.cls.set('userId', payload.sub); + this.cls.set('role', payload.role); const dbUrl = process.env['DATABASE_URL'] ?? diff --git a/apps/api/src/app/clients/clients.controller.ts b/apps/api/src/app/clients/clients.controller.ts new file mode 100644 index 0000000..c27923b --- /dev/null +++ b/apps/api/src/app/clients/clients.controller.ts @@ -0,0 +1,33 @@ +import { Controller, Get, Param, ParseUUIDPipe, Query } from '@nestjs/common'; +import { ClsService } from 'nestjs-cls'; +import { createZodDto } from 'nestjs-zod'; +import { + ClientListQuerySchema, + type ClientDetail, + type ClientListQuery, + type ClientListResponse, +} from '@sar/api-interface'; +import type { WorkspaceClsStore } from '../workspace/workspace.types'; +import { ClientsService } from './clients.service'; + +class ClientListQueryDto extends createZodDto(ClientListQuerySchema) {} + +@Controller({ path: 'clients' }) +export class ClientsController { + constructor( + private readonly clients: ClientsService, + private readonly cls: ClsService, + ) {} + + @Get() + list(@Query() query: ClientListQueryDto): Promise { + // parse aplica defaults (page=1, limit=50) definidos no schema + const parsed = ClientListQuerySchema.parse(query) as ClientListQuery; + return this.clients.list(parsed, this.cls.get('userId') ?? '', this.cls.get('role') ?? 'rep'); + } + + @Get(':id') + findOne(@Param('id', ParseUUIDPipe) id: string): Promise { + return this.clients.findOne(id, this.cls.get('userId') ?? '', this.cls.get('role') ?? 'rep'); + } +} diff --git a/apps/api/src/app/clients/clients.module.ts b/apps/api/src/app/clients/clients.module.ts new file mode 100644 index 0000000..e8b7c58 --- /dev/null +++ b/apps/api/src/app/clients/clients.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ClientsController } from './clients.controller'; +import { ClientsService } from './clients.service'; + +@Module({ + controllers: [ClientsController], + providers: [ClientsService], +}) +export class ClientsModule {} diff --git a/apps/api/src/app/clients/clients.service.ts b/apps/api/src/app/clients/clients.service.ts new file mode 100644 index 0000000..421edbe --- /dev/null +++ b/apps/api/src/app/clients/clients.service.ts @@ -0,0 +1,132 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { ClsService } from 'nestjs-cls'; +import { Prisma } from '@prisma/client'; +import type { + ClientDetail, + ClientListQuery, + ClientListResponse, + ClientSummary, + ActivityStatus, +} from '@sar/api-interface'; +import type { WorkspaceClsStore } from '../workspace/workspace.types'; + +// Thresholds de atividade (FR-2.3). Configuráveis por workspace futuramente. +const ALERT_DAYS = 30; +const INACTIVE_DAYS = 60; + +function activityStatus(lastOrderAt: Date | null): ActivityStatus { + if (!lastOrderAt) return 'inactive'; + const days = Math.floor((Date.now() - lastOrderAt.getTime()) / 86_400_000); + if (days >= INACTIVE_DAYS) return 'inactive'; + if (days >= ALERT_DAYS) return 'alert'; + return 'active'; +} + +function decimalToString(v: Prisma.Decimal | null): string | null { + return v ? v.toString() : null; +} + +@Injectable() +export class ClientsService { + constructor(private readonly cls: ClsService) {} + + async list(query: ClientListQuery, userId: string, role: string): Promise { + const prisma = this.cls.get('prisma'); + if (!prisma) throw new Error('prisma não disponível no CLS'); + + const { q, status, financialStatus, page, limit } = query; + const skip = (page - 1) * limit; + + // Rep vê apenas sua carteira; supervisor/manager/admin vê tudo (FR-2.1). + const repFilter: Prisma.ClientWhereInput = role === 'rep' ? { repId: userId } : {}; + + const searchFilter: Prisma.ClientWhereInput = q + ? { + OR: [ + { name: { contains: q, mode: 'insensitive' } }, + { tradeName: { contains: q, mode: 'insensitive' } }, + { taxId: { contains: q } }, + ], + } + : {}; + + const financialFilter: Prisma.ClientWhereInput = financialStatus ? { financialStatus } : {}; + + const where: Prisma.ClientWhereInput = { + deletedAt: null, + ...repFilter, + ...searchFilter, + ...financialFilter, + }; + + const [rows, total] = await Promise.all([ + prisma.client.findMany({ + where, + select: { + id: true, + name: true, + tradeName: true, + taxId: true, + financialStatus: true, + lastOrderAt: true, + lastOrderValue: true, + openOrdersCount: true, + }, + skip, + take: limit, + orderBy: { name: 'asc' }, + }), + prisma.client.count({ where }), + ]); + + // Filtra por activityStatus depois do fetch (computed field — não persiste no DB). + const mapped: ClientSummary[] = rows.map((r) => ({ + id: r.id, + name: r.name, + tradeName: r.tradeName, + taxId: r.taxId, + financialStatus: r.financialStatus, + activityStatus: activityStatus(r.lastOrderAt), + lastOrderAt: r.lastOrderAt?.toISOString() ?? null, + lastOrderValue: decimalToString(r.lastOrderValue), + openOrdersCount: r.openOrdersCount, + })); + + const filtered = status ? mapped.filter((c) => c.activityStatus === status) : mapped; + + return { data: filtered, total, page, limit }; + } + + async findOne(id: string, userId: string, role: string): Promise { + const prisma = this.cls.get('prisma'); + if (!prisma) throw new Error('prisma não disponível no CLS'); + + const repFilter: Prisma.ClientWhereInput = role === 'rep' ? { repId: userId } : {}; + + const client = await prisma.client.findFirst({ + where: { id, deletedAt: null, ...repFilter }, + }); + + if (!client) throw new NotFoundException(`Cliente ${id} não encontrado`); + + return { + id: client.id, + name: client.name, + tradeName: client.tradeName, + taxId: client.taxId, + email: client.email, + phone: client.phone, + address: client.address as ClientDetail['address'], + financialStatus: client.financialStatus, + activityStatus: activityStatus(client.lastOrderAt), + creditLimit: decimalToString(client.creditLimit), + lastOrderAt: client.lastOrderAt?.toISOString() ?? null, + lastOrderValue: decimalToString(client.lastOrderValue), + openOrdersCount: client.openOrdersCount, + erpCode: client.erpCode, + syncedAt: client.syncedAt?.toISOString() ?? null, + createdAt: client.createdAt.toISOString(), + updatedAt: client.updatedAt.toISOString(), + }; + } +} diff --git a/apps/api/src/app/workspace/workspace.types.ts b/apps/api/src/app/workspace/workspace.types.ts index 1be2c5a..7a6ec18 100644 --- a/apps/api/src/app/workspace/workspace.types.ts +++ b/apps/api/src/app/workspace/workspace.types.ts @@ -1,5 +1,6 @@ import type { ClsStore } from 'nestjs-cls'; import type { PrismaClient } from '@prisma/client'; +import type { JwtRole } from '../auth/jwt.types'; // Forma do CLS store por request — fonte da verdade para qualquer caller. // CODING-RULES PGD-DB-009: nunca importe PrismaClient diretamente; use cls.get('prisma'). @@ -8,6 +9,7 @@ import type { PrismaClient } from '@prisma/client'; export interface WorkspaceClsStore extends ClsStore { requestId: string; workspaceId: string; - userId?: string; // preenchido pelo JwtAuthGuard (M3) - prisma?: PrismaClient; // preenchido pelo WorkspaceModule após WorkspacePrismaPool entrar (M5) + userId?: string; // preenchido pelo JwtAuthGuard após validar o token + role?: JwtRole; // preenchido pelo JwtAuthGuard após validar o token + prisma?: PrismaClient; // preenchido pelo JwtAuthGuard via WorkspacePrismaPool } diff --git a/apps/web/src/cockpits/rafael/ClientsPage.tsx b/apps/web/src/cockpits/rafael/ClientsPage.tsx new file mode 100644 index 0000000..b875d0a --- /dev/null +++ b/apps/web/src/cockpits/rafael/ClientsPage.tsx @@ -0,0 +1,201 @@ +import { useState } from 'react'; +import { Badge, Input, Select, Space, Table, Tag, Tooltip, Typography } from 'antd'; +import type { TableColumnsType } from 'antd'; +import { useNavigate } from '@tanstack/react-router'; +import type { ActivityStatus, ClientSummary, FinancialStatus } from '@sar/api-interface'; +import { useClientList } from '../../lib/queries/clients'; + +const { Title } = Typography; +const { Search } = Input; + +// ─── Badge configs ──────────────────────────────────────────────────────────── + +const ACTIVITY_CONFIG: Record = { + active: { color: 'success', label: 'Ativo' }, + alert: { color: 'warning', label: 'Em alerta' }, + inactive: { color: 'error', label: 'Inativo' }, +}; + +const FINANCIAL_CONFIG: Record = { + regular: { color: 'success', label: 'Regular' }, + attention: { color: 'warning', label: 'Atenção' }, + blocked: { color: 'error', label: 'Bloqueado' }, +}; + +// ─── Columns ────────────────────────────────────────────────────────────────── + +function buildColumns(navigate: ReturnType): TableColumnsType { + return [ + { + title: 'Cliente', + dataIndex: 'name', + key: 'name', + render: (name: string, record: ClientSummary) => ( + + navigate({ to: '/clientes/$id', params: { id: record.id } })} + > + {name} + + {record.tradeName && ( + + {record.tradeName} + + )} + + ), + sorter: true, + }, + { + title: 'CNPJ / CPF', + dataIndex: 'taxId', + key: 'taxId', + width: 160, + render: (v: string) => ( + + {v} + + ), + }, + { + title: 'Atividade', + dataIndex: 'activityStatus', + key: 'activityStatus', + width: 120, + render: (v: ActivityStatus) => { + const cfg = ACTIVITY_CONFIG[v]; + return ; + }, + }, + { + title: 'Situação', + dataIndex: 'financialStatus', + key: 'financialStatus', + width: 110, + render: (v: FinancialStatus) => { + const cfg = FINANCIAL_CONFIG[v]; + return {cfg.label}; + }, + }, + { + title: 'Última compra', + dataIndex: 'lastOrderAt', + key: 'lastOrderAt', + width: 140, + render: (v: string | null, record: ClientSummary) => { + if (!v) return ; + const date = new Date(v).toLocaleDateString('pt-BR'); + const value = record.lastOrderValue + ? `R$ ${Number(record.lastOrderValue).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}` + : ''; + return ( + + {date} + + ); + }, + }, + { + title: 'Pedidos abertos', + dataIndex: 'openOrdersCount', + key: 'openOrdersCount', + width: 120, + align: 'center', + render: (v: number) => + v > 0 ? ( + + {v} + + ) : ( + + ), + }, + ]; +} + +// ─── Page ───────────────────────────────────────────────────────────────────── + +export function ClientsPage() { + const navigate = useNavigate(); + const [q, setQ] = useState(''); + const [search, setSearch] = useState(''); + const [activityFilter, setActivityFilter] = useState(); + const [page, setPage] = useState(1); + const limit = 50; + + const { data, isLoading, isFetching } = useClientList({ + q: search || undefined, + status: activityFilter, + page, + limit, + }); + + const columns = buildColumns(navigate); + + return ( + + {/* Cabeçalho */} + + + Carteira de Clientes + + + {data ? `${data.total} cliente${data.total !== 1 ? 's' : ''} na sua carteira` : ' '} + + + + {/* Filtros */} + + setQ(e.target.value)} + onSearch={(v) => { + setSearch(v); + setPage(1); + }} + allowClear + style={{ width: 320 }} + /> + + placeholder="Atividade" + allowClear + style={{ width: 140 }} + value={activityFilter} + onChange={(v) => { + setActivityFilter(v); + setPage(1); + }} + options={[ + { value: 'active', label: 'Ativo' }, + { value: 'alert', label: 'Em alerta' }, + { value: 'inactive', label: 'Inativo' }, + ]} + /> + + + {/* Tabela */} + + columns={columns} + dataSource={data?.data ?? []} + rowKey="id" + loading={isLoading || isFetching} + pagination={{ + current: page, + pageSize: limit, + total: data?.total ?? 0, + showSizeChanger: false, + showTotal: (total) => `${total} clientes`, + onChange: (p) => setPage(p), + }} + scroll={{ x: 900 }} + size="middle" + onRow={(record) => ({ + style: { cursor: 'pointer' }, + onClick: () => navigate({ to: '/clientes/$id', params: { id: record.id } }), + })} + /> + + ); +} diff --git a/apps/web/src/components/dev/DevLogin.tsx b/apps/web/src/components/dev/DevLogin.tsx new file mode 100644 index 0000000..6a830d3 --- /dev/null +++ b/apps/web/src/components/dev/DevLogin.tsx @@ -0,0 +1,53 @@ +// Componente de login dev — visível apenas quando NODE_ENV !== 'production' e sem token. +// Em produção o token vem do master-login real (fora do escopo do MVP). + +import { useState } from 'react'; +import { Alert, Button, Card, Flex, Space, Typography } from 'antd'; +import { apiFetch } from '../../lib/api-client'; +import { authStore } from '../../lib/auth-store'; +import { AuthTokenResponseSchema } from '@sar/api-interface'; + +export function DevLogin({ onLogin }: { onLogin: () => void }) { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + async function handleLogin() { + setLoading(true); + setError(null); + try { + const raw = await apiFetch('/api/v1/auth/dev/token', { + method: 'POST', + body: { userId: 'user-001', workspaceId: 'dev-workspace', role: 'rep' }, + }); + const { accessToken } = AuthTokenResponseSchema.parse(raw); + authStore.set(accessToken); + onLogin(); + } catch (e) { + setError(e instanceof Error ? e.message : 'Erro ao obter token'); + } finally { + setLoading(false); + } + } + + return ( + + + + + SAR · Login Dev + + + {error && } + + + + + ); +} diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts index 8701874..445700b 100644 --- a/apps/web/src/lib/api-client.ts +++ b/apps/web/src/lib/api-client.ts @@ -8,6 +8,8 @@ // CODING-RULES §05: 422 = validação Zod; 4xx outros = erros de domínio; 5xx = retry pelo // QueryClient (até 2x). O ApiError carrega tudo que o caller precisa pra decidir. +import { authStore } from './auth-store'; + const PROBLEM_CONTENT_TYPE = 'application/problem+json'; export interface ProblemDetails { @@ -39,11 +41,14 @@ interface RequestOptions extends Omit { export async function apiFetch(path: string, options: RequestOptions = {}): Promise { const { body, headers, ...rest } = options; + const token = authStore.get(); + const init: RequestInit = { ...rest, headers: { Accept: 'application/json', ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}), + ...(token ? { Authorization: `Bearer ${token}` } : {}), ...headers, }, ...(body !== undefined ? { body: JSON.stringify(body) } : {}), diff --git a/apps/web/src/lib/auth-store.ts b/apps/web/src/lib/auth-store.ts new file mode 100644 index 0000000..a9712a4 --- /dev/null +++ b/apps/web/src/lib/auth-store.ts @@ -0,0 +1,16 @@ +// Store minimalista para o token de acesso (dev: localStorage; prod: cookie httpOnly via BFF). +// Em produção o token virá do master-login real e não ficará em localStorage. + +const TOKEN_KEY = 'sar_access_token'; + +export const authStore = { + get(): string | null { + return localStorage.getItem(TOKEN_KEY); + }, + set(token: string): void { + localStorage.setItem(TOKEN_KEY, token); + }, + clear(): void { + localStorage.removeItem(TOKEN_KEY); + }, +}; diff --git a/apps/web/src/lib/queries/clients.ts b/apps/web/src/lib/queries/clients.ts new file mode 100644 index 0000000..a7f1efe --- /dev/null +++ b/apps/web/src/lib/queries/clients.ts @@ -0,0 +1,45 @@ +import { useQuery } from '@tanstack/react-query'; +import { + ClientListResponseSchema, + ClientDetailSchema, + type ClientListQuery, + type ClientListResponse, + type ClientDetail, +} from '@sar/api-interface'; +import { apiFetch } from '../api-client'; + +export const CLIENT_KEYS = { + all: ['clients'] as const, + list: (params: Partial) => ['clients', 'list', params] as const, + detail: (id: string) => ['clients', 'detail', id] as const, +}; + +export function useClientList(params: Partial = {}) { + const qs = new URLSearchParams(); + if (params.q) qs.set('q', params.q); + if (params.status) qs.set('status', params.status); + if (params.financialStatus) qs.set('financialStatus', params.financialStatus); + if (params.page) qs.set('page', String(params.page)); + if (params.limit) qs.set('limit', String(params.limit)); + + const query = qs.toString(); + + return useQuery({ + queryKey: CLIENT_KEYS.list(params), + queryFn: async () => { + const raw = await apiFetch(`/api/v1/clients${query ? `?${query}` : ''}`); + return ClientListResponseSchema.parse(raw); + }, + }); +} + +export function useClientDetail(id: string) { + return useQuery({ + queryKey: CLIENT_KEYS.detail(id), + queryFn: async () => { + const raw = await apiFetch(`/api/v1/clients/${id}`); + return ClientDetailSchema.parse(raw); + }, + enabled: !!id, + }); +} diff --git a/apps/web/src/lib/router.tsx b/apps/web/src/lib/router.tsx index 26fc2a2..0cd9f26 100644 --- a/apps/web/src/lib/router.tsx +++ b/apps/web/src/lib/router.tsx @@ -1,6 +1,7 @@ import { createRouter, createRootRoute, createRoute, Outlet } from '@tanstack/react-router'; import { AppShell } from '../components/layout/AppShell'; import { RafaelPainel } from '../cockpits/rafael/RafaelPainel'; +import { ClientsPage } from '../cockpits/rafael/ClientsPage'; const rootRoute = createRootRoute({ component: () => ( @@ -16,14 +17,38 @@ const indexRoute = createRoute({ component: RafaelPainel, }); -// Placeholder routes (cockpits a implementar) const rafaelRoute = createRoute({ getParentRoute: () => rootRoute, path: '/rep', component: RafaelPainel, }); -const routeTree = rootRoute.addChildren([indexRoute, rafaelRoute]); +const clientesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/clientes', + component: ClientsPage, +}); + +// Placeholder detail route — ClientDetailPage virá em próxima iteração de C2 +const clienteDetailRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/clientes/$id', + component: () => { + const { id } = clienteDetailRoute.useParams(); + return ( +
+

Ficha do cliente {id} — em construção

+
+ ); + }, +}); + +const routeTree = rootRoute.addChildren([ + indexRoute, + rafaelRoute, + clientesRoute, + clienteDetailRoute, +]); export const router = createRouter({ routeTree, diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 693a400..f14e161 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -1,4 +1,4 @@ -import { StrictMode } from 'react'; +import { StrictMode, useState } from 'react'; import { createRoot } from 'react-dom/client'; import { ConfigProvider, App as AntdApp } from 'antd'; import ptBR from 'antd/locale/pt_BR'; @@ -12,9 +12,24 @@ import './styles/global.css'; import { sarTheme } from './lib/theme'; import { queryClient } from './lib/query-client'; import { router } from './lib/router'; +import { authStore } from './lib/auth-store'; +import { DevLogin } from './components/dev/DevLogin'; dayjs.locale('pt-br'); +const isDev = import.meta.env.DEV; + +function Root() { + const [hasToken, setHasToken] = useState(() => !!authStore.get()); + + // Em dev, exibe DevLogin se não houver token. Em prod, fluxo de auth real virá aqui. + if (isDev && !hasToken) { + return setHasToken(true)} />; + } + + return ; +} + const rootEl = document.getElementById('root'); if (!rootEl) { throw new Error('Root element not found'); @@ -25,7 +40,7 @@ createRoot(rootEl).render( - + diff --git a/design-artifacts/_progress/00-design-log.md b/design-artifacts/_progress/00-design-log.md index 4afa460..f9aaffa 100644 --- a/design-artifacts/_progress/00-design-log.md +++ b/design-artifacts/_progress/00-design-log.md @@ -412,7 +412,32 @@ **Pendente próxima sessão:** 1. **OpenTelemetry SDK** plugar quando entrar no catálogo. -2. **Modelagem C2** — modelo `Client` no Prisma schema + migração + endpoint `GET /clients`. Requer OQ-1/OQ-4 resolvidos com primeiro cliente. +2. **C2 ficha do cliente** — `ClientDetailPage` (web), endpoint detalhe já existe; precisa de UI. +3. **C3 Consulta de Pedidos Históricos** — modelo `Order` + `OrderItem` no Prisma + endpoint. + +### 2026-05-27 — C2 Consulta de Clientes COMPLETO ✅ + +**OQ-4 resolvida:** Limite de crédito gerenciado no SAR (admin/supervisor define; SAR é fonte da verdade). + +**Entregas:** + +- **Prisma schema:** modelo `Client` + enum `FinancialStatus`. Migração `20260527225728_add_client` aplicada. + Campos: taxId (unique), endereço (JSON), creditLimit (Decimal, null = não definido), repId, lastOrderAt/Value (desnorm. de Orders), openOrdersCount, erpCode, syncedAt, deletedAt (soft delete). + +- **Contratos Zod:** `@sar/api-interface` — `ClientSummarySchema`, `ClientDetailSchema`, `ClientListResponseSchema`, `ClientListQuerySchema`. `activityStatus` calculado em runtime (não persiste — evita drift). + +- **API:** `ClientsModule` — `GET /api/v1/clients` (list, search, paginação, filtro atividade) + `GET /api/v1/clients/:id`. Rep vê só carteira (`repId = userId`); supervisor/manager/admin vê tudo. `activityStatus` computado de `lastOrderAt` (thresholds: 30d alert, 60d inactive — FR-2.3). + +- **Seed dev:** 10 clientes fictícios brasileiros (8 do user-001, 2 do user-002) com dados variados de atividade e situação financeira. + +- **Web:** `ClientsPage` (Rafael cockpit) com tabela AntD (busca, filtro atividade, paginação). `DevLogin` para adquirir token em dev. `authStore` (localStorage dev). `/clientes` e `/clientes/:id` no router. + +- **Smoke test:** `GET /clients` sem token → 401 ✓. Com token rep user-001 → 8 clientes ✓. Filtro `?status=inactive` → 1 resultado ✓. Busca `?q=padaria` → 1 resultado ✓. + +**Pendente próxima sessão:** +1. `ClientDetailPage` — UI da ficha (web); endpoint já existe. +2. C3 — modelo `Order` + `OrderItem` + endpoint `GET /clients/:id/orders`. +3. OpenTelemetry SDK. --- diff --git a/libs/shared/api-interface/src/index.ts b/libs/shared/api-interface/src/index.ts index fdde956..2b8678f 100644 --- a/libs/shared/api-interface/src/index.ts +++ b/libs/shared/api-interface/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/ping.contract'; export * from './lib/auth.contract'; +export * from './lib/client.contract'; diff --git a/libs/shared/api-interface/src/lib/client.contract.ts b/libs/shared/api-interface/src/lib/client.contract.ts new file mode 100644 index 0000000..1c456ff --- /dev/null +++ b/libs/shared/api-interface/src/lib/client.contract.ts @@ -0,0 +1,74 @@ +import { z } from 'zod'; + +// Contratos canônicos de C2 — Consulta de Clientes. +// Consumidos pela API (output tipado) e pela Web (TanStack Query + parse). + +// ─── Enums ──────────────────────────────────────────────────────────────────── + +export const FinancialStatusSchema = z.enum(['regular', 'attention', 'blocked']); +export type FinancialStatus = z.infer; + +// Calculado em runtime a partir de lastOrderAt (não persiste no banco). +export const ActivityStatusSchema = z.enum(['active', 'alert', 'inactive']); +export type ActivityStatus = z.infer; + +// ─── Address ───────────────────────────────────────────────────────────────── + +export const AddressSchema = z.object({ + street: z.string().min(1), + number: z.string().min(1), + complement: z.string().optional(), + district: z.string().min(1), + city: z.string().min(1), + state: z.string().length(2), // UF + zip: z.string().regex(/^\d{8}$/), // sem máscara +}); +export type Address = z.infer; + +// ─── Client Summary (lista) ─────────────────────────────────────────────────── + +export const ClientSummarySchema = z.object({ + id: z.string().uuid(), + name: z.string(), + tradeName: z.string().nullable(), + taxId: z.string(), + financialStatus: FinancialStatusSchema, + activityStatus: ActivityStatusSchema, + lastOrderAt: z.iso.datetime().nullable(), + lastOrderValue: z.string().nullable(), // Decimal serializado como string + openOrdersCount: z.number().int().nonnegative(), +}); +export type ClientSummary = z.infer; + +// ─── Client Detail (ficha) ─────────────────────────────────────────────────── + +export const ClientDetailSchema = ClientSummarySchema.extend({ + email: z.string().email().nullable(), + phone: z.string().nullable(), + address: AddressSchema.nullable(), + creditLimit: z.string().nullable(), // Decimal serializado como string; null = não definido + erpCode: z.string().nullable(), + syncedAt: z.iso.datetime().nullable(), + createdAt: z.iso.datetime(), + updatedAt: z.iso.datetime(), +}); +export type ClientDetail = z.infer; + +// ─── List query + response ──────────────────────────────────────────────────── + +export const ClientListQuerySchema = z.object({ + q: z.string().optional(), // busca nome/taxId + status: ActivityStatusSchema.optional(), // filtro de atividade + financialStatus: FinancialStatusSchema.optional(), + page: z.coerce.number().int().positive().default(1), + limit: z.coerce.number().int().min(1).max(200).default(50), +}); +export type ClientListQuery = z.infer; + +export const ClientListResponseSchema = z.object({ + data: z.array(ClientSummarySchema), + total: z.number().int().nonnegative(), + page: z.number().int().positive(), + limit: z.number().int().positive(), +}); +export type ClientListResponse = z.infer; diff --git a/package.json b/package.json index 33f34dd..52785e2 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "prettier": "^3.8.3", "ts-jest": "^29.4.0", "ts-node": "10.9.1", + "tsx": "^4.22.3", "typescript": "catalog:", "typescript-eslint": "^8.40.0", "vite": "^8.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dabbdfa..bbec4d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,19 +140,19 @@ importers: version: 22.7.4(4b13c1cc0bda3c1986e087923119c037) '@nx/react': specifier: ^22.7.4 - version: 22.7.4(01c509d82b017f650c92252c8a65a36f) + version: 22.7.4(6fa5571f3fc6ef67e97c226f0ccc296b) '@nx/vite': specifier: ^22.7.4 - version: 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7) + version: 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7) '@nx/vitest': specifier: 22.7.4 - version: 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7) + version: 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7) '@nx/web': specifier: ^22.7.4 - version: 22.7.4(0aa974f5519e750f830dd857cf3876b2) + version: 22.7.4(1e779c520d3d689e7e6148efa92a27ca) '@nx/webpack': specifier: 22.7.4 - version: 22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2)) + version: 22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2)) '@nx/workspace': specifier: ^22.7.4 version: 22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)) @@ -203,7 +203,7 @@ importers: version: 19.2.3(@types/react@19.2.15) '@vitejs/plugin-react': specifier: ^6.0.0 - version: 6.0.2(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + version: 6.0.2(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: ~4.1.0 version: 4.1.7(vitest@4.1.7) @@ -263,10 +263,13 @@ importers: version: 3.8.3 ts-jest: specifier: ^29.4.0 - version: 29.4.11(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.11(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(esbuild@0.28.0)(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: 10.9.1 version: 10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3) + tsx: + specifier: ^4.22.3 + version: 4.22.3 typescript: specifier: 'catalog:' version: 5.9.3 @@ -275,10 +278,10 @@ importers: version: 8.60.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3) vite: specifier: ^8.0.0 - version: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) + version: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ~4.1.0 - version: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) webpack-cli: specifier: ^5.1.4 version: 5.1.4(webpack@5.107.2) @@ -1190,6 +1193,162 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5262,6 +5421,11 @@ packages: es-toolkit@1.47.0: resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -8981,6 +9145,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} + engines: {node: '>=18.0.0'} + hasBin: true + tsyringe@4.10.0: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} @@ -10626,6 +10795,84 @@ snapshots: '@emotion/unitless@0.7.5': {} + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.4.2))': dependencies: eslint: 9.39.4(jiti@2.4.2) @@ -11271,7 +11518,7 @@ snapshots: upath: 2.0.1 optionalDependencies: typescript: 5.9.3 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -11315,7 +11562,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) tapable: 2.3.0 optionalDependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -11719,20 +11966,20 @@ snapshots: - nx - supports-color - '@nx/module-federation@22.7.4(5c56c14a7da6c27e4340d767892e49ff)': + '@nx/module-federation@22.7.4(eb71e2bd71e5c7b32a9de1e4523a4e13)': dependencies: '@module-federation/enhanced': 2.5.0(@rspack/core@1.6.8(@swc/helpers@0.5.21))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.107.2) '@module-federation/node': 2.7.43(@rspack/core@1.6.8(@swc/helpers@0.5.21))(typescript@5.9.3)(webpack@5.107.2) '@module-federation/sdk': 2.5.0(node-fetch@2.7.0(encoding@0.1.13)) '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) '@nx/js': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) - '@nx/web': 22.7.4(0aa974f5519e750f830dd857cf3876b2) + '@nx/web': 22.7.4(1e779c520d3d689e7e6148efa92a27ca) '@rspack/core': 1.6.8(@swc/helpers@0.5.21) express: 4.22.2 http-proxy-middleware: 3.0.5 picocolors: 1.1.1 tslib: 2.8.1 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -11872,14 +12119,14 @@ snapshots: - supports-color - verdaccio - '@nx/react@22.7.4(01c509d82b017f650c92252c8a65a36f)': + '@nx/react@22.7.4(6fa5571f3fc6ef67e97c226f0ccc296b)': dependencies: '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) '@nx/eslint': 22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf) '@nx/js': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) - '@nx/module-federation': 22.7.4(5c56c14a7da6c27e4340d767892e49ff) + '@nx/module-federation': 22.7.4(eb71e2bd71e5c7b32a9de1e4523a4e13) '@nx/rollup': 22.7.4(@babel/core@7.29.7)(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/babel__core@7.20.5)(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3) - '@nx/web': 22.7.4(0aa974f5519e750f830dd857cf3876b2) + '@nx/web': 22.7.4(1e779c520d3d689e7e6148efa92a27ca) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) '@svgr/webpack': 8.1.0(typescript@5.9.3) express: 4.22.2 @@ -11889,7 +12136,7 @@ snapshots: semver: 7.8.1 tslib: 2.8.1 optionalDependencies: - '@nx/vite': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7) + '@nx/vite': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7) transitivePeerDependencies: - '@babel/core' - '@babel/traverse' @@ -11958,11 +12205,11 @@ snapshots: - typescript - verdaccio - '@nx/vite@22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7)': + '@nx/vite@22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7)': dependencies: '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) '@nx/js': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) - '@nx/vitest': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7) + '@nx/vitest': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) ajv: 8.20.0 enquirer: 2.3.6 @@ -11970,8 +12217,8 @@ snapshots: semver: 7.8.1 tsconfig-paths: 4.2.0 tslib: 2.8.1 - vite: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) - vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) + vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: - '@babel/traverse' - '@nx/eslint' @@ -11983,7 +12230,7 @@ snapshots: - typescript - verdaccio - '@nx/vitest@22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7)': + '@nx/vitest@22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7)': dependencies: '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) '@nx/js': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) @@ -11992,8 +12239,8 @@ snapshots: tslib: 2.8.1 optionalDependencies: '@nx/eslint': 22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf) - vite: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) - vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) + vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12004,7 +12251,7 @@ snapshots: - typescript - verdaccio - '@nx/web@22.7.4(0aa974f5519e750f830dd857cf3876b2)': + '@nx/web@22.7.4(1e779c520d3d689e7e6148efa92a27ca)': dependencies: '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) '@nx/js': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) @@ -12016,8 +12263,8 @@ snapshots: '@nx/eslint': 22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf) '@nx/jest': 22.7.4(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3))(typescript@5.9.3) '@nx/playwright': 22.7.4(4b13c1cc0bda3c1986e087923119c037) - '@nx/vite': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.7) - '@nx/webpack': 22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2)) + '@nx/vite': 22.7.4(@babel/traverse@7.29.7)(@nx/eslint@22.7.4(b64d164c9d1e8a3c8cca240ae13fdedf))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.7) + '@nx/webpack': 22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12027,7 +12274,7 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2))': + '@nx/webpack@22.7.4(@babel/traverse@7.29.7)(@rspack/core@1.6.8(@swc/helpers@0.5.21))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21)))(typescript@5.9.3)(webpack-cli@5.1.4(webpack@5.107.2))': dependencies: '@babel/core': 7.29.7 '@nx/devkit': 22.7.4(nx@22.7.4(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.40(@swc/helpers@0.5.21))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.40(@swc/helpers@0.5.21))) @@ -12039,7 +12286,7 @@ snapshots: browserslist: 4.28.2 copy-webpack-plugin: 14.0.0(webpack@5.107.2) css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.21))(webpack@5.107.2) - css-minimizer-webpack-plugin: 8.0.0(webpack@5.107.2) + css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.0)(webpack@5.107.2) fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.107.2) less: 4.5.1 less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.21))(less@4.5.1)(webpack@5.107.2) @@ -12057,11 +12304,11 @@ snapshots: sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.21))(sass-embedded@1.100.0)(sass@1.100.0)(webpack@5.107.2) source-map-loader: 5.0.0(webpack@5.107.2) style-loader: 3.3.4(webpack@5.107.2) - terser-webpack-plugin: 5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack@5.107.2) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.107.2) ts-loader: 9.5.7(typescript@5.9.3)(webpack@5.107.2) tsconfig-paths-webpack-plugin: 4.2.0 tslib: 2.8.1 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-dev-server: 5.2.4(tslib@2.8.1)(webpack-cli@5.1.4(webpack@5.107.2))(webpack@5.107.2) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(webpack@5.107.2) @@ -13753,10 +14000,10 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true - '@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) '@vitest/coverage-v8@4.1.7(vitest@4.1.7)': dependencies: @@ -13770,7 +14017,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/expect@4.1.7': dependencies: @@ -13781,13 +14028,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) '@vitest/pretty-format@4.1.7': dependencies: @@ -13816,7 +14063,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/utils@4.1.7': dependencies: @@ -13902,17 +14149,17 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.107.2))(webpack@5.107.2)': dependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-cli: 5.1.4(webpack@5.107.2) '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.107.2))(webpack@5.107.2)': dependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-cli: 5.1.4(webpack@5.107.2) '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.107.2))(webpack@5.107.2)': dependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-cli: 5.1.4(webpack@5.107.2) '@xhmikosr/archive-type@8.0.1': @@ -14355,7 +14602,7 @@ snapshots: '@babel/core': 7.29.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) babel-plugin-const-enum@1.2.0(@babel/core@7.29.7): dependencies: @@ -14881,7 +15128,7 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.16 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) core-js-compat@3.49.0: dependencies: @@ -14957,9 +15204,9 @@ snapshots: semver: 7.8.1 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.21) - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) - css-minimizer-webpack-plugin@8.0.0(webpack@5.107.2): + css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.0)(webpack@5.107.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 7.1.9(postcss@8.5.15) @@ -14967,7 +15214,9 @@ snapshots: postcss: 8.5.15 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + optionalDependencies: + esbuild: 0.28.0 css-select@5.2.2: dependencies: @@ -15392,6 +15641,35 @@ snapshots: es-toolkit@1.47.0: {} + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -15918,7 +16196,7 @@ snapshots: semver: 7.8.1 tapable: 2.3.3 typescript: 5.9.3 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) form-data-encoder@4.1.0: {} @@ -17340,7 +17618,7 @@ snapshots: less: 4.5.1 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.21) - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) less@4.5.1: dependencies: @@ -17367,7 +17645,7 @@ snapshots: dependencies: webpack-sources: 3.5.0 optionalDependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) lightningcss-android-arm64@1.32.0: optional: true @@ -17631,7 +17909,7 @@ snapshots: mini-css-extract-plugin@2.4.7(webpack@5.107.2): dependencies: schema-utils: 4.3.3 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) mini-svg-data-uri@1.4.4: {} @@ -18360,7 +18638,7 @@ snapshots: semver: 7.8.1 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.21) - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - typescript @@ -19031,7 +19309,7 @@ snapshots: '@rspack/core': 1.6.8(@swc/helpers@0.5.21) sass: 1.100.0 sass-embedded: 1.100.0 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) sass@1.100.0: dependencies: @@ -19302,7 +19580,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) source-map-support@0.5.13: dependencies: @@ -19505,7 +19783,7 @@ snapshots: style-loader@3.3.4(webpack@5.107.2): dependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) stylehacks@7.0.11(postcss@8.5.15): dependencies: @@ -19595,15 +19873,16 @@ snapshots: transitivePeerDependencies: - supports-color - terser-webpack-plugin@5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack@5.107.2): + terser-webpack-plugin@5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.107.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) optionalDependencies: '@swc/core': 1.15.40(@swc/helpers@0.5.21) + esbuild: 0.28.0 postcss: 8.5.15 terser@5.48.0: @@ -19695,7 +19974,7 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.11(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.11(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(esbuild@0.28.0)(jest-util@30.3.0)(jest@30.3.0(@types/node@24.12.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -19713,6 +19992,7 @@ snapshots: '@jest/transform': 30.4.1 '@jest/types': 30.4.1 babel-jest: 30.4.1(@babel/core@7.29.7) + esbuild: 0.28.0 jest-util: 30.3.0 ts-loader@9.5.7(typescript@5.9.3)(webpack@5.107.2): @@ -19723,7 +20003,7 @@ snapshots: semver: 7.8.1 source-map: 0.7.4 typescript: 5.9.3 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) ts-node@10.9.1(@swc/core@1.15.40(@swc/helpers@0.5.21))(@types/node@24.12.4)(typescript@5.9.3): dependencies: @@ -19769,6 +20049,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.22.3: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + tsyringe@4.10.0: dependencies: tslib: 1.14.1 @@ -19966,7 +20252,7 @@ snapshots: vary@1.1.2: {} - vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0): + vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -19975,18 +20261,20 @@ snapshots: tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.4 + esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.4.2 less: 4.5.1 sass: 1.100.0 sass-embedded: 1.100.0 terser: 5.48.0 + tsx: 4.22.3 yaml: 2.9.0 - vitest@4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)): + vitest@4.1.7(@types/node@24.12.4)(@vitest/coverage-v8@4.1.7)(@vitest/ui@4.1.7)(jsdom@22.1.0)(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -20003,7 +20291,7 @@ snapshots: tinyexec: 1.2.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@24.12.4)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.14(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.4.2)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.100.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.4 @@ -20054,7 +20342,7 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-merge: 5.10.0 webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.107.2): @@ -20066,7 +20354,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) transitivePeerDependencies: - tslib @@ -20101,7 +20389,7 @@ snapshots: webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.2) ws: 8.18.0 optionalDependencies: - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) webpack-cli: 5.1.4(webpack@5.107.2) transitivePeerDependencies: - bufferutil @@ -20123,9 +20411,9 @@ snapshots: webpack-subresource-integrity@5.1.0(webpack@5.107.2): dependencies: typed-assert: 1.0.9 - webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) + webpack: 5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)) - webpack@5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)): + webpack@5.107.2(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack-cli@5.1.4(webpack@5.107.2)): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 @@ -20147,7 +20435,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(postcss@8.5.15)(webpack@5.107.2) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.40(@swc/helpers@0.5.21))(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.107.2) watchpack: 2.5.1 webpack-sources: 3.5.0 optionalDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 86cdf4d..598971b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,6 +8,7 @@ allowBuilds: '@parcel/watcher': true '@prisma/engines': true '@swc/core': true + esbuild: true less: true nx: true prisma: true