Compare commits

..

No commits in common. "7555d3f1ff513ac6a2a2b75003e75da9c1bd1b06" and "00b892b91b6eafddee328bc5ee7ce9a6481434ce" have entirely different histories.

17 changed files with 62 additions and 112 deletions

View File

@ -17,7 +17,7 @@
"@types/bcrypt": "^6.0.0", "@types/bcrypt": "^6.0.0",
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
"@types/dinero.js": "^2.0.0", "@types/dinero.js": "^2.0.0",
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/glob": "^9.0.0", "@types/glob": "^9.0.0",
"@types/jsonwebtoken": "^9.0.10", "@types/jsonwebtoken": "^9.0.10",
"@types/luxon": "^3.7.1", "@types/luxon": "^3.7.1",

View File

@ -19,7 +19,7 @@
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.4.11", "@biomejs/biome": "^2.4.11",
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"react": "^19.2.5", "react": "^19.2.5",

View File

@ -24,7 +24,7 @@
"devDependencies": { "devDependencies": {
"@hookform/devtools": "^4.4.0", "@hookform/devtools": "^4.4.0",
"@types/dinero.js": "^2.0.0", "@types/dinero.js": "^2.0.0",
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/mime-types": "^3.0.1", "@types/mime-types": "^3.0.1",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"react": "^19.2.5", "react": "^19.2.5",

View File

@ -23,7 +23,7 @@
"devDependencies": { "devDependencies": {
"@hookform/devtools": "^4.4.0", "@hookform/devtools": "^4.4.0",
"@types/dinero.js": "^2.0.0", "@types/dinero.js": "^2.0.0",
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
@ -39,7 +39,6 @@
"@erp/core": "workspace:*", "@erp/core": "workspace:*",
"@erp/customers": "workspace:*", "@erp/customers": "workspace:*",
"@hookform/resolvers": "^5.2.2", "@hookform/resolvers": "^5.2.2",
"@lglab/react-qr-code": "^1.4.10",
"@repo/i18next": "workspace:*", "@repo/i18next": "workspace:*",
"@repo/rdx-criteria": "workspace:*", "@repo/rdx-criteria": "workspace:*",
"@repo/rdx-ddd": "workspace:*", "@repo/rdx-ddd": "workspace:*",

View File

@ -1,4 +1,3 @@
import { UtcDate } from "@repo/rdx-ddd";
import { Maybe, Result } from "@repo/rdx-utils"; import { Maybe, Result } from "@repo/rdx-utils";
import { import {
@ -103,7 +102,7 @@ export class ProformaToIssuedInvoiceConverter implements IProformaToIssuedInvoic
invoiceNumber: proforma.invoiceNumber, invoiceNumber: proforma.invoiceNumber,
invoiceDate: UtcDate.today(), // La fecha de la factura es la fecha de emisión, no la de la proforma invoiceDate: proforma.invoiceDate,
operationDate: proforma.operationDate, operationDate: proforma.operationDate,
description: proforma.description, description: proforma.description,

View File

@ -1,6 +1,6 @@
import type { Tax } from "@erp/core/api"; import type { Tax } from "@erp/core/api";
import { ValueObject } from "@repo/rdx-ddd"; import { ValueObject } from "@repo/rdx-ddd";
import { Maybe, Result } from "@repo/rdx-utils"; import { type Maybe, Result } from "@repo/rdx-utils";
import { ItemAmount } from "../../common/value-objects"; import { ItemAmount } from "../../common/value-objects";
@ -32,19 +32,6 @@ export class ProformaItemTaxes
return Result.ok(new ProformaItemTaxes(props)); return Result.ok(new ProformaItemTaxes(props));
} }
/**
* Crea una instancia "vacía" (sin impuestos)
* - Evita duplicación de lógica de construcción
* - Centraliza el concepto de "sin impuestos"
*/
static empty(): ProformaItemTaxes {
return new ProformaItemTaxes({
iva: Maybe.none(),
rec: Maybe.none(),
retention: Maybe.none(),
});
}
toKey(): string { toKey(): string {
const ivaCode = this.props.iva.match( const ivaCode = this.props.iva.match(
(iva) => iva.code, (iva) => iva.code,

View File

@ -68,8 +68,8 @@ export const issuedInvoicesRouter = (params: StartParams) => {
router.get( router.get(
"/:invoice_id/report", "/:invoice_id/report",
//checkTabContext, //checkTabContext,
validateRequest(ReportIssueInvoiceByIdQueryRequestSchema, "query"),
validateRequest(ReportIssueInvoiceByIdParamsRequestSchema, "params"), validateRequest(ReportIssueInvoiceByIdParamsRequestSchema, "params"),
validateRequest(ReportIssueInvoiceByIdQueryRequestSchema, "query"),
(req: Request, res: Response, next: NextFunction) => { (req: Request, res: Response, next: NextFunction) => {
const useCase = deps.useCases.reportIssuedInvoice(); const useCase = deps.useCases.reportIssuedInvoice();

View File

@ -283,6 +283,12 @@ export class IssuedInvoiceRepository
}, },
]; ];
// Reemplazar findAndCountAll por findAll + count (más control y mejor rendimiento)
/*const { rows, count } = await CustomerInvoiceModel.findAndCountAll({
...query,
transaction,
});*/
const [rows, count] = await Promise.all([ const [rows, count] = await Promise.all([
CustomerInvoiceModel.findAll({ CustomerInvoiceModel.findAll({
...query, ...query,

View File

@ -13,7 +13,7 @@ import {
import { import {
CreateProformaRequestSchema, CreateProformaRequestSchema,
GetProformaByIdRequestSchema, GetProformaByIdRequestSchema,
IssueProformaByIdParamsRequestSchema, IssueProformaByIdResponseSchema,
ListProformasRequestSchema, ListProformasRequestSchema,
ReportProformaByIdParamsRequestSchema, ReportProformaByIdParamsRequestSchema,
ReportProformaByIdQueryRequestSchema, ReportProformaByIdQueryRequestSchema,
@ -150,7 +150,7 @@ export const proformasRouter = (params: StartParams) => {
"/:proforma_id/issue", "/:proforma_id/issue",
//checkTabContext, //checkTabContext,
validateRequest(IssueProformaByIdParamsRequestSchema, "params"), validateRequest(IssueProformaByIdResponseSchema, "params"),
(req: Request, res: Response, next: NextFunction) => { (req: Request, res: Response, next: NextFunction) => {
const useCase = deps.useCases.issueProforma(publicServices); const useCase = deps.useCases.issueProforma(publicServices);

View File

@ -3,12 +3,12 @@ import { useMemo, useState } from "react";
import type { import type {
IssuedInvoiceList, IssuedInvoiceList,
IssuedInvoiceStatus,
ListIssuedInvoicesByCriteriaParams, ListIssuedInvoicesByCriteriaParams,
VerifactuRecordStatus,
} from "../../shared"; } from "../../shared";
import { useIssuedInvoiceListQuery } from "../../shared/"; import { useIssuedInvoiceListQuery } from "../../shared/";
type VerifactuRecordListStatusFilter = "all" | VerifactuRecordStatus; type IssuedInvoiceListStatusFilter = "all" | IssuedInvoiceStatus;
const EMPTY_ISSUED_INVOICES_LIST: IssuedInvoiceList = { const EMPTY_ISSUED_INVOICES_LIST: IssuedInvoiceList = {
items: [], items: [],
@ -22,8 +22,7 @@ export const useIssuedInvoiceListController = () => {
const [pageIndex, setPageIndex] = useState(0); const [pageIndex, setPageIndex] = useState(0);
const [pageSize, setPageSize] = useState(5); const [pageSize, setPageSize] = useState(5);
const [search, setSearch] = useState(""); const [search, setSearch] = useState("");
const [verifactuStatusFilter, setVerifactuStatusFilter] = const [statusFilter, setStatusFilter] = useState<IssuedInvoiceListStatusFilter>("all");
useState<VerifactuRecordListStatusFilter>("all");
const debouncedSearch = useDebounce(search, 300); const debouncedSearch = useDebounce(search, 300);
@ -34,20 +33,17 @@ export const useIssuedInvoiceListController = () => {
pageSize, pageSize,
order: "desc", order: "desc",
orderBy: "invoice_date", orderBy: "invoice_date",
filters: filters: status === "all" ? [] : [{ field: "status", operator: "eq", value: status }],
verifactuStatusFilter === "all"
? []
: [{ field: "verifactu.status", operator: "eq", value: verifactuStatusFilter }],
}), }),
[debouncedSearch, pageIndex, pageSize, verifactuStatusFilter] [debouncedSearch, pageIndex, pageSize, status]
); );
const query = useIssuedInvoiceListQuery({ criteria }); const query = useIssuedInvoiceListQuery({ criteria });
const setStatusFilterValue = (value: string) => { const setStatusFilterValue = (value: string) => {
const nextValue = (value || "all") as VerifactuRecordListStatusFilter; const nextValue = (value || "all") as IssuedInvoiceListStatusFilter;
setVerifactuStatusFilter((prev) => { setStatusFilter((prev) => {
if (prev === nextValue) return prev; if (prev === nextValue) return prev;
// Sólo si la búsqueda realmente cambia, // Sólo si la búsqueda realmente cambia,
@ -99,7 +95,7 @@ export const useIssuedInvoiceListController = () => {
search, search,
setSearchValue, setSearchValue,
statusFilter: verifactuStatusFilter, statusFilter,
setStatusFilter: setStatusFilterValue, setStatusFilter: setStatusFilterValue,
}; };
}; };

View File

@ -1,5 +1,4 @@
import { formatDate } from "@erp/core/client"; import { formatDate } from "@erp/core/client";
import { ReactQRCode } from "@lglab/react-qr-code";
import { DataTableColumnHeader } from "@repo/rdx-ui/components"; import { DataTableColumnHeader } from "@repo/rdx-ui/components";
import { import {
Button, Button,
@ -17,6 +16,7 @@ import {
import type { ColumnDef } from "@tanstack/react-table"; import type { ColumnDef } from "@tanstack/react-table";
import { DownloadIcon, FileDownIcon, MailIcon, MoreVerticalIcon, QrCodeIcon } from "lucide-react"; import { DownloadIcon, FileDownIcon, MailIcon, MoreVerticalIcon, QrCodeIcon } from "lucide-react";
import * as React from "react"; import * as React from "react";
import QrCode from "react-qr-code";
import { useTranslation } from "../../../../../i18n"; import { useTranslation } from "../../../../../i18n";
import type { IssuedInvoiceListRow } from "../../../../shared"; import type { IssuedInvoiceListRow } from "../../../../shared";
@ -115,17 +115,7 @@ export function useIssuedInvoicesGridColumns(
} }
/> />
<TooltipContent className="m-0 p-3"> <TooltipContent className="m-0 p-3">
<div className="border-2 border-black"> <QrCode className="bg-white p-8" value={verifactu.url} />
<ReactQRCode
background="#fff"
dataModulesSettings={{ color: "#000" }}
finderPatternInnerSettings={{ color: "#000" }}
finderPatternOuterSettings={{ color: "#000" }}
marginSize={8}
size={256}
value={verifactu.url}
/>
</div>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
)} )}

View File

@ -23,7 +23,7 @@
"react-dom": "^19.2.5" "react-dom": "^19.2.5"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"react": "^19.2.5", "react": "^19.2.5",

View File

@ -4,12 +4,12 @@ import {
requireAuthenticatedGuard, requireAuthenticatedGuard,
requireCompanyContextGuard, requireCompanyContextGuard,
} from "@erp/core/api"; } from "@erp/core/api";
import type { GetCustomerByIdUseCase } from "@erp/customers/api/application";
import type { GetCustomerUseCase } from "../../../application";
import { customersApiErrorMapper } from "../customer-api-error-mapper"; import { customersApiErrorMapper } from "../customer-api-error-mapper";
export class GetCustomerController extends ExpressController { export class GetCustomerController extends ExpressController {
public constructor(private readonly useCase: GetCustomerByIdUseCase) { public constructor(private readonly useCase: GetCustomerUseCase) {
super(); super();
this.errorMapper = customersApiErrorMapper; this.errorMapper = customersApiErrorMapper;

View File

@ -14,7 +14,7 @@
"./api": "./src/api/index.ts" "./api": "./src/api/index.ts"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"typescript": "^6.0.2" "typescript": "^6.0.2"
}, },
"dependencies": { "dependencies": {

View File

@ -15,7 +15,7 @@
"./api": "./src/api/index.ts" "./api": "./src/api/index.ts"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"typescript": "^6.0.2" "typescript": "^6.0.2"
}, },
"dependencies": { "dependencies": {

View File

@ -23,7 +23,7 @@
"react-dom": "^19.2.5" "react-dom": "^19.2.5"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^5.0.6",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"react": "^19.2.5", "react": "^19.2.5",

View File

@ -175,8 +175,8 @@ importers:
specifier: ^2.0.0 specifier: ^2.0.0
version: 2.0.0 version: 2.0.0
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/glob': '@types/glob':
specifier: ^9.0.0 specifier: ^9.0.0
version: 9.0.0 version: 9.0.0
@ -360,8 +360,8 @@ importers:
specifier: ^2.4.11 specifier: ^2.4.11
version: 2.4.11 version: 2.4.11
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/react': '@types/react':
specifier: ^19.2.14 specifier: ^19.2.14
version: 19.2.14 version: 19.2.14
@ -448,8 +448,8 @@ importers:
specifier: ^2.0.0 specifier: ^2.0.0
version: 2.0.0 version: 2.0.0
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/mime-types': '@types/mime-types':
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
@ -489,9 +489,6 @@ importers:
'@hookform/resolvers': '@hookform/resolvers':
specifier: ^5.2.2 specifier: ^5.2.2
version: 5.2.2(react-hook-form@7.72.1(react@19.2.5)) version: 5.2.2(react-hook-form@7.72.1(react@19.2.5))
'@lglab/react-qr-code':
specifier: ^1.4.10
version: 1.4.10(react@19.2.5)
'@repo/i18next': '@repo/i18next':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/i18n version: link:../../packages/i18n
@ -566,8 +563,8 @@ importers:
specifier: ^2.0.0 specifier: ^2.0.0
version: 2.0.0 version: 2.0.0
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/react': '@types/react':
specifier: ^19.2.14 specifier: ^19.2.14
version: 19.2.14 version: 19.2.14
@ -654,8 +651,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/react': '@types/react':
specifier: ^19.2.14 specifier: ^19.2.14
version: 19.2.14 version: 19.2.14
@ -712,8 +709,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
typescript: typescript:
specifier: ^6.0.2 specifier: ^6.0.2
version: 6.0.2 version: 6.0.2
@ -785,8 +782,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
'@types/react': '@types/react':
specifier: ^19.2.14 specifier: ^19.2.14
version: 19.2.14 version: 19.2.14
@ -837,8 +834,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^5.0.6
version: 4.17.25 version: 5.0.6
typescript: typescript:
specifier: ^6.0.2 specifier: ^6.0.2
version: 6.0.2 version: 6.0.2
@ -2229,11 +2226,6 @@ packages:
'@jridgewell/trace-mapping@0.3.9': '@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
'@lglab/react-qr-code@1.4.10':
resolution: {integrity: sha512-B+VOFfvnx+NqVaJqDbh1glHEU/rJR/3XtINcvM3qC9DW292GbaLNoa2OvRlXHYUQdsWcdzNzOcPzT39P1O8uJg==}
peerDependencies:
react: ^18 || ^19
'@modelcontextprotocol/sdk@1.29.0': '@modelcontextprotocol/sdk@1.29.0':
resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@ -3597,11 +3589,11 @@ packages:
'@types/estree@1.0.8': '@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/express-serve-static-core@4.19.8': '@types/express-serve-static-core@5.1.1':
resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==}
'@types/express@4.17.25': '@types/express@5.0.6':
resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==}
'@types/fined@1.1.5': '@types/fined@1.1.5':
resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==}
@ -3637,9 +3629,6 @@ packages:
'@types/mime-types@3.0.1': '@types/mime-types@3.0.1':
resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==} resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==}
'@types/mime@1.3.5':
resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
'@types/ms@2.1.0': '@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
@ -3693,14 +3682,11 @@ packages:
'@types/response-time@2.3.9': '@types/response-time@2.3.9':
resolution: {integrity: sha512-w5i5/y/1N3hkSBru1dat7Pf/YzdFLAANbKR78i2VIPnKw1Ub2ZNXE/n3K4v1BBMIIbAccgxpGZT8lIuLW284Dw==} resolution: {integrity: sha512-w5i5/y/1N3hkSBru1dat7Pf/YzdFLAANbKR78i2VIPnKw1Ub2ZNXE/n3K4v1BBMIIbAccgxpGZT8lIuLW284Dw==}
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
'@types/send@1.2.1': '@types/send@1.2.1':
resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
'@types/serve-static@1.15.10': '@types/serve-static@2.2.0':
resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==}
'@types/statuses@2.0.6': '@types/statuses@2.0.6':
resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==}
@ -8029,10 +8015,6 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
'@lglab/react-qr-code@1.4.10(react@19.2.5)':
dependencies:
react: 19.2.5
'@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)':
dependencies: dependencies:
'@hono/node-server': 1.19.13(hono@4.12.12) '@hono/node-server': 1.19.13(hono@4.12.12)
@ -9291,19 +9273,18 @@ snapshots:
'@types/estree@1.0.8': {} '@types/estree@1.0.8': {}
'@types/express-serve-static-core@4.19.8': '@types/express-serve-static-core@5.1.1':
dependencies: dependencies:
'@types/node': 25.6.0 '@types/node': 25.6.0
'@types/qs': 6.15.0 '@types/qs': 6.15.0
'@types/range-parser': 1.2.7 '@types/range-parser': 1.2.7
'@types/send': 1.2.1 '@types/send': 1.2.1
'@types/express@4.17.25': '@types/express@5.0.6':
dependencies: dependencies:
'@types/body-parser': 1.19.6 '@types/body-parser': 1.19.6
'@types/express-serve-static-core': 4.19.8 '@types/express-serve-static-core': 5.1.1
'@types/qs': 6.15.0 '@types/serve-static': 2.2.0
'@types/serve-static': 1.15.10
'@types/fined@1.1.5': {} '@types/fined@1.1.5': {}
@ -9338,8 +9319,6 @@ snapshots:
'@types/mime-types@3.0.1': {} '@types/mime-types@3.0.1': {}
'@types/mime@1.3.5': {}
'@types/ms@2.1.0': {} '@types/ms@2.1.0': {}
'@types/node@25.6.0': '@types/node@25.6.0':
@ -9355,18 +9334,18 @@ snapshots:
'@types/passport-local@1.0.38': '@types/passport-local@1.0.38':
dependencies: dependencies:
'@types/express': 4.17.25 '@types/express': 5.0.6
'@types/passport': 1.0.17 '@types/passport': 1.0.17
'@types/passport-strategy': 0.2.38 '@types/passport-strategy': 0.2.38
'@types/passport-strategy@0.2.38': '@types/passport-strategy@0.2.38':
dependencies: dependencies:
'@types/express': 4.17.25 '@types/express': 5.0.6
'@types/passport': 1.0.17 '@types/passport': 1.0.17
'@types/passport@1.0.17': '@types/passport@1.0.17':
dependencies: dependencies:
'@types/express': 4.17.25 '@types/express': 5.0.6
'@types/picomatch@4.0.3': {} '@types/picomatch@4.0.3': {}
@ -9403,23 +9382,17 @@ snapshots:
'@types/response-time@2.3.9': '@types/response-time@2.3.9':
dependencies: dependencies:
'@types/express': 4.17.25 '@types/express': 5.0.6
'@types/node': 25.6.0
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
'@types/node': 25.6.0 '@types/node': 25.6.0
'@types/send@1.2.1': '@types/send@1.2.1':
dependencies: dependencies:
'@types/node': 25.6.0 '@types/node': 25.6.0
'@types/serve-static@1.15.10': '@types/serve-static@2.2.0':
dependencies: dependencies:
'@types/http-errors': 2.0.5 '@types/http-errors': 2.0.5
'@types/node': 25.6.0 '@types/node': 25.6.0
'@types/send': 0.17.6
'@types/statuses@2.0.6': {} '@types/statuses@2.0.6': {}