feat(api,web): c2 consulta de clientes — list + search + auth flow

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 <noreply@anthropic.com>
This commit is contained in:
2026-05-27 23:08:57 +00:00
parent 2a8be3fd82
commit 14c8350216
26 changed files with 1394 additions and 84 deletions

View File

@@ -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 |

View File

@@ -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"
}
}

View File

@@ -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',
},
});

View File

@@ -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");

View File

@@ -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"

View File

@@ -14,13 +14,58 @@ generator 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
}

286
apps/api/prisma/seed.ts Normal file
View File

@@ -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();
});

View File

@@ -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 },

View File

@@ -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'] ??

View File

@@ -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<WorkspaceClsStore>,
) {}
@Get()
list(@Query() query: ClientListQueryDto): Promise<ClientListResponse> {
// 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<ClientDetail> {
return this.clients.findOne(id, this.cls.get('userId') ?? '', this.cls.get('role') ?? 'rep');
}
}

View File

@@ -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 {}

View File

@@ -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<WorkspaceClsStore>) {}
async list(query: ClientListQuery, userId: string, role: string): Promise<ClientListResponse> {
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<ClientDetail> {
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(),
};
}
}

View File

@@ -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
}

View File

@@ -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<ActivityStatus, { color: string; label: string }> = {
active: { color: 'success', label: 'Ativo' },
alert: { color: 'warning', label: 'Em alerta' },
inactive: { color: 'error', label: 'Inativo' },
};
const FINANCIAL_CONFIG: Record<FinancialStatus, { color: string; label: string }> = {
regular: { color: 'success', label: 'Regular' },
attention: { color: 'warning', label: 'Atenção' },
blocked: { color: 'error', label: 'Bloqueado' },
};
// ─── Columns ──────────────────────────────────────────────────────────────────
function buildColumns(navigate: ReturnType<typeof useNavigate>): TableColumnsType<ClientSummary> {
return [
{
title: 'Cliente',
dataIndex: 'name',
key: 'name',
render: (name: string, record: ClientSummary) => (
<Space direction="vertical" size={0}>
<Typography.Link
strong
onClick={() => navigate({ to: '/clientes/$id', params: { id: record.id } })}
>
{name}
</Typography.Link>
{record.tradeName && (
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
{record.tradeName}
</Typography.Text>
)}
</Space>
),
sorter: true,
},
{
title: 'CNPJ / CPF',
dataIndex: 'taxId',
key: 'taxId',
width: 160,
render: (v: string) => (
<Typography.Text className="tabular-nums" style={{ fontSize: 13 }}>
{v}
</Typography.Text>
),
},
{
title: 'Atividade',
dataIndex: 'activityStatus',
key: 'activityStatus',
width: 120,
render: (v: ActivityStatus) => {
const cfg = ACTIVITY_CONFIG[v];
return <Badge status={cfg.color as 'success' | 'warning' | 'error'} text={cfg.label} />;
},
},
{
title: 'Situação',
dataIndex: 'financialStatus',
key: 'financialStatus',
width: 110,
render: (v: FinancialStatus) => {
const cfg = FINANCIAL_CONFIG[v];
return <Tag color={cfg.color}>{cfg.label}</Tag>;
},
},
{
title: 'Última compra',
dataIndex: 'lastOrderAt',
key: 'lastOrderAt',
width: 140,
render: (v: string | null, record: ClientSummary) => {
if (!v) return <Typography.Text type="secondary"></Typography.Text>;
const date = new Date(v).toLocaleDateString('pt-BR');
const value = record.lastOrderValue
? `R$ ${Number(record.lastOrderValue).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`
: '';
return (
<Tooltip title={value}>
<Typography.Text className="tabular-nums">{date}</Typography.Text>
</Tooltip>
);
},
},
{
title: 'Pedidos abertos',
dataIndex: 'openOrdersCount',
key: 'openOrdersCount',
width: 120,
align: 'center',
render: (v: number) =>
v > 0 ? (
<Tag color="processing" className="tabular-nums">
{v}
</Tag>
) : (
<Typography.Text type="secondary"></Typography.Text>
),
},
];
}
// ─── Page ─────────────────────────────────────────────────────────────────────
export function ClientsPage() {
const navigate = useNavigate();
const [q, setQ] = useState('');
const [search, setSearch] = useState('');
const [activityFilter, setActivityFilter] = useState<ActivityStatus | undefined>();
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 (
<Space direction="vertical" size={24} style={{ width: '100%' }}>
{/* Cabeçalho */}
<Space direction="vertical" size={4}>
<Title level={2} style={{ margin: 0 }}>
Carteira de Clientes
</Title>
<Typography.Text type="secondary">
{data ? `${data.total} cliente${data.total !== 1 ? 's' : ''} na sua carteira` : ' '}
</Typography.Text>
</Space>
{/* Filtros */}
<Space wrap>
<Search
placeholder="Buscar por nome, razão social ou CNPJ…"
value={q}
onChange={(e) => setQ(e.target.value)}
onSearch={(v) => {
setSearch(v);
setPage(1);
}}
allowClear
style={{ width: 320 }}
/>
<Select<ActivityStatus | undefined>
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' },
]}
/>
</Space>
{/* Tabela */}
<Table<ClientSummary>
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 } }),
})}
/>
</Space>
);
}

