Facturas de cliente

This commit is contained in:
David Arranz 2025-09-11 19:52:50 +02:00
parent 84636276cc
commit 241ee4da93
14 changed files with 466 additions and 21 deletions

View File

@ -56,8 +56,8 @@ function buildSequelize(): Sequelize {
pool: {
max: 10,
min: 0,
idle: 10_000,
acquire: 30_000,
idle: 10000,
acquire: 30000,
},
dialectOptions: {
timezone: ENV.APP_TIMEZONE,

View File

@ -29,7 +29,9 @@ export abstract class TransactionManager implements ITransactionManager {
}
this._transaction = await this._startTransaction();
this._isCompleted = false;
this.logger.debug("Transaction started", { label: "TransactionManager.start" });
this.logger.debug("Transaction started", {
label: "TransactionManager.start",
});
}
/**
@ -59,6 +61,7 @@ export abstract class TransactionManager implements ITransactionManager {
"❌ Cannot start a new transaction inside another. Nested transactions are not allowed.",
{ label: "TransactionManager.complete" }
);
console.trace();
throw new Error("A transaction is already active. Nested transactions are not allowed.");
}

View File

@ -1,11 +1,14 @@
import { Result } from "@repo/rdx-utils";
import { Sequelize, Transaction } from "sequelize";
import { TransactionManager } from "../database";
import { InfrastructureUnavailableError } from "../errors";
import { InfrastructureError, InfrastructureUnavailableError } from "../errors";
export class SequelizeTransactionManager extends TransactionManager {
protected _database: Sequelize | null = null;
private readonly isolationLevel: string;
protected async _startTransaction(): Promise<Transaction> {
// Sequelize adquiere una conexión del pool y la asocia a la transacción.
return await this._database!.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED,
});
@ -18,14 +21,13 @@ export class SequelizeTransactionManager extends TransactionManager {
}
protected async _rollbackTransaction(): Promise<void> {
if (this._transaction) {
await this._transaction.rollback();
}
throw new InfrastructureError("Database not available");
}
constructor(database: Sequelize) {
constructor(database: Sequelize, options?: { isolationLevel?: string }) {
super();
this._database = database;
this.isolationLevel = options?.isolationLevel ?? Transaction.ISOLATION_LEVELS.READ_COMMITTED;
}
get database(): Sequelize {
@ -34,4 +36,43 @@ export class SequelizeTransactionManager extends TransactionManager {
}
return this._database;
}
/**
* Ejecuta el unit of work usando la API gestionada de Sequelize.
* Esta API adquiere/libera conexiones del pool automáticamente.
*/
async complete<T>(work: (transaction: Transaction) => Promise<T>): Promise<T> {
if (!this._database) {
throw new InfrastructureUnavailableError("Database not available");
}
// Evita transacciones anidadas según la política del TransactionManager base
if (this._transaction) {
this.logger.error(
"❌ Cannot start a new transaction inside another. Nested transactions are not allowed.",
{ label: "SequelizeTransactionManager.complete" }
);
throw new Error("A transaction is already active. Nested transactions are not allowed.");
}
try {
// Usa la forma gestionada: si `work` resuelve => commit, si lanza => rollback.
const result = await this._database.transaction(async (t) => {
const workResult = await work(t);
if (workResult instanceof Result && workResult.isFailure) {
// Forzamos rollback propagando el error
throw workResult.error;
}
return workResult;
});
return result as T;
} catch (err) {
const error = err as Error;
this.logger.error(`❌ Transaction rolled back due to error: ${error.message}`, {
stack: error.stack,
label: "SequelizeTransactionManager.complete",
});
throw error;
}
}
}

View File

@ -32,9 +32,9 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@erp/customers": "workspace:*",
"@erp/core": "workspace:*",
"@erp/auth": "workspace:*",
"@erp/core": "workspace:*",
"@erp/customers": "workspace:*",
"@hookform/resolvers": "^5.0.1",
"@repo/rdx-criteria": "workspace:*",
"@repo/rdx-ddd": "workspace:*",
@ -45,8 +45,11 @@
"ag-grid-community": "^33.3.0",
"ag-grid-react": "^33.3.0",
"date-fns": "^4.1.0",
"handlebars": "^4.7.8",
"libphonenumber-js": "^1.12.7",
"lucide-react": "^0.503.0",
"puppeteer": "^24.20.0",
"puppeteer-report": "^3.2.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-router-dom": "^6.26.0"

View File

@ -1 +1 @@
export * from "./list-invoices.assembler";
export * from "./list-customer-invoices.assembler";

View File

@ -1,6 +1,7 @@
import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { CustomerInvoiceListDTO } from "../../infrastructure";
import { CustomerInvoice } from "../aggregates";
/**
@ -47,7 +48,7 @@ export interface ICustomerInvoiceRepository {
* @param companyId - ID de la empresa.
* @param criteria - Criterios de búsqueda.
* @param transaction - Transacción activa para la operación.
* @returns Result<CustomerInvoice[], Error>
* @returns Result<Collection<CustomerInvoiceListDTO>, Error>
*
* @see Criteria
*/
@ -55,7 +56,7 @@ export interface ICustomerInvoiceRepository {
companyId: UniqueID,
criteria: Criteria,
transaction: any
): Promise<Result<Collection<CustomerInvoice>, Error>>;
): Promise<Result<Collection<CustomerInvoiceListDTO>, Error>>;
/**
*

View File

@ -2,6 +2,7 @@ import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";
import { CustomerInvoiceListDTO } from "../../infrastructure";
import { CustomerInvoice, CustomerInvoicePatchProps, CustomerInvoiceProps } from "../aggregates";
import { ICustomerInvoiceRepository } from "../repositories";
@ -62,13 +63,13 @@ export class CustomerInvoiceService {
* @param companyId - Identificador UUID de la empresa a la que pertenece el cliente.
* @param criteria - Objeto con condiciones de filtro, paginación y orden.
* @param transaction - Transacción activa para la operación.
* @returns Result<Collection<CustomerInvoice>, Error> - Colección de facturas o error.
* @returns Result<Collection<CustomerInvoiceListDTO>, Error> - Colección de facturas o error.
*/
async findInvoiceByCriteriaInCompany(
companyId: UniqueID,
criteria: Criteria,
transaction?: Transaction
): Promise<Result<Collection<CustomerInvoice>, Error>> {
): Promise<Result<Collection<CustomerInvoiceListDTO>, Error>> {
return this.repository.findByCriteriaInCompany(companyId, criteria, transaction);
}

View File