View File

@@ -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<string | null>(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 (
<Flex justify="center" align="center" style={{ minHeight: '100vh' }}>
<Card style={{ width: 360 }}>
<Space direction="vertical" size={20} style={{ width: '100%' }}>
<Typography.Title level={3} style={{ margin: 0 }}>
SAR · Login Dev
</Typography.Title>
<Alert
type="warning"
message="Ambiente de desenvolvimento"
description="Este login automático não existe em produção."
showIcon
/>
{error && <Alert type="error" message={error} showIcon />}
<Button type="primary" block loading={loading} onClick={() => void handleLogin()}>
Entrar como Rafael (rep · user-001)
</Button>
</Space>
</Card>
</Flex>
);
}

View File

@@ -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<RequestInit, 'body'> {
export async function apiFetch(path: string, options: RequestOptions = {}): Promise<unknown> {
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) } : {}),

View File

@@ -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);
},
};

View File

@@ -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<ClientListQuery>) => ['clients', 'list', params] as const,
detail: (id: string) => ['clients', 'detail', id] as const,
};
export function useClientList(params: Partial<ClientListQuery> = {}) {
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<ClientListResponse, Error>({
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<ClientDetail, Error>({
queryKey: CLIENT_KEYS.detail(id),
queryFn: async () => {
const raw = await apiFetch(`/api/v1/clients/${id}`);
return ClientDetailSchema.parse(raw);
},
enabled: !!id,
});
}

View File

@@ -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 (
<div style={{ padding: 24 }}>
<p>Ficha do cliente {id} em construção</p>
</div>
);
},
});
const routeTree = rootRoute.addChildren([
indexRoute,
rafaelRoute,
clientesRoute,
clienteDetailRoute,
]);
export const router = createRouter({
routeTree,

View File

@@ -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 <DevLogin onLogin={() => setHasToken(true)} />;
}
return <RouterProvider router={router} />;
}
const rootEl = document.getElementById('root');
if (!rootEl) {
throw new Error('Root element not found');
@@ -25,7 +40,7 @@ createRoot(rootEl).render(
<ConfigProvider theme={sarTheme} locale={ptBR} componentSize="middle">
<AntdApp>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
<Root />
</QueryClientProvider>
</AntdApp>
</ConfigProvider>

View File

@@ -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.
---

View File

@@ -1,2 +1,3 @@
export * from './lib/ping.contract';
export * from './lib/auth.contract';
export * from './lib/client.contract';

View File

@@ -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<typeof FinancialStatusSchema>;
// 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<typeof ActivityStatusSchema>;
// ─── 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<typeof AddressSchema>;
// ─── 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<typeof ClientSummarySchema>;
// ─── 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<typeof ClientDetailSchema>;
// ─── 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<typeof ClientListQuerySchema>;
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<typeof ClientListResponseSchema>;

View File

@@ -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",

424
pnpm-lock.yaml generated
View File

@@ -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:

View File

@@ -8,6 +8,7 @@ allowBuilds:
'@parcel/watcher': true
'@prisma/engines': true
'@swc/core': true
esbuild: true
less: true
nx: true
prisma: true