@ -9,7 +9,11 @@ import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Sequelize, Transaction } from "sequelize";
import { CustomerInvoice, ICustomerInvoiceRepository } from "../../domain";
import { ICustomerInvoiceFullMapper, ICustomerInvoiceListMapper } from "../mappers";
import {
CustomerInvoiceListDTO,
ICustomerInvoiceFullMapper,
ICustomerInvoiceListMapper,
} from "../mappers";
import { CustomerInvoiceItemTaxModel } from "./customer-invoice-item-tax.model";
import { CustomerInvoiceItemModel } from "./customer-invoice-item.model";
import { CustomerInvoiceTaxModel } from "./customer-invoice-tax.model";
@ -188,7 +192,7 @@ export class CustomerInvoiceRepository
companyId: UniqueID,
criteria: Criteria,
transaction: Transaction
): Promise<Result<Collection<any>, Error>> {
): Promise<Result<Collection<CustomerInvoiceListDTO>, Error>> {
try {
const mapper: ICustomerInvoiceListMapper = this._registry.getReadModelMapper("LIST");
const { CustomerModel } = this._database.models;

View File

@ -2,3 +2,4 @@ export * from "./create-customer-invoice.request.dto";
export * from "./customer-invoices-list.request.dto";
export * from "./delete-customer-invoice-by-id.request.dto";
export * from "./get-customer-invoice-by-id.request.dto";
export * from "./report-customer-invoice-by-id.request.dto";

View File

@ -0,0 +1,9 @@
import * as z from "zod/v4";
export const ReportCustomerInvoiceByIdRequestSchema = z.object({
invoice_id: z.string(),
});
export type ReportCustomerInvoiceByIdRequestDTO = z.infer<
typeof ReportCustomerInvoiceByIdRequestSchema
>;

View File

@ -20,7 +20,7 @@ export const CustomerInvoicesListGrid = () => {
const { t } = useTranslation();
const { data, isLoading, isPending, isError, error } = useCustomerInvoicesQuery({
pagination: {
pageSize: 9999,
pageSize: 999,
},
});
@ -90,8 +90,8 @@ export const CustomerInvoicesListGrid = () => {
resizable: true,
},
pagination: true,
paginationPageSize: 10,
paginationPageSizeSelector: [10, 20, 30, 50],
paginationPageSize: 15,
paginationPageSizeSelector: [10, 15, 20, 30, 50],
localeText: AG_GRID_LOCALE_ES,
rowSelection: { mode: "multiRow" },
};

View File

@ -1,4 +1,4 @@
import { useDataSource } from "@erp/core/hooks";
import { useDataSource, useQueryKey } from "@erp/core/hooks";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { CreateCustomerInvoiceRequestDTO } from "../../common/dto";

View File

@ -483,6 +483,9 @@ importers:
express:
specifier: ^4.18.2
version: 4.21.2
handlebars:
specifier: ^4.7.8
version: 4.7.8
i18next:
specifier: ^25.1.1
version: 25.2.1(typescript@5.8.3)
@ -492,6 +495,12 @@ importers:
lucide-react:
specifier: ^0.503.0
version: 0.503.0(react@19.1.0)
puppeteer:
specifier: ^24.20.0
version: 24.20.0(typescript@5.8.3)
puppeteer-report:
specifier: ^3.2.0
version: 3.2.0
react:
specifier: ^19.1.0
version: 19.1.0
@ -1870,10 +1879,21 @@ packages:
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
engines: {node: '>= 10.0.0'}
'@pdf-lib/standard-fonts@1.0.0':
resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==}
'@pdf-lib/upng@1.0.1':
resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==}
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
'@puppeteer/browsers@2.10.9':
resolution: {integrity: sha512-kUGHwABarVhvMP+zhW5zvDA7LmGcd4TwrTEBwcTQic5EebUqaK5NjC0UXLJepIFVGsr2N/Z8NJQz2JYGo1ZwxA==}
engines: {node: '>=18'}
hasBin: true
'@radix-ui/number@1.1.1':
resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
@ -3050,6 +3070,9 @@ packages:
'@types/yargs@17.0.33':
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@vitejs/plugin-react@4.6.0':
resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==}
engines: {node: ^14.18.0 || >=16.0.0}
@ -3219,6 +3242,14 @@ packages:
axios@1.10.0:
resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==}
b4a@1.7.1:
resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==}
peerDependencies:
react-native-b4a: '*'
peerDependenciesMeta:
react-native-b4a:
optional: true
babel-jest@29.7.0:
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -3251,6 +3282,39 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
bare-events@2.6.1:
resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==}
bare-fs@4.4.1:
resolution: {integrity: sha512-B7VdbD19fypJh6jCXgYge06pxj3UvMv+x8IOZjTSqpiy/ib3UHhwe8Zm7wqxHe7QI3CrySjui4YIRBvocuBthg==}
engines: {bare: '>=1.16.0'}
peerDependencies:
bare-buffer: '*'
peerDependenciesMeta:
bare-buffer:
optional: true
bare-os@3.6.2:
resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==}
engines: {bare: '>=1.14.0'}
bare-path@3.0.0:
resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==}
bare-stream@2.7.0:
resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==}
peerDependencies:
bare-buffer: '*'
bare-events: '*'
peerDependenciesMeta:
bare-buffer:
optional: true
bare-events:
optional: true
bare-url@2.2.2:
resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==}
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@ -3294,6 +3358,9 @@ packages:
bser@2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
@ -3391,6 +3458,11 @@ packages:
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
engines: {node: '>=18'}
chromium-bidi@8.0.0:
resolution: {integrity: sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==}
peerDependencies:
devtools-protocol: '*'
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
@ -3557,6 +3629,15 @@ packages:
resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
engines: {node: '>=10'}
cosmiconfig@9.0.0:
resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
engines: {node: '>=14'}
peerDependencies:
typescript: '>=4.9.5'
peerDependenciesMeta:
typescript:
optional: true
create-jest@29.7.0:
resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -3735,6 +3816,9 @@ packages:
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
devtools-protocol@0.0.1495869:
resolution: {integrity: sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==}
diff-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -3838,6 +3922,9 @@ packages:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'}
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
engines: {node: '>=10.13.0'}
@ -3845,6 +3932,10 @@ packages:
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
errno@0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true
@ -3962,10 +4053,18 @@ packages:
resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
engines: {node: '>=4'}
extract-zip@2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
hasBin: true
fast-equals@5.2.2:
resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==}
engines: {node: '>=6.0.0'}
fast-fifo@1.3.2:
resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
@ -3979,6 +4078,9 @@ packages:
fb-watchman@2.0.2:
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
fdir@6.4.5:
resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==}
peerDependencies:
@ -4114,6 +4216,10 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
get-stream@5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@ -4932,6 +5038,9 @@ packages:
resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==}
engines: {node: '>= 18'}
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
@ -5153,6 +5262,9 @@ packages:
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
param-case@2.1.1:
resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==}
@ -5241,6 +5353,12 @@ packages:
pause@0.0.1:
resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==}
pdf-lib@1.17.1:
resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
pg-connection-string@2.9.0:
resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==}
@ -5357,6 +5475,10 @@ packages:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
progress@2.0.3:
resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
engines: {node: '>=0.4.0'}
prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
@ -5378,10 +5500,25 @@ packages:
prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
puppeteer-core@24.20.0:
resolution: {integrity: sha512-n0y/f8EYyZt4yEJkjP3Vrqf9A4qa3uYpKYdsiedIY4bxIfTw1aAJSpSVPmWBPlr1LO4cNq2hGNIBWKPhvBF68w==}
engines: {node: '>=18'}
puppeteer-report@3.2.0:
resolution: {integrity: sha512-c2JNsAeLa4Ik4FVPdTRyWYfXO61uSI0ZJ9BNPuf84sImTmwBT4CY/Vn88iQ7q7LQstJStkPuNWAzJgNEmBONmQ==}
puppeteer@24.20.0:
resolution: {integrity: sha512-iLnLV9oHKKAujmxiSxRWKfcT1q2COu0g1N9iU2TCp1MlmsyjgNAkcBOR3cAOqKb5UTiVPIGG4z5PO5yfpYZ6jA==}
engines: {node: '>=18'}
hasBin: true
pure-rand@6.1.0:
resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
@ -5832,6 +5969,7 @@ packages:
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
deprecated: The work that was done in this beta branch won't be included in future versions
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
@ -5860,6 +5998,9 @@ packages:
std-env@3.9.0:
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
streamx@2.22.1:
resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==}
string-hash@1.1.3:
resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
@ -5963,6 +6104,12 @@ packages:
resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==}
engines: {node: '>=6'}
tar-fs@3.1.0:
resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==}
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'}
@ -5980,6 +6127,9 @@ packages:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
text-decoder@1.2.3:
resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
text-hex@1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
@ -6203,6 +6353,9 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
typed-query-selector@2.12.0:
resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==}
typescript-plugin-css-modules@5.1.0:
resolution: {integrity: sha512-6h+sLBa4l+XYSTn/31vZHd/1c3SvAbLpobY6FxDiUOHJQG1eD9Gh3eCs12+Eqc+TCOAdxcO+zAPvUq0jBfdciw==}
peerDependencies:
@ -6430,6 +6583,9 @@ packages:
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
webdriver-bidi-protocol@0.2.8:
resolution: {integrity: sha512-KPvtVAIX8VHjLZH1KHT5GXoOaPeb0Ju+JlAcdshw6Z/gsmRtLoxt0Hw99PgJwZta7zUQaAUIHHWDRkzrPHsQTQ==}
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
@ -6494,6 +6650,18 @@ packages:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
ws@8.18.3:
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@ -6520,6 +6688,9 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
yauzl@2.10.0:
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
yn@3.1.1:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
@ -7476,9 +7647,31 @@ snapshots:
'@parcel/watcher-win32-ia32': 2.5.1
'@parcel/watcher-win32-x64': 2.5.1
'@pdf-lib/standard-fonts@1.0.0':
dependencies:
pako: 1.0.11
'@pdf-lib/upng@1.0.1':
dependencies:
pako: 1.0.11
'@pkgjs/parseargs@0.11.0':
optional: true
'@puppeteer/browsers@2.10.9':
dependencies:
debug: 4.4.1
extract-zip: 2.0.1
progress: 2.0.3
proxy-agent: 6.5.0
semver: 7.7.2
tar-fs: 3.1.0
yargs: 17.7.2
transitivePeerDependencies:
- bare-buffer
- react-native-b4a
- supports-color
'@radix-ui/number@1.1.1': {}
'@radix-ui/primitive@1.1.2': {}
@ -8684,6 +8877,11 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 22.15.32
optional: true
'@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.15.32)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.89.0)(stylus@0.62.0)(terser@5.40.0)(tsx@4.19.4))':
dependencies:
'@babel/core': 7.27.4
@ -8859,6 +9057,8 @@ snapshots:
transitivePeerDependencies:
- debug
b4a@1.7.1: {}
babel-jest@29.7.0(@babel/core@7.27.4):
dependencies:
'@babel/core': 7.27.4
@ -8922,6 +9122,42 @@ snapshots:
balanced-match@1.0.2: {}
bare-events@2.6.1:
optional: true
bare-fs@4.4.1:
dependencies:
bare-events: 2.6.1
bare-path: 3.0.0
bare-stream: 2.7.0(bare-events@2.6.1)
bare-url: 2.2.2
fast-fifo: 1.3.2
transitivePeerDependencies:
- react-native-b4a
optional: true
bare-os@3.6.2:
optional: true
bare-path@3.0.0:
dependencies:
bare-os: 3.6.2
optional: true
bare-stream@2.7.0(bare-events@2.6.1):
dependencies:
streamx: 2.22.1
optionalDependencies:
bare-events: 2.6.1
transitivePeerDependencies:
- react-native-b4a
optional: true
bare-url@2.2.2:
dependencies:
bare-path: 3.0.0
optional: true
base64-js@1.5.1: {}
basic-ftp@5.0.5: {}
@ -8987,6 +9223,8 @@ snapshots:
dependencies:
node-int64: 0.4.0
buffer-crc32@0.2.13: {}
buffer-equal-constant-time@1.0.1: {}
buffer-from@1.1.2: {}
@ -9094,6 +9332,12 @@ snapshots:
chownr@3.0.0: {}
chromium-bidi@8.0.0(devtools-protocol@0.0.1495869):
dependencies:
devtools-protocol: 0.0.1495869
mitt: 3.0.1
zod: 3.25.67
ci-info@3.9.0: {}
cjs-module-lexer@1.4.3: {}
@ -9239,6 +9483,15 @@ snapshots:
path-type: 4.0.0
yaml: 1.10.2
cosmiconfig@9.0.0(typescript@5.8.3):
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.1
js-yaml: 4.1.0
parse-json: 5.2.0
optionalDependencies:
typescript: 5.8.3
create-jest@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.32)(typescript@5.8.3)):
dependencies:
'@jest/types': 29.6.3
@ -9389,6 +9642,8 @@ snapshots:
detect-node-es@1.1.0: {}
devtools-protocol@0.0.1495869: {}
diff-sequences@29.6.3: {}
diff@4.0.2: {}
@ -9481,6 +9736,10 @@ snapshots:
encodeurl@2.0.0: {}
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
enhanced-resolve@5.18.1:
dependencies:
graceful-fs: 4.2.11
@ -9488,6 +9747,8 @@ snapshots:
entities@2.2.0: {}
env-paths@2.2.1: {}
errno@0.1.8:
dependencies:
prr: 1.0.1
@ -9655,8 +9916,20 @@ snapshots:
iconv-lite: 0.4.24
tmp: 0.0.33
extract-zip@2.0.1:
dependencies:
debug: 4.4.1
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
'@types/yauzl': 2.10.3
transitivePeerDependencies:
- supports-color
fast-equals@5.2.2: {}
fast-fifo@1.3.2: {}
fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
@ -9675,6 +9948,10 @@ snapshots:
dependencies:
bser: 2.1.1
fd-slicer@1.1.0:
dependencies:
pend: 1.2.0
fdir@6.4.5(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
@ -9811,6 +10088,10 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
get-stream@5.2.0:
dependencies:
pump: 3.0.3
get-stream@6.0.1: {}
get-tsconfig@4.10.1:
@ -10793,6 +11074,8 @@ snapshots:
dependencies:
minipass: 7.1.2
mitt@3.0.1: {}
mkdirp@0.5.6:
dependencies:
minimist: 1.2.8
@ -11020,6 +11303,8 @@ snapshots:
package-json-from-dist@1.0.1: {}
pako@1.0.11: {}
param-case@2.1.1:
dependencies:
no-case: 2.3.2
@ -11105,6 +11390,15 @@ snapshots:
pause@0.0.1: {}
pdf-lib@1.17.1:
dependencies:
'@pdf-lib/standard-fonts': 1.0.0
'@pdf-lib/upng': 1.0.1
pako: 1.0.11
tslib: 1.14.1
pend@1.2.0: {}
pg-connection-string@2.9.0: {}
picocolors@1.0.1: {}
@ -11202,6 +11496,8 @@ snapshots:
process@0.11.10: {}
progress@2.0.3: {}
prompts@2.4.2:
dependencies:
kleur: 3.0.3
@ -11236,8 +11532,49 @@ snapshots:
prr@1.0.1:
optional: true
pump@3.0.3:
dependencies:
end-of-stream: 1.4.5
once: 1.4.0
punycode@2.3.1: {}
puppeteer-core@24.20.0:
dependencies:
'@puppeteer/browsers': 2.10.9
chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869)
debug: 4.4.1
devtools-protocol: 0.0.1495869
typed-query-selector: 2.12.0
webdriver-bidi-protocol: 0.2.8
ws: 8.18.3
transitivePeerDependencies:
- bare-buffer
- bufferutil
- react-native-b4a
- supports-color
- utf-8-validate
puppeteer-report@3.2.0:
dependencies:
pdf-lib: 1.17.1
puppeteer@24.20.0(typescript@5.8.3):
dependencies:
'@puppeteer/browsers': 2.10.9
chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869)
cosmiconfig: 9.0.0(typescript@5.8.3)
devtools-protocol: 0.0.1495869
puppeteer-core: 24.20.0
typed-query-selector: 2.12.0
transitivePeerDependencies:
- bare-buffer
- bufferutil
- react-native-b4a
- supports-color
- typescript
- utf-8-validate
pure-rand@6.1.0: {}
qs@6.13.0:
@ -11704,6 +12041,15 @@ snapshots:
std-env@3.9.0: {}
streamx@2.22.1:
dependencies:
fast-fifo: 1.3.2
text-decoder: 1.2.3
optionalDependencies:
bare-events: 2.6.1
transitivePeerDependencies:
- react-native-b4a
string-hash@1.1.3: {}
string-length@4.0.2:
@ -11814,6 +12160,25 @@ snapshots:
tapable@2.2.2: {}
tar-fs@3.1.0:
dependencies:
pump: 3.0.3
tar-stream: 3.1.7
optionalDependencies:
bare-fs: 4.4.1
bare-path: 3.0.0
transitivePeerDependencies:
- bare-buffer
- react-native-b4a
tar-stream@3.1.7:
dependencies:
b4a: 1.7.1
fast-fifo: 1.3.2
streamx: 2.22.1
transitivePeerDependencies:
- react-native-b4a
tar@6.2.1:
dependencies:
chownr: 2.0.0
@ -11845,6 +12210,12 @@ snapshots:
glob: 7.2.3
minimatch: 3.1.2
text-decoder@1.2.3:
dependencies:
b4a: 1.7.1
transitivePeerDependencies:
- react-native-b4a
text-hex@1.0.0: {}
thenify-all@1.6.0:
@ -12058,6 +12429,8 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
typed-query-selector@2.12.0: {}
typescript-plugin-css-modules@5.1.0(ts-node@10.9.2(@types/node@22.15.32)(typescript@5.8.3))(typescript@5.8.3):
dependencies:
'@types/postcss-modules-local-by-default': 4.0.2
@ -12332,6 +12705,8 @@ snapshots:
dependencies:
defaults: 1.0.4
webdriver-bidi-protocol@0.2.8: {}
webidl-conversions@3.0.1: {}
webidl-conversions@4.0.2: {}
@ -12419,6 +12794,8 @@ snapshots:
imurmurhash: 0.1.4
signal-exit: 3.0.7
ws@8.18.3: {}
y18n@5.0.8: {}
yallist@3.1.1: {}
@ -12441,6 +12818,11 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
yauzl@2.10.0:
dependencies:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0
yn@3.1.1: {}
yocto-queue@0.1.0: {}